Criando e Exibindo Comentários
==============================
Nesta seção, nós vamos implementar as funcionalidades de exibição e criação de comentários.
Para melhorar a interação com os usuários, nós vamos mostrá-los os possíveis erros cada vez que eles terminam de preencher um campo. Isto é conhecido como validação das entradas no lado do cliente. Nós vamos mostrar como isto pode ser feito no Yii de maneira perfeita e extremamente fácil. Note que isto requere a versão 1.1.1 or mais nova do Yii.
Exibindo Comentários
--------------------
Ao invés de exibir e criar comentários em páginas individuais, nós usamos a página de detalhe do post (gerada pela ação `view` de `PostController`). Abaixo da exibição do conteúdo do post, nós vamos exibir primeiro uma lista de comentários pertencentes a este post e então um formulário de criação de comentários.
Para exibir os comentários na página de detalhe do post, nós modificamos o scripi e visão `/wwwroot/blog/protected/views/post/view.php` como a seguir,
~~~
[php]
...visão do post aqui...
~~~
No código acima, nós chamamos `renderPartial()` para renderizar uma visão parcial de nome `_comments` para exibir a lista de comentários pertencentes ao post atual. Note que na visão nós usamos a expressão `$model->comments` para obter os comentários para o post. Isto é válido porque nós declaramos um relacionamento chamado `comments` na classe `Post`. A avaliação desta expressão vai provocar uma consulta JOIN implícita à base de dados para retornar os comentários apropriados. Esta funcionalidade é conhecida como [lazy relational query](http://www.yiiframework.com/doc/guide/database.arr).
A visão parcial `_comments` não é muito interessante. Ela principalmente vai iterar entre os comentários e exibir os seus detalhes. Leitores interessados podem ler `/wwwroot/yii/demos/blog/protected/views/post/_comments.php`.
Criando Comentários
-------------------
Para manipular a criação de comentários, primeiro nós modificamos o método `actionView()` de `PostController` como a seguir,
~~~
[php]
public function actionView()
{
$post=$this->loadModel();
$comment=$this->newComment($post);
$this->render('view',array(
'model'=>$post,
'comment'=>$comment,
));
}
protected function newComment($post)
{
$comment=new Comment;
if(isset($_POST['Comment']))
{
$comment->attributes=$_POST['Comment'];
if($post->addComment($comment))
{
if($comment->status==Comment::STATUS_PENDING)
Yii::app()->user->setFlash('comentarioEnviado','Obrigado...');
$this->refresh();
}
}
return $comment;
}
~~~
No código acima, nos chamamos o método `newComment()` antes de renderizar a visão `view`. No método `newComment()`, nós criamos uma instância de `Comment` e verificamos se o formulário de comentários foi enviado. Se foi enviado, nós tentamos adicionar o comentário para o post chamando `$post->addComment($comment)`. Se isto der certo, nós atualizamos a página de detalhe do post. Caso o comentário precise ser aprovado, nós mostramos uma notificação para indicar esta decisão. Uma notificação é usualmente uma mensagem de confirmação exibida aos visitantes. Se o visitante clicar no botão "atualizar" do navegador, a mensagem desaparecerá.
Nós também precisamos modificar `/wwwroot/blog/protected/views/post/view.php`,
~~~
[php]
......
~~~
No código acima, nós exibimos a notificação caso ela exista. Se não, nós exibimos o formulário de entrada de comentários através da renderização da visão parcial `/wwwroot/blog/protected/views/comment/_form.php`.
Validação no Lado do Cliente
----------------------------
Para poder suportar a validação do formulário de comentários no lado do cliente, nós precisamos fazer algumas pequenas alterações na visão do formulário de comentários `/wwwroot/blog/protected/views/comment/_form.php` e no método `newComment()`.
No arquivo `_form.php`, nós precisamos principalmente configurar [CActiveForm::enableAjaxValidation] como "true" quando nós criamos o widget [CActiveForm]:
~~~
[php]
beginWidget('CActiveForm', array(
'id'=>'comment-form',
'enableAjaxValidation'=>true,
)); ?>
......
endWidget(); ?>
~~~
E no método `newComment()`, nós inserimos um bloco de código para responder às requisições da validação via AJAX. O código verifica se há uma variável `POST` de nome `ajax`. Se houver, ele exibe os resultados da validação através de [CActiveForm::validate].
~~~
[php]
protected function newComment($post)
{
$comment=new Comment;
if(isset($_POST['ajax']) && $_POST['ajax']==='comment-form')
{
echo CActiveForm::validate($comment);
Yii::app()->end();
}
if(isset($_POST['Comment']))
{
$comment->attributes=$_POST['Comment'];
if($post->addComment($comment))
{
if($comment->status==Comment::STATUS_PENDING)
Yii::app()->user->setFlash('comentarioEnviado','Obrigado...');
$this->refresh();
}
}
return $comment;
}
~~~
$Id: comment.create.txt 2772 2010-12-24 16:24:12Z alexander.makarow $
commentCount . 'comentário(s)'; ?>
renderPartial('_comments',array( 'post'=>$model, 'comments'=>$model->comments, )); ?>