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.
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,
...visão do post aqui... <div id="comments"> if($model->commentCount>=1): <h3> echo $model->commentCount . 'comentário(s)'; </h3> $this->renderPartial('_comments',array( 'post'=>$model, 'comments'=>$model->comments, )); endif; </div>
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.
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
.
Para manipular a criação de comentários, primeiro nós modificamos o método actionView()
de PostController
como a seguir,
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
,
...... <div id="comments"> ...... <h3>Deixe um Comentário</h3> if(Yii::app()->user->hasFlash('comentarioEnviado')): <div class="flash-success"> echo Yii::app()->user->getFlash('comentarioEnviado'); </div> else: $this->renderPartial('/comment/_form',array( 'model'=>$comment, )); endif; </div><!-- comments -->
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
.
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:
<div class="form"> $form=$this->beginWidget('CActiveForm', array( 'id'=>'comment-form', 'enableAjaxValidation'=>true, )); ...... $this->endWidget(); </div><!-- form -->
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.
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;
}
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.