Question

Je veux faire de la Magie Méthodes dans mon Module Personnalisé.

J'ai créé un nouveau Modèle avec différentes variables membres (variable1, variable2) et je veux obtenir comme getVariable1.

Comment ai-je besoin de déclarer les variables de membre?Puis-je les mettre sur le privé?De quoi d'autre ai-je raté?

J'ai lu quelque part j'ai besoin de les enregistrer dans $_data['variable1'], mais cela ne fonctionne pas.

Merci!

Était-ce utile?

La solution

La magie des méthodes sont mises en œuvre par Varien_Object classe.

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).")");
}

Vous aurez besoin de prolonger la classe ou une autre classe qui s'étend de Varien_Object comme Mage_Core_Model_Abstract par exemple.Vous n'êtes pas obligé de définir des variables ou des méthodes dans votre modèle en tant que votre méthode, on commence par get, set, uns et has, c'est en supposant que vous voulez qu'ils fonctionnent comme les méthodes magiques.

De sorte que vous pouvez écrire quelque chose comme ceci:

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

Si vous ne Zend_Debug::dump($model); vous remarquerez que vos données sont stockées dans _data la propriété, qui est déclarée dans Varien_Object classe.

Exemple:

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) {
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top