2015-05-08 78 views
3

我是Prestashop的學習插件開發人員。我一直在試圖解決這個問題很長一段時間,你如何正確地覆蓋模塊中的模板文件?覆蓋模塊中的核心模板文件

來源::

/modules/<module>/views/templates/admin/products/informations.tpl 

要:

/override/controllers/admin/templates/products/informations.tpl 

重寫整個此刻我從我的模塊複製在覆蓋文件夾中的模板文件上安裝覆蓋整個文件文件只是爲了添加一個輸入字段似乎很粗糙。

這工作得很好,但我很擔心,因爲如果用戶安裝了一些其他模塊,想要使用相同的文件,它會損壞或Prestashop的新版本更改文件,它不再支持新版本。在每一種感覺都像是一個骯髒的解決方案的方式。

有沒有辦法只覆蓋文件的一部分,也許直接從模塊文件夾?有沒有更好的方法來做到這一點?你怎麼做到這一點?

+1

使用JS這一點。製作一個包含您的新div/input的TPL文件,然後將所需內容插入到任意位置。 '$('#my_div')。insertAfter('#element_id');' – UnLoCo

回答

0

如果您的模塊需要更改.tpl文件中的某些代碼,最好是在oryginal .tpl中執行,並在那裏放置IF-ELSE語句,僅在模塊處於打開狀態時纔會添加輸入字段。當有人更新腳本時,您無法避免銷燬這些文件。

您可以考慮一些將在客戶端添加輸入的JS解決方案。

+0

希望你不對:D我希望他們能像控制器和類一樣容易實現。 – numsu

1

要覆蓋PrestaShop中的模板,您需要覆蓋模塊控制器中的hookDisplayOverrideTemplate方法。

要註冊掛鉤,將它添加到您的安裝功能:

$this->registerHook('DisplayOverrideTemplate');

現在你自己的版本功能添加到您的服務器文件.tpl。

public function hookDisplayOverrideTemplate($params) 
{ 
    $controllerName = get_class($params['controller']); 
    $tpl = dirname(__FILE__) . '/views/templates/override/example.tpl'; 
    if ($controllerName == 'ExampleController' && file_exists($tpl)) 
     return $tpl; 
    return false; 
} 

在我的例子,你需要把你想與你的模塊裏面/views/template/override文件夾覆蓋你的模板。

加載頁面時,前端控制器classes/controller/FrontController.php調用hookDisplayOverrideTemplate函數,如果返回了模板,則會加載該模板,否則會加載默認模板。

我測試了這一點,並知道它的Prestashop V1.5和V1.6