【问题标题】:CakePHP: Friendly urls using inflector and no idCakePHP:使用变形器和无 id 的友好 url
【发布时间】:2011-08-11 07:54:12
【问题描述】:

我使用 CakePHP 构建了一个简单的投资组合,它的网址如下:domain.com/portfolio/82/This_is_an_item

我想要做的是从 url 中删除 ID。我该怎么做?

这是我的视图控制器代码:

function view ( $id, $slug )
{
    $post = $this->Portfolio->read(null, $id));

    $this->set(compact('post'));
}

这里是链接生成器:

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

我猜我需要更改控制器方法以对标题进行某种查找?

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    我会将 slug 连同标题一起保存在数据库中。这样你只需要创建一次。此外,您可能无法获得从 slug 到标题的唯一链接,因此最好不要尝试。

    为了便于处理,您可以使用 Sluggable 行为,请参阅https://gist.github.com/338096(或只是 Google)。

    更新

    如果你使用https://gist.github.com/338096中的sluggable行为(在app/model/behaviors中保存为sluggable.php),你只需要做几个步骤:

    在您的 Profile 模型类中添加 var $actsAs = array('Sluggable');

    var $actsAs = array(
        'Sluggable' => array(
            'fields' => 'title',
            'scope' => false,
            'conditions' => false,
            'slugfield' => 'slug',
            'separator' => '-',
            'overwrite' => false,
            'length' => 256,
            'lower' => true
        )
    );
    

    如果你想覆盖设置

    在数据库中,在profiles表中添加一列slug

    当您保存配置文件时,它会自动添加填写 slug 字段,您无需采取任何特殊操作。

    【讨论】:

    • 如何创建一个像标题一样的 slug,将其保存到数据库,然后将其用作 url?代码示例会很棒:) 谢谢
    • 我可以不只是将变形的标题保存在一个名为“slug”的新列中,然后将其用作网址吗?如果是这样,我将如何在不需要使用 sluggable 行为的情况下做到这一点?
    • 仅供参考,CakeDC 的 Utils plugin 还带有 SluggableBehavior(除其他外)。
    • @Cameron,这正是这些行为的作用。如果你愿意,可以重新发明轮子。 :)
    • 我会在我的控制器中为添加和编辑方法添加什么以将变形的标题保存在 slug 列中?
    【解决方案2】:

    您可以完全消除 id,但您必须确保 slug 是唯一的(指定 inUnique 验证规则是一个选项)。保存帖子时,在“标题”字段上使用Inflector::slug()(如果您想保持标题不变,您可能希望将其保存到“slug”字段:

    $this-&gt;data['Portfolio']['slug'] = Inflector::slug($this-&gt;data['Portfolio']['title'])

    function view ($slug ){
       $post = $this->Portfolio->find('first', array('conditions'=>array('Portfolio.slug'=>$slug))));
       $this->set(compact('post'));
    }
    

    对于链接:

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

    【讨论】:

    • 这看起来不错。你能告诉我如何拯救蛞蝓吗?当我正确地做到这一点时,我将在数据库中有一个标题字段和一个 slug 字段?干杯
    • 我编辑了答案。对第二个问题是肯定的,因为你在重击之后无法取回标题。
    猜你喜欢
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2013-07-25
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多