{"id":208328,"date":"2014-01-07T14:34:03","date_gmt":"2014-01-07T10:34:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=208328"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=208328","title":{"rendered":"<span class=\"post_title\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 (behaviour) \u0434\u043b\u044f Yii2<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0427\u0430\u0441\u0442\u043e, \u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430, \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0430\u0439\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0430\u0439\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u043f\u043e id \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u0431\u0430\u0437\u0435, \u0430 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443, \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e slug.<\/p>\n<pre><code class=\"php\">post\/view\/1 =&gt; post\/view\/testovaya-novost<\/code><\/pre>\n<p>  (\u0438\u0437 url&#8217;\u0430 \u0441\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u0438 view, \u043d\u043e \u0443\u0440\u043e\u043a \u043d\u0435 \u043e \u0442\u043e\u043c)<\/p>\n<p>  \u0421\u0430\u043c\u044b\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 post \u043f\u043e\u043b\u0435 slug, \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 Post \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (view) \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 input, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0432\u0431\u0438\u0432\u0430\u0435\u043c slug.<\/p>\n<pre><code class=\"php\"> &lt;?php  use yii\\helpers\\Html; use yii\\widgets\\ActiveForm;  \/**  * @var yii\\web\\View           $this  * @var common\\models\\Post     $model  * @var yii\\widgets\\ActiveForm $form  *\/ ?&gt;  &lt;div class=&quot;post-form&quot;&gt;  \t&lt;?php $form = ActiveForm::begin(); ?&gt;  \t&lt;?= $form-&gt;field( $model, 'name' )-&gt;textInput( [ 'maxlength' =&gt; 255 ] ) ?&gt; \t&lt;?= $form-&gt;field( $model, 'slug' )-&gt;textInput( [ 'maxlength' =&gt; 255 ] ) ?&gt; \t&lt;?= $form-&gt;field( $model, 'content' )-&gt;textarea( [ 'rows' =&gt; 6 ] ) ?&gt;  \t&lt;div class=&quot;form-group&quot;&gt; \t\t&lt;?= Html::submitButton( $model-&gt;isNewRecord ? Yii::t( 'app', 'Create' ) : Yii::t( 'app', 'Update' ), [ 'class' =&gt; $model-&gt;isNewRecord ? 'btn btn-success' : 'btn btn-primary' ] ) ?&gt; \t&lt;\/div&gt;  \t&lt;?php ActiveForm::end(); ?&gt;  &lt;\/div&gt;<\/code><\/pre>\n<p>  <a name=\"habracut\"><\/a><\/p>\n<p>  \u041d\u043e \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e (\u0434\u0430 \u043a\u043e\u0433\u043e \u044f \u043e\u0431\u043c\u0430\u043d\u044b\u0432\u0430\u044e, \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432 \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 slug \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437 name, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0435\u0433\u043e \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0432\u0435\u0434\u044c \u043c\u044b \u043f\u043e slug&#8217;\u0443 \u0431\u0443\u0434\u0435\u043c \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c post \u0438\u0437 \u0431\u0430\u0437\u044b, \u0430, \u0437\u043d\u0430\u0447\u0438\u0442, slug \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c), \u043d\u0443 \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e (\u0442\u0435\u0441\u0442\u043e\u0432\u0430\u044f-\u043d\u043e\u0432\u043e\u0441\u0442\u044c =&gt; testovaya-novost) \u2014 \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e.<br \/>  \u0427\u0442\u043e \u0436, \u043f\u0438\u0448\u0435\u043c, \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043a \u0441\u043e\u0431\u044b\u0442\u0438\u044e, \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u2014 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0418 \u0442\u0443\u0442 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0441\u0430\u0439\u0442\u0430 \u043c\u044b \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e slug&#8217;\u0438 \u0435\u0449\u0435 \u043d\u0443\u0436\u043d\u044b \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 Page. \u0410 \u0435\u0449\u0435 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0434\u043b\u044f \u0442\u043e\u0432\u0430\u0440\u0430 \u2014 \u043f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u043e\u0434\u0435\u043b\u044c Item. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0439\u0442\u0438 \u043f\u043e \u043f\u0443\u0442\u0438 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0433\u043e \u0441\u043e\u043f\u0440\u043e\u0442\u0438\u0432\u043b\u0435\u043d\u0438\u044f \u2014 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0430. \u041d\u043e\u2026<\/p>\n<p>  \u0412 Yii \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0442\u0430\u043a\u0430\u044f \u0432\u0435\u0449\u044c \u043a\u0430\u043a \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f (behaviours) \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445. \u0418\u0442\u0430\u043a, \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0434\u043b\u044f slug&#8217;\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u0412 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 Post (\u043e\u043d\u0430 \u0436\u0435 \\commoin\\models\\Post \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439) \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0435\u0449\u0435 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"php\">public function behaviors() { \treturn [  \t\t'slug' =&gt; [ \t\t\t'class' =&gt; 'common\\behaviors\\Slug', \t\t\t'in_attribute' =&gt; 'name', \t\t\t'out_attribute' =&gt; 'slug', \t\t\t'translit' =&gt; true \t\t] \t]; }<\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e behaviours, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u043a\u043b\u0430\u0441\u0441, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0442\u0440\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430:<br \/>  1. in_attribute \u2014 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043c\u043e\u0434\u0435\u043b\u0438, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f slug (\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 name \u0438\u043b\u0438 title)<br \/>  2. out_attribute \u2014 \u044d\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e slug&#8217;\u0430 (slug \u0438\u043b\u0438 alias)<br \/>  3. translit \u2014 \u0442\u0443\u0442 \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e<\/p>\n<p>  \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u0435\u0449\u0435 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u2014 unique, \u043d\u043e \u043f\u043e\u0442\u043e\u043c \u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043b \u044d\u0442\u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0442.\u043a. \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u043e \u043d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b slug \u0431\u044b\u043b \u043d\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c.<\/p>\n<p>  \u0423\u043f\u043e\u043c\u044f\u043d\u0443, \u0447\u0442\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f yii2-app-advanced, \u0442\u043e \u0435\u0441\u0442\u044c \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043f\u0430\u043f\u043a\u0438 backend \u0438 frontend, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043b\u0435\u0436\u0430\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b \u0438 \u0432\u044c\u044e\u0448\u043a\u0438, \u0438 \u043f\u0430\u043f\u043a\u0430 common, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0431\u0449\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c common\/behaviours\/Slug.php:<\/p>\n<pre><code class=\"php\">&lt;?php  namespace common\\behaviors;  use yii; use yii\\base\\Behavior; use yii\\db\\ActiveRecord;  class Slug extends Behavior { \tpublic $in_attribute = 'name'; \tpublic $out_attribute = 'slug'; \tpublic $translit = true;  \tpublic function events() \t{ \t\treturn [ \t\t\tActiveRecord::EVENT_BEFORE_VALIDATE =&gt; 'getSlug' \t\t]; \t}\t }<\/code><\/pre>\n<p>  \u041a\u043b\u0430\u0441\u0441 \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043e\u0442 yii\\base\\Behavior, \u043f\u0440\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0442\u0440\u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 \u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\u043c\u0438, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 events, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044e \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438. \u0422\u0430\u043a \u043a\u0430\u043a slug \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d \u0432 rules \u043a\u0430\u043a required, \u0442\u043e \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e slug&#8217;\u0430 \u0434\u043e \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"php\">ActiveRecord::EVENT_BEFORE_VALIDATE =&gt; 'getSlug'<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 getSlug:<\/p>\n<pre><code class=\"php\">public function getSlug( $event ) { \tif ( empty( $this-&gt;owner-&gt;{$this-&gt;out_attribute} ) ) { \t\t$this-&gt;owner-&gt;{$this-&gt;out_attribute} = $this-&gt;generateSlug( $this-&gt;owner-&gt;{$this-&gt;in_attribute} ); \t} else { \t\t$this-&gt;owner-&gt;{$this-&gt;out_attribute} = $this-&gt;generateSlug( $this-&gt;owner-&gt;{$this-&gt;out_attribute} ); \t} }<\/code><\/pre>\n<p>  \u0421\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043a\u0430\u043a $this-&gt;owner. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c slug \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a $this-&gt;owner-&gt;slug \u0438\u043b\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 $this-&gt;owner-&gt;{$this-&gt;out_attribute}, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430 slug&#8217;\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e $this-&gt;out_attribute.<br \/>  \u0414\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u0443\u0441\u0442 \u043b\u0438 slug \u043f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0438, \u0435\u0441\u043b\u0438 \u043f\u0443\u0441\u0442, \u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e \u0438\u0437 name (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0438). \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442, \u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0438\u0439 slug.<\/p>\n<pre><code class=\"php\">private function generateSlug( $slug ) { \t$slug = $this-&gt;slugify( $slug ); \tif ( $this-&gt;checkUniqueSlug( $slug ) ) { \t\treturn $slug; \t} else { \t\tfor ( $suffix = 2; !$this-&gt;checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {} \t\treturn $new_slug; \t} }<\/code><\/pre>\n<p>  \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u043c\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 slugify \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043c \u0432 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u0435\u0435 \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c:<\/p>\n<pre><code class=\"php\">private function slugify( $slug ) { \tif ( $this-&gt;translit ) { \t\treturn Inflector::slug( TransliteratorHelper::process( $slug ), '-', true ); \t} else { \t\treturn $this-&gt;slug( $slug, '-', true ); \t} }<\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442? \u042d\u0442\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u0430\u043c\u0438 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u0435. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u043d\u0438\u043f\u043f\u0435\u0442\u043e\u0432, \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0432 \u0437\u0430\u0440\u0443\u0431\u0435\u0436\u043d\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u043e\u0447\u0438\u0449\u0430\u044e\u0442 \u0442\u0435\u043a\u0441\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0443\u043c\u043b\u044f\u0443\u0442\u043e\u0432, \u043a\u0440\u044b\u0448\u0435\u0447\u0435\u043a \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 (&#8216;\u00c0&#8217; =&gt; &#8216;A&#8217;, &#8216;\u00c1&#8217; =&gt; &#8216;A&#8217;, &#8216;\u00c2&#8217; =&gt; &#8216;A&#8217;, &#8216;\u00c3&#8217; =&gt; &#8216;A&#8217;,), \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0437 \u00ab\u0433\u0440\u044f\u0437\u043d\u043e\u0439\u00bb \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u044b \u0434\u0435\u043b\u0430\u044e\u0442 \u00ab\u0447\u0438\u0441\u0442\u0443\u044e\u00bb. \u042d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0445\u0435\u043b\u043f\u0435\u0440 yii2 yii\\helpers\\Inflector::slug (\u043a\u0441\u0442\u0430\u0442\u0438, \u0437\u0430 \u0432\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u0431\u044b\u043b \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u2014 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0430\u0434 yii2 \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442\u0441\u044f). \u0412 \u0440\u0443\u043d\u0435\u0442\u0435 \u0436\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0435\u0449\u0435 \u0437\u0430\u043c\u0435\u043d\u0443 \u043a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u044b \u043d\u0430 \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u0443. \u041d\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0433\u0438\u0431\u043a\u0443\u044e \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044e. \u0412 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 yii\\helpers\\Inflector::slug \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f php-\u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 intl, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0434\u0430\u0436\u0435 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0435 \u0438\u0435\u0440\u043e\u0433\u043b\u0438\u0444\u044b, \u043d\u043e, \u043a\u0430\u043a \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d\u043e \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e (php 5.5.6). \u041d\u043e \u0443 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 2amigos, \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0433\u043e \u0432\u0441\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c\u0441\u044f yii, \u0431\u044b\u043b\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 transliterator-helper (\u043e\u043d\u043e \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0438\u0434\u0435\u0438 \u0438\u0437 drupal&#8217;\u0430, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u043c\u043d\u044e). \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e php-\u0444\u0430\u0439\u043b\u043e\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u0438\u0445 \u0437\u0430\u043c\u0435\u043d\u0430 \u0432 \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u0435.<br \/>  \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432 composer.json \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c <code>&quot;2amigos\/transliterator-helper&quot;: &quot;2.0.*&quot;<\/code>, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d dosamigos\\helpers\\TransliteratorHelper:<\/p>\n<pre><code class=\"php\">return Inflector::slug( TransliteratorHelper::process( $slug ), '-', true );<\/code><\/pre>\n<p>  \u0422\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c, \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u043e\u0442 \u043d\u0435\u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u043d\u0430 \u0447\u0435\u0440\u0442\u043e\u0447\u043a\u0443 &quot;-&quot;.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0436\u0435 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442 \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0442\u043e:<\/p>\n<pre><code class=\"php\">return $this-&gt;slug( $slug, '-', true );<\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 slug (\u0443\u0440\u0435\u0437\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f yii\\helpers\\Inflector::slug \u0431\u0435\u0437 \u0442\u0440\u0430\u043d\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438):<\/p>\n<pre><code class=\"php\">private function slug( $string, $replacement = '-', $lowercase = true ) { \t$string = preg_replace( '\/[^\\p{L}\\p{Nd}]+\/u', $replacement, $string ); \t$string = trim( $string, $replacement ); \treturn $lowercase ? strtolower( $string ) : $string; }<\/code><\/pre>\n<p>  \u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a generateSlug:<\/p>\n<pre><code class=\"php\">private function generateSlug( $slug ) { \t$slug = $this-&gt;slugify( $slug ); \tif ( $this-&gt;checkUniqueSlug( $slug ) ) { \t\treturn $slug; \t} else { \t\tfor ( $suffix = 2; !$this-&gt;checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {} \t\treturn $new_slug; \t} }<\/code><\/pre>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u043e\u0439 \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c slug \u043d\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u0431\u0430\u0437\u0435. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u043d\u0435\u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 slug \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u0442\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e \u043d\u0435\u043c\u0443 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<pre><code class=\"php\">private function checkUniqueSlug( $slug ) { \t$pk = $this-&gt;owner-&gt;primaryKey(); \t$pk = $pk[0];  \t$condition = $this-&gt;out_attribute . ' = :out_attribute'; \t$params = [ ':out_attribute' =&gt; $slug ]; \tif ( !$this-&gt;owner-&gt;isNewRecord ) { \t\t$condition .= ' and ' . $pk . ' != :pk'; \t\t$params[':pk'] = $this-&gt;owner-&gt;{$pk}; \t}  \treturn !$this-&gt;owner-&gt;find() \t\t-&gt;where( $condition, $params ) \t\t-&gt;one(); }<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0443 \u043d\u0430\u0441 \u0442\u0435\u043e\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u043d\u0435 id, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0435\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 primaryKey(). \u0414\u0430\u043b\u044c\u0448\u0435 \u0434\u0435\u043b\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e slug&#8217;\u0430. \u0415\u0441\u043b\u0438 \u0436\u0435 \u0437\u0430\u043f\u0438\u0441\u044c \u043d\u0435 \u043d\u043e\u0432\u0430\u044f, \u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c update (!$this-&gt;owner-&gt;isNewRecord), \u0442\u043e slug \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e id:<\/p>\n<pre><code class=\"php\">$condition .= ' and ' . $pk . ' != :pk';<\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 true, \u0435\u0441\u043b\u0438 slug \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d, \u0438 false, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442. \u0414\u0430\u043b\u044c\u0448\u0435:<\/p>\n<pre><code class=\"php\">if ( $this-&gt;checkUniqueSlug( $slug ) ) { \treturn $slug; } else { \tfor ( $suffix = 2; !$this-&gt;checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {} \treturn $new_slug; }<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 slug \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d, \u043c\u044b \u0435\u0433\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0443 \u043c\u043e\u0434\u0435\u043b\u0438 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0432 \u0431\u0430\u0437\u0443. \u0415\u0441\u043b\u0438 \u0436\u0435 \u043d\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u0435\u043d, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0441\u0443\u0444\u0444\u0438\u043a\u0441 testovaya-novost-2<\/p>\n<pre><code class=\"php\">for ( $suffix = 2; !$this-&gt;checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {}<\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0439 \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u043a slug&#8217;\u0443. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0432 WordPress, \u043d\u043e \u043c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0443, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u0437\u0430\u043d\u044f\u0442\u044b\u0445 testovaya-novost, testovaya-novost-2, testovaya-novost-3, testovaya-novost-4, testovaya-novost-5 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c 6 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u043b\u0443\u0447\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u0431\u0443\u0434\u0443 \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d.<\/p>\n<p>  \u0418\u0442\u0430\u043a, slug \u0441\u0433\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u043d, \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0432 \u043c\u043e\u0434\u0435\u043b\u044c, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u0432 \u0431\u0430\u0437\u0443, \u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"php\">&lt;?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 { \tpublic $in_attribute = 'name'; \tpublic $out_attribute = 'slug'; \tpublic $translit = true;  \tpublic function events() \t{ \t\treturn [ \t\t\tActiveRecord::EVENT_BEFORE_VALIDATE =&gt; 'getSlug' \t\t]; \t}  \tpublic function getSlug( $event ) \t{ \t\tif ( empty( $this-&gt;owner-&gt;{$this-&gt;out_attribute} ) ) { \t\t\t$this-&gt;owner-&gt;{$this-&gt;out_attribute} = $this-&gt;generateSlug( $this-&gt;owner-&gt;{$this-&gt;in_attribute} ); \t\t} else { \t\t\t$this-&gt;owner-&gt;{$this-&gt;out_attribute} = $this-&gt;generateSlug( $this-&gt;owner-&gt;{$this-&gt;out_attribute} ); \t\t} \t}  \tprivate function generateSlug( $slug ) \t{ \t\t$slug = $this-&gt;slugify( $slug ); \t\tif ( $this-&gt;checkUniqueSlug( $slug ) ) { \t\t\treturn $slug; \t\t} else { \t\t\tfor ( $suffix = 2; !$this-&gt;checkUniqueSlug( $new_slug = $slug . '-' . $suffix ); $suffix++ ) {} \t\t\treturn $new_slug; \t\t} \t}  \tprivate function slugify( $slug ) \t{ \t\tif ( $this-&gt;translit ) { \t\t\treturn Inflector::slug( TransliteratorHelper::process( $slug ), '-', true ); \t\t} else { \t\t\treturn $this-&gt;slug( $slug, '-', true ); \t\t} \t}  \tprivate function slug( $string, $replacement = '-', $lowercase = true ) \t{ \t\t$string = preg_replace( '\/[^\\p{L}\\p{Nd}]+\/u', $replacement, $string ); \t\t$string = trim( $string, $replacement ); \t\treturn $lowercase ? strtolower( $string ) : $string; \t}  \tprivate function checkUniqueSlug( $slug ) \t{ \t\t$pk = $this-&gt;owner-&gt;primaryKey(); \t\t$pk = $pk[0];  \t\t$condition = $this-&gt;out_attribute . ' = :out_attribute'; \t\t$params = [ ':out_attribute' =&gt; $slug ]; \t\tif ( !$this-&gt;owner-&gt;isNewRecord ) { \t\t\t$condition .= ' and ' . $pk . ' != :pk'; \t\t\t$params[':pk'] = $this-&gt;owner-&gt;{$pk}; \t\t}  \t\treturn !$this-&gt;owner-&gt;find() \t\t\t-&gt;where( $condition, $params ) \t\t\t-&gt;one(); \t} }<\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041a\u043e\u0434 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0434\u0430\u043d \u0432\u044b\u0448\u0435. \u0410 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438:<\/p>\n<pre><code class=\"php\">\u0442\u0435\u0441\u0442 \u0422\u0435\u0441\u0442 \u0439 test \u6211\u7231 \u4e2d\u6587 \u03a8 \u1f89 \u01fc \u00df \u0426 =&gt; test-test-y-test-wo-ai-zhong-wen-ps-a-ae-ss-c<\/code><\/pre>\n<p>  \u0421\u0441\u044b\u043b\u043a\u0438:  <\/p>\n<ul>\n<li><a href=\"http:\/\/yiiframework.com\">\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Yii<\/a><\/li>\n<li><a href=\"http:\/\/yiiframework.ru\">\u0420\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/yiisoft\/yii2\">\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 github yii2<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/yiisoft\/yii2\/tree\/master\/docs\/guide\">\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0430\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043a \u0432\u0435\u0440\u0441\u0438\u0438 2<\/a><\/li>\n<\/ul>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/208328\/\"> http:\/\/habrahabr.ru\/post\/208328\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t\u0427\u0430\u0441\u0442\u043e, \u0430 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435\u0433\u0434\u0430, \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0430\u0439\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0430\u0439\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0435 \u043f\u043e id \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432 \u0431\u0430\u0437\u0435, \u0430 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c\u0443 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0443, \u043d\u0430\u0437\u043e\u0432\u0435\u043c \u0435\u0433\u043e slug.<\/p>\n<pre><code class=\"php\">post\/view\/1 =&gt; post\/view\/testovaya-novost<\/code><\/pre>\n<p>  (\u0438\u0437 url&#8217;\u0430 \u0441\u0442\u043e\u0438\u043b\u043e \u0431\u044b \u0443\u0431\u0440\u0430\u0442\u044c \u0438 view, \u043d\u043e \u0443\u0440\u043e\u043a \u043d\u0435 \u043e \u0442\u043e\u043c)<\/p>\n<p>  \u0421\u0430\u043c\u044b\u043c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 post \u043f\u043e\u043b\u0435 slug, \u0432 \u043c\u043e\u0434\u0435\u043b\u0438 Post \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442, \u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 (view) \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u044b\u0439 input, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0443\u0447\u043a\u0430\u043c\u0438 \u0432\u0431\u0438\u0432\u0430\u0435\u043c slug.<\/p>\n<pre><code class=\"php\"> &lt;?php  use yii\\helpers\\Html; use yii\\widgets\\ActiveForm;  \/**  * @var yii\\web\\View           $this  * @var common\\models\\Post     $model  * @var yii\\widgets\\ActiveForm $form  *\/ ?&gt;  &lt;div class=&quot;post-form&quot;&gt;  \t&lt;?php $form = ActiveForm::begin(); ?&gt;  \t&lt;?= $form-&gt;field( $model, 'name' )-&gt;textInput( [ 'maxlength' =&gt; 255 ] ) ?&gt; \t&lt;?= $form-&gt;field( $model, 'slug' )-&gt;textInput( [ 'maxlength' =&gt; 255 ] ) ?&gt; \t&lt;?= $form-&gt;field( $model, 'content' )-&gt;textarea( [ 'rows' =&gt; 6 ] ) ?&gt;  \t&lt;div class=&quot;form-group&quot;&gt; \t\t&lt;?= Html::submitButton( $model-&gt;isNewRecord ? Yii::t( 'app', 'Create' ) : Yii::t( 'app', 'Update' ), [ 'class' =&gt; $model-&gt;isNewRecord ? 'btn btn-success' : 'btn btn-primary' ] ) ?&gt; \t&lt;\/div&gt;  \t&lt;?php ActiveForm::end(); ?&gt;  &lt;\/div&gt;<\/code><\/pre>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-208328","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/208328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=208328"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/208328\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=208328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=208328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=208328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}