Prosseguindo com nossos bate-papos sobre Magento, aqui temos as formas de se instanciar classes e criar objetos no Magento.
Neste post vamos aprender a instanciar objetos através dos métodos de fábrica, para ser o mais prático possível antes devo explicar que você deve conhecer o nome da classe e da entidade que você quer instanciar.
Segundo o Magento U as classes de fábrica servem para basicamente três coisas:
– Instanciar models (regras de negócio que se conectam a base de dados) e classes de recursos do magento, os Resources que serão abordados em tópico oportuno.
– Criar helpers para vendas e instanciar blocos de template
– Instanciar controllers para criação de CMS
Por exemplo se você quer dados dos produtos, você deve saber que todo produto é um entidade da classe catálogo, portanto você terá que criar um objeto catálogo e invocar a entidade produto através do seguinte comando:
$product = Mage::getModel(‘catalog/product’);
Todo método de fábrica passa obrigatoriamente por uma determinação do arquivo Mage.php na pasta app, que irá direcionar para a classe certa, esse arquivo além de participar da inicialização da sua loja ele também invoca qualquer método nativo da Magento de qualquer lugar do código (dentro do Magento é claro) através de seu parent Mage::. É como se você tivesse tirando um coelho da cartola toda vez que instanciar essa classe.
Bom voltando as classes de fábrica quando você instancia qualquer entidade dessa forma você chama a seguinte função:
public static function getModel($modelClass = '', $arguments = array()) { return self::getConfig()->getModelInstance($modelClass, $arguments) }
Através do método getModelInstance ele passa os dois valores: o da classe e da entidade.
public function getModelInstance($modelClass='', $constructArguments=array()) { $className = $this->getModelClassName($modelClass); if (class_exists($className)) { Varien_Profiler::start('CORE::create_object_of::'.$className); $obj = new $className($constructArguments); Varien_Profiler::stop('CORE::create_object_of::'.$className); return $obj; } else { return false; } }public function getModelClassName($modelClass) { $modelClass = trim($modelClass); if (strpos($modelClass, '/')===false) { return $modelClass; } return $this->getGroupedClassName('model', $modelClass); }
Como pode ver o getGroupedClassName () faz todo o trabalho ele explode nossa string usando ‘/’ como agulha, remove espaços em branco e as formas de matriz de strings.
Então, temos de invocar Varien_Simplexml_Element que recebe o nome da classe, no caso catálogo, que irá passar Mage_Catalog_Model, como foi declarado nas configurações dessa classe em seu arquivo config.xml
No caso desta extensão foi substituído, ela poderia ser Namespace_Catalog_Model. Nós também adicionamos o nome da entidade de classe (produto) e depois de usar Magento uc_words (baseado em PHP ucwords que retorna um string com o primeiro caractere de cada palavra maiúscula, se esse personagem é alfabética), que finalmente irá receber Mage_Catalog_Model_Product que será devolvido em getModelInstance. Como observamos de cima, ele irá criar o objeto, usando um novo operador.
Portanto para invocar Namespace_Modulename_Model devemos utilizar o comando
$model = Mage::getModel(‘modulename/model’);
Na criação de objetos de model, também podemos tentar usar Mage::getSingleton().
O método difere getModel() utilizando padrão de design diferente chamada Singleton, o que significa que somente uma instanciação de uma classe é utilizada durante o processo de execução.
No entanto, ao chamar getModel(), uma nova classe será criada toda vez que o método é chamado.
Ou seja, durante execução do código o getModel() cria uma classe nova e o getSingleton() somente o instancia.
No próximo post da sequência iremos falar sobre Helper que também são métodos de fábrica. Iremos ver como o Magento os instancia como vimos aqui com Models, aguarde!