Difference between revisions of "X-Cart:Dynamic .tpl Patcher"

From X-Cart 4 Classic
Jump to: navigation, search
(Using dinamic .tpl patcher to create a module)
 
m (Using the dinamic .tpl patcher to create a module)
 
(5 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
== Using the dinamic .tpl patcher to create a module ==
  
== Using dinamic .tpl patcher to create a module ==
+
This article is intended for X-Cart module developers; it explains how to use dinamic .tpl patcher when creating a module.<br /> 
  
You can use smarty prefilters/ output filters to insert the module entry points in the current skin while compilation - which is preferrable - or when the template is displayed.  
+
During the distribution pack generating you have to generate a diff file for every graphic template.
 +
(Please see: [[X-Cart:Generating_module_distribution_packs_for_X-Cart_4]])
 +
3rd-party templates and customizations are not considered, which may lead to difficulties installing the module.<br /> 
 +
 
 +
To solve this problem, you can use smarty prefilters/output filters to insert the module entry points in the current skin during compilation - which is preferable - or when the template is displayed.<br />
 +
 
 +
You may find the files here: <br />[[File:Dynamic_tpl_patcher.4.7.x.php]]
 +
<br />or here: <br />[[File:Dynamic_tpl_patcher.4.6.x.php]]
  
You may find the files here: http://help.x-cart.com/index.php?title=File:Dynamic_tpl_patcher.4.7.x.php
 
or here: http://help.x-cart.com/index.php?title=File:Dynamic_tpl_patcher.4.6.x.php
 
  
 
'''Examples of using prefilters:'''  
 
'''Examples of using prefilters:'''  
  
1) adding the following piece of code in init function of func_MODULE_init  
+
: 1. adding the following piece of code in init function of func_MODULE_init  
 
 
  
  if (AREA_TYPE == 'C') {
+
<pre>  if (AREA_TYPE == 'C') {
 
         require $xcart_dir . XC_DS . 'modules' . XC_DS . 'Pilibaba' . XC_DS . 'lib' . XC_DS . 'dynamic_tpl_patcher.php';
 
         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/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('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);
 
         modules\Pilibaba\lib\x_tpl_add_callback_patch('modules/Add_to_cart_popup/product_added.tpl', 'func_pilibaba_tpl_insertButton', X_TPL_PREFILTER);
     }  
+
     } </pre>
 
 
  
  
 +
: 2. adding the following in func_pilibaba_tpl_insertButton
  
2) add the following in func_pilibaba_tpl_insertButton
+
<pre>function func_pilibaba_tpl_insertButton($tpl_name, $tpl_source) {//{{{
 
 
function func_pilibaba_tpl_insertButton($tpl_name, $tpl_source) {//{{{
 
 
     if (strpos($tpl_source, 'pilibaba_enabled') !== false) {
 
     if (strpos($tpl_source, 'pilibaba_enabled') !== false) {
 
         return $tpl_source;
 
         return $tpl_source;
Line 48: Line 51:
 
     return $tpl_source;
 
     return $tpl_source;
 
}//}}}  
 
}//}}}  
 +
</pre>
  
  
 
'''Example of using output filter run on certain pages:'''  
 
'''Example of using output filter run on certain pages:'''  
  
if (
+
<pre>if (
 
     'C' != x_get_area_type()
 
     'C' != x_get_area_type()
 
     && x_check_controller_condition(NULL, array('register', 'user_modify'))
 
     && x_check_controller_condition(NULL, array('register', 'user_modify'))
Line 64: Line 68:
 
}
 
}
 
x_tpl_add_listener('modules/XAuth/register.tpl', 'before', 'func_xauth_prepare_register');
 
x_tpl_add_listener('modules/XAuth/register.tpl', 'before', 'func_xauth_prepare_register');
x_tpl_add_listener('modules/One_Page_Checkout/profile/account_info.tpl', 'before', 'func_xauth_prepare_register');
+
x_tpl_add_listener('modules/One_Page_Checkout/profile/account_info.tpl', 'before', 'func_xauth_prepare_register');</pre>
 +
 
  
 +
Using prefilters helps to simplify inserting modules entry points, including 3rd-party and custom-built modules.
  
Using prefilters helps to simplify adding modules insert points, including 3rd-party modules.
+
[[Category:X-Cart developer guide]]

Latest revision as of 10:23, 26 October 2016

Using the dinamic .tpl patcher to create a module

This article is intended for X-Cart module developers; it explains how to use dinamic .tpl patcher when creating a module.

During the distribution pack generating you have to generate a diff file for every graphic template. (Please see: X-Cart:Generating_module_distribution_packs_for_X-Cart_4) 3rd-party templates and customizations are not considered, which may lead to difficulties installing the module.

To solve this problem, you can use smarty prefilters/output filters to insert the module entry points in the current skin during compilation - which is preferable - or when the template is displayed.

You may find the files here:
File:Dynamic tpl patcher.4.7.x.php
or here:
File:Dynamic tpl patcher.4.6.x.php


Examples of using prefilters:

1. adding the following piece of code in init function of 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. adding the following in 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;
}//}}} 


Example of using output filter run on certain pages:

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',

        '\1%%\2'
    );
}
x_tpl_add_listener('modules/XAuth/register.tpl', 'before', 'func_xauth_prepare_register');
x_tpl_add_listener('modules/One_Page_Checkout/profile/account_info.tpl', 'before', 'func_xauth_prepare_register');


Using prefilters helps to simplify inserting modules entry points, including 3rd-party and custom-built modules.