- Автор: infinity237
- Источник:
- Уровень сложности исполнения: это делается простым копированием и нажиманием кнопки
Вот еще одна доработка(хак,костыль) для плагина basket.
И так предположим у нас есть каталог продукции, с различными параметрами не влияющими на стоимость (например размер или цвет).
Задача: сделать вывод этого параметра в корзину и в письмо feedback'a. Решение задачи, когда параметр влияет на стоимость представлено в другой теме.
1) Создаем в xfields дополнительное текстовое поле: Новости → табличные данные. Например, size (Размер модели).
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;
}
{% 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 %}
<a href="#" class="purchase">Добавить В корзину</a>
Работает по принципу: если таблица размеров в новости заполнена, то заставить пользователя выбрать размер и добавить продукт в корзину. Если таблица не заполнена, то добавить продукт в корзину. 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>
{{ entry.xfields.tdata.size }}
Второй хак
Предположим у нас есть каталог продукции, с различными параметрами среди которых есть изображения.
Задача: сделать вывод изображения продукта в корзине, сделать возможным использовать ссылку на новость в письмах-заказах feedback'a.
0) Важно не забывать, что в шаблонах /plugins/basket/list.tpl и /plugins/basket/lfeedback.tpl, как и в любых других TWIG шаблонах работают функции debagValue() и debugContext(), которые позволяют вывеси все возможные для использования переменные. Например:
{{ debugValue(entries) }}
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);
}
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 %}
http://i.snag.gy/2vXfR.jpg
Можешь почитать и вот эту статейку "Скрипт скрытого блока"
Это тоже интересно
- 05.08.18Плагин reCAPTCHA
- 05.02.19x_filter - фильтр записей
- 17.08.19Плагин ognews
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.