web-dev-qa-db-ja.com

現在匿名の場合、編集中のノードのデフォルトの作成者を現在の作成者に設定する簡単な方法はありますか?

私が取り組んでいるサイトは、適切なユーザーシステムを持っていなかったシステムからの移行であるため、多くの匿名ノードがあります。ユーザーはノードにアクセスしてノードを編集し、システムの作成者を変更することで記事を要求できますが、誰か(できれば管理者ではない人)が匿名の作成者がいるノードを編集するときは常にデフォルトでこれを実行します。フォームの変更またはフォームのプリプロセスフックを介してすぐに実行できるはずですが、drupalフォームシステムはまだ取得できません。ソリューションと優れた情報源へのポインタはどちらも歓迎します。

[〜#〜] update [〜#〜]ここでこの質問を調整しました: 匿名ノードのデフォルトのノード所有者を設定するにはどうすればよいですか?ノード編集フォームでは?

3
UltraBob

次のような hook_form_alter() 関数を使用できます。

/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  // If edit page is node
  if (isset($form['#node_edit_form'])) {
    $form['actions']['submit']['#submit'][] = 'mymodule_node_edit_submit';
  }
}


/**
 * Implements submit function for node edit.
 */
function mymodule_node_edit_submit($form, &$form_state) {
   // Get node id
   $nid = $form_state['values']['nid'];
   // Get current user
   $current_uid = $form_state['values']['uid'];
   // Load node if owner is anonymous
   if($current_uid == 0){
     // Get logged in user id to append uid as owner to node.
     global $user;
     $node = node_load($nid);
     // Set owner id as logged in user
     $node->uid = $user->uid;
     // Save node
     node_save($node);  
    }
}
2
Ajay Reddy

オプション1-編集後にノードの作成者を適応させる

Rules モジュールを有効にしている場合は、次のようなルールを使用できます。

{ "rules_change_anonymous_user_to_current_user" : {
    "LABEL" : "Change anonymous user to current user",
    "PLUGIN" : "reaction rule",
    "ACTIVE" : false,
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "node_update" : [] },
    "IF" : [
      { "data_is" : { "data" : [ "node-unchanged:author:uid" ], "value" : "0" } },
      { "user_has_role" : {
          "account" : [ "site:current-user" ],
          "roles" : { "value" : { "2" : "2" } }
        }
      },
      { "NOT user_has_role" : {
          "account" : [ "site:current-user" ],
          "roles" : { "value" : { "3" : "3" } }
        }
      }
    ],
    "DO" : [
      { "data_set" : { "data" : [ "node:author" ], "value" : [ "site:current-user" ] } },
      { "drupal_message" : {
          "message" : "Be aware: this was a node with an anonymous author. Since you just edited it, you are now considered as the author of it.",
          "type" : "warning"
        }
      }
    ]
  }
}

ルールUIを有効にすると、このルールを自分のサイトにインポートできるようになります。

このルールが何をするのか明確でない場合に備えて:

  • ルールイベント:既存のコンテンツを更新した後。
  • ルール条件:
    • 編集中のノードの作成者はuid=0を持っています。
    • ノードを編集しているユーザーがログインしています。
    • ノードを編集するユーザーには、「管理者」の役割はありません。
  • ルールアクション:
    • ノードの作成者を現在のユーザーに設定します。
    • 」のような(警告)メッセージを表示します。注意:これは匿名の作成者のノードです。編集したばかりなので、作成者と見なされます。」。

Done! ...オプション1付き。

オプション2-フラグを設定した後(編集するのではなく)ノードの作成者を適応させる

...誰か(できれば管理者ではない誰か)が匿名の作成者がいるノードを編集するときはいつでも...」)前のオプションには欠点:ノードを編集する必要があります。しかし、ノードのコンテンツが実際に問題なく、何も編集する必要がない場合はどうでしょうか。そのため、私は可能な選択肢をお勧めします。これは、前のオプションと一緒に使用するか、またはその代替として使用します。詳細については、以下をお読みください...

