ルールでユーザーのノードを作成する前に、ユーザーがコンテンツタイプからノードを既に作成しているかどうかを確認したいと思います。これの条件を作成するにはどうすればよいですか?ありがとう!
私の解決策は、ユーザーフラグ(グローバルフラグタイプ)を作成し、作成後にノードの作成者にフラグを付けるルールを作成することでした。ルール条件は、ノードの分類用語もチェックします。
元のルールでは、ユーザーにフラグが付けられていないかどうかを確認する新しい条件を追加し、それらのノードを作成しました。
私のWebサイトでは、ユーザーが自分でグループノードを作成しないので、これは私にとってはうまくいきます。
ルールに対するこれらの大きな答えを見た後、コードを介して同じことを試すことができると思います。ルールよりもはるかに小さく、非常に高速です!
/**
* 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");
}
}
}
}
このコードは、ユーザーがノードを既に作成したかどうかを確認し、作成した場合は、新しいノードを作成する代わりに、既存のノードの編集フォームにリダイレクトします。
ルールやコードなしでこの機能が必要な場合は、プロファイルモジュールを試すことができます。コンテンツタイプを「プロファイル」として構成するためのこの魔法の機能があります。また、コンテンツタイプが「プロファイル」として構成されている場合、ユーザーはその特定のタイプのノードを複数持つことはできません。
ありがとう!
注:これにより、実際にノードなどを作成することができます。したがって、これはプロアクティブソリューションというより「リアクティブ」ソリューションです。ノードの作成を開始する前にそれらを停止するために、ルールがジョブのツールであるとは思いません。ほとんどの場合、 form alter とクエリを使用して簡単なカスタムモジュールを作成する必要があります。クエリが1を超える場合はフォームを表示し、そうでない場合はメッセージを表示します。
チェック部分を実行する非常に迅速で簡単な方法は、 [〜#〜] vbo [〜#〜] を使用することです。
ユーザーがそのコンテンツタイプのノードをまだ作成していない場合(否定チェックボックスのため)、これは基本的にTRUEを返します。したがって、実行するのは、アクションでノードを削除(エンティティーを削除)し、「メッセージの表示」アクションを使用してメッセージを表示することです。
できました。
少し時間がかかりました。
ルールでトリガーするアクションを指定できないため、ノードを保存できません この時点では不可能 (ルールをテストしていたため、これに遭遇しました)。
ただし、コンテンツの編集など、何か他のことをしたい場合は、モデレートまたは私が解決策を持っているものにはフラグを立ててください。
これにより、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
で正しいものを探しました。
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;
}
私が好きなのは、ユーザーが特定の日付で作成されたノードを持っているかどうかを確認することです。