2014-12-13 24 views
0

我必须创建一个模块,以便动态更改简短说明块。但是这个块在Prestashop 1.5.4中并不存在,如果简短的描述是空的,所以我认为如果它是空的,就做一个触发器来填充它。如何通过PHP表单添加MySQL触发器(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中,但安装失败时,我通过模块安装。 我认为这是分隔符的错,但...我不知道如何避免这种情况。

我要修改什么?

(和对不起我的英文不好,我希望它至少是理解的)

回答

0

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是共同模式的一部分。 我个人应该是非常如果某些第三方模块会开始在我的数据库中创建触发器,则生气。

+0

它的工作:)谢谢! 我不知道任何其他“轻”的方式来做到这一点。我想过一个方法,当我必须做的时候改变变化描述,但是这会在这个表上执行很多更新。 此外,无法翻译的简短描述(Prestashop与Smarty合作):/ 无论如何,谢谢! – Metalovichinkov 2014-12-13 09:00:33