Magento 1 и Magento 2 сеттеры и геттеры
Для получения и внесения данных в сессию или атрибуты объектов в Magento используются конструкции get и set. Для этого мы программно устанавливаем некоторые значения для объектов и получаем их. В начале рассмотрим пример с сессиями.
Сессия — это временный объект, который создается на сервере для каждого пользователя магазина Magento для хранения некоторых значений (например, товаров в корзине). Если вы хотите сохранить данные, которые нужно передать с одной страницы на другую для одного и того же пользователя, вам нужно сохранить их в сеансе.
Для начала рассмотрим подробный пример на Magento 1.
$inputMessage = 'Hello World';Mage::getSingleton('core/session')->setWelcomeMessage($inputMessage);$outputMessage = Mage::getSingleton('core/session')->getWelcomeMessage();echo $this->__($outputMessage); |
Все достаточно просто, данный код на Magento 1 можно вынести в Helper или использовать его в конкретном шаблоне если не требуется его повторения по всему проекту. Вторым примером рассмотрим использование сессии в Magento 2.
class MyTestSession { protected $session; public function __construct( \Magento\Framework\Session\SessionManagerInterface $session, ... ){ $this->session = $session; ... } public function setValue($value){ $this->session->start(); $this->session->setMessage($value); } public function getValue(){ $this->session->start(); return $this->session->getMessage(); } public function unSetValue(){ $this->session->start(); return $this->session->unsMessage(); }} |
Этот простой класс использует объект сеанса для хранения информации. Вы можете вызвать setValue($value), getValue() и unSetValue() для работы с значениями сессий. Эти методы устанавливают атрибуты с заданным значением. Вы можете назвать этот атрибут как хотите. Главное вызывать start() перед использованием сеанса. В противном случае вы получите ошибку, если сеанса нет. Функция start() сгенерирует новый объект сеанса.
Вы можете использовать этот простой класс для хранения значений на стороне сервера и использовать его на нескольких страницах вызывая для сохранения значений в сессии функцию setValue, для получения значений getValue и удаления значения unSetValue().
Для сохранения значений в продуктах так же используются set и при получении get.
$product->setPrice(240);$product->save(); |
Но при работе с атрибутами имеющие опции, а не прямое значение атрибута, данная конструкция не сработает. Таким примером может быть выбор цвета товара или производителя. Данные атрибуты в большинстве случаев имею тип select или multiselect.
Как с ними работать, для этого давайте взглянем на наш метод beforeSave(), чтобы увидеть, что происходит, когда мы вызываем $product->setManufacturer(‘New Option’);
Для начала рассмотрим подробный пример на Magento 1.
... public function beforeSave($object) { $code = $this->getAttribute()->getAttributeCode(); if($object->getData($code)){ $option_id = $this->addAttributeValue($code, $object->getData($code)); $object->setData($code, $option_id); } return $this; }... |
Во-первых, мы получаем $code, который в этом примере будет возвращать «производитель». После быстрой проверки, чтобы убедиться, что предоставленное значение не пустое, мы получаем право на добавление значения атрибута, если оно не существует, путем вызова $ this->addAttributeValue(‘Manufacturer’, ‘New Option’);
... protected function addAttributeValue($code, $value) { /* @var Mage_Eav_Model_Entity_Attribute $attribute_model */ $attribute_model = Mage::getModel('eav/entity_attribute'); $attribute_id = $attribute_model->getIdByCode('catalog_product', $code); $attribute = $attribute_model->load($attribute_id); if(!$option_id = $this->getOptionId($attribute, $value)){ /* @var Mage_Eav_Model_Entity_Setup $setup */ $setup = Mage::getModel('eav/entity_setup', 'core_setup'); $option['attribute_id'] = $attribute_id; $option['value']['option_'.$attribute_id][0] = $value; $setup->addAttributeOption($option); $option_id = $this->getOptionId($attribute, $value); } return $option_id; }... |
Модель Mage_Eav_Model_Entity_Attribute вызывается, чтобы мы могли получить attribute_id из его кода, а затем загрузить объект $attribute. Мы передаем этот объект $attribute и строку $value методу getOptionId(), который просто проверяет, существует ли уже option_id. Если это не так, мы должны создать его, используя модель Mage_Eav_Model_Entity_Setup.
... /* @var Mage_Eav_Model_Entity_Setup $setup */ $setup = Mage::getModel('eav/entity_setup', 'core_setup'); $option['attribute_id'] = $attribute_id; $option['value']['option_'.$attribute_id][0] = $value; $setup->addAttributeOption($option);... |
Здесь можно увидеть, что мы создаем массив $option и присваиваем «attribute_id» и «value». Еще раз мы вызываем getOptionId(), чтобы получить вновь созданный option_id, и возвращаем его в метод beforeSave(), с которого мы начали!
... $option_id = $this->addAttributeValue($code, $object->getData($code)); $object->setData($code, $option_id);... |
Рассмотрим пример на Magento2 при сохранении цвета продукта:
if ($color != '') { $color_attr = $prod->getResource()->getAttribute('color'); if ($color_attr->usesSource()) { $colour_opt = $color_attr->getSource()->getOptionId($color); if ($available_color != $colour_opt) { $prod->setData('color', $colour_opt); $prod->getResource()->saveAttribute($prod, 'color'); } } } |
