Используйте магические методы в пользовательском модуле

magento.stackexchange https://magento.stackexchange.com//questions/52464

  •  12-12-2019
  •  | 
  •  

Вопрос

Я хочу использовать магические методы в своем пользовательском модуле.

Я создал новую модель с различными переменными-членами (переменная1, переменная2) и хочу получить их как getVariable1.

Как мне нужно объявить эти переменные-члены?Могу ли я установить их в приват?Что еще мне не хватает?

Где-то я читал, что мне нужно их сохранить. $_data['variable1'], но это не работает.

Спасибо!

Это было полезно?

Решение

Магические методы реализуются через Varien_Object сорт.

public function __call($method, $args)
{
    switch (substr($method, 0, 3)) {
        case 'get' :
            //Varien_Profiler::start('GETTER: '.get_class($this).'::'.$method);
            $key = $this->_underscore(substr($method,3));
            $data = $this->getData($key, isset($args[0]) ? $args[0] : null);
            //Varien_Profiler::stop('GETTER: '.get_class($this).'::'.$method);
            return $data;

        case 'set' :
            //Varien_Profiler::start('SETTER: '.get_class($this).'::'.$method);
            $key = $this->_underscore(substr($method,3));
            $result = $this->setData($key, isset($args[0]) ? $args[0] : null);
            //Varien_Profiler::stop('SETTER: '.get_class($this).'::'.$method);
            return $result;

        case 'uns' :
            //Varien_Profiler::start('UNS: '.get_class($this).'::'.$method);
            $key = $this->_underscore(substr($method,3));
            $result = $this->unsetData($key);
            //Varien_Profiler::stop('UNS: '.get_class($this).'::'.$method);
            return $result;

        case 'has' :
            //Varien_Profiler::start('HAS: '.get_class($this).'::'.$method);
            $key = $this->_underscore(substr($method,3));
            //Varien_Profiler::stop('HAS: '.get_class($this).'::'.$method);
            return isset($this->_data[$key]);
    }
    throw new Varien_Exception("Invalid method ".get_class($this)."::".$method."(".print_r($args,1).")");
}

Вам нужно будет либо расширить этот класс, либо любой другой класс, который расширяется от Varien_Object нравиться Mage_Core_Model_Abstract например.Вам не требуется определять какие-либо переменные или методы в вашей модели, если ваш метод начинается с get, set, uns и has, при условии, что вы хотите, чтобы они работали как волшебные методы.

Итак, вы можете написать что-то вроде этого:

$model = Mage::getModel('namespace_module/sample');
$model->setSomeData('Hello');
echo $model->getSomeData();

Если ты это сделаешь Zend_Debug::dump($model); вы заметите, что ваши данные хранятся в _data имущество, задекларированное в Varien_Object сорт.

Пример:

object(Namespace_Module_Model_Sample)#128 (7) {
  ["_data":protected] => array(1) {
    ["some_data"] => string(5) "Hello"
  }
  ["_hasDataChanges":protected] => bool(true)
  ["_origData":protected] => NULL
  ["_idFieldName":protected] => NULL
  ["_isDeleted":protected] => bool(false)
  ["_oldFieldsMap":protected] => array(0) {
  }
  ["_syncFieldsMap":protected] => array(0) {
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top