Собственно вопрос в теме. Есть некий модуль, который при определенном условии записывает в базу данных какую-то информацию. Мне нужно, зная название таблицы из БД и названия поля, куда будет записана информация отловить тот момент, когда она будет записана. Возможно ли такое?
Пытаюсь реализовать что-то подобное с помощью хука hook_query_alter(), но ничего не выходит. Какие-то теги там, непонятно. Мне менять эти данные не нужно, только отловить сам момент их записи.
Комментарии
hook_query_alter
Это поле друпаловской сущности или какая-то левая таблица? Если первое, то можно пробовать hook_entity_presave , а вот если второе, то это вообще мимо друпала на уровне БД как-то надо делать, но как - не подскажу.
Думается, что вы неверным путём идёте.
Вам скорее нужно событие вызывающее запись, а не сам факт записи
Для этого нужно разбираться в чужих модулях. Гораздо проще было бы отловить именно сам факт записи и желательно саму информацию.
Возлагаю надежды на hook_query_alter(). Вот что написано в книжке:
Только вот как пользоваться этой функцией hook_query_alter(), не понятно.
А я возлагаю надежды, что вы объясните задачу
Напрасно. Какая связь между выборкой из БД и записью в БД?
А что делает этот хук hook_query_alter() ?
Чтобы было ясно, что я хочу реализовать.
Предположим есть модуль module_1 который записывает в таблицу tabl (созданную вручную или во время установки модуля) в поле znachenie какую-то информацию. Что-то вроде:
<?phpdb_insert('tabl')
->fields(array
(
' znachenie' => 1,
)
)
->execute();?>
Есть модуль module_2 который хочет отловить тот момент, когда в поле znachenie будет записана информация. Понятно, что логичнее всего было бы исходить из самого события, которое заставляет первый модуль эту информацию заносить в БД, но проблема в том, что первый модуль писал не я и разобраться не профессионалу в нем довольно сложно.
Вы на вопрос не ответили вообще никак.
С такими теоретическими изысканиями вы задачу не решите.
Конкретно, что за модуль и когда он делает запись в базу?
Конкретно модуль quiz, он нужен для проведения тестов. Когда пользователь заканчивает выполнение теста, в БД в таблицу quiz_node_results в поле time_end заносится время, когда тест закончен. Нужно отловить этот момент, т.е. перед тем, как эта запись будет сделана мой модуль должен на это отреагировать.
Правильное решение:
В конце теста юзер наверняка нажимает какую-то кнопку на форме, у каждой кнопки есть submit, там оттуда идёт запись.
Решение быстрое:
Тупо поиск по названию таблицы и названию поля
* Score a completed quiz.
*/
function quiz_end_scoring($result_id) {
Вот она, походу, искомая функция.
Там происходит entity_save()
Как прицепиться к сохранению сущности вам ранее ответили.
Ясно. Ну, я так и пытался, пока безуспешно. Просто думал чтобы в чужих модулях не копаться, обхитрить их. Но, видимо так нельзя. Ладно, спасибо, будем пытаться.
Так можно, но не нужно. В чужих модулях лучше покопаться, станет ясен принцип работы и будет возникать меньше вопросов.
А вообще, самый быстрый путь: открываете файл имя_модуля.api.php - там список хуков модуля, просто ищите, что из них вам подойдёт.