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:

fonini@valhalla:$ ./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:

// 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:

// 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.

// 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.

Download dos arquivos

Grande abraço e até a próxima!

Comente você também

* Copie este código:

* Cole ou digite o código aqui:

Google