06
Май
2019

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');
   }
  }
 }
Источник Magento 1 и Magento 2 сеттеры и геттеры .
Share

Тебе может это понравится...