如何解决使用帖子标题作为URL的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\'));
}
解决方法
@Ross建议您使用Portfolio.slug进行搜索,因此这里是如何执行此操作的方法:
向您的数据库表添加一个名为slug的字段。您很可能希望VARCHAR的长度足以容纳该段。
当您创建或更新\“ Portfolio \”记录时,请使用Inflector :: slug方法来生成一个条并将其保存到数据库中。您总是可以在模型的beforeSave事件中执行此操作,或者根据需要在保存数据之前在控制器中执行此操作。
更新查找调用以查找Portfolio.slug而不是Portfolio.title。
不幸的是,没有办法反转Inflector :: 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。