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...
commentCount>=1): ?>

commentCount . 'comentário(s)'; ?>

renderPartial('_comments',array( 'post'=>$model, 'comments'=>$model->comments, )); ?>
~~~ 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] ......
......

Deixe um Comentário

user->hasFlash('comentarioEnviado')): ?>
user->getFlash('comentarioEnviado'); ?>
renderPartial('/comment/_form',array( 'model'=>$comment, )); ?>
~~~ 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 $