Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

gremio10

[Resolvido] Criar um view helper

Recommended Posts

Fala galera, eu estava pesquisando no google, como criar um view Helper, para facilitar a construção de um HTML meu que eu sempre utilizo...

 

construi ele assim...

 

não sei se está correto ^_^

 

class Zend_View_Helper_likeButton extends Zend_View_Helper_Abstract
{
   protected $total;
   protected $html;

   public function generateButton( $class, $type_id, $type )
   {
       $this->buttonBody( $class, $type_id, $type );
       $this->counter( $type_id );

       return $this->html;
   }

   public function getTotal()
   {
       return $this->total;
   }

   public function setTotal( $total )
   {
       $this->total = $total;
   }

   private function buttonBody( $class, $type_id, $type )
   {
       if( $this->getTotal == 0 )
       {
           $this->html = sprintf( "<form class='%s' type-id='%s' type-like='%s' value-type-count-like='%d'>", $class, $type_id, $type, $this>getTotal );
               $this->html .= "<input type='submit' value='Recomendar' class='bt-recomendar-small' />";
           $this->html .= "</form>";
       }
       else
       {
           $this->html = "<div class='bt-recomendar-small-clicked'>Recomendado por você</div>";
       }

       return $this;
   }

   private function counter( $id )
   {
       $this->html .= sprintf( "<div class='%s'>", "recomendacoes_box" );
           $this->html .= sprintf( "<div class='%s'></div>", "rec-tip-l" );
               $this->html .= sprintf( "<div class='%s' id='%d'>", "rec-tip-m", $id );
                   $this->html .= sprintf( "%d", $this->getTotal );
               $this->html .= "</div>";
           $this->html .= sprintf( "<div class='%s'></div>", "rec-tip-r" );
       $this->html .= "</div>";

       return $this;
   }

}

 

coloquei ele no library - Zend - View - Helper mas quando coloco na minha view $this->setTotal( 10 ); ele não funciona, e retorna um erro de controller ...

 

acho que esse tipo de erro se deve por eu estar usando modulo, por que se não utilizasse, ficaria me dizendo qual o verdadeiro erro..

 

minha Bootstrap ficou assim:

 

protected function _initHelpers()
   {
       $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
       $viewRenderer->initView();

       $viewRenderer->view->addHelperPath('Zend/View/Helper/', 'Zend_View_Helper');
   }

 

e nada =/

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dessa forma que você está fazendo está errado.

 

Primeiro, deixe o nome da classe com letra maiúscula:

 

class Zend_View_Helper_LikeButton extends Zend_View_Helper_Abstract {

 

Crie um método com o nome da classe que retorne o próprio objeto (o método sim deve começar com letra minúscula):

 

public function likeButton() {
return $this;
}

 

No método setTotal faça com que ele também retorne o objeto:

 

public function setTotal($total) {
$this->total = $total;
return $this;
}

 

Agora na view faça assim:

 

echo $this->likeButton()->setTotal(10)->generateButton('likeLiga', 10, 'doencas');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja como ficou :

 

<?php

class Zend_View_Helper_LikeButton extends Zend_View_Helper_Abstract
{
   protected $total;
   protected $html;

   public function likeButton()
   {        
       return $this;
   }

   public function generateButton( $class, $type_id, $type )
   {        
       $this->buttonBody( $class, $type_id, $type );
       $this->counter( $type_id );

       return $this;
   }

   public function setTotal( $total )
   {
       $this->total = $total;
       return $this;
   }

   private function buttonBody( $class, $type_id, $type )
   {
       if( $this->total == 0 )
       {
           $this->html = sprintf( "<form class='%s' type-id='%s' type-like='%s' value-type-count-like='%d'>", $class, $type_id, $type, $this->total );
               $this->html .= "<input type='submit' value='Recomendar' class='bt-recomendar-small' />";
           $this->html .= "</form>";
       }
       else
       {
           $this->html = "<div class='bt-recomendar-small-clicked'>Você deve estar logado</div>";
       }

       return $this->html;
   }

   private function counter( $id )
   {
       $this->html .= sprintf( "<div class='%s'>", "recomendacoes_box" );
           $this->html .= sprintf( "<div class='%s'></div>", "rec-tip-l" );
               $this->html .= sprintf( "<div class='%s' id='%d'>", "rec-tip-m", $id );
                   $this->html .= sprintf( "%d", $this->total );
               $this->html .= sprintf( "</div>" );
           $this->html .= sprintf( "<div class='%s'></div>", "rec-tip-r" );
       $this->html .= sprintf( "</div>" );

       return $this;
   }

}

 

acredito que tenha feito corretamente :huh:

Compartilhar este post


Link para o post
Compartilhar em outros sites

:lol: , que coisa :ermm:

 

<?php

class Zend_View_Helper_LikeButton extends Zend_View_Helper_Abstract
{
   protected $total;
   protected $html;

