2014-12-13 30 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