如何在cakephp中使用sluggable行为使用不同表中的字段生成slug
我有一个活动模型,我想为每个新活动创建一个slug。我可以通过sluggable行为轻松地做到这一点,这非常棒,但我希望slug是从users表中的first_name和last_name字段创建的如何在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
我该怎么做?我在网上见过几次这样的问题,但都没有回答。当然有可能 为什么要使用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。谁是爸爸!您太棒了,谢谢,谢谢,谢谢:)