Как создать блок программно

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

14.03.2011 17:26

Использую блок для фильтра, описан он так
<block type="catalog/layer_view" name="category-selection" template="catalog/category/selection.phtml">

Нормально на странице вызывается фильтры отображаются.
И данный код отрабатывает
$block = Mage::getBlockSingleton('catalog/layer_view');
$filters = $block->getFilters();
foreach ($filters as $filter){
    foreach ($filter->getItems() as $item)
        echo  $item->getLabel(). '('.$item->getCount().')<br />';

Понадобилось мне добавить ajax, вынес этот код в шаблон и попытался его вызвать через CMS страницу(т.е привязал шаблон к странице).
<reference name="content">
  <block type="catalog/layer_view" name="filter_ajax" template="catalog/category/filters_ajax.phtml"/>
</reference>

В итоге массив getItems() - пустой.
Затем решил пойти более верным путем и сделал контроллер в котором попытался выполнить этот код, эффект тот же.
Такое ощущение что блок не инициализировался полностью.
Внимание вопрос.

Как правильно инициализировать блок в коде?

#2 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

14.03.2011 18:47

Может как то используя коллекцию отфильтрованную по атрибуту... передать её потом в фильтр и который автоматом вернет уже то что надо...
Целый день копаюсь...

#3 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

14.03.2011 20:11

Просмотр сообщенияIgorN (14.03.2011 17:26) писал:

Как правильно инициализировать блок в коде?


Как создать блок программно

#4 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

15.03.2011 11:00

Спасибо большое, все заработало :)

#5 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

15.03.2011 12:10

Затык, код нормально пашет, но через аякс та же проблема.
Может я не правильно с аяксом работаю?
Не пойму почему массив getItems() пустой

#6 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

15.03.2011 12:27

Как вернуть JSON вместо HTML

Как получить данные с сервера без перезагрузки страницы

#7 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

15.03.2011 12:31

Спасибо буду пробовать, а то вроде код работает, а пытаешься его прикрутить перестает пахать

#8 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

15.03.2011 12:47

По ссылкам прошелся, с отправкой запросов аяксом проблем нет, а вариант с json я еще вчера нашел, но надобности в нем нет, так как я решил просто обновить блок с фильтром и вроде все просто но не пашет. Что то я не правильно делаю.

Для фильтра сделал шаблон _filters.phtml (catalog/category/_filters.phtml) что бы вынести общую часть отдельно.
В нем у меня
$_filters = $this->getFilters();
//далее в цикле пробегаюсь по фильтрам и строю элементы

В local.xml такой код
<reference name="content">      
			<remove name="category.products" /> 
			<block type="catalog/category_view" name="category-top" template="catalog/category/top.phtml">
			</block>
			<block type="core/template" name="category-selection" template="catalog/category/selection.phtml">
                            <block type="catalog/layer_view" name="catalog.filters" template="catalog/category/_filters.phtml"></block>
			</block>
			<block type="catalog/product_list" name="category-products" template="catalog/category/products.phtml">
			</block>
        </reference

Основной тут category-selection
Именно в нем идет вызов catalog.filters для отображения фильтра
Это то что грузится при старте страницы.
Теперь мне надо аяксом обновить фильтр
Для этого сделал filters_ajax.phtml с таким кодом
echo
        Mage::getSingleton('core/layout')
                ->createBlock(
                        'module/block_name'
                        ,
                        ''
                        ,
                        array (
                                "param1" => $value1
                        )
                )
                ->setTemplate ('module/template.phtml')
                ->renderView ()
;

и этот код работает если его вставить например в category-selection.

Далее я сделал cms/page к которой и обращаюсь для обновления фильтра
В cms/page у меня "Layout Update XML"
<reference name="content">
	<remove name="page_content_heading" />
	<remove name="cms.wrapper" />
  <block type="catalog/product_list" name="category_ajax" template="catalog/category/filters_ajax.phtml"/>
</reference>


Запрос проходит нормальный но фильтр не строится так как метод getItems у $_filter пустой.
Почему так? В одном случае когда приложение отрабатывает стандартно все ок, а в другом нет? Явно какие то процессы не отрабатывают.
Пробовал через метод контроллера вызывать тот же эффект.
Пробовал напрямую объект создавать и опять нечего.
Блин 12 час идет борьбы с этой задачей и вроде все просто а к финишу все не приду :(

#9 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

15.03.2011 13:09

Хм... при классическом режиме фильтров много
идет "Category", "Price", "Options" и др. атрибуты
,а при аяксовом варианте только "Category" т.е. атрибуты вообще не подгрузились видать блоку не хватает чего то, а как понять чего?

#10 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

15.03.2011 13:36

Дебажу код (класс Mage_Catalog_Model_Layer), метод getProductCollection()
$this->getCurrentCategory()->getId() //возвращает 2 а при нормальном запросе 5
Далее это сказывается на getProductCollection()
который возвращает пустую коллекцию, из-за этого не подтягиваются атрибуты.

В блок я параметром передаю category_id но он видать не учитывается.
А в классическом виде id категории определяется после маршрутизации...

#11 IgorN
  • Группа: Пользователь
  • Сообщений: 293
  • Регистрация: 09.03.2011

15.03.2011 14:04

Решил задачу, добавил метод в Category контроллер, в нем возвращаю джейсон, и все ок.

Поделиться темой: