При генерации установочного пакета согласно
http://help.x-cart.com/index.php?title=X-Cart:Generating_module_distribution_packs_for_X-Cart_4
приходится генерировать diff на каждый стандартный скин. При этом не учитываются кустомы и 3rd-party скины, что ведет к проблемам при установке модуля.
Для решения этой проблемы можно использовать
smarty prefilter/outputfilters
которые вставляют точки входа модуля в текущий скин в момент компиляции(преподчтительно) или в момент вывода скина.
Для это можно использовать готовую библиотеку
http://help.x-cart.com/index.php?title=File:Dynamic_tpl_patcher.4.7.x.php
или
http://help.x-cart.com/index.php?title=File:Dynamic_tpl_patcher.4.6.x.php
Префильтры рекомендуются так как, компиляция шаблонов выполняется только 1 раз, и соотвественно вызов данных префильтров больше не происходит во время стандартной работы магазина
namespace используются, чтобы избежать конфликта имен с другими модулями
1)в функции init модуля func_MODULE_init добавляем код
http://help.x-cart.com/index.php?title=X-Cart:Generating_module_distribution_packs_for_X-Cart_4
приходится генерировать diff на каждый стандартный скин. При этом не учитываются кустомы и 3rd-party скины, что ведет к проблемам при установке модуля.
Для решения этой проблемы можно использовать
smarty prefilter/outputfilters
которые вставляют точки входа модуля в текущий скин в момент компиляции(преподчтительно) или в момент вывода скина.
Для это можно использовать готовую библиотеку
http://help.x-cart.com/index.php?title=File:Dynamic_tpl_patcher.4.7.x.php
или
http://help.x-cart.com/index.php?title=File:Dynamic_tpl_patcher.4.6.x.php
Префильтры рекомендуются так как, компиляция шаблонов выполняется только 1 раз, и соотвественно вызов данных префильтров больше не происходит во время стандартной работы магазина
namespace используются, чтобы избежать конфликта имен с другими модулями
Пример использования префильтров
1)в функции init модуля func_MODULE_init добавляем код
if (AREA_TYPE == 'C') { require $xcart_dir . XC_DS . 'modules' . XC_DS . 'Pilibaba' . XC_DS . 'lib' . XC_DS . 'dynamic_tpl_patcher.php'; modules\Pilibaba\lib\x_tpl_add_callback_patch('customer/main/cart.tpl', 'func_pilibaba_tpl_insertButton', X_TPL_PREFILTER); modules\Pilibaba\lib\x_tpl_add_callback_patch('customer/minicart.tpl', 'func_pilibaba_tpl_insertButton', X_TPL_PREFILTER); modules\Pilibaba\lib\x_tpl_add_callback_patch('modules/Add_to_cart_popup/product_added.tpl', 'func_pilibaba_tpl_insertButton', X_TPL_PREFILTER); }
2) в func_pilibaba_tpl_insertButton добавить
function func_pilibaba_tpl_insertButton($tpl_name, $tpl_source) {//{{{ if (strpos($tpl_source, 'pilibaba_enabled') !== false) { return $tpl_source; } // add button {include file="modules/Pilibaba/checkout_btn.tpl" btn_place=... $search = '%{if \$amazon_pa_enabled}[^{]*{include file="modules/Amazon_Payments_Advanced/checkout_btn.tpl"[^{]*{/if}%Ss'; $tpl_source = preg_replace_callback($search, function ($matches) { return $matches[0] . "\n" . str_replace( array('amazon_pa_enabled', 'Amazon_Payments_Advanced'), array('pilibaba_enabled','Pilibaba'), $matches[0]); }, $tpl_source ); $tpl_source = str_replace('{if $paypal_express_active || $amazon_pa_enabled', '{if $paypal_express_active || $amazon_pa_enabled || $pilibaba_enabled', $tpl_source); if (defined('XC_PILIBABA_DEBUG')) { x_log_add('pilibaba_patched_fiels', 'patched_file:' . $tpl_name . "\n" . $tpl_source); } return $tpl_source; }//}}}
Пример использования output фильтра, условно запускающегося только на некоторых страницах
if ( 'C' != x_get_area_type() && x_check_controller_condition(NULL, array('register', 'user_modify')) ) { x_tpl_add_regexp_patch( 'modules/XAuth/linked_accounts_admin.tpl', '/(<form [^>]*name="registerform"[^>]*>.+)(<tr>.+<\/tr>)/USs',