Кажется, что невозможно использовать только Drupal, что означает:
variable_set()
Сам по себе не вызывает никаких хуков, но использует db_merge()
. Эта функция использует MergeQuery
класс. Теперь было бы неплохо подключиться hook_query_alter()
, но это работает только для классов запросов, которые реализуют QueryAlterableInterface
интерфейс. К сожалению, этот интерфейс теперь реализован только с помощью SelectQuery
и в SelectQueryExtender
классах, а не в MergeQuery
классе.
Обратите внимание, что даже если вы найдете способ создать дочерний класс MergeQuery
, который реализует QueryAlterableInterface
и заставит его использовать Drupal. hook_query_alter()
работает только с запросами, которые имеют теги, и variable_set()
не помечает его запрос, поэтому ловушка не будет использоваться в любом случае, если вы не захотите взломать ядро. Но если вам это нужно, вам не нужно все это, вы можете просто взломать вызов.
Если вы чувствуете хардкор, вы можете использовать более косвенный подход PHP: $conf
это глобальный массив переменных конфигурации; Вы можете написать модуль, который заменит его объектом, действующим как массив, как описано в Переполнении стека . Чтобы сделать его хорошей заменой, вам нужно реализовать ArrayAccess
. Вытащите все значения из оригинала $conf
в ваш объект. Затем ArrayAccess::offsetSet()
внедрите свою логику регистрации.
$conf
своем старом ответе и уже нашел, как сделать с ним что- то еще: D Надеюсь, мой обновленный ответ кому-нибудь поможет.Вы можете использовать триггер базы данных, который будет быстрее, чем код.
Вот документация по MySQL .
создать таблицу для хранения старых значений
создайте свои триггеры, один для вставки и один для обновления:
Теперь все ваши обновления и вставки будут записывать старые значения в variable_backup.
источник
Как вы можете видеть в исходном коде,
variable_set()
не запрашивает хуки или изменения, например, нетmodule_invoke_all()
илиdrupal_alter()
звонки туда.Тем не менее, вы можете прослушать
db_merge()
запрос в специально размещенном местеhook_query_alter()
и выполнить некоторую дополнительную обработку, но, как указал Молот,hook_query_alter()
вряд ли удастся нацелиться наdb_merge()
запрос.В качестве альтернативы, вы можете сделать снимок таблицы переменных cron, чтобы сравнить ее с предыдущими ревизиями этой таблицы, или реализовать какую-либо другую форму хранения ревизий переменных для сравнения.
источник
QueryAlterableInterface
действительно реализованоQuery
само собой. Но в 8 управление конфигурацией все равно перестраивается. И в 7 только помеченные запросы выбора изменяются, насколько я вижу. Но может я что-то упустил?Я открыл тикет Feature Request на Drupal.org, чтобы создать перехватчики для перехвата установки и удаления системных переменных, и я отправил на проверку основной патч для этого! Посмотри пожалуйста:
https://www.drupal.org/project/drupal/issues/2934718
источник