1 Отредактировано Sergey T. (17.06.2015 12:10:04)

Тема: Как добавить произвольное поле в карточку товара

Подскажите пожалуйста как добавить в карточку товара в админке произвольное поле, чтобы потом выводить его в карточке товара на сайте и чтобы это поле участвовало в групповом редактировании товаров из админки? Для примера мне нужно вставить в этом поле какой-то произвольный текст и ссылку.

Как вывести в шаблон я понимаю, это product.tpl, а вот как создать это в админке - это вопрос.

http://i71.fastpic.ru/big/2015/0617/52/6e83f1730c63671cd9f536b54bce1952.jpg

Re: Как добавить произвольное поле в карточку товара

Самый просто и быстрый способ, через "Характеристики" товара.

Повысить оценку Понизить оценку

3 Отредактировано Александр (17.06.2015 12:58:10)

Re: Как добавить произвольное поле в карточку товара

Весь вопрос почти полностью мной был раскрыт в этой теме:
Как добавить поле товару или любому другому объекту в ReadyScript?
Пробуйте

Обращение к полю можно сделать так:

{$product.вашеполевпсевдонимеколонки}

//Например
{$product.yourfield}

4 Отредактировано Александр (17.06.2015 13:22:50)

Re: Как добавить произвольное поле в карточку товара

Бутаков пишет:

Самый просто и быстрый способ, через "Характеристики" товара.

Тоже хорошо, только доставать не удобно)
Плюс лишний запрос, хотя если в карточке товара, то нет

Re: Как добавить произвольное поле в карточку товара

Ну как там успехи? Есть продвижения?

6 Отредактировано Sergey T. (19.06.2015 17:29:11)

Re: Как добавить произвольное поле в карточку товара

Что-то не выходит. Не добавляется поле в админке в карточке товара. Что сделал:
1. Создал папку sizes в папке modules
2. Создал папку config в папке sizes, в ней два файла file.inc.php и handlers.inc.php
3. Добавил в них содержимое из того поста, который вы указали
4. Зашел в настройки системы и "исправил структуру БД"

После этих действий в карточке товара на вкладке "основные" ничего не изменилось. Видимо что-то сделал не так.

7 Отредактировано Александр (19.06.2015 18:32:09)

Re: Как добавить произвольное поле в карточку товара

Sergey T. пишет:

Что-то не выходит. Не добавляется поле в админке в карточке товара. Что сделал:
1. Создал папку sizes в папке modules
2. Создал папку config в папке sizes, в ней два файла file.inc.php и handlers.inc.php
3. Добавил в них содержимое из того поста, который вы указали
4. Зашел в настройки системы и "исправил структуру БД"

После этих действий в карточке товара на вкладке "основные" ничего не изменилось. Видимо что-то сделал не так.

А вы сам модуль то Ваш установили(Веб-сайт->Настройка модулей)? Без этого не попрёт, т.е. хуки у не установленых модулей не работают. И киньте листинг файлов пожалуйста.
P.S. Если в Веб-сайт->Настройка модулей модуль не присутствует, то сбросьте кэш и обновите страницу.

8 Отредактировано Sergey T. (22.06.2015 08:46:31)

Re: Как добавить произвольное поле в карточку товара

Опишу более подробно:

1. Создал папку под модуль - "sizes", в ней папку "config", в нее поместил 3 файла.

http://i70.fastpic.ru/big/2015/0620/34/0222f20105494bc41c681279c64c5434.png

вот содержимое файлов:
file.inc.php

<?php
namespace Custom\Config;
use \RS\Orm\Type;

/**
* Конфигурационный файл модуля
*/
class File extends \RS\Orm\ConfigObject
{
    
    /**
    * Возвращает значения свойств по-умолчанию
    * 
    * @return array
    */
    public static function getDefaultValues()
    {
        return array(
            'name' => t('Ваш дополнительный модуль'),
            'description' => t('Модуль с дополнительным функционалом'),
            'version' => '1.0.0.0',
            'author' => 'ВАШЕ авторские имя',
        );
    }       
}

