Как я могу сделать слаг, используя поля из другой таблицы, используя медленное поведение в CakePHP - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть модель Campaign, и я хочу создать слаг для каждой новой кампании.Я могу легко сделать это с помощью медлительного поведения, которое удивительно, но я бы хотел, чтобы слаг был создан из полей first_name и last_name в таблице users.

Как я могу это сделать?Я видел это пару раз в Интернете, но так и не ответил.Конечно, это возможно!?!

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Если у вас есть связь, в которой Campaign принадлежит пользователю, то в вашей модели Campaign просто переопределите функцию beforeValidate (). Вместо этого вы можете переопределить beforeSave (), но вы не получите проверку для слаг. В любом случае:

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;
}        
0 голосов
/ 19 апреля 2011

Если вы собираетесь использовать медлительное поведение, и оба поля принадлежат одной модели - решение, которое я использовал в прошлом, заключается в следующем:

a) Установите виртуальное поле для модели User

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

b) Используйте поведение Sluggable в virtualField.

<?php
    class User extends AppModel
    {
        ...
        public $actsAs = array(
            'Sluggable' => array(
                'label' => 'full_name',
                ...
            ),
            ...
        );
    }
?>
0 голосов
/ 19 апреля 2011

Почему вы хотите использовать Sluggable? Не проще ли использовать метод Inflector::slug с first_name и last_name в качестве параметров? Как то так:

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

Кажется, мне проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...