Fork me on GitHub

Отслеживание изменений в записях и дополнительная обработка на PHP

Вы можете использовать вычислимые поля в таблицах, но может возникнуть ситуация, когда они не смогут помочь в решении какой-то задачи. Например, при изменении записи невозможно стандартными средствами изменить данные в другой таблице, отправить уведомление, вычислить значение поля с использованием данных из других таблиц или провести дополнительную проверку и корректировку значений. Для решения таких проблем имеется возможность реализовать специальные функции на языке PHP. Функция для перехвата изменений должна иметь название update _[алиас таблицы] и принимать параметр $id, в котором будет передаваться идентификатор созданной или измененной записи в указанной таблице. Если таблица не имеет алиаса, то укажите вместо него числовой идентификатор таблицы.

function update_action( $id ) {
    $db = DB::GetInstance();
}

Функция, в приведенном примере, ничего не делает, но она будет вызываться после каждого успешного добавления или изменения любой записи в таблице с алиасом action. Внутри функции вы можете писать любой код на языке PHP. Для доступа к базе данных можно использовать методы из модуля lib/safemysql.class.php и lib/extmysql.class.php. Описывать функции можно или прямо в conf.inc.php или подключить там в виде отдельного файла.

Рассмотрим конкретный пример. Предположим, в таблице handmade учитываются какие-то работы и имеется связь с таблицей материалов materials где указаны цены за единицу продукции. В таблице handmade у каждой работы вы можете выбрать несколько материалов и в поле amount указать количество потраченных материалов через '/'.


Реализуем специальную функцию для автоматического заполнения поля Summary, чтобы каждый раз вручную не считать сумму потраченную на материалы и стоимости самой работы.

function update_handmade( $id )
{
    $db = DB::GetInstance();
    $item = $db->getrow("select amount, wcost, m.cost as cost from `handmade` as t
          left join materials as m on m.id = t.materials
          where t.id=?s", $id );
    $actions = explode( '/', $item['amount'] );
    $list = $db->getall("select m.cost from ?n as t
          left join materials as m on m.id = t.idmulti
          where t.idcolumn=?s && t.iditem=?s order by t.id", ENZ_ONEMANY, 51, $id );
    $sum = (int)$item['wcost'] + ( isset($actions[0] ) ? $item['cost']*$actions[0] : 0 );
    $i = 1;
    foreach ( $list as $il )
    {
        if ( isset( $actions[$i])) {
             $sum += $il['cost'] * $actions[$i];
        }
        $i++;
    }
    $db->update( 'handmade', array( 'sum' => $sum ), '', $id );
}

В результате работы данной функции будет автоматически вычисляться значение поля Summary.

Следует заметить, что данная возможность бесполезна для простого пользователя. Как минимум, нужно быть знакомым с языком программирования PHP и языком запросов MySQL. Также нужно разбираться в структуре базы данных и понимать каким образом хранится информация.