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

Аватар пользователя Антоха82

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

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

Тип материала:
Версия Drupal:
0 Thanks

Комментарии

Аватар пользователя marassa
marassa 2 месяца назад
Антоха82 написал:
название таблицы из БД и названия поля, куда будет записана информация

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

Аватар пользователя Semantics
Semantics 2 месяца назад

Думается, что вы неверным путём идёте.
Вам скорее нужно событие вызывающее запись, а не сам факт записи

Аватар пользователя Антоха82
Антоха82 2 месяца назад
Semantics написал:
Думается, что вы неверным путём идёте.

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

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

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

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

Аватар пользователя Semantics
Semantics 2 месяца назад

А я возлагаю надежды, что вы объясните задачу

Аватар пользователя marassa
marassa 2 месяца назад
Антоха82 написал:
Возлагаю надежды на hook_query_alter()

Напрасно. Какая связь между выборкой из БД и записью в БД?

Аватар пользователя Антоха82
Антоха82 2 месяца назад

А что делает этот хук hook_query_alter() ?

Аватар пользователя Антоха82
Антоха82 2 месяца назад

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

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

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

Аватар пользователя Semantics
Semantics 2 месяца назад

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

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

Аватар пользователя Антоха82
Антоха82 2 месяца назад

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

Аватар пользователя Semantics
Semantics 2 месяца назад

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

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

/**
 * Score a completed quiz.
 */

function quiz_end_scoring($result_id) {

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

Аватар пользователя Антоха82
Антоха82 2 месяца назад

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

Аватар пользователя gun_dose
gun_dose 2 месяца назад

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

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