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);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |