Положение
Я использовал вики-статью на сайте Yii, Сбор табличных данных , чтобы следовать в качестве примера.
Я не думаю, что мне нужно проверять табличные данные в традиционном смысле для нескольких моделей. У меня есть только одна модель, но я динамически создаю количество полей в форме. Вот еще немного фона.
Я импортирую CSV-файлы, в которых заголовки разных файлов различаются. Перед правильным анализом файлов пользователь должен сопоставить, какой заголовок будет сопоставлен с какой таблицей / столбцом.
У меня есть одна модель, ImportParseForm
расширенная с CFormModel
. Это действительно только одно правило:
public function rules()
{
return array(
array('header', 'required'),
);
}
Вот фрагмент моего взгляда:
<?php foreach($headers as $h => $hItem): ?>
<div class="row">
<?php echo CHtml::label(CHtml::encode($hItem), "[$h]header"); ?> maps to
<?php echo $fParse->textField($mForm, "[$h]header"); ?>
<?php echo $fParse->error($mForm, "[$h]header"); ?>
</div>
<?php endforeach; ?>
Вот фрагмент моего контроллера:
$mForm = new ImportParseForm;
$valid = true;
if (isset($_POST['ImportParseForm'])){
foreach ($headers as $h => $hVal){
if (isset($_POST['ImportParseForm'][$h])){
$mForm->attributes = $_POST['ImportParseForm'][$h];
$valid = $mForm->validate() && $valid;
}
}
if ($valid){
// Process CSV
}
}
Если все поля действительны, то они проходят, как и ожидалось. Проблема в том, что если одно из полей недопустимо (или в данном случае пусто), тогда все поля помечаются как недействительные.
В Yii 1.1.10 они добавили CActiveForm :: validateTabular () , но похоже, что это для нескольких моделей. Не совсем то, что у меня здесь. Но для удовольствия я добавил следующее к своему контроллеру (конечно, удалил другой тип проверки):
CActiveForm::validateTabular($mForm, array('header'));
Сама форма действительна, только если заполнен первый элемент. Если первый элемент заполнен, он установит все остальные элементы с тем же значением (и пройдет проверку).
Вопрос
Можно ли использовать CActiveForm для проверки по полям, которые генерируются динамически (аналогично табличному вводу, но только с одной моделью)?