Еще один хак для плагина basket

Вот еще одна доработка(хак,костыль) для плагина basket.
И так предположим у нас есть каталог продукции, с различными параметрами не влияющими на стоимость (например размер или цвет).
Задача: сделать вывод этого параметра в корзину и в письмо feedback’a. Решение задачи, когда параметр влияет на стоимость представлено в другой теме.
1) Создаем в xfields дополнительное текстовое поле: Новости → табличные данные. Например, size (Размер модели).
Еще один хак для плагина basket
2) Заполняем таблицу из одного столбца для каждого продукта. Если продукт не имеет такого показателя, оставляем незаполненным.
3) Редактируем basket/lib/librpc.php, для того чтобы плагин мог работать с таблицами без «ценового столбца».
Найти https://github.com/vponomarev/ngcms-plu … #L130-L139
Заменить на:

Код:
 $xc = xf_configLoad();
$xfData = xf_decode($nrec['xfields']);
$xfTData = unserialize($rec['xfields']);
// Get price
if (pluginGetVariable('basket', 'ntable_price') && isset($xfTData[pluginGetVariable('basket', 'ntable_price')])) {
$price = $xfTData[pluginGetVariable('basket', 'ntable_price')];
} elseif (pluginGetVariable('basket', 'news_price') && isset($xfData[pluginGetVariable('basket', 'news_price')])) {
$price = $xfData[pluginGetVariable('basket', 'news_price')];
} else {
$price = 0;
}

4) Выводим в news.full.tpl элементы — radio переключатели выбора параметра:

Код:
 {% if p.xfields._table.countRec > 0 %}
{% for xdata in p.xfields._table.data %}
<input id="{{ xdata.id }}" type="radio" name="size" value="{{ xdata.field_size }}">
<label for="{{ xdata.id }}">{{ xdata.field_size }}</label>
{% endfor %}
<hh>
{% endif %}

5) Выводим кнопку/ссылку «Добавить в корзину» (в news.full.tpl):

Код:
 <a href="#" class="purchase">Добавить В корзину</a>

6) Пишем обработчик на JS + TWIG (в news.full.tpl):
Работает по принципу: если таблица размеров в новости заполнена, то заставить пользователя выбрать размер и добавить продукт в корзину. Если таблица не заполнена, то добавить продукт в корзину. TWIG конструкции можно переписать на JS/JQ, если в этом есть необходимость.

Код:
 <script>
$(document).ready(function() {

$(".purchase").click(function(e){
{% if p.xfields._table.countRec > 0 %}
var count = 1;
var tblid = 0;
tblid = $("input[type='radio']:checked").attr('id');
if(typeof tblid == "undefined"){
alert('<red>Вы не выбрали размер!</red>');
return false;
}
rpcBasketRequest('plugin.basket.manage', {'action': 'add', 'ds':51,'id':tblid,'count':count});
return false;
{% else %}
rpcBasketRequest('plugin.basket.manage', {'action': 'add', 'ds':1,'id':{news-id},'count':1});
{% endif %}

e.preventDefault();
});

});
</script>

7) Вывести переменную в таблицу в шаблонах /plugins/basket/list.tpl и /plugins/basket/lfeedback.tpl

Код:
 {{ entry.xfields.tdata.size }}

Второй хак
Предположим у нас есть каталог продукции, с различными параметрами среди которых есть изображения.
Задача: сделать вывод изображения продукта в корзине, сделать возможным использовать ссылку на новость в письмах-заказах feedback’a.

0) Важно не забывать, что в шаблонах /plugins/basket/list.tpl и /plugins/basket/lfeedback.tpl, как и в любых других TWIG шаблонах работают функции debagValue() и debugContext(), которые позволяют вывеси все возможные для использования переменные. Например:

Код:
 {{ debugValue(entries) }}

