使用帖子标题作为url的CakePHP视图方法

时间:2011-06-12 18:53:33

标签: php cakephp

我的投资组合有以下链接结构:

<?php echo $this->Html->link($post['Portfolio']['title'], array('controller' => 'portfolio', 'action' => 'view', Inflector::slug($post['Portfolio']['title'])), array('title' => $post['Portfolio']['title'])); ?>

其中包含以下网址:http://driz.co.uk/portfolio/view/Paperview_Magazine

但是,如何让我的控制器根据标题显示项目?

到目前为止,我已经拥有了这个,但却无法让它工作,只是得到一个空白页面(所以我还需要检查格式是否正确,并且它们是相关的项目)

function view ( $title )
{

    $posts = $this->Portfolio->find('first', array('conditions' => array('Portfolio.title' => $title)
    ));

    if (empty($title))
    {
        $this->cakeError('error404');
    }
    $this->set(compact('posts'));
}

1 个答案:

答案 0 :(得分:1)

@Ross建议您使用Portfolio.slug进行搜索,以便您可以这样做:

  1. 在数据库表中添加一个名为slug的字段。你很可能想要一个足够长度的VARCHAR来容纳slu ..
  2. 创建或更新“投资组合”记录时,使用Inflector :: slug方法生成一个slug并将其保存到数据库中。您可以在模型的beforeSave事件中执行此操作,或者如果您愿意,可以在保存数据之前在控制器中执行此操作。
  3. 更新find调用以查找Portfolio.slug而不是Portfolio.title。
  4. 不幸的是,没有办法扭转Inflector :: Slug函数,因为它删除了某些字符,如撇号,引号,括号等,这就是为什么你需要将slug保存到数据库中,如果你想搜索它。

    以下是如何在模型中使用beforeSave事件:

    public function beforeSave(array $options = array())
    {
      // If the title is not empty, create/update the slug.
      if ( ! empty($this->data[$this->alias]['title'] )
        $this->data[$this->alias]['slug'] = Inflector::slug($this->data[$this->alias]['title']);
    
      // Returning true is important otherwise the save or saveAll call will fail.
      return true;
    }