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

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

irbees2008 irbees2008 Опубликовано - 5 - августа Настройка плагинов
1695 - 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

Можешь почитать и вот эту статейку "Копируем в Mysql"

Опрос

Ваше мнение

На каком движке ваш сайт?
Результаты

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

Теги

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

Статистика

  • Caйту: 3302 дня
  • Новостей: 539
  • Комменты: 252
  • Зарегистрированно : 569
  • Онлайн всего: [7]
  • Гости: [6]
  • Поисковики: [1] Google
  • Были сегодня : [2] Яндекс, Google
  • SQL запросов: 30
  • Генерация страницы: 0.101сек
  • Потребление памяти: 4.949 Mb 
  •   яндекс.ћетрика