CHtml::$errorCss в CActiveForm

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
DropSQL
Сообщения: 102
Зарегистрирован: 2010.02.19, 22:20
Откуда: Киев

CHtml::$errorCss в CActiveForm

Сообщение DropSQL »

Здравствуйте
У меня возникла пару вопросов по CActiveForm, для начала приведу сюда сво форму:

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

<div id="content">
    <?
    $form = $this->beginWidget('ActiveForm', array(
        'focus'=>array($model,'email'),
        'htmlOptions'=>array(
            'class' => 'details contact-form',
        ),
        'clientOptions'=>array(
            'validateOnSubmit'=>false,
            'validateOnChange'=>true,
            'validateOnType'=>false,
            'errorCssClass' => 'parent-error',
        ),
        'errorMessageCssClass' => 'error-txt',
    ));
    ?>
    <fieldset>
        <div class="headline">
            <div class="headline-holder">
                <h2><?=Yii::t('applicant', 'registrationApplicant')?></h2>
            </div>
        </div>
        <div class="row">
            <?=$form->label($model,'email'); ?>
            <?=$form->textField($model,'email',array('class'=>'text')); ?>
        </div>
        <?=$form->error($model, 'email')?>
        <div class="btn-area">
            <div class="btn-holder">
                <span class="submit"><?=Yii::t('forms', 'registration')?><?=$form->submit('');?></span>
            </div>
        </div>
    </fieldset>
    <?
    $this->endWidget();
    ?>
</div>
В клиентской валидация работает с заполнением css очень хорошо, но вот когда отправляется запрос на сервер и рендерится шаблон, css не выставляется такой какой мне нужно, ставится стандартный css класс 'error', как мне выставить правильный css class?
И ещё вопрос, как быть чтобы label не выставлял класс error? мне нужно label помечать никак, нужно только элементы формы (input, select...)

Надеюсь изложил понятно, заранее благодарен.

DropSQL
Сообщения: 102
Зарегистрирован: 2010.02.19, 22:20
Откуда: Киев

Re: CHtml::$errorCss в CActiveForm

Сообщение DropSQL »

Временное решение вопроса:
DropSQL писал(а):И ещё вопрос, как быть чтобы label не выставлял класс error? мне нужно label помечать никак, нужно только элементы формы (input, select...)
в ActiveForm (наследник CActiveForm) переопределил метод label:

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

public function label($model,$attribute,$htmlOptions=array())
    {
        if(isset($htmlOptions['for']))
        {
            $for=$htmlOptions['for'];
            unset($htmlOptions['for']);
        }
        else
            $for=CHtml::getIdByName(CHtml::resolveName($model,$attribute));
        if(isset($htmlOptions['label']))
        {
            if(($label=$htmlOptions['label'])===false)
                return '';
            unset($htmlOptions['label']);
        }
        else
            $label=$model->getAttributeLabel($attribute);
        return CHtml::label($label,$for,$htmlOptions);
    }

DropSQL
Сообщения: 102
Зарегистрирован: 2010.02.19, 22:20
Откуда: Киев

Re: CHtml::$errorCss в CActiveForm

Сообщение DropSQL »

Ну собственно ещё 1 костыль, для решения подставки css нужного в input и остальных полях:
Опять в ActiveForm:

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

public function init()
    {
        CHtml::$errorCss = $this->errorInputCssClass;
        parent::init();
    }
Собственно это всё костыли, но других вариантов пока что не нашел.

Проблема не решена, класс с input не удаляется после клиентской валидации... сейчас напишу js

DropSQL
Сообщения: 102
Зарегистрирован: 2010.02.19, 22:20
Откуда: Киев

Re: CHtml::$errorCss в CActiveForm

Сообщение DropSQL »

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

public function init()
    {
        CHtml::$errorCss = $this->errorInputCssClass;
        if(isset($this->clientOptions['afterValidate']))
        {
            $js = $this->clientOptions['afterValidate'];
        }
        $afterValidate = <<<JavaScript
function(form, data, hasError){
    alert("45");
    {$js}
    return true;
}
JavaScript;
        $this->clientOptions['afterValidate'] = $afterValidate;
        parent::init();
    }
 
этот код генерирует такой код:

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

'afterValidate':'function(form, data, hasError){\n\talert(\"45\");\n\t\n\treturn true;\n}'
 
Но никаких ошибок в консоле браузера и никакого алерта нету, ни до ни после валидации клиентской... как быть, подскажите плз? может подскажите плз как продебажить?

Joseph Jevelin
Сообщения: 339
Зарегистрирован: 2012.01.06, 22:07

Re: CHtml::$errorCss в CActiveForm

Сообщение Joseph Jevelin »

Столкнулся с подобной проблемой.
В версии Yii 1.1.13 добавили новые параметры, с помощью которых можно решить данную задачу.

В контроллере:

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

public function beforeAction($action)
{
    CHtml::$errorContainerTag='span';
    CHtml::$errorMessageCss='error-mes';
    CHtml::$errorSummaryCss='error-sum';

    return true;
}
В представлении:

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

<div class="row">
    <div>
        <?php echo $form->label($mUser, 'username'); ?>
    </div>

    <span>
        <?php echo $form->textField($mUser, 'username'); ?>

        <?php echo CHtml::error($mUser, 'username'); ?>
    </span>
</div>

Ответить