メインコンテンツに移動

メインナビゲーション

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

パンくず

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

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

drupal
Views
rules

やりたいこと: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関数使用の変更だと思います
Embedded thumbnail for Drupalのモジュール(Background Precess)が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)