Modx Evo ShopKeeper

ShopKeeper - это популярнейшее расширение для интенети-магазинов. Представляет собой в общем корзину. Вокруг нее все и вертится.

Мне удобнее хранить шаблоны(TPL) в файлах. Например в папке order(оформление заказа): шаблоны cartTpl.tpl, cartRowTpl.tpl, orderDataTpl.tpl . В доках написано буквально следующее:

Чанк содержит сразу 3 шаблона - для пустой, заполненной расширенной и простой корзины. Если чанки хранятся в файлах, можно указать путь с командой "@FILE:". Если чанки созданы в системе управления, то указывается только имя чанка (например &cartTpl=`shopCart`)
Возрадовавшись я лихо набросал форму оформления заказа:
[!Shopkeeper? 
&noJQuery=`1` 
&orderFormPage=`10263` 
&flyToCart=`nofly` 
&cartTpl=`@FILE:assets/cppv/TPL/T1/otherPages/ordering/cartTpl.tpl` 
&cartRowTpl=`@FILE:assets/cppv/TPL/T1/otherPages/ordering/cartRowTpl.tpl` 
&orderDataTpl=`@FILE:assets/cppv/TPL/T1/otherPages/ordering/orderDataTpl.tpl` 
&cartType=`full`!]
И увидел пустую страницу. В исходнике нашел:
..../assets/snippets/shopkeeper/classes/class.shopkeeper.php    
......    
  /**
   *
   * @param string $tpl
   * @return string
   */
    function fetchTpl($tpl){
        $template = "";
        if(substr($tpl,-4)=='.tpl' && preg_match('/^(@FILE:)\s?(assets\/snippets\/shopkeeper\/)((chunks\/)|(module\/templates\/)).+/',$tpl))
           {
            $tpl_file = MODX_BASE_PATH . substr($tpl, 6);
            if(file_exists($tpl_file)){
              $template = file_get_contents(trim($tpl_file));
            }
        }else if(substr($tpl, 0, 6) == "@CODE:"){
            $template = substr($tpl, 6);
        }else if($this->modx->getChunk($tpl) != ""){
            $template = $this->modx->getChunk(trim($tpl));
        }else{
            $template = false;
        }
        return $template;
}
....
Т.е. эта сволочь разрешает грузить файлы-шаблоны только со своей директории. Устав порядком от таких вещей, я тупо стер
&& preg_match('/^(@FILE:)\s?(assets\/snippets\/shopkeeper\/)((chunks\/)|(module\/templates\/)).+/',$tpl)
И все заработало. Нехорошо, конечно, править источники. Но тут иначе никак.

