@EVOSandru6

Как в yii сделать валдацию для элементов массива связанной модели?

Добрый день,

В форме создания отеля , необходимо наполнить его номерами. Желательно, чтобы при добавлении каждого пункта номера, проходила клиентская валидация по содержимому его полей.

Есть 2 класса: Hotels и Rooms

1. В relations у Hotels:
'rooms' => [self::HAS_MANY, 'Rooms','hotel_id'],

2. В rules у Hotels:
[['rooms'],'safe']

3. В свойствах у Hotels:
public $rooms;

4. В _form.php для крудо в с отелями фрагмент:

<?php
    $this->widget('ext.jqrelcopy.JQRelcopy',array(
        //the id of the 'Copy' link in the view, see below.
        'id' => 'add_room',
        //add a icon image tag instead of the text
        //leave empty to disable removing
        'removeText' => 'Удалить',
        //htmlOptions of the remove link
        'removeHtmlOptions' => array('style'=>'color:red'),
        //options of the plugin, see http://www.andresvidal.com/labs/relcopy.html
        'options' => array(
            //A class to attach to each copy
            'copyClass'=>'newcopy',
            // The number of allowed copies. Default: 0 is unlimited
            'limit'=>5,
            //Option to clear each copies text input fields or textarea
            'clearInputs'=>true,
            //A jQuery selector used to exclude an element and its children
            'excludeSelector'=>'.skipcopy',
            //Additional HTML to attach at the end of each copy.
            'append'=>CHtml::tag('span',array('class'=>'hint'),'Вы можете удалить эту строку'),
        )
    ));?>

    <button type="button" class="btn btn-danger" data-toggle="collapse" data-target="#demo">
        <?php echo $form->labelEx($model, 'rooms'); ?>
    </button>

    <div  id="demo" class="collapse">
        <div class="add-room">
            <table class="table">
                <tr>
                    <td>
                        <?php echo CHtml::label('Название',''); ?>
                    </td>
                    <td>
                        <?php echo CHtml::label('Кол-во комнат <span class="badge">шт.</span>',''); ?>
                    </td>
                    <td>
                        <?php echo CHtml::label('Стоимость от отеля <span class="badge">тг.</span>',''); ?>
                    </td>
                    <td>
                        <?php echo CHtml::label('Стоимость от фирмы <span class="badge">тг.</span>',''); ?>
                    </td>
                    <td>
                        <?php echo CHtml::label('Свободная продажа',''); ?>
                    </td>
                    <td>
                        <?php echo CHtml::label('Завтрак',''); ?>
                    </td>
                    <td>
                        <?php echo CHtml::label('Рацион',''); ?>
                    </td>
                </tr>
                <tr>
                    <td>
                        <?php echo CHtml::textField('Hotels[rooms][name][]',''); ?>
                    </td>
                    <td>
                        <?php echo CHtml::numberField('Hotels[rooms][beds_count][]', '',
                            [
                                'placeholder'=>'шт. '
                            ]); ?>
                    </td>
                    <td>
                        <?php echo CHtml::numberField('Hotels[rooms][price][]', '',
                            [
                                'placeholder'=>'тг. '
                            ]); ?>
                    </td>


                    <td>
                        <?php echo CHtml::numberField('Hotels[rooms][price_rr][]', '',
                                [
                                    'placeholder'=>'тг. '
                                ]
                            ); ?>
                    </td>
                    <td>
                        <?php echo CHtml::checkBox('Hotels[rooms][is_freesale][]', ''); ?>
                    </td>
                    <td>
                        <?php echo CHtml::checkBox('Hotels[rooms][is_breakfast][]', ''); ?>
                    </td>
                    <td>
                        <?php echo CHtml::dropDownList('Hotels[rooms][food_id][]', '', CHtml::listData($food, 'id', 'name')); ?>

                    </td>

                </tr>


            </table>
        </div>
        <a id="add_room" href="#" class="btn btn-primary btn-lg" rel=".add-room">+</a>
    </div>


Данный виджет нужен для добавления однородных сущностей, потом, когда action подтягивает $_POST связанные данные сохраняются куда нужно (номера в свою таблицу).

Проблема в том, что валидация не подтягивается из класса Rooms

Как это можно поправить?
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
vyachin
@vyachin
Ищу работу
заменить [['rooms'],'safe'] на примерно ['rooms', 'validateRooms']

public function validateRooms()
{
foreach($this->rooms as $room) {
$model = new Room();
$model->load($room, '');
if (!$model->validate())
{
$this->addErrors($model->getErrors());
}
}
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы