メインコンテンツに移動

メインナビゲーション

  • ホーム
  • サイトマップ
  • ビデオ
  • ご連絡

パンくず

  • ホーム
  • Drupalのモジュール(Rules)のアクションコンポーネントでVBOより新規ノード作成とフィールドのコピー

Drupalのモジュール(Rules)のアクションコンポーネントでVBOより新規ノード作成とフィールドのコピー

drupal
Views
rules

やりたいこと:モジュール(VBO/Rules)で新規コンテンツの作成及び選択したノードのタイトルのセット

  • 背景:Drupal7.55、Views7.x-3.16、Views Bulk Operation(VBO)7.x-3.4、Rules7.xー2.10
  • Viewsで記事一覧から特定の記事を選択する
    • その記事のタイトルを取得
    • 新しいコンテンツに選択したタイトルを設定して作成します

解決:VBOがRulesでノード作成アクションコンポーネントでノード新規作成します

  • Rulesでアクションコンポーネントを作成します ⇒ VBOがコンポーネントの利用ができます
  • Rulesで特定なノードをパラメータとして指定します ⇒ ノード新規作成時に「タイトル」のコピーが可能となります
    Rulesの「アクションコンポーネント」に特定なノードをパラメータとして渡す
  • VBOがノード選択して、アクションコンポーネントにパラメータとして渡します
Embedded thumbnail for Drupalのモジュール(Rules)のアクションコンポーネントでVBOより新規ノード作成とフィールドのコピー
drupal
module usage
Views
rules

問題点:モジュール(VBO)から利用しているRulesのコンポーネントへのアクセス権限設定が不明で登録ユーザーからのアクセスができない

  • 環境:Drupal7.54、VBO(Views Bulk Operations)7.x-3.4、Rules7.x2.9
  • モジュール(VBO)でRuelsのコンポーネントの利用は「Drupalのモジュール(VBO)で利用するRulesのアクションコンポーネント権限の設定 」を参考してください
  • 登録ユーザーがRulesコンポーネントへのアクセスができない状態です
  • ユーザーアクセス権限設定では通常ユーザー権限管理(ホーム » 管理 » ユーザー » 権限)で行いますが、Rulesコンポーネントで作成されたアクションセットの名前がありませんでした。どこで設定するのは不明です。

解決:モジュール(Rules)コンポーネント設定画面にユーザー権限設定欄でアクセス権限設定を行います

  • Rulesコンポーネントへのアクセスの権限設定は比較的にイレギュラーで、Rulesコンポーネントの管理ページ(ホーム » 管理 » 環境設定 » ワークフロー » ルール » コンポーネント)で行います
    • 作成したコンポーネントの管理ページ上にある「設定」リンクがありまして、それをクリックします
    • ページの一番したに「 Configure access for using this component with a permission. 」チェックボックスをチェックして、ユーザーアクセス権限設定欄が現れます
      VBOから利用しているRulesコンポーネントへのアクセス権限設定
  • Rulesコンポーネント管理画面でユーザー権限が設定したら、そのユーザーが当該コンポーネントへのアクセスができるようになります
drupal
Views
rules

モジュール(VBO、Rules)でデータコピーができます

  • モジュール(Rules)のコンポーネント(Component)がVBO(Views Bulk Operation)よく利用されている
    • Drupalのモジュール(Rules)で新規ノード作成とフィールドの値セットする「アクションセット」の作成 
    • Drupalのモジュール(Rules)のアクションコンポーネントでVBOより新規ノード作成とフィールドのコピー

データコピー過程のアクセス権限チェックが複数回行われています

  • モジュール(VBO)で「一括処理チェックボックス」を検索一覧に表示させる際に、コピー先のオブジェクトへのアクセス権限チェックを行います
    • Drupalのモジュール(VBO)で利用するRulesのアクションコンポーネント権限の設定
  • データコピー操作する際に再度コピー元とコピー先にアクセス権限チェックを行います
    • コピー元に「view」権限のチェック  ← VBOで行う
    • コピー先に「create」権限のチェック ← Rulesで行う
      VBOでデータコピー操作際にコピー元とコピー先へのアクセス権限チェック
  • もし、VBOでコピー元のデータへのアクセス(view)権限チェックが失敗した場合、操作画面に何もエラーメッセージを表示せず、システムログにチェックエラーを記録します
    VBOでデータコピー元へのアクセス権限(view)チェック失敗のログ
drupal
development
Views

Drupalのモジュール(Rules)で作成した各種アクションセットコンポーネントをモジュールVBOで一括処理

  • 背景:Drupal7.x.56、Views Bulk Operation(VBO)7.x-3.4、Rules7.x-2.10
  • モジュール(Rules)がいろいろなアクションセットの作成ができます
    • データの作成/更新/削除
    • メール送信、フラグを立てる
    • などなど
  • モジュール(VBO)がRulesで作成したアクションコンポーネントの利用ができます
    • Drupalのモジュール(Rules)のアクションコンポーネントでVBOより新規ノード作成とフィールドのコピー
  • 今回の例として、Rulesでメッセージ表示する単純なアクションコンポーネント(show message)を作成して、VBOで一括処理を行います
    Rulesでメッセージ表示コンポーネントをVBOで一括処理

