如何使用cakephp中的缓慢行为使用来自不同表的字段来制作slu ..

时间:2011-04-19 11:14:50

标签: php cakephp

我有一个Campaign模型,我想为每个新广告系列创建一个slug。我可以使用可缓慢的行为轻松地做到这一点,这很棒,但我想从用户表中的first_name和last_name字段创建slug。

我该怎么做?我已经看过它在网上问了几次但从未回答过。当然有可能!?!

3 个答案:

答案 0 :(得分:1)

假设您有一个Campaign属于User的关系,那么在您的Campaign模型中,只需覆盖beforeValidate()函数。您可以覆盖beforeSave(),但不会对slug进行验证。无论如何:

function beforeValidate() {
    $return = parent::beforeValidate();

    if(isset($this->data['User']['first_name']) && isset($this->data['User']['last_name'])) {
        // assumes we're saving a campaign and a user at the same time w/ saveAll
        $this->data['Campaign']['slug'] = $this->data['User']['first_name'] . ' ' . $this->data['User']['last_name'];
    } elseif(isset($this->data['Campaign']['user_id'])) {
        // saving Campaign record w/ just user_id passed
        $user = $this->User->find('first', array('conditions'=>array('User.id'=>$this->data['Campaign']['user_id']), 'fields'=>array('User.first_name', 'User.last_name')));
        if($user) {
            $this->data['Campaign']['slug'] = $user['User']['first_name'] . ' ' . $user['User']['last_name'];
        }
    }
    return $return;
}        

答案 1 :(得分:0)

为什么要使用Sluggable行为?使用first_name和last_name作为参数的Inflector::slug方法不是更容易吗?像这样:

$name = sprintf('%s %s', $first_name, $last_name);
$slug = Inflector::slug($name);
$this->Campaign->set('slug', $slug);
$this->Campaign->save();

对我来说似乎更容易。

答案 2 :(得分:0)

如果您打算使用可缓慢的行为并且两个字段来自同一模型 - 我过去使用的解决方案是:

a)为用户模型设置虚拟字段

<?php
    class User extends AppModel
    {
        var $virtualFields = array(
            'full_name' => 'CONCAT(User.first_name, " ", User.last_name)'
        );
        ...
    }
?>

b)在virtualField上使用Sluggable行为。

<?php
    class User extends AppModel
    {
        ...
        public $actsAs = array(
            'Sluggable' => array(
                'label' => 'full_name',
                ...
            ),
            ...
        );
    }
?>