2012-03-15 2 views
4

Я изучаю CakePHP, мой первый MVC, и у меня есть несколько вопросов «лучшей практики».Добавить комментарий к статье в CakePHP

Это мой вид для отображения новостной статьи:

<h1><?php echo h($post['Post']['title'])?></h1> 
<p><?php echo h($post['Post']['body'])?></p> 

<?php foreach ($post['Comment'] as $comment): ?> 
<div class="comment" style="margin-left:50px;"> 
     <p><?php echo h($comment['body'])?></p> 
    </div> 
<?php endforeach; 

echo $this->element('newcomment', array("post_id" => $post['Post']['id']));?> 

Я не думаю, что вы могли бы использовать «добавить» представление для добавления комментария в другой точке зрения, поэтому я создал элемент. Надеюсь, это лучшая практика для этого.

Моя основная «проблема» была: добавление комментария. Добавляю ли я скрытое поле в форму или добавляю его в действие формы?

Я пошел с частью «id in action», потому что его легче повторно использовать для перенаправления. Это Новый_комментарий элемент:

<h1>Add Comment</h1> 
<?php 
echo $this->Form->create('Comment',array('action' => 'add', 
              'url' => array($post_id))); 
echo $this->Form->input('body', array('rows' => '3')); 
echo $this->Form->end('Add comment'); 
?> 

И тогда это функция «добавить» в CommentsController:

public function add($post_id = null) { 
    if ($this->request->is('post')) { 
     $this->Comment->set(array('post_id'=>$post_id)); 
     if ($this->Comment->save($this->request->data)) { 
      $this->Session->setFlash('Your comment has been added.'); 
      //$this->redirect(array('action' => 'index')); 
      $this->redirect(array('controller' => 'posts', 'action' => 'view', $post_id)); 
     } else { 
      $this->Session->setFlash('Unable to add your comment.'); 
     } 
    } 
} 

Это как это должно быть?

Надеюсь, здесь все вопросы задают здесь. Использование наилучшей практики для меня очень важно.

+1

Ваш подход прекрасен; @Dave суммирует его хорошо, и идея элемента является хорошей для создания поддерживаемого и повторно используемого кода. Просто имейте в виду, что пользователь может легко maniuplate значение 'post_id' в действии формы; позволяя им комментировать * любую * почту, если только соответствующая проверка не была применена раньше, или используется хеширование ввода формы компонента безопасности. – Ross

+0

только одно: '$ this-> Comment-> set (array ('post_id' => $ post_id));' должна быть последней строкой (для обоих случаев!) – mark

+0

Эй, Марк, как это? Я думал, что было бы логичнее делать это перед данными сохранения ($ this-> request->) ... Не нужно ли мне снова делать save()? – John

ответ

4

Рассматривая свой вопрос как обзор концепции, а не по строкам, нет никакой проблемы с этой общей структурой/способом ее выполнения.

У нас обычно есть элемент «comments», в котором есть все, что есть - комментарии, новый блок комментариев ... и т. Д. Затем вы можете передать переменную, если вы не хотите, чтобы пользователи могли комментировать эту конкретную вещь или переменную для количества комментариев, которые вы хотите показать ... и т. Д. Это не значит, что это лучше - просто лучше для нас. Каждый сайт может представить различные сценарии, которые делают его другим способом лучше.

Я пробовал задавать вопрос «лучшей практики» для многих вещей (включая CakePHP), и то, что я нашел, обычно нет прямого ответа. Если ваш код прост, чист, хорошо организован и имеет проблемы с безопасностью/целостностью данных, вы в порядке.

Единственное, о чем я подумал бы, это хорошие комментарии Ajax. Пользователи становятся испорченными, а обновление страницы просто для того, чтобы прокомментировать что-то, может считаться досадой.

Независимо от того, используете ли вы скрытое поле или URL-адрес, до тех пор, пока код обработки данных не будет твердым, он не должен иметь значения вообще, и снова все сводится к предпочтению.

Смежные вопросы