Desenvolvendo um módulo de contato no Symfony 1.4
Olá pessoal, o tutorial de hoje mostra como fazer um módulo com formulário de contato e envio dos dados por email usando o framework Symfony. Você já deve possuir um projeto criado para poder proseeguir.
Primeiro, crie o módulo vazio com o comando abaixo:
./symfony generate:module frontend contato
O comando acima cria um módulo vazio, localizado em apps/frontend/modules/contato. O próximo passo é criar a classe do formulário. Esta classe irá conter todos os widgets (entenda por inputs, textareas, selects) que irão compor o formulário.
Crie um arquivo chamado ContatoForm.class.php em lib/form, com o conteúdo abaixo:
<?php // lib/form/ContatoForm.class.php
class ContactForm extends BaseForm {
public function configure(){
$this->setWidgets(array(
'nome' => new sfWidgetFormInputText(),
'email' => new sfWidgetFormInputText(),
'assunto' => new sfWidgetFormInputText(),
'mensagem' => new sfWidgetFormTextarea(),
));
$this->widgetSchema->setLabels(array(
'nome' => 'Nome',
'email' => 'Email',
'assunto' => 'Assunto',
'mensagem' => 'Mensagem'
));
$this->setValidators(array(
'nome' => new sfValidatorString(array('required' => true)),
'email' => new sfValidatorEmail(),
'assunto' => new sfValidatorString(array('required' => true)),
'mensagem' => new sfValidatorString(array('min_length' => 10)),
));
// Se esta opção não for setada, serão geradas tabelas no HTML
$this->widgetSchema->setFormFormatterName('list');
$this->widgetSchema->setNameFormat('contato[%s]');
}
}
Com a classe do formulário pronta, basta passar uma instância dela para o template. Edite o arquivo apps/frontend/modules/contato/actions/actions.class.php e adapte-o para o código que segue:
<?php // apps/frontend/modules/contato/actions/actions.class.php
class contatoActions extends sfActions {
public function executeIndex(sfWebRequest $request){
$this->form = new ContatoForm();
if ($request->isMethod('post')){
$this->form->bind($request->getParameter('contato'));
if ($this->form->isValid()){
$this->redirect('contato/enviar?'.http_build_query($this->form->getValues()));
}
}
}
}
Agora definiremos o template que irá receber a instância da classe ContatoForm, gerando os campos do formulário. Edite o arquivo apps/frontend/modules/contato/templates/indexSucess.php. Faço um parentêses aqui. Para cada action que você definir (no arquivo de actions, obviamente), você pode criar um arquivo nomedaactionSuccess.php. O conteúdo desse arquivo será exibido ao executar a action (a menos que ela redirecione para outra action). Exemplo: uma action enviaemail deve possuir um template enviaemailSuccess.php.
<!-- apps/frontend/modules/contato/templates/indexSuccess.php -->
<form action="<?php echo url_for('contato/index') ?>" method="post">
<ul>
<?php echo $form; ?>
<li>
<input type="submit" value="Enviar" />
</li>
</ul>
</form>
Você deve ter percebido que a action do formulário está apontando para contato/enviar. Ou seja, ao ser submetido, o método enviar da classe contatoActions será invocado, logo teremos que criá-lo. Volte para o arquivo apps/frontend/modules/contato/actions/actions.class.php e adicione os métodos abaixo, o método que enviará o email e o método que será chamado se o envio for bem sucedido. Mude as configurações para seu servidor de envio. Outros parâmetros na documentação da Swift Mailer.</p>
<?php // apps/frontend/modules/contato/actions/actions.class.php
public function executeEnviar(sfWebRequest $request){
$transport = Swift_SmtpTransport::newInstance('smtp.seudominio.com', 25)
->setUsername('seuemail@dominio.com')
->setPassword('senha');
$mailer = Swift_Mailer::newInstance($transport);
$message = Swift_Message::newInstance()
->setSubject( $request->getParameter('assunto') )
->setFrom(array( $request->getParameter('email') => $request->getParameter('nome') ))
->setTo(array('email_contato@seudominio.com.br'))
->setReplyTo( $request->;getParameter('email') )
->setBody( $request->getParameter('mensagem') );
if ($mailer->send($message)){
$this->redirect('contato/feito');
}
}
public function executeFeito(){
}
Agora basta criar um template para o método executeFeito, mostrando uma mensagem de envio bem sucedido.
<!-- apps/frontend/modules/contato/templates/feitoSuccess.php -->
<span style="font-weight: bold; font-size: 14px;">Contato enviado com sucesso. Obrigado!</span>
Tudo pronto! Teste seu módulo agora:
http://localhost/seuprojeto/index.php/contato.
Download
Caso algo tenha dado errado, baixe os arquivos utilizados e coloque-os em suas devidas pastas. Melhor ainda que substituir os arquivos é tentar encontrar a causa do problema e quem sabe melhorar o módulo, que está bem básico.
Grande abraço e até a próxima!