예제 #1
0
 /**
  * Создает 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;
 }
예제 #2
0
 /**
  * Валидация дополнительных полей
  * документа
  */
 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();
     }
 }