Хаки и Скрипты Next Generation CMS

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

irbees2008 irbees2008 Опубликовано - 5 - августа Настройка плагинов
2428 - 0
  • Автор: infinity237
  • Источник:
  • Уровень сложности исполнения: это делается простым копированием и нажиманием кнопки

Вот еще одна доработка(хак,костыль) для плагина basket.
И так предположим у нас есть каталог продукции, с различными параметрами не влияющими на стоимость (например размер или цвет).
Задача: сделать вывод этого параметра в корзину и в письмо feedback'a. Решение задачи, когда параметр влияет на стоимость представлено в другой теме.
1) Создаем в xfields дополнительное текстовое поле: Новости → табличные данные. Например, size (Размер модели).
rl5j9.jpg (15.35 Kb)
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 %}
Результат:
2vxfr.jpg (74.9 Kb)http://i.snag.gy/2vXfR.jpg

Можешь почитать и вот эту статейку "Кнопка очистки кеша движка"

Опрос

Ваше мнение

Каким софтом вы пользуетесь?
Результаты

Последние комментарии

Теги

Anything in here will be replaced on browsers that support the canvas element

Статистика

  • Caйту: 4365 дней
  • Новостей: 566
  • Комменты: 257
  • Зарегистрированно : 660
  • Онлайн всего: [12]
  • Гости: [12]
  • Были сегодня : [3] Google, Яндекс, Google
  • SQL запросов: 30
  • Генерация страницы: 0.337сек
  • Потребление памяти: 5.269 Mb 
  •   Яндекс.Метрика