fedornabilkin / yii2-binds
通过基于全局标识符uid的中介表关联模型和实体
v0.0.1
2018-03-12 20:02 UTC
Requires
- bower-asset/simple-ajax-requests: ~0.1
- kartik-v/yii2-tree-manager: ~1.0.8
- yiisoft/yii2: ~2.0.0
This package is auto-updated.
Last update: 2024-09-20 19:14:44 UTC
README
通过中介表基于全局uid关联模型和实体。
此扩展需要php 7.0及以上版本。使用模块yii2-tree-manager和SAR (simple ajax requests)
安装
使用composer安装扩展。
php composer.phar require --prefer-dist fedornabilkin/yii2-binds "*"
或者在composer.json
文件的require部分添加。
"fedornabilkin/yii2-binds": "dev-master"
执行迁移
php yii migrate --migrationPath=@fedornabilkin/binds/migrations
管理目录/binds/catalog
使用示例
模型
use fedornabilkin\binds\behaviors\BindBehavior; use fedornabilkin\binds\behaviors\SeoBehavior; use fedornabilkin\binds\models\base\BindModel; class Post extends BindModel { public function behaviors() { return array_merge_recursive(parent::behaviors(), [ 'SeoBehavior' => [ 'class' => SeoBehavior::class, ], 'BindsBehavior' => [ 'class' => BindBehavior::class, 'tree' => [ // никнэймы корневых узлов дерева каталога 'nicknames' => [ 'visible' => [ 'multiple' => false, // единичный или множественный выбор ], 'categories' => [ 'multiple' => false, ], 'tags' => [ 'multiple' => true, 'asDropdown' => false, // развернутое состояние ], ], ], ], ]); } /** * tableName() * rules() * attributeLabels() * ... */ /** * модели hasOne, указать для удаления дочерней модели * если она связана с родительской один-к-одному * * Один комментарий может быть привязан только к одной модели Post */ public function getChildModels() { return array_merge(parent::getChildModels(), [ Comment::tableName() => Comment::class, ]); } /** * @return ActiveQuery */ public function getComments() { return $this->hasOne(Comment::class, ['uid_content' => 'uid']); } }
数据填充表单
<?php use fedornabilkin\binds\models\Catalog; use fedornabilkin\binds\models\Uid; use yii\helpers\Html; use kartik\tree\TreeViewInput; use yii\widgets\ActiveForm; /* @var $this yii\web\View */ /* @var $model frontend\models\Post */ ?>
<div class="post-update"> <?php $form = ActiveForm::begin(); ?> <div class="row"> <div class="col-xs-12 col-sm-8"> <?= \fedornabilkin\binds\widgets\status\StatusWidget::widget(['model' => $model])?> <?= $form->field($model, 'title')->textInput(['maxlength' => true]) ?> <?= $form->field($model, 'post')->textarea(['rows' => 6]) ?> <div class="form-group"> <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?> </div> <?= \fedornabilkin\binds\widgets\seo\SeoWidget::widget(['model' => $model])?> </div> <div class="col-xs-12 col-sm-4"> <?= \fedornabilkin\binds\widgets\binds\BindsWidget::widget(['model' => $model])?> </div> </div> <?php ActiveForm::end(); ?> </div>
如果评论与评分模型相关联,则在Comment::getChildModels()
中指定此模型,以便在删除Post模型时删除所有相关评论以及每个删除评论的评分。
此删除模型方案仅在以下情况下有效:如果这些模型具有uid
字段,该字段在bind_uids
表的id
字段上具有外键,并且通过uid_content
字段与父模型相关联。
删除时的递归搜索uid在BindModel::_getUids()
方法中实现
配置
要使SEO数据在页面的metatags中显示,需要在配置文件中将SeoBehavior
添加到组件View
。此外,在地址中需要传递$_GET ?alias=adres-stranicy
。
'components' => [ ... 'view' => [ 'as seo' => [ 'class' => \fedornabilkin\binds\behaviors\SeoBehavior::class, ], ], ], 'modules' => [ ... 'binds' => [ 'class' => 'fedornabilkin\binds\Module', ], 'treemanager' => [ 'class' => 'kartik\tree\Module', 'dataStructure' => [ 'keyAttribute' => 'id', ], ], ],