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