Я должен сделать модуль, который динамически меняет блок короткого описания. Но этот блок не существовал в Prestashop 1.5.4, если краткое описание пусто, поэтому я подумал сделать триггер, чтобы заполнить его, если он пуст.
Вот моя функция установки:
public function install()
{
if
(
!parent::install()
OR !$this->registerHook('displayProductStatus')
OR !$this->registerHook('displayOverrideTemplate')
) {
return FALSE;
}$sql = array();
include(dirname(__FILE__) . '/init/install_sql.php');
foreach ($sql as $s)
{
if (!Db::getInstance()->Execute($s))
{
return FALSE;
}
}
return TRUE;
}
А вот и мой install_sql.php
<?php
$sql = array();
$sql[] = "DELIMITER $$
CREATE TRIGGER add_short_description
BEFORE INSERT ON ps_product_lang
for each row begin
if (NEW.description_short is NULL OR NEW.description_short = '' ) THEN
SET NEW.description_short = '.';
END IF;
END$$
DELIMITER ;";
Эта триггерная функция довольно хорошо работает, если я добавляю ее непосредственно в PHPMyAdmin, но установка завершается неудачно, когда я прохожу мимо установки модуля.
Я думаю, что это ошибка разделителя, но … я не знаю, как этого избежать.
Что я должен изменить?
(и извините за мой плохой английский, я надеюсь, что это по крайней мере понятно)
1) DELIMITER
является только клиентской командой mysql и не является частью SQL. Поэтому вы не должны включать это.
2) Теперь вы можете превратить свой курок в «однострочник»
CREATE TRIGGER add_short_description
BEFORE INSERT ON ps_product_lang
FOR EACH ROW
SET NEW.description_short = COALESCE(NULLIF(NEW.description_short, ''), '.')
Вот SQLFiddle демонстрация
3) У меня недостаточно знаний о Prestashop, но добавление триггера в составе модуля может быть очень плохой идея, потому что это может легко ввести побочные эффекты, особенно если ps_product_lang
является частью общей схемы.
Я лично был бы очень разозлился, если какой-нибудь сторонний модуль начал создавать триггеры в моей базе данных.
Других решений пока нет …