Правильная работа с моделью

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

10.03.2011 17:29

Пробую получить атрибуты и их значения в шаблоне
$canape_options_items = Mage::getModel ("eav/entity_attribute_option")
    -> getCollection()
    -> join(
	'eav/attribute_option_value',
	'eav_attribute_option.option_id = eav_attribute_option_value.option_id', array('value'))
    -> addFieldToFilter('attribute_id', '5')
    ;

У коллекции только один метод join которые работает как Inner Join, что мне не подходит. Да и тот не пашет так как запись "eav/entity_attribute_option" в запросе преобразуется в 'main_table' и соответственно не срабатывает мое условие но даже если заменить "eav_attribute_option" на 'main_table' то не находится другой столбец "eav_attribute_option_value.option_id" видать и тут маджента вставляет что то свое.

Я думаю писать подобные запросы в темплейте - плохо и из-за этого грабли.
Надо видать расширить модель или создать свою, правильно ли я думаю и как это сделать?
Буду благодарен примером или ссылке на ман, голова уже закипает от кол-ва информации.

Спасибо.

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

10.03.2011 17:37

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

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

10.03.2011 17:47

Просмотр сообщенияДмитрий Федюк (10.03.2011 17:37) писал:



Читал,пробовал(с этой статьи и начал) но у меня то нет продукта(нет объекта $_product), мне надо только сформировать фильтр. Но вопрос не в этом, пока копался возник вопрос о правильном использовании модели, почитал ман, узнал что можно создать свой модуль определить в нем модель и коллекцию и переопределить стандартные, но в этом случае думаю надобности нет. Может лучше было бы создать блок или хэлпер, но остается вопрос о правильной работе с моделью. Как мне например получить нормальный объект select-а (не в модели а в шаблоне), что бы воспользоватся полной мощностью Zend_Db_Select, может можно вытянуть из репозитория объект адаптера и уже из него достучатся к селекту?
Интересует правильный подход.

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

10.03.2011 17:58

Ваша проблема в том, что вы ставите задачу на слишком низком уровне абстракции.
В чём состоит прикладная проблема?
Что вы хотите сделать с информационной моделью предметной области, ради чего вам нужны все «селекты» и «достучаться»?

Например, прочитать товар из базы можно очень просто:

/** @var Mage_Catalog_Model_Product $product; */
$product = Mage::getModel ("catalog/product")->load ("666");


Затем вы можете прочить значение прикладной характеристики товара, например:
$product->getData ("color");


Если нужно обновить значение прикладной характеристики товара, можно написать:
$product->setData ("color", "красный")->save();


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

10.03.2011 18:03

Просмотр сообщенияДмитрий Федюк (10.03.2011 17:58) писал:

Ваша проблема в том, что вы ставите задачу на слишком низком уровне абстракции.
В чём состоит прикладная проблема?
Что вы хотите сделать с информационной моделью предметной области, ради чего вам нужны все «селекты» и «достучаться»?

Например, прочитать товар из базы можно очень просто:

/** @var Mage_Catalog_Model_Product $product; */
$product = Mage::getModel ("catalog/product")->load ("666");


Затем вы можете прочить значение прикладной характеристики товара, например:
$product->getData ("color");


Если нужно обновить значение прикладной характеристики товара, можно написать:
$product->setData ("color", "красный")->save();



Спасибо за ответ. Об этом варианте я думал, получить любой продукт, вытянуть атрибут и отобразить его свойства. Но мне кажется, что это не очень хорошо. Лишний запрос, да и какой продукт вытягивать... а если он потом будет удален...
На странице(раздел каталога) где фильтр есть список продуктов, можно из него вытащить первый элемент, но тут стоит проблема как обратится к тому списку если мы в другой вьюхе и что делать если после фильтрации элементов не будет.
Не знаю как правильно, гуглю читаю но пока пусто.

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

10.03.2011 18:15

Кстати надыбал такой код
$attribute = Mage::getModel('eav/config')->getAttribute('catalog_product', 'canape_cuir_material');
foreach ($attribute->getSource()->getAllOptions(true, true) as $instance) {
   $myArray[$instance['value']] = $instance['label'];
}
var_dump($myArray);

И он выдает нужный мне вариант. Но я его не опнимаю. Зачем идет обращение к Mage::getModel('eav/config') (идет ли обращение к бд)
почему затем идет обращение к 'catalog_product' я отталкивался от eav_...

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

10.03.2011 18:22

Прикольно надыбал еще кода (гугл рулит)
$_product = Mage::getModel('catalog/product');
$attribute = $_product->getResource()->getAttribute('canape_cuir_material');
var_dump($attribute->getSource()->getAllOptions());


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

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

10.03.2011 19:12

Google ошибается, этот пример кода работать не будет, потому что Mage::getModel('catalog/product') только создаёт пустой объект, а реальные данные надо ещё загрузить из базы посредством метода load (см. выше).

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