   public function likeButton()
   {        
       return $this;
   }

   public function generateButton( $class, $type_id, $type )
   {        
       $this->buttonBody( $class, $type_id, $type );
       $this->counter( $type_id );

       return $this->html;
   }

   public function setTotal( $total )
   {
       $this->total = $total;
       return $this;
   }

   private function buttonBody( $class, $type_id, $type )
   {
       if( $this->total == 0 )
       {
           $this->html = sprintf( "<form class='%s' type-id='%s' type-like='%s' value-type-count-like='%d'>", $class, $type_id, $type, $this->total );
               $this->html .= "<input type='submit' value='Recomendar' class='bt-recomendar-small' />";
           $this->html .= "</form>";
       }
       else
       {
           $this->html = "<div class='bt-recomendar-small-clicked'>Você deve estar logado</div>";
       }
   }

   private function counter( $id )
   {
       $this->html .= sprintf( "<div class='%s'>", "recomendacoes_box" );
           $this->html .= sprintf( "<div class='%s'></div>", "rec-tip-l" );
               $this->html .= sprintf( "<div class='%s' id='%d'>", "rec-tip-m", $id );
                   $this->html .= sprintf( "%d", $this->total );
               $this->html .= sprintf( "</div>" );
           $this->html .= sprintf( "<div class='%s'></div>", "rec-tip-r" );
       $this->html .= sprintf( "</div>" );

       return $this;
   }

}

 

Eu estou fazendo correto, mandando ele retornar um HTML?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, ao meu ver é melhor usar return pra retornar o HTML do que dar "echo" dentro da própria classe.

 

Mas observe que tem alguns erros no seu código, como essa linha onde você usa a função sprintf apenas com o primeiro parâmetro e sem nada pra formatar na string:

 

$this->html .= sprintf( "</div>" );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui :lol: :lol:

 

<?php

class Zend_View_Helper_LikeButton extends Zend_View_Helper_Abstract
{
   public $total;
   public $html;

   public function likeButton()
   {        
       return $this;
   }

   public function generateButton( $class, $type_id, $type )
   {        
       $this->buttonBody( $class, $type_id, $type );
       $this->counter( $type_id );

       return $this;
   }

   public function setTotal( $total )
   {
       $this->total = $total;
       return $this;
   }

   public function buttonBody( $class, $type_id, $type )
   {
       if( $this->total == 0 )
       {
           $this->html = sprintf( "<form class='%s' type-id='%s' type-like='%s' value-type-count-like='%d'>", $class, $type_id, $type, $this->total );
               $this->html .= "<input type='submit' value='Recomendar' class='bt-recomendar-small' />";
           $this->html .= "</form>";
       }
       else
       {
           $this->html = "<div class='bt-recomendar-small-clicked'>Você deve estar logado</div>";
       }

       return $this;
   }

   public function counter( $id )
   {
       $this->html .= sprintf( "<div class='%s'>", "recomendacoes_box" );
           $this->html .= sprintf( "<div class='%s'></div>", "rec-tip-l" );
               $this->html .= sprintf( "<div class='%s' id='%d'>", "rec-tip-m", $id );
                   $this->html .= sprintf( "%d", $this->total );
               $this->html .= "</div>";
           $this->html .= sprintf( "<div class='%s'></div>", "rec-tip-r" );
       $this->html .= "</div>";

       return $this->html;
   }

}

 

na view:

 

<?php
   $buttonLike = $this->likeButton()->setTotal( 10 )->generateButton( "likeLiga", 10, "doencas" );
   echo $$buttonLike->html;
?>

 

Obrigado pela paciência e ajuda!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou dar só umas dicas pra você melhorar isso aí, se você fizer o que eu sugeri no post #8, retirando o "return" do método buttonBody já que ele é um método para uso interno, e colocando no médodo generateButton um "return $this->html;" em vez de apenas "return $this;", bastaria você fazer isso na view:

 

echo $this->likeButton()->setTotal(10)->generateButton('likeLiga', 10, 'doencas');

 

Também não vi muito sentido em você usar tantos métodos dentro da view. Note que você passa apenas 3 parâmentros diferentes por eles, então dava pra você melhorar isso e fazer com que retornasse tudo usando apenas o método likeButton(), ficando assim:

 

echo $this->likeButton('likeLiga', 10, 'doencas');

 

Lembre-se que o objetivo dos helpers é facilitar e não complicar as coisas. ;)

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.