Наверх

Как вывести дополнительную характеристику товара в любом месте

Дополнительные характеристики товара выводятся циклом в порядке сортировки в административной части. Для них даже есть отдельный шаблон modules/shop/views/shop.view.param.php.

Но бывает так, что нужно какую-то отдельную характеристику вывести в определенном месте. Например, есть характеристика «Цвет» и нам информацию о цвете нужно вывести в таком виде:

Пример:

Цвет:  

Есть два способа выбрать характеристику: по идентификатору и по имени.

Массив характеристик с идентификатором по имени – $result["names_param"]. В этом случае код будет такой:

Пример:

if(! empty($result["names_param"]["Цвет"]))
{
    echo
'Цвет: ';
    foreach(
$result["names_param"]["Цвет"]["value"] as $value)
    {
        echo
'<img src="/img/box_';
        switch(
$value)
        {
            case
'желтый';
                echo
'yellow';
                break;

            case
'красный';
                echo
'red';
                break;

            case
'зеленый';
                echo
'green';
                break;
        }
        echo
'" alt="'.$value.'">';
    }
}

В примере мы выводили характеристику с типом «список с выбором нескольких значений». Для нее задается несколько значений, поэтому переменная $result["names_param"]["Цвет"]["value"] задана как массив. Все остальные переменные имеют единственное значение. Например, для текстовой характеристики «Материал» код будет следующим:

Пример:

if(! empty($result["names_param"]["Материал"]))
{
    echo
'Материал: '.$result["names_param"]["Материал"]["value"];
}

Если нужно использовать идентификатор вместо имени, тогда обращаемся к массиву $result["ids_param"].

Пример:

if(! empty($result["ids_param"][3]))
{
    echo
$result["ids_param"][3]["name"].': '.$result["ids_param"][3]["value"];
}

Выше рассмотрены случаи, когда характеристику выводим в карточке товара. В остальных случаях заменяем $result на $row. Чтобы вывести характеристику в блоке или списке, для нее обязательно должна быть отмечена соответствующая опция.

Пример можно применять и в модуле «Объявления».

Ваши комментарии и дополнения

Как сделать чтобы выводимая характеристика не дублировалась?
Как вывести характеристику файлы?
Есть три массива с разным форматом данных о характеристики:
$result["rows"], $result["ids_param"] и $result["names_param"].
Первый массив циклом выводится в шаблоне modules/shop/views/shop.view.param.php.
Два другиех в дефолтных шаблона не участвуют.
Если Вы выводите характеристику черезе массив $result["ids_param"], то уберите ее из вывода в shop.view.param.php так:
Код
foreach ($result["rows"] as $param)
{
if($param["id"] == 'номер') continue;
...

Если через $result["names_param"], то удобнее по имени идентифицировать:
Код
foreach ($result["rows"] as $param)
{
if($param["name"] == 'название') continue;
...

--------------------------
В этом же шаблоне можно посмотреть как выводится характеристика типа "файл".
Код
if($param["type"] == "attachments")
{
// как выводится файл
}

Берите этот код и вместо $param подставляйте как в примере:
$result["names_param"]["Материал"] или $result["ids_param"][3]
Здравствуйте! Спасибо за ответ!
Это описано как сделать чтобы не повторялось.
А как вывести характеристику типа файл в нужном месте?
Мне посоветовали этот код:
Код
if (!empty($result["ids_param"][117]))
{
echo '<div class="shop_all_img">';
foreach ($result["ids_param"][117]["value"] as $files)
{
echo '<a href="'.$files["link"].'">'.$result["ids_param"][117]["name"].'</a>';
}
echo '</div>';
}

Выходит название характеристики.
У меня в одной характеристики будет закачено несколько файлов.
Но нужно чтобы выходило стандартно:
Название характеристики: ссылка на скачивание
ссылка на скачивание
Это возможно сделать?
А как вывести поля в форме регистрации вне цикла?
В формах с конструктором ничего такого пока не предусмотрена. Поэтому только циклом перебирать и искать нужное поле.
А как вывести характеристику, если у неё не стоят галочки?

Показывать в списке
Показывать в блоке товаров
Показывать на странице товара
Никак не вывести. Если галки не стоят, то характеристика не запрашивается. Поставьте галку для нужной ситуации, а в цикле пропускайте ее, как я писала выше:
Код
foreach ($result["rows"] as $param)
{
if($param["id"] == 'номер') continue;
...
Цитата
Как вывести дополнительную характеристику товара в любом месте


Не совсем в любом. Надо мне вывести доп.характеристику, не влияющую на цену, в блоке корзины (указать кг./гр./шт.), а нельзя, поскольку она не попадает в $result.

Решил получить через модуль магазина $this->diafan->_shop

Оказалось, что объект (насколько я это понял в меру своей невысокой компетенции) числится как private и получить какие-либо данные я могу только через существующие методы. Поскольку удобным образом в документации доступные методы не перечисляются, я решил прибегнуть к помощи функций get_class_methods().

Решил разбираться на приведённом в документации примере

Код
Пример:
// получаем все цены для товара ID=12 без учета скидок (базовые цены)
$prices = $this->diafan->_shop->price_get_base(12);


и вообще не нашёл метод price_get_base() из примера выше. Прошёлся по всему дистрибутиву текстовым поиском. И опять ничего. Т.е. явного описания метода price_get_base() в файлах дистрибутива нет. А нет потому, что price_ добавляется как префикс в одном из файлов модуля магазина. И это как-то не очевидно.

Конкретно для данной статьи (страницы) хотелось бы увидеть пример вывода характеристики не влияющей на цену в шаблоне корзины (например, в cart.view.show_block.php) через метод $this->diafan->_shop. Тогда содержание статьи будет полностью соответствовать её названию.
Присоединяюсь к пожеланию Павла.
Острая нехватка более разнообразных примеров использования вывода характеристик, средствами CMS. Чтобы не писать запросы из видов, а использовать методы системы.
//вывод доп. характеристики
if(!empty($result["ids_param"][12])){
echo'<div class="block-piss">';
echo $result["ids_param"][12]["name"].': '.$result["ids_param"][12]["value"][0];
echo'</div>';
}
Зарегистрируйтесь или авторизируйтесь для того, чтобы оставить комментарий.