I have experience with Zend Framework and I can say is Yii shall get inspiration from it.
1. How to represent a form involving several models?
Like form and subforms: http://framework.zen…form.forms.html
Take a look how is simple in zend framework:
This is FORM (base)
<?php
require SITE_FORMS . 'SubFormulario_Inscreva.php';
require SITE_FORMS . 'SubFormulario_MaisPessoas.php';
class Formulario_Inscreva extends Zend_Form
{
public function init()
{
$this->setAction('')
->setMethod('post');
$inscreva = new SubFormulario_Inscreva();
$maispessoas = new SubFormulario_MaisPessoas();
$this->addSubForm($inscreva , 'inscreva');
$this->addSubForm($maispessoas, 'maispessoas');
$submit = new Zend_Form_Element_Submit('submit');
$submit->setLabel('Enviar')
->setDecorators(array(
array(
'decorator' => 'ViewHelper',
'options' => array('helper' => 'formSubmit')),
array(
'decorator' => array('td' => 'HtmlTag'),
'options' => array('tag' => 'td', 'colspan' => 2)),
array(
'decorator' => array('tr' => 'HtmlTag'),
'options' => array('tag' => 'tr')),
array(
'decorator' => array('table' => 'HtmlTag'),
'options' => array('tag' => 'table')),
));
$this->setDecorators(
array('FormElements'
, array('Form')
)
);
$this->addElements(
array($submit
)
);
}
}
This is one of sub-form attached in base form
<?php
/**
* Nome
* Empresa
* CPF/CNPJ
* Endereço
* Bairro
* Cidade
* Estado
* Telefone
* E-mail
* Site
* Forma de pagamento
* Observação
*
* Sub-Formulário
* Nome Completo
* Nome para Crachá
* E-mail
*/
require SITE_FORMS . 'Form_Element_Radio_Formapagemento.php';
require SITE_FORMS . 'Form_Element_Select_Estado.php';
require SITE_FORMS . 'Form_Element_Text_Bairro.php';
require SITE_FORMS . 'Form_Element_Text_CPFCNPJ.php';
require SITE_FORMS . 'Form_Element_Text_Cidade.php';
require SITE_FORMS . 'Form_Element_Text_Email.php';
require SITE_FORMS . 'Form_Element_Text_Empresa.php';
require SITE_FORMS . 'Form_Element_Text_Endereco.php';
require SITE_FORMS . 'Form_Element_Text_Nome.php';
require SITE_FORMS . 'Form_Element_Text_Site.php';
require SITE_FORMS . 'Form_Element_Text_Telefone.php';
require SITE_FORMS . 'Form_Element_Textarea_Observacao.php';
class SubFormulario_Inscreva extends Zend_Form_SubForm
{
public function init()
{
// Nome
$nome = new Form_Element_Text_Nome('nome');
$nome->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// Empresa
$empresa = new Form_Element_Text_Empresa('empresa');
$empresa->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// CPF/CNPJ
$cpfcnpj = new Form_Element_Text_CPFCNPJ('cpfcnpj');
$cpfcnpj->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// Endereço
$endereco = new Form_Element_Text_Endereco('endereco');
$endereco->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// Bairro
$bairro = new Form_Element_Text_Bairro('bairro');
$bairro->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// Cidade
$cidade = new Form_Element_Text_Cidade('cidade');
$cidade->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// Estado
$estado = new Form_Element_Select_Estado('estado');
$estado->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// Telefone
$telefone = new Form_Element_Text_Telefone('telefone');
$telefone->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// E-mail
$email = new Form_Element_Text_Email('email');
$email->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// Site
$site = new Form_Element_Text_Site('site');
$site->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr'))
)
);
// Site
$formaPagamento = new Form_Element_Radio_Formapagamento('formaPagamento');
$formaPagamento->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr', 'valign' => 'top'))
)
);
// Observação
$observacao = new Form_Element_Textarea_Observacao('observacao');
$observacao->setDecorators(array(
'ViewHelper'
, 'Errors'
, array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))
, array('Label', array('tag' => 'th'))
, array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr', 'valign' => 'top'))
));
$this->setDecorators(
array('FormElements', array('HtmlTag', array('tag' => 'table', 'cellspacing' => 1)))
);
$this->addElements(
array($nome
,$empresa
,$cpfcnpj
,$endereco
,$bairro
,$cidade
,$estado
,$telefone
,$email
,$site
,$formaPagamento
,$observacao
)
);
}
}
Quote
2. How to deal with tabular data input?
This is a great nightmare in Zend Framework world…
You must google for an entire day and find only one article explaining…
You can have 2 options.
1 - Let the object render their selves with Decorators, subforms and they element (text, radio…) with pre-set html wrappers.
Good for simple form.
Bad for a little complex form.
2 - You can do a viewscript: http://framework.zen…tors.viewScript
You make a template and renders each html element in they respective position.
Quote
3. How to group form elements?
I think this was answered in 1.