web-dev-qa-db-ja.com

ユーザーがルールにコンテンツタイプのノードを作成したかどうかを確認するにはどうすればよいですか?

ルールでユーザーのノードを作成する前に、ユーザーがコンテンツタイプからノードを既に作成しているかどうかを確認したいと思います。これの条件を作成するにはどうすればよいですか?ありがとう!

2
Dee

私の解決策は、ユーザーフラグ(グローバルフラグタイプ)を作成し、作成後にノードの作成者にフラグを付けるルールを作成することでした。ルール条件は、ノードの分類用語もチェックします。

元のルールでは、ユーザーにフラグが付けられていないかどうかを確認する新しい条件を追加し、それらのノードを作成しました。

私のWebサイトでは、ユーザーが自分でグループノードを作成しないので、これは私にとってはうまくいきます。

1
Dee

ルールに対するこれらの大きな答えを見た後、コードを介して同じことを試すことができると思います。ルールよりもはるかに小さく、非常に高速です!

/**
 * Implements hook_node_prepare()
 * @param type $node 
 */
function mymodule_node_prepare($node) {
  if ($node->type == "my_type") {
    if (!isset($node->nid)) {
      $existing_nid = db_query("SELECT nid FROM {node} WHERE (type = :type1) AND uid = :uid", array("type1" => "my_type, "uid" => $node->uid))->fetchField();
      if ($existing_nid != FALSE) {
        drupal_goto("node/$existing_nid/edit");
      }
    }
  }
}

このコードは、ユーザーがノードを既に作成したかどうかを確認し、作成した場合は、新しいノードを作成する代わりに、既存のノードの編集フォームにリダイレクトします。

ルールやコードなしでこの機能が必要な場合は、プロファイルモジュールを試すことができます。コンテンツタイプを「プロファイル」として構成するためのこの魔法の機能があります。また、コンテンツタイプが「プロファイル」として構成されている場合、ユーザーはその特定のタイプのノードを複数持つことはできません。

ありがとう!

2
Amrit Bera

注:これにより、実際にノードなどを作成することができます。したがって、これはプロアクティブソリューションというより「リアクティブ」ソリューションです。ノードの作成を開始する前にそれらを停止するために、ルールがジョブのツールであるとは思いません。ほとんどの場合、 form alter とクエリを使用して簡単なカスタムモジュールを作成する必要があります。クエリが1を超える場合はフォームを表示し、そうでない場合はメッセージを表示します。

チェック部分を実行する非常に迅速で簡単な方法は、 [〜#〜] vbo [〜#〜] を使用することです。

  • コンテキストフィルターとしてUID(作成者)、通常の非表示フィルターとしてコンテンツタイプを使用してVBOビューを作成します。これは基本的に、ビューに与えたUIDのすべてのnidを返します。
  • 指定された数値を表示するようにページャーを設定します= 1。
  • ルールでは、このVBOビューを条件として使用できます。「VBOビューから返された結果の数を確認する」
  • ドロップダウンから作成したVBOビューを選択します
  • 引数には、データセレクターとcreated/about-createdノードのUIDを使用します。
  • 結果の数として1を入力し、否定チェックボックスを使用します。

ユーザーがそのコンテンツタイプのノードをまだ作成していない場合(否定チェックボックスのため)、これは基本的にTRUEを返します。したがって、実行するのは、アクションでノードを削除(エンティティーを削除)し、「メッセージの表示」アクションを使用してメッセージを表示することです。

できました。

1
7wonders

少し時間がかかりました。

まず最初に

ルールでトリガーするアクションを指定できないため、ノードを保存できません この時点では不可能 (ルールをテストしていたため、これに遭遇しました)。

ただし、コンテンツの編集など、何か他のことをしたい場合は、モデレートまたは私が解決策を持っているものにはフラグを立ててください。

新しい条件でカスタムモジュールを作成する

これにより、2つの新しい条件が作成されます。1つは、ユーザーが以前に特定のノードの投稿を作成したかどうかを確認するためのもので、もう1つは、コンテンツタイプとユーザーエンティティを確認する単純なテキストのためのものです。どちらのルールも投稿のステータスをチェックし、公開されている場合にのみtrueを返します。これは、文字列コンテンツタイプとint uidをチェックするように簡単に拡張できます。

モジュール機能:

/*
 * Implementation of hook_rules_condition_info()
 */
function mymodule_rules_condition_info() {  
  return array(
    'mymodule_condition_has_other_post' => array(
      'label' => t('User has other post of same content type for given node.'),
      'parameter' => array(
        'node' => array('type' => 'node', 'label' => t('node')),
        'user' => array('type' => 'user', 'label' => t('user')),
      ),
      'group' => t('User'),
    ),
    'mymodule_condition_has_post' => array(
      'label' => t('User has post of content type.'),
      'parameter' => array(
        'contentType' => array('label' => t('content type'), 'type' => 'text'),
        'user' => array('type' => 'user', 'label' => t('user')),
      ),
      'group' => t('User'),
    ),
  );
}

function mymodule_condition_has_post($contentType, $user) {
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', 'node')
    ->entityCondition('bundle', $contentType)
    ->propertyCondition('status', 1)
    ->propertyCondition('uid', $user->uid);
  $result = $query->execute();

  if (isset($result['node'])) {
    return true;
  } else {
    return false;
  }
}

function mymodule_condition_has_other_post($node, $user) {
  return mymodule_condition_has_post($node->type, $user);
}

イベント、条件、アクションを含むルールを作成します

管理者の役割を持つすべてのユーザーにメールを送信するために作成しました。

{ "rules_has_post" : {
    "LABEL" : "has_post",
    "PLUGIN" : "reaction rule",
    "REQUIRES" : [ "mymodule", "rules" ],
    "ON" : [ "node_presave" ],
    "IF" : [
      { "mymodule_condition_has_other_post" : { "node" : [ "node" ], "user" : [ "node:author" ] } }
    ],
    "DO" : [
      { "mail_to_users_of_role" : {
          "roles" : { "value" : { "3" : "3" } },
          "subject" : "new node on [site:name]",
          "message" : "user [node:author] created a new node: [node:url]",
          "from" : "[email protected]"
        }
      }
    ]
  }
}

ドキュメントページ はかなり古く、d7の構文とd6の構文はまったく異なります。 rules.api.phpで正しいものを探しました。

1
Andre Baumeier

drupal.orgでこのコードを見つけました。

https://www.drupal.org/node/2052241

global $user;

$result = db_query("SELECT COUNT(nid) FROM node JOIN users ON node.uid = users.uid 

WHERE node.status = :status AND users.uid = :uid AND node.type = :type", 

array(":status"=> 1,":uid" => $user->uid, ":type" => 'configuration_1'))

->fetchField();

if ($result >= 1){
    return FALSE;
    }

 else{

return TRUE;

}

私が好きなのは、ユーザーが特定の日付で作成されたノードを持っているかどうかを確認することです。

0
mooru