Magento 1 и Magento 2 сеттеры и геттеры

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