如何在cakephp中使用sluggable行为使用不同表中的字段生成slug

如何在cakephp中使用sluggable行为使用不同表中的字段生成slug,php,cakephp,Php,Cakephp,我有一个活动模型,我想为每个新活动创建一个slug。我可以通过sluggable行为轻松地做到这一点,这非常棒,但我希望slug是从users表中的first_name和last_name字段创建的 我该怎么做?我在网上见过几次这样的问题,但都没有回答。当然有可能 为什么要使用slagable行为?使用名和姓作为参数的屈折体::slug方法不是更容易吗?大概是这样的: $name = sprintf('%s %s', $first_name, $last_name); $slug = Infle

我有一个活动模型,我想为每个新活动创建一个slug。我可以通过sluggable行为轻松地做到这一点,这非常棒,但我希望slug是从users表中的first_name和last_name字段创建的


我该怎么做?我在网上见过几次这样的问题,但都没有回答。当然有可能

为什么要使用slagable行为?使用名和姓作为参数的
屈折体::slug
方法不是更容易吗?大概是这样的:

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

对我来说似乎更容易。

假设您有一个活动属于用户的关系,那么在您的活动模型中,只需覆盖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;
}        

如果要使用sluggable行为,并且两个字段来自同一个模型,那么我过去使用的解决方案是:

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

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

b) 在virtualField上使用Slagable行为

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


可能是的。但是sluggable做了一系列的检查,比如检查以确保slug是唯一的等等。。。我不确定你的建议是否对我有用。名字和姓氏是不同模型的一部分。我当然不能这样称呼他们?继续下一篇评论是否有某种方法可以加载用户模型,以便将var$actsAs=array('slaggable'=>array('label'=>array('User.first\u name'、'User.last\u name')、'separator'=>'、'overwrite'=>true));当然,您可以对用户模型执行相同的检查。我知道这种行为的“一体化”解决方案很好,但我想你最好用一种新的方法来模拟它的一些功能,而不是试图让你的方式适合你。看起来我建议了一个只适用于单一型号的解决方案。这个解决方案看起来不错,尽管我不想同时保存活动和用户。目前,我有一个用户注册屏幕和一个活动创建屏幕。除了从Users表导入1stname和2ndname之外,是否无法使用sluggable行为实现此目的:(无论如何,我感谢您的建议此解决方案不要求您同时保存这两个选项。我只是在处理该用例。elseif部分只要求在提供的活动数据中设置用户id。谁是爸爸!您太棒了,谢谢,谢谢,谢谢:)