AutoTimestampBehavior — время создания и модификации модели

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

AutoTimestampBehavior — время создания и модификации модели

Сообщение samdark »

Позволяет автоматически заполнять время создания и изменения модели.

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

<?php
class AutoTimestampBehavior extends CActiveRecordBehavior {
 
    /**
    * Имя поля, хранящего время создания модели.
    */
    public $created = 'created';
    /**
    * Имя поля, хранящего время изменения модели.
    */
    public $modified = 'modified';
 
 
    public function beforeValidate($on) {
        if ($this->Owner->isNewRecord)
            $this->Owner->{$this->created} = new CDbExpression('NOW()');
        else
            $this->Owner->{$this->modified} = new CDbExpression('NOW()');
 
        return true;    
    }
} 
Установка
В модели:

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

public function behaviors(){
    return array(
        'AutoTimestampBehavior' => array(
            'class' => 'application.components.AutoTimestampBehavior',
            //Тут можно переопределить названия полей, хранящих время создания и изменения модели.
        )
    );
}
 
Оригинал: http://www.yiiframework.com/doc/cookbook/14/
Vit228
Сообщения: 3
Зарегистрирован: 2009.04.07, 18:41

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение Vit228 »

Отлично, обращение к родительскому объекту в виде $this->Owner выглядит очень элегантным и лаконичным.

Для примера, как выглядит установка даты удаления записи в Симфони:

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

  public function preDelete($object, $con = null)
  {
    $class = get_class($object);
    $peerClass = get_class($object->getPeer());
 
    $columnName = sfConfig::get('propel_behavior_paranoid_'.$class.'_column', 'deleted_at');
    $method = 'set'.call_user_func(array($peerClass, 'translateFieldName'), $columnName, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_PHPNAME);
    $object->$method(time());
    $object->save();
 
    return true;
  }
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение samdark »

Если вы храните время в поле типа int, записывая туда timestamp unix, надо поменять NOW() на UNIX_TIMESTAMP().

Если в модели уже использован onBeforeValidate — придётся вызвать метод behavior-а вручную (другого способа пока не нашёл):

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

protected function beforeValidate($on) {
    $this->AutoTimestampBehavior->beforeValidate($on);
            // далее код beforeValidate модели
}
 
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение slavcodev »

Sam Dark писал(а):$this->Owner
В API указано
Public Properties
owner CComponent the owner component that this behavior is attached to. CBehavior
Будут работать оба варианта или это при смене версий изменился и регистр?
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение Ekstazi »

А разве регистр учитывается ?
Отличный рецепт и отличная альтернатива CDefaultValueValidator (Пригодится для yii 1.1)
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение samdark »

В Zii включили официальный CTimestampBehavior, так что можно воспользоваться им:
http://code.google.com/p/zii/source/bro ... havior.php

А вместо $this->Owner теперь лучше использовать $this->getOwner().
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение samdark »

А вот на него документация: http://www.yiiframework.com/doc/api/CTimestampBehavior
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение slavcodev »

Sam Dark писал(а):А вместо $this->Owner теперь лучше использовать $this->getOwner().
Почему же лучше? Разве это не одно и тоже?
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение samdark »

Верно, я чуток запутался.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение Ekstazi »

Лучше потому что это быстрее будет работать. Использование магии в php негативано сказывается на скорости работы.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение slavcodev »

Перед последнем ответом, я запутался :) Уже распутался :lol:
Жду Yii 3!
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение slavcodev »

Ekstazi писал(а):Лучше потому что это быстрее будет работать. Использование магии в php негативано сказывается на скорости работы.
И это даже где-то расписано цифрами, или это личные наблюдения?
Вроде бы это фичи PHP5, получается только хуже сделали работу с классами в пятерке?
Жду Yii 3!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение samdark »

То, что немного медленней — это верно. Но разница не столь велика, чтобы данной возможностью не пользоваться.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение Ekstazi »

На хабре об этом много писали. Просто процитировал от туда. Сам не замечал никаких трудностей с этим.
plandem
Сообщения: 25
Зарегистрирован: 2009.09.03, 02:34

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение plandem »

ну если глянуть на реализацию этого функционала, то медленнее - факт, а вот насколько - черт его знает...зависит от объекта (насколько большой хеш(для моделей), например и т.п.)

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

    public function __get($name)
    {
        $getter='get'.$name;
        if(method_exists($this,$getter))
            return $this->$getter();
        else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
        {
            // duplicating getEventHandlers() here for performance
            $name=strtolower($name);
            if(!isset($this->_e[$name]))
                $this->_e[$name]=new CList;
            return $this->_e[$name];
        }
        else if(isset($this->_m[$name]))
            return $this->_m[$name];
        else
            throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
                array('{class}'=>get_class($this), '{property}'=>$name)));
    }
 
т.е. наш ->getOwner() быстрее ->owner ровно на:
$getter='get'.$name;
if(method_exists($this,$getter))
return $this->$getter();
Аватара пользователя
delvin
Сообщения: 85
Зарегистрирован: 2009.11.13, 15:29

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение delvin »

Раньше делал просто модификацие beforeSave.
Решил по науке через behavior :)

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

    public function behaviors(){
        return array(
            'CTimestampBehavior' => array(
                'class' => 'zii.behaviors.CTimestampBehavior',
                'updateAttribute' => 'modify',
                'setUpdateOnCreate' => true,
                'timestampExpression' => 'time()',
            )
        );
    } 
У меня почему-то отказывается так работать.
SpiLLeR
Сообщения: 350
Зарегистрирован: 2009.09.17, 16:47
Откуда: Санкт-Петербург
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение SpiLLeR »

Использую расширение zii.behaviors.CTimestampBehavior и если в модели определен метод beforeSave(), то оно почему-то не работает. Никто с таким не сталкивался? При определении beforeValidate() проблем не возникает.
Предупрежден - значит вооружен.
devKP.ru
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации модели

Сообщение Ekstazi »

parent::beforeSave();
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: AutoTimestampBehavior — время создания и модификации мод

Сообщение slavcodev »

Еще один вариант автоматизации изменение время создания и модификации модели, если поведение подключать нет желания/возможности

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

class MyModel extends CActiveRecord
{
    public function rules()
    {
        return array(
            array('createTime','default','value'=>new CDbExpression('NOW()'),'on'=>'insert'),
            array('modifyTime','default','value'=>new CDbExpression('NOW()'),'setOnEmpty'=>false),
        );
    }
} 
Жду Yii 3!
Аватара пользователя
MOTORIST
Сообщения: 245
Зарегистрирован: 2010.06.24, 10:04

Re: AutoTimestampBehavior — время создания и модификации мод

Сообщение MOTORIST »

А что насчет производительности? Твой вариант визуально выглядит более эстетично=)
В сознании новичка много возможностей, в сознании эксперта — лишь несколько.
Ответить