回答:
Drupalだけを使用するのは不可能のようです。つまり、
variable_set()
それ自体はフックを呼び出しませんが、を使用しdb_merge()
ます。その関数はMergeQuery
クラスを使用しています。さて、でフックするのは良いことですhook_query_alter()
が、それはQueryAlterableInterface
インターフェースを実装するクエリクラスに対してのみ機能します。残念ながら、このインターフェースはSelectQuery
とSelectQueryExtender
クラスによってのみ実装され、クラスでは実装されなくなりましたMergeQuery
。
の子クラスを作成する方法を見つけたとしてもMergeQuery
、それはを実装しQueryAlterableInterface
、Drupalに使用させることに注意してください。hook_query_alter()
タグがあるクエリでのみ機能し、variable_set()
そのクエリにタグを付けないため、コアをハックする意思がない限り、フックはとにかく使用されません。しかし、もしそうなら、あなたはそれすべてを必要としません、あなたは単にフックコールをハックすることができます。
筋金入りに感じる場合は、より間接的なPHPアプローチ$conf
を使用できます。これは、構成変数のグローバル配列です。Stack Overflowで説明されているように、配列のように機能するオブジェクトでそれを置き換えるモジュールを作成できます。これを良い代替品にするには、実装する必要がありますArrayAccess
。オリジナルからすべての値を$conf
オブジェクトにプルします。次に、ArrayAccess::offsetSet()
ロギングロジックを実装します。
コードよりも高速なデータベーストリガーを使用できます。
古い値を格納するテーブルを作成する
CREATE TABLE variable_backup
(
name varchar(128) not null,
value longblob,
updated datetime not null,
primary key (name, updated)
);
1つは挿入用、もう1つは更新用のトリガーを作成します。
CREATE TRIGGER backup_variable_update BEFORE UPDATE ON variable
FOR EACH ROW
INSERT INTO variable_backup (name, value, type, updated) VALUES (OLD.name, OLD.value, "update", NOW());
CREATE TRIGGER backup_variable_insert BEFORE INSERT ON variable
FOR EACH ROW
INSERT INTO variable_backup (name, value, type, updated) VALUES (NEW.name, NEW.value, "insert", NOW());
これで、すべての更新と挿入により、古い値がvariable_backupに記録されます。
あなたがソースコード内で見ることができるように、variable_set()
無例えば、フックまたは変更のための要求を行うものではありませんmodule_invoke_all()
か、drupal_alter()
そこを呼び出します。
function variable_set($name, $value) {
global $conf;
db_merge('variable')->key(array('name' => $name))->fields(array('value' => serialize($value)))->execute();
cache_clear_all('variables', 'cache_bootstrap');
$conf[$name] = $value;
}
ただし、db_merge()
特別に配置されたクエリをリッスンし、hook_query_alter()
そこで追加の処理を実行できる場合がありますが、Molotによって指摘されhook_query_alter()
ているように、db_merge()
クエリをターゲットにできる可能性は低いようです。
または、変数テーブルのcronスナップショットを作成して、そのテーブルの以前のリビジョンと比較するか、比較するために他の形式の変数リビジョンストレージを実装することもできます。
QueryAlterableInterface
実際に8 はQuery
それ自体で実装されています。しかし、8で構成管理はとにかく再構築されます。7つでは、タグ付けされた選択クエリのみが私が見る限り変更可能です。しかし、何かが足りないのでしょうか?
Drupal.orgで機能リクエストチケットを開いて、システム変数の設定をインターセプトおよび削除するためのフックを作成し、このためのコアパッチをレビューのために提出しました!参照してください:
$conf
その当時はほとんど何でもできる方法をすでに見つけていました:D私の更新された答えが誰かを助けることを願っています。