Вычисляемое поле в модели

Рейтинг: 2Ответов: 2Опубликовано: 15.02.2011

В таблице есть поле description, содержащие описание товара. В CGridView хочется выводить краткое описание товара, примерно 150 символов от полного. Его я сохраняю в $short_description следующим способом:

public function __construct()
{
    $this->short_description = substr($this->description, 0, 150);   
}

К сожалению, данный метод не срабатывает. Какие ещё могут быть варианты? Вариант изменения данных в контроллере не рассматривается.

Класс модели наследуется от CActiveRecord.

Ответы

▲ 4Принят

Если я правильно понял, то у вас в базе есть поле description, обрезая да 150 символов вы хотите получить поле shortdescription. Порывшись в исходниках CActiveRecord далее CModel и далее CComponent смотрим на код волшебного метода __get()

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 if(is_array($this->_m))
        {
            foreach($this->_m as $object)
            {
                if($object->getEnabled() && (property_exists($object,$name) || $object->canGetProperty($name)))
                    return $object->$name;
            }
        }
        throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
            array('{class}'=>get_class($this), '{property}'=>$name)));
    }

можно попробывать написать функцию getshortdescription

public function getshortdescription()
{
   return mb_substr($this->description,0,150)
}
▲ 2

Посмотрите, какие параметры есть у класса, если, скажем, что-то вроде этого:

Class A {
    private description = '';

    public function __construct() {
        // вот сюда вы влезли
    }
...
}

И где-нибудь есть:

$record = new A();

То рекомендую просто расширить класс A:

Class B extends A {
    ...
}

Таким образом Вы получите доступ к this->description из класса B и сможете сделать все, что захотите, если, конечно, description не protected.