beforeSave и id записи

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
dony
Сообщения: 183
Зарегистрирован: 2012.05.26, 16:50

beforeSave и id записи

Сообщение dony »

Как здесь получить id текущей записи? в $this все поля таблицы, кроме её id.

Код: Выделить всё

protected function beforeSave() {
    if (parent::beforeSave()) {
        if ($this->isNewRecord) {
              //$this->id?
        }
        return true;
    }
    return false;
} 
HQ0
Сообщения: 182
Зарегистрирован: 2012.10.17, 17:21

Re: beforeSave и id записи

Сообщение HQ0 »

А как по-простому узнать id записи, которой ещё нет ?

Код: Выделить всё

SELECT MAX(id) id FROM tbl1

Код: Выделить всё

$model = myModel::model()->find(array(
  'select' => 'MAX(id) id',
));
 
Как вариант для извращенцев. max(id)+1 == возможный id будущей записи
dony
Сообщения: 183
Зарегистрирован: 2012.05.26, 16:50

Re: beforeSave и id записи

Сообщение dony »

Я думал, что beforeSave знает id текущей записи и можно без костылей получить его.
alexZT
Сообщения: 362
Зарегистрирован: 2012.03.06, 11:33
Откуда: Украина/Житомир
Контактная информация:

Re: beforeSave и id записи

Сообщение alexZT »

dony писал(а):Я думал, что beforeSave знает id текущей записи и можно без костылей получить его.

http://www.yiiframework.com/doc/api/1.1 ... ave-detail

если Вы не генерите айди руками, то подумайте по логике сами, как до сохранения в БД и генерации автоинкрементного ключа получить его значение?
beforeSave() принято пользовать для манипуляции с данными, которые необходимо вставить, валидация например или какие-то дефолтные значения.
Используйте afterSave() - там уже будет виден айди ибо запись уже будет создана
я человек и мне свойственно ошибаться
yii@conference.jabber.ru
dony
Сообщения: 183
Зарегистрирован: 2012.05.26, 16:50

Re: beforeSave и id записи

Сообщение dony »

А в чем ошибка этой записи? После сохранения, поле body не перезаписывается.

Код: Выделить всё

protected function afterSave() {
    if (parent::afterSave()) {
        $this->body = 'aftersave';
        return true;
    }
    return false;
}
 
HQ0
Сообщения: 182
Зарегистрирован: 2012.10.17, 17:21

Re: beforeSave и id записи

Сообщение HQ0 »

dony писал(а):После сохранения, поле body не перезаписывается.
Ну... Да. :) После сохранения данные не сохраняются.
updateByPk
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: beforeSave и id записи

Сообщение flashimage »

Я отчетливо чего-то не понимаю - зачем переопределять какое-то поле модели сразу после записи? это прям извращение какое-то)
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: beforeSave и id записи

Сообщение rak »

flashimage писал(а):Я отчетливо чего-то не понимаю - зачем переопределять какое-то поле модели сразу после записи? это прям извращение какое-то)
скорее это такие попытки познать события в ar :)
dony
Сообщения: 183
Зарегистрирован: 2012.05.26, 16:50

Re: beforeSave и id записи

Сообщение dony »

flashimage писал(а):Я отчетливо чего-то не понимаю - зачем переопределять какое-то поле модели сразу после записи? это прям извращение какое-то)
Я хочу прибавлять к slug`у страницы её id. Чтоб получалось "89-some-page". Я же правильно думаю, что это надо делать через afteresave?
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: beforeSave и id записи

Сообщение flashimage »

Зачем? Не проще ли это делать прямо в представлении или геттер сделать в модели.
public function getExtraSlug{
return $this->slug."-".$this->id;
}
тогда будет твой slug доступен по $model->extraSlug
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
dony
Сообщения: 183
Зарегистрирован: 2012.05.26, 16:50

Re: beforeSave и id записи

Сообщение dony »

А как использовать геттер в методе контроллера который формирует отображение?

Код: Выделить всё

public function actionView($slug) {
    $news = News::model()->find('slug = :slug', array(':slug' => $slug));
    $this->render('view', array('model' => $news));
} 
Последний раз редактировалось dony 2013.04.16, 17:10, всего редактировалось 1 раз.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: beforeSave и id записи

Сообщение flashimage »

так ищи по slug и id
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
dony
Сообщения: 183
Зарегистрирован: 2012.05.26, 16:50

Re: beforeSave и id записи

Сообщение dony »

flashimage писал(а):так ищи по slug и id
И что мне это даст? Как потом приклеить id к slug? Наверное, не правильно вопрос поставил - я хочу чтоб страница открывалась по ссылке id+slug. Вот, что я хочу сделать - site.com/post/87-some-page
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: beforeSave и id записи

Сообщение anton44eg »

Код: Выделить всё

$news = News::model()->find('slug = :slug AND id = :id', array(':slug' => $slug, ':id'=>$id)); 
id и slug получайте из строки путим вечленения первого числа
dony
Сообщения: 183
Зарегистрирован: 2012.05.26, 16:50

Re: beforeSave и id записи

Сообщение dony »

anton44eg писал(а):id и slug получайте из строки путим вечленения первого числа
Как я понял мне ещё надо id передавать? Сделал вот так

Код: Выделить всё

CHtml::link(CHtml::encode($data->title), array('view', 'slug'=>$data->slug, 'id'=>$data->id)); 
Экшн изменил

Код: Выделить всё

public function actionView($slug) {
    $news = News::model()->find('slug = :slug AND id = :id', array(':slug' => $slug, ':id'=>$id)); 
    $this->render('view', array('model' => $news));
} 
 
Но я сейчас ещё больше запутался. Как все это даст мне возможность сформировать ссылку вида site.com/post/87-some-page?
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: beforeSave и id записи

Сообщение rak »

dony писал(а): Но я сейчас ещё больше запутался. Как все это даст мне возможность сформировать ссылку вида site.com/post/87-some-page?
роут:

Код: Выделить всё

'post/<id:\d+>-<slug:[a-z0-9-]+>' => 'post/view',
 
урл:

Код: Выделить всё

CHtml::url($model->title, array('/post/view', 'id' => $model->id, 'slug' => $model->slug));
 
dony
Сообщения: 183
Зарегистрирован: 2012.05.26, 16:50

Re: beforeSave и id записи

Сообщение dony »

Теперь я понял. Но ссылка все равно не та
http://site.loc/index.php/news/post/17?slug=title
как из неё сделать
http://site.loc/index.php/news/post/17-title

Код: Выделить всё

'urlManager' => array(
    'urlFormat' => 'path',
    'rules' => array(
        '<controller:\w+>/<id:\d+>' => '<controller>/view',
        '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
        '<controller:\w+>/<action:\w+>' => '<controller>/<action>',
        '/news/post/<id:\d+>-<slug:[a-z0-9-]+>' => 'post/view',
    ),
),
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: beforeSave и id записи

Сообщение rak »

только что проверил, у меня генерируется то, что нужно
это правило нужно разместить в самое начало массива
dony
Сообщения: 183
Зарегистрирован: 2012.05.26, 16:50

Re: beforeSave и id записи

Сообщение dony »

Я уже в разные места вставлял. Наверное, из-за настроек моего сервера не так генерируется
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: beforeSave и id записи

Сообщение flashimage »

Проверь наличие файла .htaccess в директории с index.php (webroot) с содержимым

Код: Выделить всё

AddDefaultCharset UTF-8

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
Если его нет - добавь и перезапусти апач
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Ответить