問題点:VBO一括処理後に画面遷移(redirect)はできません

  • VBOで一括処理後に、画面を遷移して処理結果を確認することがあります
  • VBOの設定オプションに、処理後の画面遷移設定がありません
  • ネットで調べてみたが、VBO一括処理後の画面遷移オプション追加パッチがります
    • これは、モジュールVBOに対するパッチです
    • このパッチ適応したら、次回VBOアップグレード時に、ソースのマージ作業が面だと思います
    • できれば、VBOのパッチを使用したくないです

解決:カスタムモジュール(vbo_redirect_option.zip)でVBO処理後の画面遷移オプションの追加

  • モジュール(VBO)の主要部分がクラス(class)構造なので、簡単に画面遷移ロジックを追加することはできません
  • 「Bulk Operation Settings」に処理後の画面遷移オプションを追加します
    • 「Bulk Operation Settings」のオーバーライドができないので、hook_form_alter()でオプションを追加することになりました
      /**
       * Implements hook_form_alter().
       */
      function vbo_redirect_option_form_alter(&$form, &$form_state, $form_id)
      {
        // VBOの処理かのチェック
          if( isset($form_state['id']) && $form_state['id'] === "views_bulk_operations"){
      
         // ここで、画面遷移先の保存処理は少し反則
         //  vbo_settingsに画面遷移先の追加は難しい(クラス構造体内にあるため)
         //  環境変数に画面遷移先(uri)を保存
              if( isset($form_state['input']['options']['vbo_settings'][vbo_redirect_url]) ){
                  variable_set( 'vbo_redirect_url', $form_state['input']['options']['vbo_settings'][vbo_redirect_url] ) ;
              }
      
         // 画面遷移先のテキストフィールドを追加
              $form['options']['vbo_settings']['vbo_redirect_url'] = array(
                  '#type' => 'textfield',
                  '#title' => t('Page to direct to after completion of  batch'),
                  '#description' => t('Redirects to the view when finished the operation'),
                  '#default_value' => variable_get('vbo_redirect_url'),
              );
          }
      }
    • 画面遷移先を入力するテキストフィールドを設定画面に追加
    • 画面遷移先(uri)をvbo_settingsに入れたいですが、クラスの構造体にあるため追加できません。環境変数に保存することにしました。
    • 設定画面を保存("#submit")後に、画面遷移先を保存する処理を行いたいですが、"#submit"にコールバック関数を入れても、呼び出されない現象があって、仕方がなく、hook_form_alter()内で画面遷移先(uri)の保存処理を行いました
      VBOに一括処理後に画面遷移オプションの追加
  • hook_views_bulk_operations_form_alter()を実装して、実際のVBO一括処理後に、画面遷移設定を行います
    /**
     * Implements hook_views_bulk_operations_form_alter().
     */
    function vbo_redirect_option_views_bulk_operations_form_alter(&$form, &$form_state, $vbo)
    {
        $vbo_redirect_url = trim( variable_get('vbo_redirect_url') ) ;
    
        if( isset($vbo_redirect_url) && strlen($vbo_redirect_url) >0 ){
    
            // check if vbo operation skip confirmation
            $skip_confirmation = false ;
            foreach( $vbo->options['vbo_operations'] as $key => $operation ){
                if( $operation['selected'] && $operation['skip_confirmation'] ){
                    if( isset($form['select'][$key]) ) {
                        $form['select'][$key]['#submit'][] = 'vbo_redirect_after_operation';
                        $skip_confirmation = true ;
                    }
                }
            }
    
            // set redirect method when vbo has confirmation step
            if( !$skip_confirmation ){
                $form['actions']['submit']['#submit'][] = 'vbo_redirect_after_operation' ;
            }
        }
    }
    
    // callback function to set redirect url
    function vbo_redirect_after_operation($form, &$form_state){
        $vbo_redirect_url = trim( variable_get('vbo_redirect_url') ) ;
        $form_state['redirect'] = $vbo_redirect_url;
    }
    • VBO一括処理の「確認のステップをスキップ」があるか、ないかを分けて処理します(画面遷移設定場所が違うため)
    • "#submit"に画面遷移処理を追加します
    • 画面遷移処理は$form_state['redirect'] で行います

結論と感想:簡単のカスタモジュールでVBOへの影響はありません。各オペレーション設定に画面遷移オプションを追加したほうよいかもしれない

  • このカスタムモジュールのインストールより、モジュール(VBO)への影響はありません
  • この画面遷移オプションを「Bulk Operation Settings」に追加したので、すべてのオペレーションに適応されます
    • VBOの一括処理内容がいろいろあります(例:オーナー変更、エンティティ内容変更など)
    • これらの処理後に一つの画面遷移先の設定はやや強引的だと思います
  • できれば、「Selected Bulk Operations」にある、選択したオペレーションの設定に画面遷移先の設定をしたほうが柔軟的な対応だと思います(次回の課題)
    画面遷移オプションを各オペレーションに追加すべき
添付 サイズ
vbo_redirect_option.zip (1.19 KB) 1.19 KB
Embedded thumbnail for Drupalのモジュール(VBO)の一括処理後にページ遷移させる方法
ホーム

古松

検索

Article Category

  • apache(7)
  • css(19)
  • drupal(295)
  • Electron(4)
  • html(34)
  • javascript(27)
  • laravel(4)
  • linux(5)
  • macOS(2)
  • mysql(13)
  • php(19)
  • python(4)
  • SEO(12)
  • video(72)
  • Visual Studio Code(4)
  • windows(13)
  • wordpress(32)