handlers.inc.php

<?php
namespace Custom\Config;
use \RS\Orm\Type as OrmType;

class Handlers extends \RS\Event\HandlerAbstract
{
    /**
    * Функция инициализирует регистрацию действий
    */
    function init()
    {
        $this->bind('orm.init.catalog-product'); //Сообщаем что у нас появился хук расширяющий товар
    }
    
    /**
    * Расширяем объект товара
    * Обратите внимание на название хука и этой функции . и - не используются 
    *
    * @param array $list
    */
    public static function ormInitCatalogProduct(\Catalog\Model\Orm\Product $orm_product)
    {
         //Расширяем поля
        $orm_product->getPropertyIterator()->append(array(
            t('Основные'), //Вкладка на которую будет добавлено поле, поля в массиве ниже будут приписаны к этой вкладке в конец
            'is_root' => new OrmType\Integer(array( //Название поля в таблице БД и его тип
                'description' => 'Корневой элемент?', //Подпись к полю
                 'maxLength' => 1, //Длинна поля
                'default' => 0, //Значение по умолчанию
                'CheckBoxView' => array(1,0) //Отвечает за отображение в качестве флага(галочки)
            ))
        ));
    }
}

и даже создал module.xml на всякий случай:

<?xml version="1.0" encoding="utf-8"?>
<config>
    <defaultValues>    
        <name multilanguage="true">ТЕСТ</name>
        <description multilanguage="true">ПЕРВЫЙ ТЕСТОВЫЙ МОДУЛЬ</description>        
        <version>1.0.0.0</version>
        <author>Somebody</author>        
    </defaultValues>
</config>

2. После сих действий зашел в админку в настройки системы и исправил структуру БД
3. Затем зашел Веб-сайт->Настройка модулей и модуля там не увидел (кэш очищен, страница обновлена)
4. Пробовал упаковывать все это в zip и пару раз устанавливать. После выбора архива выводится следующее:

http://i71.fastpic.ru/big/2015/0620/12/f6c0435fbb16b38662331d3761d69212.png

а после нажатия кнопки *установить* появляется *ошибка передачи данных. Повторите попытку еще раз*.

Что делать? Куда копать?

9 Отредактировано Александр (22.06.2015 11:38:54)

Re: Как добавить произвольное поле в карточку товара

Всё понятно. Вы не обратили внимание на namespace. А именно:

<?php
namespace Custom\Config;

А namespace должен соответствовать Вашей папке sizes:

<?php
namespace Sizes\Config;

т.к. custom это имя папки модуля который у Вас уже присутствует и там как раз такой namespace в той папке. Система проверяет папки и namespace, если не совпадает, то модуль не может быть установлен. Т.к. система обращается в классу как \Sizes\Config\File.

Что касается файла file.inc.php Мы изменили положение в создании модулей. Сейчас все сведения о модулях хранятся не в функции  getDefaultValues(), а в файле module.xml. Поэтому функцию getDefaultValues можете из класса удалить.

После того как везде поменяете namespace, надо установить модуль и проделать приведённые манипуляции.

10 Отредактировано Александр (22.06.2015 11:48:23)

Re: Как добавить произвольное поле в карточку товара

Исправил статью на форуме в соответствии с последними вехами и добавил строку о namespace, чтобы люди не путались, можете с ней ознакомится здесь.

11

Re: Как добавить произвольное поле в карточку товара

Вроде все получилось. Поле к карточке товара в админке добавилось, в шаблон товара на сайте тоже добавилось. Я выбрал тип "строка" и указал максимальную длину 100 символов, но при добавление в эту строку например слова "привет", при сохранении остается только буква "п", остальное вырезается.

Вот что указал в handlers.inc.php

 //Расширяем поля
        $orm_product->getPropertyIterator()->append(array(
            t('Основные'), //Вкладка на которую будет добавлено поле, поля в массиве ниже будут приписаны к этой вкладке в конец
            'is_root' => new OrmType\String(array( //Название поля в таблице БД и его тип
                'description' => 'Строка', //Подпись к полю
                 'maxLength' => 100 //Длинна поля
                
            ))

12 Отредактировано Александр (22.06.2015 15:21:13)

Re: Как добавить произвольное поле в карточку товара

Вы

 'maxLength' => 100

давно поставили?
Может просто, не обновили поле и там осталась длинна 1 символ?
Если да просто обновите таблицы базы данных, кнопкой, как раньше делали.
И в админке у Вас "п" в поле остаётся?

Re: Как добавить произвольное поле в карточку товара

Надо скорее всего обновить таблицы БД, чтобы длинна 100 символов применилась.

14

Re: Как добавить произвольное поле в карточку товара

Так и сделал! Обновил таблицы БД, сбросил КЭШ и все ЗАРАБОТАЛО! СПАСИБО! Тема раскрыта и закрыта! smile

15 Отредактировано Александр (22.06.2015 15:25:25)

Re: Как добавить произвольное поле в карточку товара

Кстати is_root это просто английское наименование поля в таблице БД из примера. Замените лучше на более приемлемое, для Вашей задачи.
И обновите БД и в товар запишите значение для этого поля.

Re: Как добавить произвольное поле в карточку товара

Sergey T. пишет:

Так и сделал! Обновил таблицы БД, сбросил КЭШ и все ЗАРАБОТАЛО! СПАСИБО! Тема раскрыта и закрыта! smile

Отлично! smile Если возникнут вопросы не стесняемся задавать.

17 Отредактировано Sergey T. (22.06.2015 17:22:58)

Re: Как добавить произвольное поле в карточку товара

И, надеюсь, последний вопрос в этой теме. Если я выбрал тип "текст" и вставил туда ссылку, то в карточке товара выводится просто текстом <a href="#">ссылка</a>. Как сделать, чтобы была именно ссылка, а не просто текст?

Посмотрел в инспекторе, почему-то содержимое ставится в кавычки.

КАРТОЧКА ТОВАРА:
http://i69.fastpic.ru/big/2015/0622/57/569cf65d5fa61e69fb43a4dc2726d657.jpg

БРАУЗЕР:
http://i69.fastpic.ru/big/2015/0622/d4/e1a4dd814031af9142b28bc2368417d4.jpg

handlers.inc.php

//Расширяем поля
        $orm_product->getPropertyIterator()->append(array(
            t('Основные'), //Вкладка на которую будет добавлено поле, поля в массиве ниже будут приписаны к этой вкладке в конец
            'is_root' => new OrmType\Text(array( //Название поля в таблице БД и его тип
                'description' => 'Текст', //Подпись к полю
                 'maxLength' => 1000 //Длинна поля

Если меняю на тип String (строка) - такая же беда. Если делаю поле с редактором, то ссылка вставляется нормально, но дополнительно все обрамляется в теги <p>, а они лишние

18 Отредактировано Александр (22.06.2015 19:15:15)

Re: Как добавить произвольное поле в карточку товара

Все текстовые данные перед сохранием проходят через htmlspecialchars(экранируются). А это значит, что Вам надо вызвать htmlspecialchars_decode, чтобы разэкранировать для того, чтобы текст превратился в HTML.
Т.е.:

{$product.is_root|htmlspecialchars_decode}

или

{htmlspecialchars_decode($product.is_root)}

Как Вам приятнее.

19

Re: Как добавить произвольное поле в карточку товара

Теперь все работает как надо! Благодарю за помощь!

Re: Как добавить произвольное поле в карточку товара

Sergey T. пишет:

Теперь все работает как надо! Благодарю за помощь!

Не за что! smile