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.
72 lines
1.9 KiB
72 lines
1.9 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\helpers\ArrayHelper; |
|
use Yii; |
|
|
|
/** |
|
* @property MetaForm $meta; |
|
*/ |
|
class PageForm extends CompositeForm |
|
{ |
|
public $title; |
|
public $slug; |
|
public $content; |
|
public $parentId; |
|
|
|
private $_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] |
|
]; |
|
} |
|
|
|
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()->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']; |
|
} |
|
} |