Provavelmente você já teve que separar alguns campos de seus formulários em blocos, utilizando o fieldset, certo? E se ainda não teve, pode ter certeza que um dia terá, hehe ^^.
Como resolver isso no Zend Framework? fácil! “addDisplayGroup”
Mas, tenha em mente que o addDisplayGroup irá criar o fieldset exatamente aonde ele foi setado, logo, você deve criar seus forms na sequência de campos e de chamadas do group corretas. Veja aqui um pequeno exemplo:
<?php
Class AnimaisForm extends Zend_Dojo_Form
{
public function __construct($options=null)
{
parent::__construct($options);
$translate = Zend_Registry::get('translate');
$this->setTranslator($translate);
$campo = $this->createElement('ValidationTextBox', 'nome_popular');
$campo->addFilters(array('StringTrim', 'StripTags'))
->addValidator('NotEmpty')
->setInvalidMessage('Informe o nome do animal.')
->addValidator('StringLength', true, array(1,60))
->setRequired(true)
->setLabel('Nome Popular');
$this->addElement($campo);
$campo = $this->createElement('ValidationTextBox', 'raca');
$campo->addFilters(array('StringTrim', 'StripTags'))
->addValidator('NotEmpty')
->setInvalidMessage('Informe a raça do animal.')
->addValidator('StringLength', true, array(1,60))
->setRequired(true)
->setLabel('Raça');
$this->addElement($campo);
//Aqui vamos agrupar os 2 campos pelo nome.
$this->addDisplayGroup(array('nome_popular', 'raca'), 'gBasico', array('legend'=>"Dados básicos"));
$campo = $this->createElement('NumberTextBox', 'idade');
$campo->addFilter('StringTrim')
->addValidator('int')
->setInvalidMessage('Informe a idade do animal.')
->setRequired(true)
->setAttrib('lang', 'pt-br')
->setLabel('Idade');
$this->addElement($campo);
$campo = $this->createElement('NumberTextBox', 'peso');
$campo->addFilter('StringTrim')
->addValidator('int')
->setInvalidMessage('Informe o peso do animal.')
->setRequired(true)
->setAttrib('lang', 'pt-br')
->setLabel('Peso');
$this->addElement($campo);
//Aqui vamos agrupar os 2 campos pelo nome em outro fieldset.
$this->addDisplayGroup(array('idade', 'peso'), 'gespecifico', array('legend'=>"Dados específicos"));
}
}
?>

Bem tranquilo não? Agora ultima dica, se você está utilizando o Dojo também, pode transformar esses fieldsets em TitlePanes, eles ficam com um visual mais interessante e podem esconder o conteúdo ao custo de um clique. Para isso, apenas substítua a linha do “addDisplayGroup” para:
$this->addDisplayGroup(array('nome_popular', 'raca'), 'gBasico', array("dojoType"=>'dijit.TitlePane', 'title'=>"Dados básicos"));
e
$this->addDisplayGroup(array('idade', 'peso'), 'gespecifico', array("dojoType"=>'dijit.TitlePane', 'title'=>"Dados específicos"));
Você também precisará acrescentar no view, que irá chamar essa form, uma chamada Dojo para importar o módulo do TitlePane (e levando em conta que você já possui a chamada do dojo em seu layout). Dessa forma:
<?php
$this->dojo()->requireModule('dijit.TitlePane');
?>


É isso ^^