Вывод параметра msoption в превью товара
Подскажите, как можно реализовать вывод размеров товара в превью товара. Вот здесь пример: www.childrensalon.com/girl?order=new.
Далее вытекает второй вопрос: как можно вывести значение параметра minishop (size в нашем случае, тип msoption) в виде простого списка?
Далее вытекает второй вопрос: как можно вывести значение параметра minishop (size в нашем случае, тип msoption) в виде простого списка?
Комментарии: 14
По моему, с обоими вопросами должен помочь сниппет msOptions — смотри его параметры.
Да, но этот сниппет выводит значения параметра только в шаблоне самого товара. А мне нужно в теле блока «ms2_product» в каталоге. Вот что имеется пока. Вводит сообщение: «This resource is not instance of msProduct class.»
[[!msOptions?name=`size`
&tplOuter=`INLINE@ <table><tr><td>Размеры:</td></tr>[[+rows]]</table>`
&tplInner=`<tr><td>[[+value]]</td></tr>`
]]
Может, нужно как-то указать id товара, для которого ты собрался выводить опции?
Как, по твоему, msOptions должен сам об этом догадаться? Ведь ты вызываешь его не на странице товара и $modx->resource->id содержит «not instance of msProduct class».
Как, по твоему, msOptions должен сам об этом догадаться? Ведь ты вызываешь его не на странице товара и $modx->resource->id содержит «not instance of msProduct class».
Все получилось, благодарю за наводку.
[[!msOptions? &product=`[[+id]]` &name=`size` &tplOuter=`@INLINE <table><tr><td>Размеры:</td></tr>[[+rows]]</table>` &tplRow=`@INLINE <tr><td>[[+value]]</td></tr>`]]
Интересно, а как вывести больше одной опции в превью товара?
Для каждой следующей опции вызывать сниппет [[!msoptions]]
Я тоже об этом подумал, но показалось не совсем правильным.
msProductOption выводит все опции, но только на странице товара, если вызвать в превью — белая страница.
У меня замечательно все выводится. Не забудьте прописать в каждом вызове сниппета параметры:
&product=`[[+id]]` &name=`имя опции`
Возможно, ошибки возникают из за пустого значения поля. Тогда надо делать проверку:[[!msOptions:toPlaceholder=`result`? &product=`[[+id]]` &name=`имя опции`]]
[[+result:isnot=``:then=`[[+result]] `]]
а не я не msOptions а про msProductOption… это другой сниппет. Но все равно спасибо :)
Такого сниппета вообще нет. Это название mysql таблицы.
В версии miniShop 2.2.0 msProductOption работает аналогично msOptions но выводит все опции товара. С его помощью можно легко построить таблицу характеристик. Удобная штука, но, как ч уже говорил не работает в превью товара, приходиться несколько раз вызывать msOptions.
<?php
/* @var array $scriptProperties */
/* @var miniShop2 $miniShop2 */
$miniShop2 = $modx->getService('minishop2');
$miniShop2->initialize($modx->context->key);
/* @var pdoFetch $pdoFetch */
if (!$modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) {return false;}
$pdoFetch = new pdoFetch($modx, $scriptProperties);
$output = '';
if (empty($product) && !empty($input)) {$product = $input;}
if (empty($outputSeparator)) {$outputSeparator = "\n";}
$options = explode(",",$modx->getOption('options',$scriptProperties,''));
$product = !empty($product) ? $modx->getObject('msProduct', $product) : $product = $modx->resource;
if (!($product instanceof msProduct)) {
$output = 'This resource is not instance of msProduct class.';
}
$optionKeys = $product->getOptionKeys();
$productData = $product->toArray();
$ignoreOptions = explode(',', trim($modx->getOption('ignoreOptions', $scriptProperties, '')));
if (!empty($groups)) {
$groups = explode(',', trim($groups));
$groups = array_map('trim', $groups);
} else if ($groups === '0') {
$groups = array(0);
}
if(count($optionKeys) > 0){
$rows = array();
foreach ($optionKeys as $key) {
if (in_array($key, $ignoreOptions)) continue;
$productOption = array();
foreach ($productData as $dataKey => $dataValue) {
$dataKey = explode('.', $dataKey);
if ($dataKey[0] == $key && (count($dataKey) > 1)) {
$productOption[$dataKey[1]] = $dataValue;
}
}
// Пропускаем, если характеристика группы не указана в параметре &groups
if (!empty($groups) && !in_array($productOption['category'], $groups) && !in_array($productOption['category_name'], $groups)) continue;
if (isset($groups[0]) && ($groups[0] == 0) && ($productOption['category'] != 0)) continue;
if (is_array($productData[$key])) {
$values = array();
foreach ($productData[$key] as $value) {
$params = array_merge($productData, $productOption, array('value' => $value));
$values[] = $pdoFetch->getChunk($tplValue, $params);
}
$productOption['value'] = implode($valuesSeparator, $values);
} else {
$productOption['value'] = $productData[$key];
}
// Пропускаем, если значение пустое
if ($hideEmpty && empty($productOption['value'])) continue;
$rows[] = $pdoFetch->getChunk($tplRow, array_merge($productData, $productOption));
}
$rows = implode($outputSeparator, $rows);
$output = empty($tplOuter)
? $pdoFetch->getChunk('', array_merge($productData, array('rows' => $rows)))
: $pdoFetch->getChunk($tplOuter, array_merge($scriptProperties, $productData, array('rows' => $rows)));
}
else{
$output = !empty($tplEmpty)
? $pdoFetch->getChunk($tplEmpty, array_merge($scriptProperties, $productData))
: '';
}
return $output;
[[!msProductOptions? &product=`[[+id]]`]]
Кстати, вывод параметров в превью с помощью msOptions жутко тормозит работу msFilter2.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.