メインコンテンツに移動
ホーム

古松

メインナビゲーション

  • ホーム
  • ビデオ
  • ご連絡

パンくず

  • ホーム
  • Drupalのモジュール(Background Precess)がVBOのメッセージを削除してしまう問題点

Drupalのモジュール(Background Precess)がVBOのメッセージを削除してしまう問題点

やりたいこと:Drupalのモジュール(Views、VBO、Rules)であるアクション後に成功/失敗のメッセージを画面に表示させます

  • 背景:Drupal7.56、Views7.x-3.17、Views Bulk Operation7.x-3.4、Rules7.x-3.10
  • モジュール(Rules)がいろいろな処理(メール送信、メッセージ表示、データ更新など)によく利用される
  • Rulesのコンポーネントを作成して、モジュール(Views Bulk Operation)に使わせるのも、非常に便利です
    • Drupalのモジュール(Rules)のアクションコンポーネントでVBOより新規ノード作成とフィールドのコピー
    • Drupalのモジュール(VBO)で利用するRulesのアクションコンポーネント権限の設定
  • 今回の例として、単純に投稿の「タイトル」をメッセージとして、画面に表示させます(具体的な方法はビデをを参考)
    • 簡単な設定で投稿の「タイトル」をメッセージとして画面に表示しました

問題点:モジュール(Background Precess)をインストールしたら、メッセージが表示されなくなります

  • モジュール(Background Precess 7.x-7.17)が、データインポート(例:Feeds Import)、ナイトバッチなどの重い処理によく利用されます
  • モジュール(Background Precess)がインストールしたら、以前表示されたメッセージが表示しなくなりました

原因:モジュール(Background Precess)が終了時にPHPのexit関数が溜まったメッセージを削除してしまいました

  • モジュール(Rules)のメッセージ表示アクションが単純的にdrupal_set_message()を利用して、メッセージを表示させています
    /**
     * \sites\all\modules\rules\modules\system.eval.inc
     * 14行あたり
     *
     * Action: Show a drupal message.
     */
    function rules_action_drupal_message($message, $status, $repeat) {
      drupal_set_message(filter_xss_admin($message), $status, $repeat);
    }
  • 関数drupal_set_message()はPHPの環境変数$_SESSIONにメッセージを溜め込んでいます
    // メッセージを$_SESSIONに溜め込む
    function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
      if ($message || $message === '0' || $message === 0) {
        if (!isset($_SESSION['messages'][$type])) {
          $_SESSION['messages'][$type] = array();
        }
    
        if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {
          $_SESSION['messages'][$type][] = $message;
        }
    
        // Mark this page as being uncacheable.
        drupal_page_is_cacheable(FALSE);
      }
    
      // Messages not set when DB connection fails.
      return isset($_SESSION['messages']) ? $_SESSION['messages'] : NULL;
    }
  • モジュール(Background Precess)がインストールしたら、D7のbatchプロセスをオーバーライドしてしまいます
  • Background Precessが終了時に、PHPの関数exitで全スクリプトを終了させる同時に、$_SESSIONにあるメッセージも消してしまいました
    • \sites\all\modules\background_process\background_process.moduleの616行あたりをご参考

解決方法:Background Precessをアンインストールか、Views Bulk Operationの「skip batching」をチェックして、Background Precessを避けます

  • 解決方法1、Background Precessをアンインストールします
    • D7のbatchのみに使用して、Background Precessを使用しない
  • 解決方法2、Views Bulk Operationの設定(「skip batching」)オプションでBackground Precessを避けます
    • 但し、警告通りに多数のデータ処理としてはPHP処理のタイムアウトを引き起こす可能性があります
      DrupalのVBOの「skip batching」オプションでBackground Precessを避けます
  • 根本的な解決にならないですが、上記方法のどれかを選択して、問題を回避します
  • 根本的な解決方法は、Background Precessの終了時にexit関数使用の変更だと思います

検索フォーム

カテゴリ別

  • laravel
  • drupal
  • javascript
  • windows
  • html
  • mysql
  • php
  • apache
  • css
  • SEO
  • video
  • wordpress
  • linux
  • python
  • Electron
  • Visual Studio Code

google ads