Однако, к некоторым данным из новости нет доступа из шаблонов /plugins/basket/list.tpl и /plugins/basket/lfeedback.tpl (например ссылка на новость или изображения новости).
1) Редактируем basket/basket.php, для того чтобы плагин мог доставать нужные данные из таблиц news и images.
Требуется найти функциях plugin_basket_list(), onShow($formID, $formStruct, $formData, &$tvars), onProcess($formID, $formStruct, $formData, $flagHTML, &$tvars):

Код:
 $total += round($rec['price'] * $rec['count'], 2);

Ниже добавить:

Код:
 $linked_ds = $rec['linked_ds'];
$linked_id = $rec['linked_id'];
// Check if linked item is available

switch ($linked_ds) {
case $DSlist['news']:
// Retrieve news record
$recf = $mysql->record("select * from ".prefix."_news where id = ".db_squote($linked_id));
if (!is_array($recf)) {
return array('status' => 0, 'errorCode' => 3, 'errorText' => 'Item [news] with ID ('.$linked_id.') is not found');
}

$rec_img = array();
$img_urls = array();
foreach ($mysql->select("select * from ".prefix."_images where (plugin = 'xfields') AND (linked_id = ".db_squote($linked_id).")") as $irec) {
$rec_img []= $irec;
}
foreach ($rec_img as $imgInfo) {
$img_urls[] = ($imgInfo['storage']?$config['attach_url']:$config['images_url']).'/'.$imgInfo['folder'].'/'.$imgInfo['name'];
}

$xc = xf_configLoad();
$xfData = xf_decode($recf['xfields']);

$rec['news'] = $recf;
$rec['images'] = $img_urls;
$rec['news_url'] = home.newsGenerateLink($recf);

case $DSlist['#xfields:tdata']:
// Retrieve XFields record
$recf = $mysql->record("select * from ".prefix."_xfields where id = ".db_squote($linked_id));
if (!is_array($recf)) {
return array('status' => 0, 'errorCode' => 4, 'errorText' => 'Item [tdata] with ID ('.$linked_id.') is not found');
}

// Retrieve joined record (assume that it can be only news
if ($recf['linked_ds'] != $DSlist['news']) {
return array('status' => 0, 'errorCode' => 5, 'errorText' => 'Sorry, only news related XFields tables are supported now');
}

$nrec = $mysql->record("select * from ".prefix."_news where id = ".db_squote($recf['linked_id']));
if (!is_array($nrec)) {
return array('status' => 0, 'errorCode' => 6, 'errorText' => 'Item found, but related [news] is lost');
}

foreach ($mysql->select("select * from ".prefix."_images where (plugin = 'xfields') AND (linked_id = ".db_squote($nrec['id']).")") as $irec) {
$rec_img []= $irec;
}
foreach ($rec_img as $imgInfo) {
$img_urls[] = ($imgInfo['storage']?$config['attach_url']:$config['images_url']).'/'.$imgInfo['folder'].'/'.$imgInfo['name'];
}

$xc = xf_configLoad();
$xfData = xf_decode($nrec['xfields']);
$xfTData = unserialize($recf['xfields']);

$rec['news'] = $nrec;
$rec['images'] = $img_urls;
$rec['news_url'] = home.newsGenerateLink($nrec);
}

Внимание, решение делает в наихудшем случае 2n запросов к БД на действие, где n — число продуктов в корзине, что может повысить нагрузку на БД при больших количествах заказов.

2) После этого в шаблонах /plugins/basket/list.tpl и /plugins/basket/lfeedback.tpl появится возможность доставать данные из массивов news и images.
Например вывод изображения:

Код:
 {% for entry in entries %}
...
{{ entry.images[0] }}
...
{% endfor %}

Вывод ссылки на новость:

Код:
 {% for entry in entries %}
...
{{ entry.news_url }}
...
{% endfor %}

Результат:
Еще один хак для плагина baskethttp://i.snag.gy/2vXfR.jpg

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

пять − 1 =