私はDate iCalモジュールの作成者であり、現在取り組んでいる新しいメジャーバージョン(3.x)では、2.xがインストールされているユーザーに対して2部構成のスキーマ更新が必要です。これらの変更を行う更新フックを記述しましたが、ユーザーの1人がデータベース更新スクリプトの実行に失敗すると、iCalフィードインポーターに関連するエラーメッセージが表示されます。
正しい解決策は、更新スクリプトを実行することです...しかし、彼らが入り、手動でインポーターを変更してメッセージを取り除く場合、インポーターは永続的に壊れたままになります(スキーマ更新の2番目の部分は行われないため)実行されました)。
では、更新を実行していないユーザーにメッセージを表示する方法はありますか?または、3.xが2.xの上にインストールされたときにページのロードが初めて発生したときに、どういうわけか更新フックを強制的に実行しますか?
jimajammaからのコメントの拡張:
更新関数で
variable_set()
を実行して、正常に実行されたときに_preprocess_page()内で確認できる変数を設定します
すべてのページの読み込みでこれをチェックする代わりに、管理領域を参照し、インストールされているバージョンが3.0(3.1、3.2、アップグレードパスとしての古いバージョンのサポートを停止した場合はそのチェックを終了する)の場合にのみ実行します。
さらに hook_requirements を使用して、ステータスレポートページにフィードバックを提供します。
インストール要件を確認し、ステータスレポートを作成します。
(...)
「ランタイム」フェーズは、純粋なインストール要件に限定されず、メンテナンスタスクやセキュリティの問題など、より一般的なステータス情報にも使用できます。
モジュールの更新を強制する方法はいくつかあります。
更新関数を直接呼び出す。
_$sandbox = [];
module_load_include('install', 'FOO');
FOO_update_7001($sandbox);
_
スキーマバージョンを目的のポイントにリセットし、通常どおりに更新を再度実行します。
_drupal_set_installed_schema_version('module_name', '7000');
_
または、リセットして最新の更新スキーマのみを再実行します。
_drupal_set_installed_schema_version('foo', drupal_get_installed_schema_version('foo') - 1);
_
ノート:
hook_install
_に配置できるため、更新プロセス中にすべての後続の更新フックが実行されます。この関数をインストールファイルの外で使用するには、まずDrupal _install.inc
_とモジュールのインストールファイルを含めます。
_require_once DRUPAL_ROOT . '/includes/install.inc';
module_load_include('install', 'foo');
_
ini_set('max_execution_time', 0);
を追加することを検討してください。drush
を使用します。いくつかの例を以下に示します。
drush eval 'module_load_include('install', 'foo'); $s = []; foo_update_7001($s);'
drush sqlq "UPDATE system SET schema_version = 7000 WHERE name = 'foo'" && drush -y updb
_(回答に書き換え)
「SELECT schema_version FROM system」を実行して、更新が実行されたかどうかを検出できます。そうでない場合は、実行を拒否してください(エラーメッセージが表示されます)。
上記の提案に同意します-私の唯一の追加は「トリガーとアクション」も調査することです-トリガー(ユーザーが管理ページをチェックするなど)がプルされたときにアクション(ユーザーに通知するか更新を実行する)が発生する必要があるようです。使用例については、サンプルモジュールを参照してください。アクションとトリガーの両方のサンプルコードがあります。 :)
function MYMODULE_install() { $functions = get_defined_functions(); foreach ($functions['user'] as $function) { if (strpos($function, 'MYMODULE_update_') === 0) { call_user_func($function); } } }