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' ); } } } |