0

尝试将 url '/localhost/topp/events/view/14' 中的当前事件 ID '14' 保存到评论表中的 event_id 字段。我正在使用评论控制器中的添加功能和事件 view.ctp 页面上的“添加评论”按钮。有任何想法吗?有人建议我使用隐藏的 id 字段和 $this->params['pass']['0'] 但不知道如何去做,欢迎任何建议。提前致谢。

我当前的评论控制器添加操作代码:

public function add() {
        //$this->loadModel('Event');
        if ($this->request->is('post')) {
            $this->Comment->create();
            $this->request->data['Comment']['user_id'] = $this->Auth->user('id');
                    //Commented below is the logic Iam trying to achieve but is wrong
            //$this->request->data['Comment']['event_id'] = $this->request->data['Event']['id'];
            if ($this->Comment->save($this->request->data)) {
                $this->Session->setFlash(__('The comment has been saved'));
                $this->redirect(array('controller' => 'events', 'action' => 'myevents'));
            } else {
                $this->Session->setFlash(__('The comment could not be saved. Please, try again.'));
            }
        }
    }

//////////////////////////////////////////////我的事件查看代码带有添加注释link // //////////////////////

<div class="events view">
    <?php echo $this->element('maintitle'); ?>
    <?php echo $this->element('profile_area'); ?>
<h2><?php  echo __('Event'); ?></h2>
    <dl>        
        <td><?php echo $this->Html->image('/files/event/photo/'.$event['Event']['id'].'/thumb_'.$event['Event']['photo'], array("alt" => "No Event Image")); ?>&nbsp;</td>
        <td><?php echo $this->Html->image('/files/event/photo2/'.$event['Event']['id'].'/thumb_'.$event['Event']['photo2'], array("alt" => "No Event Image")); ?>&nbsp;</td>
        <td><?php echo $this->Html->image('/files/event/photo3/'.$event['Event']['id'].'/thumb_'.$event['Event']['photo3'], array("alt" => "No Event Image")); ?>&nbsp;</td>
        <td><?php echo $this->Html->image('/files/event/photo4/'.$event['Event']['id'].'/thumb_'.$event['Event']['photo4'], array("alt" => "No Event Image")); ?>&nbsp;</td>
        <dt></dt>
        <dd>
        <br>
        </dd>
        <dt><?php echo __('Name'); ?></dt>
        <dd>
            <?php echo h($event['Event']['name']); ?>
            &nbsp;
        </dd>
        <dt><?php echo __('Date'); ?></dt>
        <dd>
            <?php echo h($event['Event']['date']); ?>
            &nbsp;
        </dd>


    </dl>
</div>
<div class="related">
    <h3><?php echo __('Related Comments'); ?></h3>
    <?php if (!empty($event['Comment'])): ?>

    <?php echo ('Add a comment for this event') ?>
    <?php
        $i = 0;
        foreach ($event['Comment'] as $comment): ?>

        <tr>
            <td><?php echo $comment['comment']; ?></td>

            <td class="actions">

            </td>
        </tr>
    <?php endforeach; ?>

<?php endif; ?>

    <div class="actions">
        <ul>
            <li><?php echo $this->Html->link(__('New Comment'), array('controller' => 'comments', 'action' => 'add')); ?> </li>
        </ul>
    </div>
</div>
4

1 回答 1

1

让我看看我是否做对了。

  1. 您发布的表格在事件视图中
  2. 链接“新评论”重定向到评论控制器中的另一个视图“添加”
  3. 这个添加视图有一个表单来实际写评论(我猜这部分,你没有把代码放在这里)
  4. 您希望 add 函数具有 event_id 来自哪里。

对?

然后,您需要将 event_view.ctp(我在这里发明名称)中的事件 id 传递给 comment_add.ctp。

所以有两种方法可以做到

第一种方式:在链接中传递事件的 id 并在这样的操作中接收它

//event_view.ctp
//I'm going to assume you know the event id here
$this->Html->link(__('New Comment'), array('controller' => 'comments', 'action' => 'add', $event_id)); ?>

这将创建一个类似comments/add/14的链接,例如,其中 14 是事件 ID。现在在操作中,您会收到 id

//pass it like parameter of the action
public function add($event_id = null) {
    if ($this->request->is('post')) {
        $this->Comment->create();
        $this->request->data['Comment']['user_id'] = $this->Auth->user('id');

        //check that the event_id isn't null and that the event actually exists first
        $this->request->data['Comment']['event_id'] = $event_id;
        /*etc*/
    }
}

您不需要将 event_id 传递给 comment_add 视图,如果用户不需要处理它,则无需将其添加到表单中。

第二种方式:如果你不想在url里面传递event_id,你需要通过post传递。为此,您现在必须添加新评论的链接需要更改为隐藏 event_id 的表单。

echo $this->Form->create('Comment', array('url'=>array('controller' => 'comments', 'action' => 'add')));
echo $this->Form->input('event_id', array('type'=>'hidden', 'value'=>$event_id);
echo $this->Form->end('New comment');

//instead of <?php echo $this->Html->link(__('New Comment'), array('controller' => 'comments', 'action' => 'add')); ?>

例如,在评论的操作中,检查您收到的帖子是否包含 event_id,但不包含 user_id。我觉得这种方式有点混乱,因为您收到的针对该操作的每个请求都将是一个帖子,因此很难区分何时要显示要填写的表单以及何时要保存它。

我更喜欢第一种方式,我建议这样做。但我觉得有必要指出还有其他方法可以做到这一点。取决于你想要什么。

于 2013-06-20T14:27:04.940 回答