Предварительная обработка поля

Уже исправленные репорты или принятые предложения
Закрыто
faeton
Сообщения: 88
Зарегистрирован: 2011.06.06, 01:00

Предварительная обработка поля

Сообщение faeton »

В некоторых случаях не хватает предварительной обработки поля перед выводом на форму

Я добавил несколько строк в свою копи фреймворка (ниже все описанно) и получил псевдополе, работающее как обычное поле, но данные берутся не из $model->filedname а из $model->___$fieldname, что позволяет сделать обработку поля перед выводом на форму.

Конкретное применение viewtopic.php?f=4&t=3932 viewtopic.php?f=3&t=4609

Думаю в фреймворк надо добавить такой функционал.

Файл framework/web/helpers/CHtml.php
меняем всего одну функцию

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

public static function resolveName($model,&$attribute_)
{
    $attribute=$attribute_;
    if (substr($attribute, 0 ,3)==='___')
        $attribute=substr($attribute, 3);
    
    if(($pos=strpos($attribute,'['))!==false)
    {
        if($pos!==0)  // e.g. name[a][b]
            return get_class($model).'['.substr($attribute,0,$pos).']'.substr($attribute,$pos);
        if(($pos=strrpos($attribute,']'))!==false && $pos!==strlen($attribute)-1)  // e.g. [a][b]name
        {
            $sub=substr($attribute,0,$pos+1);
            $attribute=substr($attribute,$pos+1);
            return get_class($model).$sub.'['.$attribute.']';
        }
        if(preg_match('/\](\w+\[.*)$/',$attribute,$matches))
        {
            $name=get_class($model).'['.str_replace(']','][',trim(strtr($attribute,array(']['=>']','['=>']')),']')).']';
            $attribute=$matches[1];
            return $name;
        }
    }
    else
        return get_class($model).'['.$attribute.']';
} 
Использование

в файле отображения используем имя нужного поля с тремя подчеркиваниями впереди:

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

<p class="more">
    <?php echo $form->labelEx($model,'more'); ?>
    <?php echo $form->textArea($model,'___more',array('rows'=>6, 'cols'=>50)); ?>
    <?php echo $form->error($model,'more'); ?>
</p>
<p class="full">
    <?php echo $form->labelEx($model,'full'); ?>
    <?php echo $form->textArea($model,'___full',array('rows'=>6, 'cols'=>50)); ?>
    <?php echo $form->error($model,'full'); ?>
</p>
При этом имена всех полей остается как надо (без трех подчеркиваний) а значение параметров берется из поля с подчеркиваниями
У меня это выглядело так (файл модели):

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

public function get___full()
{
    return str_replace('<br />', '', $this->$full);
}
public function get___more()
{
    return str_replace('<br />', '', $this->$more);
} 
Должно работать на всех элементах CActiveForm
Изображение
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: Предварительная обработка поля

Сообщение Nafania »

В некоторых случаях не хватает предварительной обработки поля перед выводом на форму
Самое простое это метод в модели. Еще есть afterFind. Можно сделать хелпер.
Да вариантов-то много вообщем, а вы уже фреймворк уже ковыряете.
faeton
Сообщения: 88
Зарегистрирован: 2011.06.06, 01:00

Re: Предварительная обработка поля

Сообщение faeton »

afterFind не подходит. изменять полу нужно только для вывода на редактирование
Да и хелпер не совсем то что нужно: такие изменения часто уникальны для поля и модели, и создавать еще один класс для этого?
Nafania писал(а):Самое простое это метод в модели
А как его использовать в таком случае

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

<?php echo $form->textArea($model,'full'); ?>
Изображение
Аватара пользователя
creocoder
Сообщения: 138
Зарегистрирован: 2010.01.24, 05:29
Откуда: Тамбов

Re: Предварительная обработка поля

Сообщение creocoder »

faeton писал(а):А как его использовать в таком случае
Элементарно, определяем в модели метод к примеру getModifiedMore(). И используем как:

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

<?php echo $form->textArea($model,'modifiedMore'); ?>
faeton
Сообщения: 88
Зарегистрирован: 2011.06.06, 01:00

Re: Предварительная обработка поля

Сообщение faeton »

creocoder писал(а):Элементарно
Мой велосипед уже сделали :)
Изображение
Закрыто