You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					109 lines
				
				3.2 KiB
			
		
		
			
		
	
	
					109 lines
				
				3.2 KiB
			| 
											8 years ago
										 | <?php
 | ||
|  | 
 | ||
|  | namespace core\forms;
 | ||
|  | 
 | ||
|  | use yii\base\Model;
 | ||
|  | use yii\helpers\ArrayHelper;
 | ||
|  | 
 | ||
|  | abstract class CompositeForm extends Model
 | ||
|  | {
 | ||
|  |     /**
 | ||
|  |      * @var Model[]|array[]
 | ||
|  |      */
 | ||
|  |     private $forms = [];
 | ||
|  | 
 | ||
|  |     abstract protected function internalForms(): array;
 | ||
|  | 
 | ||
|  |     public function load($data, $formName = null): bool
 | ||
|  |     {
 | ||
|  |         $success = parent::load($data, $formName);
 | ||
|  |         foreach ($this->forms as $name => $form) {
 | ||
|  |             if (is_array($form)) {
 | ||
|  |                 $success = Model::loadMultiple($form, $data, $formName === null ? null : $name) && $success;
 | ||
|  |             } else {
 | ||
|  |                 $success = $form->load($data, $formName !== '' ? null : $name) && $success;
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         return $success;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public function validate($attributeNames = null, $clearErrors = true): bool
 | ||
|  |     {
 | ||
|  |         $parentNames = $attributeNames !== null ? array_filter((array)$attributeNames, 'is_string') : null;
 | ||
|  |         $success = parent::validate($parentNames, $clearErrors);
 | ||
|  |         foreach ($this->forms as $name => $form) {
 | ||
|  |             if (is_array($form)) {
 | ||
|  |                 $success = Model::validateMultiple($form) && $success;
 | ||
|  |             } else {
 | ||
|  |                 $innerNames = $attributeNames !== null ? ArrayHelper::getValue($attributeNames, $name) : null;
 | ||
|  |                 $success = $form->validate($innerNames ?: null, $clearErrors) && $success;
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         return $success;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public function hasErrors($attribute = null): bool
 | ||
|  |     {
 | ||
|  |         if ($attribute !== null) {
 | ||
|  |             return parent::hasErrors($attribute);
 | ||
|  |         }
 | ||
|  |         if (parent::hasErrors($attribute)) {
 | ||
|  |             return true;
 | ||
|  |         }
 | ||
|  |         foreach ($this->forms as $name => $form) {
 | ||
|  |             if (is_array($form)) {
 | ||
|  |                 foreach ($form as $i => $item) {
 | ||
|  |                     if ($item->hasErrors()) {
 | ||
|  |                         return true;
 | ||
|  |                     }
 | ||
|  |                 }
 | ||
|  |             } else {
 | ||
|  |                 if ($form->hasErrors()) {
 | ||
|  |                     return true;
 | ||
|  |                 }
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         return false;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public function getFirstErrors(): array
 | ||
|  |     {
 | ||
|  |         $errors = parent::getFirstErrors();
 | ||
|  |         foreach ($this->forms as $name => $form) {
 | ||
|  |             if (is_array($form)) {
 | ||
|  |                 foreach ($form as $i => $item) {
 | ||
|  |                     foreach ($item->getFirstErrors() as $attribute => $error) {
 | ||
|  |                         $errors[$name . '.' . $i . '.' . $attribute] = $error;
 | ||
|  |                     }
 | ||
|  |                 }
 | ||
|  |             } else {
 | ||
|  |                 foreach ($form->getFirstErrors() as $attribute => $error) {
 | ||
|  |                     $errors[$name . '.' . $attribute] = $error;
 | ||
|  |                 }
 | ||
|  |             }
 | ||
|  |         }
 | ||
|  |         return $errors;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public function __get($name)
 | ||
|  |     {
 | ||
|  |         if (isset($this->forms[$name])) {
 | ||
|  |             return $this->forms[$name];
 | ||
|  |         }
 | ||
|  |         return parent::__get($name);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public function __set($name, $value)
 | ||
|  |     {
 | ||
|  |         if (in_array($name, $this->internalForms(), true)) {
 | ||
|  |             $this->forms[$name] = $value;
 | ||
|  |         } else {
 | ||
|  |             parent::__set($name, $value);
 | ||
|  |         }
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public function __isset($name)
 | ||
|  |     {
 | ||
|  |         return isset($this->forms[$name]) || parent::__isset($name);
 | ||
|  |     }
 | ||
|  | }
 |