рдЕрдХреНрд╕рд░, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛, рдПрдХ рд╕рд╛рдЗрдЯ рдмрдирд╛рддреЗ рд╕рдордп, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╕рд╛рдЗрдЯ рдХреЗ рдкреГрд╖реНрда рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЗрдХрд╛рдИ рдХреА рдЖрдИрдбреА рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкрд╛рда рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдЦреЛрд▓реЗ рдЬрд╛рдПрдВ, рдЗрд╕реЗ рд╕реНрд▓рдЧ рдХрд╣рддреЗ рд╣реИрдВред
post/view/1 => post/view/testovaya-novost
(рдпрд╣ рдпреВрдЖрд░рдПрд▓ рд╕реЗ рджреГрд╢реНрдп рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдмрдХ рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ)
рд╕рдмрд╕реЗ рдкреНрд░рдореБрдЦ рддрд░реАрдХрд╛ рдкреЛрд╕реНрдЯ рдЯреЗрдмрд▓ рдореЗрдВ рдПрдХ рд╕реНрд▓рдЧ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдирд╛ рд╣реИ, рдкреЛрд╕реНрдЯ рдореЙрдбрд▓ рдореЗрдВ рдПрдХ рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдирдпрд╛ рдЗрдирдкреБрдЯ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкреЗрди рдХреЗ рд╕рд╛рде рд╕реНрд▓рдЧ рдбреНрд░рд╛рдЗрд╡ рдХрд░рддреЗ рд╣реИрдВред
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; ?> <div class="post-form"> <?php $form = ActiveForm::begin(); ?> <?= $form->field( $model, 'name' )->textInput( [ 'maxlength' => 255 ] ) ?> <?= $form->field( $model, 'slug' )->textInput( [ 'maxlength' => 255 ] ) ?> <?= $form->field( $model, 'content' )->textarea( [ 'rows' => 6 ] ) ?> <div class="form-group"> <?= Html::submitButton( $model->isNewRecord ? Yii::t( 'app', 'Create' ) : Yii::t( 'app', 'Update' ), [ 'class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary' ] ) ?> </div> <?php ActiveForm::end(); ?> </div>
рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдкреЗрди рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ (рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕реЗ рдмреЗрд╡рдХреВрдл рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ), рдЗрд╕рд▓рд┐рдП рд╣рдо рдореЙрдбрд▓ рдореЗрдВ рдРрд╕реЗ рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдореЙрдбрд▓ рдмрдЪ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирд╛рдо рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕реНрд▓рдЧ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЗрд╕рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕реНрд▓рдЧ рд╕реЗ рдкреЛрд╕реНрдЯ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ) рдХреБрд░реНрд╕рд┐рдпрд╛рдВ, рдФрд░, рдЗрд╕рд▓рд┐рдП, рд╕реНрд▓рдЧ рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛), рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдФрд░ рд╢рд╛рдпрдж рдЗрд╕реЗ рдЕрдиреВрджрд┐рдд рдХрд░реЗрдВ (рдкрд░реАрдХреНрд╖рдг-рд╕рдорд╛рдЪрд╛рд░ => testovaya-novost) - рдпрд╣ рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЦреИрд░, рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рд╣рдо рдШрдЯрдирд╛ рд╕реЗ рдЬреБрдбрд╝рддреЗ рд╣реИрдВ, рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ - рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ, рдПрдХ рд╕рд╛рдЗрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдкреЗрдЬ рдореЙрдбрд▓ рдореЗрдВ рд╕реНрд▓рдЧ рдХреА рдЕрднреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдорд╛рд▓ рдХреЗ рд▓рд┐рдП рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рднреА - рдЗрд╕реЗ рдЖрдЗрдЯрдо рдореЙрдбрд▓ рд╣реЛрдиреЗ рджреЗрдВред рдЖрдк рдХрдо рд╕реЗ рдХрдо рдкреНрд░рддрд┐рд░реЛрдз рдХреЗ рдорд╛рд░реНрдЧ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреЙрдкреА-рдкреЗрд╕реНрдЯред рд▓реЗрдХрд┐рди ...
Yii рдореЗрдВ, рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреИрд╕реА рдПрдХ рдЪреАрдЬ рд╣реИ - рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдореЙрдбрд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рддреЛ, рдЪрд▓реЛ slug'ification рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рд▓рд┐рдЦреЗрдВред
рд╣рдорд╛рд░реЗ рдкреЛрд╕реНрдЯ рдореЙрдбрд▓ (рдЙрд░реНрдл \ commoin \ рдореЙрдбрд▓ \ рдкреЛрд╕реНрдЯ, рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ), рд╣рдо рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдЬреЛ рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
public function behaviors() { return [ 'slug' => [ 'class' => 'common\behaviors\Slug', 'in_attribute' => 'name', 'out_attribute' => 'slug', 'translit' => true ] ]; }
рд╣рдордиреЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛, рдЙрд╕ рдХрдХреНрд╖рд╛ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ, рдФрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рддреАрди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдкрд╛рд░рд┐рдд рдХреА рдЧрдИрдВ:
1. in_attribute - рдЙрд╕ рдореЙрдбрд▓ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬрд┐рд╕рд╕реЗ рд╕реНрд▓рдЧ рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ (рд╡рд┐рднрд┐рдиреНрди рдореЙрдбрд▓реЛрдВ рдореЗрдВ рдпрд╣ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдирд╛рдо рдпрд╛ рд╢реАрд░реНрд╖рдХ)
2. out_attribute рд╕реНрд▓рдЧ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдХреНрд░рдорд╢рдГ (рд╕реНрд▓рдЧ рдпрд╛ рдЙрдкрдирд╛рдо)
3. рдЕрдиреБрд╡рд╛рдж - рдпрд╣рд╛рдБ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ
рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдирд╛рддреЗ рд╕рдордп, рдПрдХ рдФрд░ рдЪреМрдереА рд╡рд┐рд╢реЗрд╖рддрд╛ рдереА - рдЕрджреНрд╡рд┐рддреАрдп, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рджреБрд░реНрд▓рдн рд╣реИ рдХрд┐ рд╕реНрд▓рдЧ рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИред
рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ yii2-app-advanced рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЕрд░реНрдерд╛рддреН, рдореЗрд░реЗ рдкрд╛рд╕ рдмреИрдХрдПрдВрдб рдФрд░ рдлреНрд░рдВрдЯрдПрдВрдб рдлрд╝реЛрд▓реНрдбрд░ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рджреГрд╢реНрдп рд╕реНрдерд┐рдд рд╣реИрдВ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝реЛрд▓реНрдбрд░, рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбрд▓ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИрдВред
рд╕рд╛рдорд╛рдиреНрдп / рд╡реНрдпрд╡рд╣рд╛рд░ / Slug.php рдмрдирд╛рдПрдБ:
<?php namespace common\behaviors; use yii; use yii\base\Behavior; use yii\db\ActiveRecord; class Slug extends Behavior { public $in_attribute = 'name'; public $out_attribute = 'slug'; public $translit = true; public function events() { return [ ActiveRecord::EVENT_BEFORE_VALIDATE => 'getSlug' ]; } }
рд╣рдо yii \ base \ Behavior рд╕реЗ рдХреНрд▓рд╛рд╕ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рддреАрди рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдИрд╡реЗрдВрдЯ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдореЙрдбрд▓ рдХреЛ рд╕рд╣реЗрдЬрддреЗ рд╕рдордп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреБрдЫ рдИрд╡реЗрдВрдЯ рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЪреВрдВрдХрд┐ рд╕реНрд▓рдЧ рдЖрдорддреМрд░ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдирд┐рдпрдореЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рддреНрдпрд╛рдкрди рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрд▓рдЧ рдкреАрдврд╝реА рдХреЛ рдмрд╛рдВрдз рджреЗрдВрдЧреЗред
ActiveRecord::EVENT_BEFORE_VALIDATE => 'getSlug'
рдЕрдм getSlug рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВ:
public function getSlug( $event ) { if ( empty( $this->owner->{$this->out_attribute} ) ) { $this->owner->{$this->out_attribute} = $this->generateSlug( $this->owner->{$this->in_attribute} ); } else { $this->owner->{$this->out_attribute} = $this->generateSlug( $this->owner->{$this->out_attribute} ); } }
рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕ $ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ-> рдорд╛рд▓рд┐рдХред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрд▓рдЧ рд╣рдореЗрдВ рдЗрд╕ рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ $ $ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛-> рд╕реНрд╡рд╛рдореА-> рд╕реНрд▓рдЧ рдпрд╛ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ $ рдпрд╣-> рд╕реНрд╡рд╛рдореА -> {$ рдпрд╣-> out_attribute}, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдирд╛рдо рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ $ рдЗрд╕ рдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ-> out_attributeред
рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдмрдЪрдд рдХрд░рддреЗ рд╕рдордп рд╕реНрд▓рдЧ рдЦрд╛рд▓реА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрджрд┐ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдирд╛рдо (рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рд╢реАрд░реНрд╖рдХ) рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рд╕реНрд▓рдЧ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
private function generateSlug( $slug ) { $slug = $this->slugify( $slug ); if ( $this->checkUniqueSlug( $slug ) ) { return $slug; } else { for ( $suffix = 2; !$this->checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {} return $new_slug; } }
рд╡рд┐рдзрд┐ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдо рдЕрд╡рд╛рдВрдЫрд┐рдд рдкрд╛рддреНрд░реЛрдВ рдХреЛ рд╕реНрд▓рдЧрд┐рдлрд╝ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд▓рд┐рдкреНрдпрдВрддрд░рдг рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рддреБрд░рдВрдд рдЗрд╕реЗ рджреЗрдЦреЗрдВ:
private function slugify( $slug ) { if ( $this->translit ) { return Inflector::slug( TransliteratorHelper::process( $slug ), '-', true ); } else { return $this->slug( $slug, '-', true ); } }
рд▓рд┐рдкреНрдпрдВрддрд░рдг рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдорд╛рдирдХ рд▓реИрдЯрд┐рди рд╡рд░реНрдгрдорд╛рд▓рд╛ рдореЗрдВ рдЙрдирдХреЗ рдПрдирд╛рд▓реЙрдЧреНрд╕ рджреНрд╡рд╛рд░рд╛ рд░рд╛рд╖реНрдЯреНрд░реАрдп рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рд╣реИред рд╡рд┐рджреЗрд╢реА рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реНрдирд┐рдкреЗрдЯ рдХреЗрд╡рд▓ umlauts, рдХреИрдк рдФрд░ рдЕрдиреНрдп рд╡рд░реНрдгреЛрдВ ('├А' => 'A', '=' => 'A', '=' => 'A', '├Г' ') рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдкрд╛рда рдХрд░рддреЗ рд╣реИрдВред > 'рдП'), рдЕрд░реНрдерд╛рддреН, "рдЧрдВрджреЗ" рд▓реИрдЯрд┐рди рд╕реЗ "рд╕рд╛рдл" рдмрдирд╛рддреЗ рд╣реИрдВред рдорд╛рдирдХ рд╕рд╣рд╛рдпрдХ yii2 yii \ рд╣реЗрд▓реНрдкрд░реНрд╕ \ Inflector :: рд╕реНрд▓рдЧ рднреА рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИ (рд╡реИрд╕реЗ, рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдЕрд╕рдВрдЧрдд рд░реВрдк рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - yii2 рдкрд░ рд╡рд┐рдХрд╛рд╕ рдЕрднреА рднреА рдЬрд╛рд░реА рд╣реИ)ред RuNet рдореЗрдВ, рд╡реЗ рдХреНрд░рдорд╢рдГ рд▓реИрдЯрд┐рди рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЗ рд╕рд╛рде рд╕рд┐рд░рд┐рд▓рд┐рдХ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреА рдЬрдЧрд╣ рд▓реЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдмрд╕реЗ рд▓рдЪреАрд▓рд╛ рд▓рд┐рдкреНрдпрдВрддрд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред Yii \ helpers \ Inflector :: slug рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг php рдПрдХреНрд╕рдЯреЗрдВрд╢рди intl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЪреАрдиреА рдЕрдХреНрд╖рд░реЛрдВ рдХрд╛ рднреА рдЕрдиреБрд╡рд╛рдж рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ (php 5.5.6)ред рд▓реЗрдХрд┐рди yii рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрднреБрдд 2amigos рдбреЗрд╡рд▓рдкрд░, рдЕрдиреБрд╡рд╛рджрдХ-рд╕рд╣рд╛рдпрдХ-рдРрдб-рдСрди рдкрд╛рдпрд╛ (рдпрд╣, рдмрджрд▓реЗ рдореЗрдВ, рдбреНрд░реБрдкрд▓ рд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдпрд╛рдж рд╣реИ)ред рдпрд╣ php рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд░реНрдгреЛрдВ рдФрд░ рд▓реИрдЯрд┐рди рдореЗрдВ рдЙрдирдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред
рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВ
"2amigos/transliterator-helper": "2.0.*"
рдХрдВрдкреЛрдЬрд╝рд░.рдЬрд╕рди рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЕрдм dosamigos \ helpers \ Transliterator рд╣реЗрд▓реНрдкрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ:
return Inflector::slug( TransliteratorHelper::process( $slug ), '-', true );
рд╣рдо рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЧреИрд░-рд╡рд░реНрдгрдирд╛рддреНрдордХ рд╡рд░реНрдгреЛрдВ рд╕реЗ рд╕реНрдкрд╖реНрдЯ, рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЛ рдбреИрд╢ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ "-"ред
рдпрджрд┐ рд╣рдореЗрдВ рд▓рд┐рдкреНрдпрдВрддрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ:
return $this->slug( $slug, '-', true );
рд╕реНрд▓рдЧ рд╡рд┐рдзрд┐ (yii \ рд╣реЗрд▓реНрдкрд░реНрд╕ \ Inflector рдХрд╛ рдЫреЛрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг :: рдЯреНрд░рд╛рдВрд╕рд▓рд┐рдЯрд░реЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рд╕реНрд▓рдЧ):
private function slug( $string, $replacement = '-', $lowercase = true ) { $string = preg_replace( '/[^\p{L}\p{Nd}]+/u', $replacement, $string ); $string = trim( $string, $replacement ); return $lowercase ? strtolower( $string ) : $string; }
рд╡рд╛рдкрд╕ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
private function generateSlug( $slug ) { $slug = $this->slugify( $slug ); if ( $this->checkUniqueSlug( $slug ) ) { return $slug; } else { for ( $suffix = 2; !$this->checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {} return $new_slug; } }
рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐, рд╣рдо рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд▓рдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рдЧреИрд░-рдЕрджреНрд╡рд┐рддреАрдп рд╕реНрд▓рдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
private function checkUniqueSlug( $slug ) { $pk = $this->owner->primaryKey(); $pk = $pk[0]; $condition = $this->out_attribute . ' = :out_attribute'; $params = [ ':out_attribute' => $slug ]; if ( !$this->owner->isNewRecord ) { $condition .= ' and ' . $pk . ' != :pk'; $params[':pk'] = $this->owner->{$pk}; } return !$this->owner->find() ->where( $condition, $params ) ->one(); }
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкреНрд░рд╛рдердорд┐рдХ рдХреБрдВрдЬреА рдЖрдИрдбреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрдХреЗ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдвреВрдВрдврддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реНрд▓рдЧ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд░рд┐рдХреЙрд░реНрдб рдирдпрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рдо рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (! $ This-> owner-> isNewRecord), рддреЛ рд╕реНрд▓рдЧ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдЖрдИрдбреА рдХреЗ рд▓рд┐рдП рдЕрдкрд╡рд╛рдж рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ:
$condition .= ' and ' . $pk . ' != :pk';
рдпрджрд┐ рд╕реНрд▓рдЧ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИ, рдФрд░ рдЧрд▓рдд рд╣реИ рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рд╣реИред рдЕрдЧрд▓реЗ:
if ( $this->checkUniqueSlug( $slug ) ) { return $slug; } else { for ( $suffix = 2; !$this->checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {} return $new_slug; }
рдпрджрд┐ рд╕реНрд▓рдЧ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдореЙрдбрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореЙрдбрд▓ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдЕрджреНрд╡рд┐рддреАрдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдбрд┐рдЬрд┐рдЯрд▓ рдкреНрд░рддреНрдпрдп testovaya-novost-2 рдЬреЛрдбрд╝реЗрдВ
for ( $suffix = 2; !$this->checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {}
рдЬрд╛рдирд╡рд░ рдмрд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкрд╣рд▓реЗ рдореБрдХреНрдд рдкреНрд░рддреНрдпрдп рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрд▓рдЧ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╡рд░реНрдбрдкреНрд░реЗрд╕ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреНрдпрдп рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддрд╛, рдЬреЛ рд╣рдо рдЗрд╕реЗ рдорд╛рдВрдЧ рдкрд░ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрд░рдорд╢рдГ рдЬрдм рдЯреЗрд╕реНрдЯреЛрд╡реЗрдпрд╛-рдиреЛрд╡реЛрд╕реНрдЯ, рдЯреЗрд╕реНрдЯреЛрд╡реИрдпреНрдпрд╛-рдиреЛрд╡реЛрд╕реНрдЯ -2, рдЯреЗрд╕реНрдЯреЛрд╡реИрдпрд╛-рдиреЛрд╡реЛрд╕реНрдЯ -3, рдЯреЗрд╕реНрдЯреЛрд╡реИрдпреНрдпрд╛-рдиреЛрд╡реЛрд╕реНрдЯ -4, рдЯреЗрд╕реНрдЯреЛрд╡реИрдпреНрдпрд╛-рдиреЛрд╡реЛрд╕реНрдЯ -5 рд╣рдорд╛рд░реЗ рд▓рд┐рдПред рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ 6 рдкреНрд░рд╢реНрди рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдЕрдЧрд░ рдХреЛрдИ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рджреЗ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред
рддреЛ, рд╕реНрд▓рдЧ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдореЙрдбрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЕрдиреНрдп рдореЙрдбрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдкреВрд░рд╛ рдкрд╛рда: <?php namespace common\behaviors; use dosamigos\helpers\TransliteratorHelper; use yii; use yii\base\Behavior; use yii\db\ActiveRecord; use yii\helpers\Inflector; class Slug extends Behavior { public $in_attribute = 'name'; public $out_attribute = 'slug'; public $translit = true; public function events() { return [ ActiveRecord::EVENT_BEFORE_VALIDATE => 'getSlug' ]; } public function getSlug( $event ) { if ( empty( $this->owner->{$this->out_attribute} ) ) { $this->owner->{$this->out_attribute} = $this->generateSlug( $this->owner->{$this->in_attribute} ); } else { $this->owner->{$this->out_attribute} = $this->generateSlug( $this->owner->{$this->out_attribute} ); } } private function generateSlug( $slug ) { $slug = $this->slugify( $slug ); if ( $this->checkUniqueSlug( $slug ) ) { return $slug; } else { for ( $suffix = 2; !$this->checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {} return $new_slug; } } private function slugify( $slug ) { if ( $this->translit ) { return Inflector::slug( TransliteratorHelper::process( $slug ), '-', true ); } else { return $this->slug( $slug, '-', true ); } } private function slug( $string, $replacement = '-', $lowercase = true ) { $string = preg_replace( '/[^\p{L}\p{Nd}]+/u', $replacement, $string ); $string = trim( $string, $replacement ); return $lowercase ? strtolower( $string ) : $string; } private function checkUniqueSlug( $slug ) { $pk = $this->owner->primaryKey(); $pk = $pk[0]; $condition = $this->out_attribute . ' = :out_attribute'; $params = [ ':out_attribute' => $slug ]; if ( !$this->owner->isNewRecord ) { $condition .= ' and ' . $pk . ' != :pk'; $params[':pk'] = $this->owner->{$pk}; } return !$this->owner->find() ->where( $condition, $params ) ->one(); } }
рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛрдб рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓рд┐рдкреНрдпрдВрддрд░рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
test цИСчИ▒ ф╕нцЦЗ ╬и с╛Й ╟╝ ├Я => test-test-y-test-wo-ai-zhong-wen-ps-a-ae-ss-c
рд╕рдВрджрд░реНрдн: