/** * Создает DataProvider на основе переданных данных * @param $params - параметры * @return ActiveDataProvider */ public function search($params) { $query = Field::find(); $dataProvider = new ActiveDataProvider(['query' => $query, 'pagination' => ['pageSize' => $this::COUNT]]); $this->load($params); // Если валидация не пройдена, то ничего не выводить if (!$this->validate()) { $query->where('0=1'); return $dataProvider; } // Фильтрация $query->andFilterWhere(['id' => $this->id, 'template_id' => $this->template_id, 'type' => $this->type, 'min' => $this->min, 'max' => $this->max]); $query->andFilterWhere(['like', 'name', $this->name])->andFilterWhere(['like', 'param', $this->param]); return $dataProvider; }
/** * Валидация дополнительных полей * документа */ public function fieldsValidate() { if ($this->fields) { $access_field_ids = []; // ID доступных полей // Получаем поля текущего шаблона $templateFields = Field::find()->where(['template_id' => $this->template_id])->all(); if ($templateFields) { foreach ($templateFields as $tf) { $access_field_ids[] = $tf->id; // Заполняем недостающие необходимые данных, которые // не приходят с формы заполнения документа, но необходимы // для валидации if (in_array($tf->id, array_keys($this->fields))) { $this->fields[$tf->id]['name'] = $tf->name; $this->fields[$tf->id]['type'] = $tf->type; $this->fields[$tf->id]['param'] = $tf->param; $this->fields[$tf->id]['min'] = $tf->min; $this->fields[$tf->id]['max'] = $tf->max; } } } // Определяем необходимую модель для валидации foreach ($this->fields as $field_id => $field) { // Перебираем дополнительные поля if (in_array($field_id, $access_field_ids)) { // Защита от подмены данных в массиве других полей if (isset($field['data']) && count($field['data']) && in_array($field['type'], array_keys(Field::getTypes()))) { foreach ($field['data'] as $data_id => $data) { // Перебираем все значения дополнительных полей if (in_array($field['type'], array_keys(ValueNumeric::getTypes()))) { // Числовой тип $item = substr_count($data_id, 'new') ? new ValueNumeric() : ValueNumeric::findOne($data_id); } elseif (in_array($field['type'], array_keys(ValueString::getTypes()))) { // Строковый тип $item = substr_count($data_id, 'new') ? new ValueString() : ValueString::findOne($data_id); } elseif (in_array($field['type'], array_keys(ValueText::getTypes()))) { // Текстовый тип $item = substr_count($data_id, 'new') ? new ValueText() : ValueText::findOne($data_id); } elseif (in_array($field['type'], array_keys(ValueDate::getTypes()))) { // Тип дата $item = substr_count($data_id, 'new') ? new ValueDate() : ValueDate::findOne($data_id); } $item->document_id = $this->id; $item->field_id = $field_id; $item->type = $field['type']; $item->value = isset($data['value']) ? $data['value'] : null; $item->position = isset($data['position']) ? $data['position'] : null; if (!$item->validate()) { // Ошибка значения дополнительного поля if (isset($item->errors['value'][0])) { $this->addError('fields[' . $field_id . '][data][' . $data_id . '][value]', $item->errors['value'][0]); } // Ошибка позиции дополнительного поля if (isset($item->errors['position'][0])) { $this->addError('fields[' . $field_id . '][data][' . $data_id . '][position]', $item->errors['position'][0]); } } } } } else { // Попытка сохранить поля не присущие текущему шаблону $this->addError('fields[' . $field_id . ']', Yii::t('document', 'Ошибка сохранения поля')); } } $this->requreValidate(); } }