Как перехватить данные перед записью в БД?

Главные вкладки

Аватар пользователя Антоха82 Антоха82 10 июля 2018 в 18:54

Собственно вопрос в теме. Есть некий модуль, который при определенном условии записывает в базу данных какую-то информацию. Мне нужно, зная название таблицы из БД и названия поля, куда будет записана информация отловить тот момент, когда она будет записана. Возможно ли такое?

Пытаюсь реализовать что-то подобное с помощью хука hook_query_alter(), но ничего не выходит. Какие-то теги там, непонятно. Мне менять эти данные не нужно, только отловить сам момент их записи.

Комментарии

Аватар пользователя marassa marassa 10 июля 2018 в 19:55

Антоха82 wrote:

название таблицы из БД и названия поля, куда будет записана информация

Это поле друпаловской сущности или какая-то левая таблица? Если первое, то можно пробовать hook_entity_presave , а вот если второе, то это вообще мимо друпала на уровне БД как-то надо делать, но как - не подскажу.

Аватар пользователя Антоха82 Антоха82 10 июля 2018 в 22:06

Semantics wrote:

Думается, что вы неверным путём идёте.

Вам скорее нужно событие вызывающее запись, а не сам факт записи

Для этого нужно разбираться в чужих модулях. Гораздо проще было бы отловить именно сам факт записи и желательно саму информацию.
Возлагаю надежды на hook_query_alter(). Вот что написано в книжке:

Этот хук используется для изменения запросов, созданных где угодно в Drupal, без
непосредственного изменения кода самих модулей. Все объекты запроса динамиче-
ской выборки передаются через функцию hook_query_alter() методом execute()
непосредственно перед компиляцией строки запроса.

Только вот как пользоваться этой функцией hook_query_alter(), не понятно.

Аватар пользователя Антоха82 Антоха82 10 июля 2018 в 22:20

Чтобы было ясно, что я хочу реализовать.
Предположим есть модуль module_1 который записывает в таблицу tabl (созданную вручную или во время установки модуля) в поле znachenie какую-то информацию. Что-то вроде:

<?phpdb_insert('tabl')
    ->fields(array
        (
        ' znachenie' => 1,
        )
    )
    ->execute();?>

Есть модуль module_2 который хочет отловить тот момент, когда в поле znachenie будет записана информация. Понятно, что логичнее всего было бы исходить из самого события, которое заставляет первый модуль эту информацию заносить в БД, но проблема в том, что первый модуль писал не я и разобраться не профессионалу в нем довольно сложно.

Аватар пользователя Semantics Semantics 10 июля 2018 в 22:34

Вы на вопрос не ответили вообще никак.
С такими теоретическими изысканиями вы задачу не решите.

Конкретно, что за модуль и когда он делает запись в базу?

Аватар пользователя Антоха82 Антоха82 10 июля 2018 в 22:46

Конкретно модуль quiz, он нужен для проведения тестов. Когда пользователь заканчивает выполнение теста, в БД в таблицу quiz_node_results в поле time_end заносится время, когда тест закончен. Нужно отловить этот момент, т.е. перед тем, как эта запись будет сделана мой модуль должен на это отреагировать.

Аватар пользователя Semantics Semantics 10 июля 2018 в 22:57

Правильное решение:
В конце теста юзер наверняка нажимает какую-то кнопку на форме, у каждой кнопки есть submit, там оттуда идёт запись.

Решение быстрое:
Тупо поиск по названию таблицы и названию поля

/**
 * Score a completed quiz.
 */

function quiz_end_scoring($result_id) {

Вот она, походу, искомая функция.
Там происходит entity_save()
Как прицепиться к сохранению сущности вам ранее ответили.

Аватар пользователя Антоха82 Антоха82 10 июля 2018 в 23:01

Ясно. Ну, я так и пытался, пока безуспешно. Просто думал чтобы в чужих модулях не копаться, обхитрить их. Но, видимо так нельзя. Ладно, спасибо, будем пытаться.

Аватар пользователя gun_dose gun_dose 11 июля 2018 в 6:53

Так можно, но не нужно. В чужих модулях лучше покопаться, станет ясен принцип работы и будет возникать меньше вопросов.

А вообще, самый быстрый путь: открываете файл имя_модуля.api.php - там список хуков модуля, просто ищите, что из них вам подойдёт.