Отслеживание изменений в записях и дополнительная обработка на 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. Также нужно разбираться в структуре базы данных и понимать каким образом хранится информация.
