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.
		
		
		
		
		
			
		
			
				
					
					
						
							86 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							86 lines
						
					
					
						
							2.4 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace common\modules\pages\forms; | 
						|
 | 
						|
use core\forms\CompositeForm; | 
						|
use core\forms\MetaForm; | 
						|
use common\modules\pages\entities\Page; | 
						|
use core\validators\SlugValidator; | 
						|
use yii\db\ActiveQuery; | 
						|
use yii\helpers\ArrayHelper; | 
						|
use Yii; | 
						|
 | 
						|
/** | 
						|
 * @property MetaForm $meta; | 
						|
 */ | 
						|
class PageForm extends CompositeForm | 
						|
{ | 
						|
	public $type; | 
						|
 | 
						|
    public $title; | 
						|
    public $slug; | 
						|
    public $content; | 
						|
    public $parentId; | 
						|
 | 
						|
    public $_page; | 
						|
 | 
						|
    public function __construct(Page $page = null, $config = []) | 
						|
    { | 
						|
        if ($page) { | 
						|
            $this->title = $page->title; | 
						|
            $this->slug = $page->slug; | 
						|
            $this->content = $page->content; | 
						|
            $this->parentId = $page->parent ? $page->parent->id : null; | 
						|
            $this->meta = new MetaForm($page->meta); | 
						|
            $this->_page = $page; | 
						|
        } else { | 
						|
            $this->meta = new MetaForm(); | 
						|
        } | 
						|
        parent::__construct($config); | 
						|
    } | 
						|
 | 
						|
    public function rules(): array | 
						|
    { | 
						|
        return [ | 
						|
            [['title', 'slug'], 'required'], | 
						|
            [['parentId'], 'integer'], | 
						|
            [['title', 'slug'], 'string', 'max' => 255], | 
						|
            [['content'], 'string'], | 
						|
            ['slug', SlugValidator::class], | 
						|
            //[['slug'], 'unique', 'targetClass' => Page::class, 'filter' => $this->_page ? ['<>', 'id', $this->_page->id] : null] | 
						|
	        [['slug'], 'unique', 'targetClass' => Page::class, 'filter' => function (ActiveQuery $query) { | 
						|
		        if ($this->type != Page::TYPE_PUBLIC) { | 
						|
			        $query->andWhere($this->type . '=' . Page::TYPE_PUBLIC); | 
						|
		        } | 
						|
 | 
						|
		        $query->andWhere(['type' => Page::TYPE_PUBLIC]); | 
						|
		        if ($this->_page) { | 
						|
			        $query->andWhere(['<>', 'id', $this->_page->id]); | 
						|
		        } | 
						|
		        return $query; | 
						|
	        }], | 
						|
        ]; | 
						|
    } | 
						|
 | 
						|
	public function attributeLabels() { | 
						|
		return [ | 
						|
			'title' => Yii::t('page', 'Title'), | 
						|
			'slug' => Yii::t('page', 'Slug'), | 
						|
			'id' => Yii::t('page', 'ID'), | 
						|
			'content' => Yii::t('page', 'Content'), | 
						|
			'parentId' => Yii::t('page', 'Parent Page'), | 
						|
		]; | 
						|
	} | 
						|
 | 
						|
    public function parentsList(): array | 
						|
    { | 
						|
        return ArrayHelper::map(Page::find()->andWhere(['tree' => 1])->orderBy('lft')->asArray()->all(), 'id', function (array $page) { | 
						|
            return ($page['depth'] > 1 ? str_repeat('-- ', $page['depth'] - 1) . ' ' : '') . $page['title']; | 
						|
        }); | 
						|
    } | 
						|
 | 
						|
    public function internalForms(): array | 
						|
    { | 
						|
        return ['meta']; | 
						|
    } | 
						|
} |