Не зарегистрирован
Вход
Забыли пароль?
Регистрация
Подписаться
Сэкономьте время — перед вопросом на форуме узнайте, как найти ответ быстрее
По техническим проблемам необходимо обращаться в Консультационный центр

Поиск по форуму: 

Приглашаем в блог Amiro.CMS. Регулярные обзоры, опыт, решения, практикумы.

Форум  ->   Разработка плагинов, вопросы по API  ->  Как переопределить вывод товаров в каталоге?

Раздел для разработчиков. Обсуждение создания плагинов, вопросы и пожелания по API Amiro.CMS

Добавлено: 15.07.16 15:57:37 #1



Регистрация: 19.02.15
Сообщений: 14


Обратиться по имени

Можно ли на оснований кастомного свойства у товаров переопределить стандартный вывод товаров в каталоге? Вообшем в стандартную выборку подставить условие WHERE наше свойство = например RU или BY



Добавлено: 15.07.16 20:20:09 #2



Регистрация: 26.05.08
Сообщений: 984


Обратиться по имени
Добавлено: 16.07.16 09:44:38 #3



Регистрация: 19.02.15
Сообщений: 14


Обратиться по имени

А как это сделать? Мы искали в доке API Amiro но не нашли. Нам кажется что само переопределение займет несколько строк. Например как переопределение страниц в каталоге -

AMI_Event::addHandler('v5_on_before_init', 'handleEshopInit', AMI_Event::MOD_ANY);

function handleEshopInit($name, array $aEvent, $handlerModId, $srcModId) {
	$aPageInfo = AMI_Registry::get('page');
	if(!empty($aPageInfo) && $aPageInfo['modId'] == 'eshop_item') {
		//$elementsPerPage = AMI::getSingleton('env/request')->get('elements_per_page', 0);
		$elementsPerPage = 1;
		if(intval($elementsPerPage) > 0) {
			AMI::setOption( 'eshop_item', 'page_size', $elementsPerPage);
		}
	}
	return $aEvent;
}


Если это не простая задача будьте добры дайте пожалуйста ссылку на конкретную страницу Amiro API, которая поможет решить эту задачу.



Добавлено: 16.07.16 11:46:15 #4



Регистрация: 26.05.08
Сообщений: 984


Обратиться по имени

Например есть стандартный механизм фильтрации. Просто нужно сгенерировать URL с определенными параметрами.

Например:

http://business.amiro.ru/katalog/internet-magazin/dlja-znanij/konstruktory/elementnye?&ext_custom_11=%D0%BC%D0%B0%D0%BB%D1%8C%D1%87%D0%B8%D0%BA%D0%B0%D0%BC&pf=1&flt_force_values=1&action=rsrtme



Добавлено: 16.07.16 11:51:14 #5



Регистрация: 19.02.15
Сообщений: 14


Обратиться по имени

А с помощью API? Путем изменения SQL запроса как сделать? Также правильней по идей.



Добавлено: 19.07.16 18:45:18 #6

Партнер



Регистрация: 13.01.16
Сообщений: 35


Обратиться по имени
Добавлено: 20.07.16 13:58:19 #7

Партнер


Регистрация: 22.02.09
Сообщений: 472


Обратиться по имени

phpoid:
http://manual.amiro.ru/docs/api6/eventlist.html
попробуйте событие "v5_on_apply_filters".
Что-то не понятно, для чего вообще это событие и что с ним можно сделать.
Все, что там есть сколь-нибудь полезного - это
$aEvent['sql_part'] = "AND i.lang='ru' AND (i.public = 1 ) AND (i.public_direct_link=0 ) AND (date <= NOW() )"
т.е. базовые условия по отбору товаров во всем каталоге в принципе и добавление туда какого-либо условия ничего не дает.

А вообще, вопрос, конечно, интересный и хороший, но есть подозрение, что реализовать это таким способом не получится. Как я это понимаю - есть, например, категория, на странице которой выводятся товары и вот для конкретной категории (по id или свойству, т.е. в событии обязательно нужно иметь данные этой категории) изменить условия отбора этого товара, а так же сортировку.
Возможно ли это и, если да, то как?



Добавлено: 21.07.16 08:13:07 #8

Партнер



Регистрация: 13.01.16
Сообщений: 35


Обратиться по имени

Evgeney S.,
// "_local/front_functions.php"

AMI_Event::addHandler(
    'v5_on_get_list_sql',
    'handleV5OnGetListSQL',
    AMI_Event::MOD_ANY
);

function handleV5OnGetListSQL($name, array $event, $handlerModId, $srcModId)
{
    // 'cms_es_items' can be obtained using API
    if (FALSE !== mb_strpos($event['sql_from'], 'cms_es_items', 0, 'ASCII')) { 
        $event['sql_filter'] .= "AND (i.public = 0)";
    }

    return $event;
}

Из этого события сортировку изменить можно.

Остальные данные для проверки (о работающем модуле, категории) в реестре в разделе "Full front module context".

Вот я всё и сделал



Добавлено: 25.07.16 17:05:47 #9



Регистрация: 19.02.15
Сообщений: 14


Обратиться по имени

function handleEshopFrontFilter($name, array $aEvent, $handlerModId, $srcModId) {
    if(
        $aEvent['mod_id'] == 'eshop_item' &&
        $aEvent['sql_prefix'] == 'i.' &&
        in_array(
            $aEvent['viewType'],
            array(
                'body_items',
                'body_urgent_items',
                'body_filtered',
                'body_search'
            )
        )
    ) {
        $aEvent['sql_part'] .= 'AND i.custom_field_XXX = "RU"';
    }
    return $aEvent;
}





Создать новую тему

Всего тем: 6659
Всего сообщений: 27847
Всего зарегистрированных пользователей: 53169
Последний зарегистрированный пользователь: aidar2020