an implementation of nestedSortable2.0
The preferred way to install this extension is through composer.
Either run
php composer.phar require --prefer-dist claudejanz/yii2-nested-sortable "*"
or add
"claudejanz/yii2-nested-sortable": "*"
to the require section of your composer.json
file.
In table migrateion:
$this->createTable('page', [
'id' => $this->primaryKey(),
'title' => $this->string(255)->notNull(),
'parent_id' => $this->integer()->null(),
'weight' => $this->integer(11)->notNull()->defaultValue(1),
]);
$this->createIndex('idx-page-parent_id', 'page', 'parent_id');
$this->addForeignKey('fk-page-parent_id-page-id', 'page', 'parent_id', 'page', 'id', 'SET NULL', 'CASCADE');
In ActiveRecord: for more details on Customizing Query Classes
/**
* @inheridoc
*/
public static function find()
{
return (new PageQuery(get_called_class()))->orderBy('weight');
}
/**
* @return ActiveQuery
*/
public function getParent()
{
return $this->hasOne(Page::className(), ['id' => 'parent_id']);
}
/**
* @return ActiveQuery
*/
public function getPages()
{
return $this->hasMany(Page::className(), ['parent_id' => 'id'])->inverseOf('parent');
}
Once the extension is installed, simply use it in your code by :
In view:
use claudejanz\yii2nestedSortable\NestedSortable;
echo NestedSortable::widget([
'items' => Page::find()->andWhere(['parent_id'=>null])->all(),
'url' => ['pages/save-sortable'],
'contentAttribute' => 'title';
'itemsAttribute' => 'pages';
]);
In controller:
public function actions()
{
return [
'save-sortable' => [
'class' => 'claudejanz\yii2nestedSortable\NestedSortableAction',
//'scenario'=>'editable', //optional
'modelclass' => Page::className(),
],
];
}