В версии 1.3 добавлен параметр &tplPath - путь до папки с чанками. По умолчанию &tplPath=`assets/snippets/shopkeeper/chunks/ru/` . То, что надо было.

   function fetchTpl($tpl){
        $template = "";
        if(substr($tpl,-4)=='.tpl' && substr($tpl, 0, 6) == "@FILE:"){
            $tpl_file = MODX_BASE_PATH . $this->config['tplPath'] . substr($tpl, 6);
            if(file_exists($tpl_file)){
              $template = file_get_contents(trim($tpl_file));
            }        
    

Еще один глюк: я в шаблоне корзины для формы заказа решил уменьшить картинку сниппетом:

  <tr class="cart-order">
    <td class="title-col"><img src="[[phpthumb? &input=`[+catalog_item_image+]` &options=`h=60,far=C`]]" />
    <a href="[+link+]" style="text-align:center;display:block;">[+name+] [+addit_data+] </a></td>
    <td class="price-col">[+price_total+] [+currency+]</td>

    <td class="quantity-col"><input style="width: 30px;" class="shk-count" type="text" size="2" name="count[]" maxlength="3" title="изменить количество" value="[+count+]" /> </td>
    <td class="total-col">[+phx:multiply=`[+price_total+]*[+count+]`+] [+currency+] </td>
    <td class="delete-col"><a href="[+url_del_item+]" title="Удалить" class="shk-del"><span class="text-primary glyphicon glyphicon-remove"></span>

</a></td>
</tr>

При загрузке формы заказа все было ОК. Но при пересчете цены, удалении - не обрабатывались сниппеты. Пол дня потратил. Решил опять правкой исходника. Так и не понял как).

      Файл - "/assets/snippets/shopkeeper/ajax-action.php"
      
$modx = new DocumentParser;
$modx->db->connect();
$modx->getSettings();
$modx->config['site_url'] = isset($request['site_url']) ? $request['site_url'] : '';

 $tpl="[+ququ+]";
 $arr=array(ququ=>"I am ququ!!!"); $modx->placeholders=$arr;
 $out=$modx->parseDocumentSource($tpl);

        
    
Т.е. надо было предварительно запустить парсер. Просто так. Пропарсил "левый" чанк. Сам не понял почему, но стало парсить сниппеты. Т.е. все заработало.

В моей версии если назначить свой tplPath - сначала корзина показывалась, но при добавлении - исчезала. При обновлении страницы - появлялась. Причина - ошибка в коде. В shopkeeoer.js - надо добавить tplPath для передачи в ajax. И в свойствах сниппета Shopkeeper - опять же прописать tplPath. Иначе в коннекторе он затирает другие значения.

var settings_qs = '&site_url='+site_url+
'&cart_type='+shkOpt.cartType+
'&cart_tpl='+shkOpt.cartTpl[0]+
'&cart_row_tpl='+shkOpt.cartTpl[1]+
'&addit_data_tpl='+shkOpt.cartTpl[2]+
'&tplPath='+shkOpt.tplPath+
'¤cy='+shkOpt.currency+
'&price_tv='+shkOpt.priceTV+
'&link_allow='+shkOpt.linkAllow+
'&nocounter='+shkOpt.noCounter+
'&change_price='+shkOpt.changePrice+
'&order_page='+shkOpt.orderFormPage;

В последней версии shK доп. параметры можно назначить через multiTv. Вот тут все это описано: http://modx.im/blog/fast-solution/4194.html. Надо только учесть, что сохраняться будут только связка полей "size"=>"price". Поэтому нельзя назначить произвольные поля для сохранения.

И для того чтобы все работало, нужно чтобы multiTv генерил примерно такой код

<select class="addparam" onchange="jQuery.additOpt(this)" name="komplect_items__65">
    <option value="0__250" selected="selected"> 
        150см х 300см   
    </option>
    <option value="1__30"> 
        100см х 1500см   
    </option>
    <option value="2__600"> 
        100см х 1200см   
    
</select>
* где komplect_items__65: komplect_items - имя TV с multiTv; 65 - ид страницы товара, к которому прявязан TV.
  в <option value="0__250" selected="selected">  0__250: 0 - номер сроки в таблице multiTv; 250 - значение поля PRICE. 
  вроде все просто и логично, но у меня ушло пол-дня, чтоб въехать. только рытье исходников помогло.
  в статье автор только приводит свою реализацию, которая у меня не сработала. 
  лучше бы они писали - что нужно получить. ну со стороны виднее))).

Все эти поля на странице товара должны находиться внутри тега form, где цена и прочие поля для shK. Т.к. js при изменении значения доппараметра ищет его родителя с тэгом form и выбирает все дочерние поля ужет относительно этого родителя.

Выводятся доппараметры в шаблон "additDataTpl". Доступны плейсхолдеры

param - формируется так "$name ($price)", если цена=0 - просто "$name"
name - $name
price - $this->numberFormat($price)

плейсхолдер addit_data(генерится в шаблон additDataTpl) можно вставить только в шаблон строки(cartRowTpl).
Что в общем логично. Сейчас. Я, дак, долго не мог понять почему никакой реакции. Думал, что они могут быть выведены отдельно в любом месте корзины.
    

Это главный массив при обработке плагинов, формирования доп.параметров, вывода корзины и проч.

$purchases=Array
(
    [0] => Array
        (
            [0] => 71
            [catalog] => 0
            [tv_add] => Array
                (
                    [imgTovar] => assets/cache//images/karta-postavok-60x60-1d7.jpg
                    [shk_imgTovar] => assets/cache//images/karta-postavok-60x60-1d7.jpg
                )

            [1] => 1
            [2] => 450
        )

    [1] => Array
        (
            [0] => 71
            [catalog] => 0
            [1] => 1
            [2] => 450
        )

    [2] => Array
        (
            [0] => 70
            [catalog] => 0
            [tv_add] => Array
                (
                    [parent] => 66
                    [shk_parent] => 66
                )

            [1] => 1
            [2] => 560
        )

    [3] => Array
        (
            [0] => 71
            [catalog] => 0
            [tv_add] => Array
                (
                    [parent] => 66
                    [shk_parent] => 66
                )

            [1] => 1
            [2] => 450
        )

    [4] => Array
        (
            [0] => 65
            [catalog] => 0
            [tv_add] => Array
                (
                    [shk_komplect_items] => 150см х 300см
                )

            [1] => 2
            [2] => 250
        )

    [5] => Array
        (
            [0] => 67
            [catalog] => 0
            [tv_add] => Array
                (
                    [parent] => 66
                    [shk_parent] => 66
                )

            [1] => 2
            [2] => 230
        )

)

В общем все работает хорошо, если все поправить и разобраться. Не считая нервов заказчика). Им надо все быстро.


Комментарии 0






Разрешённые теги: <b><i><br>Добавить новый комментарий: