Π‘Π²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ½ΠΎΡΡΠ΅ΠΉ
Π‘Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ ΡΡΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ
Π³Π»ΠΎΠ±Π°Π»ΡΠ½Π³ΠΎ uid., (*1)
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ php 7.0 ΠΈ Π²ΡΡΠ΅. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠΎΠ΄ΡΠ»Ρ yii2-tree-manager
ΠΈ SAR (simple ajax requests), (*2)
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ composer., (*3)
php composer.phar require --prefer-dist fedornabilkin/yii2-binds "*"
ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π² ΡΠ΅ΠΊΡΠΈΡ require Π² ΡΠ°ΠΉΠ» composer.json
., (*4)
"fedornabilkin/yii2-binds": "dev-master"
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ
php yii migrate --migrationPath=@fedornabilkin/binds/migrations
, (*5)
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠΌ /binds/catalog
, (*6)
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
ΠΠΎΠ΄Π΅Π»Ρ, (*7)
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']);
}
}
Π€ΠΎΡΠΌΠ° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΠΌΠΈ, (*8)
= \fedornabilkin\binds\widgets\status\StatusWidget::widget(['model' => $model])?>
= $form->field($model, 'title')->textInput(['maxlength' => true]) ?>
= $form->field($model, 'post')->textarea(['rows' => 6]) ?>
= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
= \fedornabilkin\binds\widgets\seo\SeoWidget::widget(['model' => $model])?>
= \fedornabilkin\binds\widgets\binds\BindsWidget::widget(['model' => $model])?>
ΠΡΠ»ΠΈ ΠΊ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π° ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ΅ΠΉΡΠΈΠ½Π³Π°, ΡΠΎ Π² Comment::getChildModels()
Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΡΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ, ΡΡΠΎΠ±Ρ ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Post ΡΠ΄Π°Π»ΠΈΡΡ Π²ΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ,
ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊ Π½Π΅ΠΉ ΠΎΡΠ½ΠΎΡΡΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ΅ ΡΠ΅ΠΉΡΠΈΠ½Π³ΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡ., (*9)
Π’Π°ΠΊΠ°Ρ ΡΡ
Π΅ΠΌΠ° ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΡΡΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ
ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ»Π΅ uid
Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΠΊΠ»ΡΡΠΎΠΌ Π½Π° ΠΏΠΎΠ»Π΅ id
ΡΠ°Π±Π»ΠΈΡΡ bind_uids
ΠΈ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Ρ
ΠΊ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΠ»Π΅ uid_content
., (*10)
Π Π΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ ΠΏΠΎΠΈΡΠΊ uid
ΠΏΡΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ BindModel::_getUids()
, (*11)
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
Π§ΡΠΎΠ±Ρ SEO-Π΄Π°Π½Π½ΡΠ΅ ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΠ»ΠΈΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ΅ Π² metatags, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ
SeoBehavior
Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ View
Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅. Π’Π°ΠΊΠΆΠ΅ Π² Π°Π΄ΡΠ΅ΡΠ΅
Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ $_GET ?alias=adres-stranicy
., (*12)
'components' => [
...
'view' => [
'as seo' => [
'class' => \fedornabilkin\binds\behaviors\SeoBehavior::class,
],
],
],
'modules' => [
...
'binds' => [
'class' => 'fedornabilkin\binds\Module',
],
'treemanager' => [
'class' => 'kartik\tree\Module',
'dataStructure' => [
'keyAttribute' => 'id',
],
],
],
ΠΠ½ΡΡΡΡΠΊΡΠΈΡ ΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅, (*13)