Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal!
Estou tendo problemas ao criar e tentar usar os Helpers no ZF e gostaria de saber se alguém já passou por algo parecido ou sabe o que está errado.
É o seguinte, se eu crio um Helper dessa forma:
<?php
class Zend_View_Helper_Date extends Zend_View_Helper_Abstract {
public function date($date) {
// conteúdo do método
}
}
E o chamo o método date na view assim:
<?php echo $this->date('2011-06-21 22:30:00'); ?>
Funciona perfeitamente!
Agora se eu mudo o nome do método, por exemplo:
<?php
class Zend_View_Helper_Date extends Zend_View_Helper_Abstract {
public function convertDate($date) {
// conteúdo do método
}
}
E chamo na view assim:
<?php echo $this->convertDate('2011-06-21 22:30:00'); ?>
Apresenta o seguinte erro:
>
Application error
Exception information:
Message: Plugin by name 'ConvertDate' was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/;./views\helpers/;F:/xampp/htdocs/cms/application/views\helpers/
Ou seja, eu preciso obrigatoriamente deixar o método com o mesmo nome da classe, se não dá erro.
Estou usando o Zend_Layout no meu projeto e o caminho deste helper que usei como exemplo é: application/views/helpers/Date.php
Então Matias, eu queria criar com outro nome para fazer mais sentido, afinal, se a função do método é converter datas não faz sentido ele chamar apenas "date", deveria se chamar "convertDate", e a classe "Date" reunir todos os métodos para tratamento de datas. Para mim isso faria mais sentido.
Agora percebo que estava com uma idéia errada de como os Helpers do Zend deviam funcionar, eu acreditava que cada classe devia reunir todos os métodos de um mesmo grupo, por exemplo, todos os Helpers de data deveriam ficar dentro de uma mesma classe.
Bem que eu estava achando estranho como o Zend faria pra descobrir em qual classe estaria um determinado método. rs Mas se ele pega o nome da classe como referência fica tudo mais claro.
Valeu Matias!
O que você pode fazer para manter esta lógica é utilizar um formato parecido com Factory. Algo assim:
<?php
class Zend_View_Helper_Date extends Zend_View_Helper_Abstract {
public function date($date, $metodo) {
if (method_exists ( $this, $metodo )) {
return $this->$metodo ( $date );
} else {
// faz alguma coisa
}
}
public function convert($date) {
// conteúdo do método
}
}<?php echo $this->date($data, 'convert'); ?>
Outra sugestão é para trabalhar com datas. O Zend_Date é fantástico. Tem muitos recursos legais que facilitam bastante a vida. Vale a pena dar uma olhada nos métodos get**(). Talvez você possa trabalhar com os dois ao mesmo tempo. Por exemplo, para converter data no formato do banco para o formato pt_BR:
<?php
class Zend_View_Helper_Date extends Zend_View_Helper_Abstract {
public function date($date, $metodo) {
$date = new Zend_Date ( $date );
if (method_exists ( $this, $metodo )) {
return $this->$metodo ( $date );
} else {
// faz alguma coisa
}
}
private function convertToBr(Zend_Date $date) {
return $date->get ( Zend_Date::DATE_MEDIUM );
}
private function convertToDb(Zend_Date $date) {
return $date->get ( Zend_Date::YEAR . '-' . Zend_Date::MONTH . '-' . Zend_Date::DAY );
}
}
Usando:
<?php echo $this->date('01/01/2011', 'convertToBr'); // 01/01/2011?>
<?php echo $this->date('01/01/2011', 'convertToDb'); // 2011-01-01?>
Carlos Eduardo
Valeu pelas dicas Matias, com certeza irei aproveitá-las. /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/joia.gif&key=0939d868f1ee3d17e7bb4735cf3a3dcbce722238baa0148d397de30444cef221" alt="joia.gif" />
Eu adotei o ZF como framework recentemente e ainda estou estudando todos os seus recursos. /applications/core/interface/imageproxy/imageproxy.php?img=http://forum.imasters.com.br/public/style_emoticons/default/smile.gif&key=15294d64c22e9e9c4ae0bf82a62ec27d13f27d6ba7078a5f7982077798029364" alt="smile.gif" />
Um abraço!
Outra forma é você verificar no metódo padrão se foi passado algum parametro, caso não tenha sido, basta retornar o próprio objeto, e assim pode chamar os outros metódos, exemplo:
//No seu view helper
public function date($options = null){
if($options === null){
return $this;
}
//foram passados parametros
}
//No seu controller:
$this->_helper->date()->outroMetodo('123');
É assim mesmo que funciona, Leozitho. O nome da classe tem que ser igual ao nome do método, senão o ZF não encontra a classe a ser chamada.
Uma pergunta, porque criar este método com o nome diferente?
Carlos Eduardo