Flag モジュールを使用して、認証済みユーザーによる使用を許可された(非グローバル)フラグを作成することもできます。 "I am the author"のようなラベルが付いたフラグをマシン名 "i_am_the_author"で定義するとします。このようなフラグを設定すると、次のように、オプション1のルールのバリエーションを使用できます。

{ "rules_change_anonymous_user_to_flagging_user" : {
    "LABEL" : "Change anonymous user to flagging user",
    "PLUGIN" : "reaction rule",
    "ACTIVE" : false,
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "flag" ],
    "ON" : { "flag_flagged_i_am_the_author" : [] },
    "IF" : [
      { "data_is" : { "data" : [ "flagged-node:author:uid" ], "value" : "0" } },
      { "user_has_role" : {
          "account" : [ "site:current-user" ],
          "roles" : { "value" : { "2" : "2" } }
        }
      },
      { "NOT user_has_role" : {
          "account" : [ "site:current-user" ],
          "roles" : { "value" : { "3" : "3" } }
        }
      }
    ],
    "DO" : [
      { "data_set" : { "data" : [ "flagged-node:author" ], "value" : [ "site:current-user" ] } },
      { "drupal_message" : {
          "message" : "Be aware: this was a node with an anonymous author. Since you just flagged it, you are now considered as the author of it.",
          "type" : "warning"
        }
      }
    ]
  }
}

ルールUIを有効にすると、このルールを自分のサイトにインポートできるようになります。

このルールが何をするのか明確でない場合に備えて:

  • ルールイベント:ノードにフラグが設定された後、[私は作成者です]の下。
  • ルール条件:
    • フラグが付けられているノードの作成者はuid=0を持っています。
    • ノードにフラグを立てているユーザーがログインしています。
    • ノードにフラグを立てるユーザーには、「管理者」の役割はありません。
  • ルールアクション:
    • ノードの作成者を現在のユーザーに設定します。
    • 」のような(警告)メッセージを表示します。注意:これは匿名の作成者のノードです。フラグを立てたばかりなので、作成者と見なされます。」.

完了! ...オプション2付き。

オプション3-ゴールデンクレードルの見出し

オプション2を実装する場合(「I am the author」フラグを使用)、オプション1のルールをそのバリエーションに置き換えることもできます。つまり、(まだ)あるノードの編集試行を単に許可しません。匿名ユーザー。このようなルールがどのように見えるかの要約を次に示します。

  • ルールイベント:Drupalは初期化中です。
  • ルール条件:現在のパスは/node/nid/editのようになります(正規表現を使用)。
  • ルールアクション:
    • リダイレクトを実行します(たとえば、ダイレクトの理由を説明するヘルプページなど、適合するパスに)。
    • Drupalメッセージを設定して、最初にノードにフラグを付けたユーザーのみが編集を許可されていることを示します...推測した... "I am the author "フラグ。

Voilà!

オプション4-ノード作成者の紛争を解決する

使用するソリューション(オプション)に関係なく、常に複数のユーザーがノードの作成者であると主張する可能性があります。

そのシナリオを考慮するために、オプション2からルールのバリエーションを作成することもできます。そのようなルールの詳細は次のとおりです。

  • 最初のルール条件を「フラグの付いたノードのノード作成者はNOT uid=0」に置き換えます。
  • 両方のルールアクションを(サイトの管理者などに)電子メールを送信するように置き換えて、ノードの作成者に関する何らかのタイプの競合が発生したことを示します(それに応じて、表示されるメッセージを調整します)。

ゲームオーバー!?!?

3
Pierre.Vriens

hook_node_update を使用できます

/**
 * Implements hook_node_update().
 */
function hook_node_update($node) {
   global $user;

     //administrator role id
     $admin_rid = 3;

     //To check if user is not admin
     if (!array_key_exists( $admin_rid , $user->roles)) {
         $node->uid = $user->uid;
         node_save($node);
     }
}
1
Bipin K