diff --git a/src/CmsSeoComponent.php b/src/CmsSeoComponent.php index 265f2e1..60b8631 100644 --- a/src/CmsSeoComponent.php +++ b/src/CmsSeoComponent.php @@ -8,11 +8,21 @@ namespace skeeks\cms\seo; +use kartik\datecontrol\DateControl; use skeeks\cms\backend\BackendComponent; +use skeeks\cms\backend\events\ViewRenderEvent; +use skeeks\cms\backend\widgets\ActiveFormBackend; use skeeks\cms\base\Component; use skeeks\cms\helpers\StringHelper; use skeeks\cms\seo\assets\CmsSeoAsset; use skeeks\cms\seo\vendor\CanUrl; +use skeeks\yii2\form\fields\BoolField; +use skeeks\yii2\form\fields\FieldSet; +use skeeks\yii2\form\fields\HtmlBlock; +use skeeks\yii2\form\fields\NumberField; +use skeeks\yii2\form\fields\SelectField; +use skeeks\yii2\form\fields\TextareaField; +use skeeks\yii2\form\fields\WidgetField; use yii\base\ActionEvent; use yii\base\BootstrapInterface; use yii\base\Event; @@ -62,6 +72,11 @@ class CmsSeoComponent extends Component implements BootstrapInterface */ const CANURL_DATA_FROM_MAIN_DOMAIN = '_can_url_from_main_domain'; + /** + * Добавление title ко всем страницам сайта + * @var string + */ + public $title_append = ""; /** * Максимадбгая длина ключевых слов * @var int @@ -81,7 +96,7 @@ class CmsSeoComponent extends Component implements BootstrapInterface /** * @var bool включить автогенерацию ключевых слов */ - public $enableKeywordsGenerator = true; + public $enableKeywordsGenerator = false; /** @@ -174,9 +189,10 @@ class CmsSeoComponent extends Component implements BootstrapInterface static public function descriptorConfig() { return array_merge(parent::descriptorConfig(), [ - 'name' => \Yii::t('skeeks/seo', 'Seo'), + 'name' => \Yii::t('skeeks/seo', 'Seo'), 'image' => [ - CmsSeoAsset::class, 'icons/seo-icon.png' + CmsSeoAsset::class, + 'icons/seo-icon.png', ], ]); } @@ -189,6 +205,7 @@ public function rules() ['countersContent', 'string'], [['contentIds', 'treeTypeIds'], 'safe'], ['sitemap_min_date', 'integer'], + ['title_append', 'string'], ]); } @@ -199,6 +216,7 @@ public function attributeLabels() 'minKeywordLenth' => \Yii::t('skeeks/seo', 'The minimum length of the keyword'), 'maxKeywordsLength' => \Yii::t('skeeks/seo', 'Length keywords'), 'robotsContent' => 'Robots.txt', + 'title_append' => 'Добавление title ко всем страницам сайта', 'countersContent' => \Yii::t('skeeks/seo', 'Codes counters'), 'activeTree' => \Yii::t('skeeks/seo', 'Active flag to tree'), 'activeContentElem' => \Yii::t('skeeks/seo', 'Active flag to contents element'), @@ -216,7 +234,8 @@ public function attributeHints() 'enableKeywordsGenerator' => \Yii::t('skeeks/seo', 'If the page is not specified keywords, they will generate is for her, according to certain rules automatically'), 'minKeywordLenth' => \Yii::t('skeeks/seo', 'The minimum length of the keyword, which is listed by the key (automatic generation)'), 'maxKeywordsLength' => \Yii::t('skeeks/seo', 'The maximum length of the string of keywords (automatic generation)'), - 'robotsContent' => \Yii::t('skeeks/seo', 'This value is added to the automatically generated file robots.txt, in the case where it is not physically created on the server'), + 'title_append' => \Yii::t('skeeks/seo', 'Этот заголовок будет добавлен ко всем страницам вашего сайта. Именно добавлен после основного заголовка страницы.'), + 'robotsContent' => \Yii::t('skeeks/seo', 'Содержимое файла robots.txt'), 'contentIds' => \Yii::t('skeeks/seo', 'If nothing is selected, then all'), 'treeTypeIds' => \Yii::t('skeeks/seo', 'If nothing is selected, then all'), 'sitemap_min_date' => \Yii::t('skeeks/seo', @@ -226,53 +245,137 @@ public function attributeHints() } - public function renderConfigFormFields(ActiveForm $form) + /** + * @return ActiveForm + */ + public function beginConfigForm() { - $result = $form->fieldSet(\Yii::t('skeeks/seo', 'Keywords')); - - $result .= $form->field($this, 'enableKeywordsGenerator')->checkbox(\Yii::$app->formatter->booleanFormat); - - $result .= $form->field($this, 'minKeywordLenth'); - $result .= $form->field($this, 'maxKeywordsLength'); - - - $result .= $form->fieldSetEnd(); - - $result .= $form->fieldSet(\Yii::t('skeeks/seo', 'Indexing')); - $result .= $form->field($this, 'robotsContent')->textarea(['rows' => 7]); - $result .= $form->fieldSetEnd(); - - $result .= $form->fieldSet(\Yii::t('skeeks/seo', 'Codes counters')); - $result .= $form->field($this, 'countersContent')->textarea(['rows' => 20]); - $result .= $form->fieldSetEnd(); + return ActiveFormBackend::begin(); + } - $result .= $form->fieldSet(\Yii::t('skeeks/seo', 'Sitemap settings')); - $result .= $form->field($this, 'activeContentElem')->checkbox(\Yii::$app->formatter->booleanFormat); - $result .= $form->field($this, 'activeTree')->checkbox(\Yii::$app->formatter->booleanFormat); + /** + * @return array + */ + public function getConfigFormFields() + { + if (file_exists(\Yii::getAlias("@webroot/robots.txt"))) { + $robotsContent = file_get_contents(\Yii::getAlias("@webroot/robots.txt")); + $indexing = [ + 'robotsContent' => [ + 'class' => HtmlBlock::class, + 'content' => <<Файл robots.txt создан на сервере. Если его удалить с серера, то настройки robots можно будет задавать в этом месте.
+Текущее содержимое файла robots:
+{$robotsContent}
+HTML
+ ],
+ ];
+ } else {
+ $indexing = [
+ 'robotsContent' => [
+ 'class' => TextareaField::class,
+ /*'on afterRender' => function(ViewRenderEvent $e) {
+ $e->content = <<
+Сгенерировать robots.txt
+
+HTML;
+
+ },*/
+ 'elementOptions' => [
+ 'rows' => 15,
+ ],
+ ],
+ ];
+ }
- $result .= $form->fieldSelectMulti($this, 'contentIds', \skeeks\cms\models\CmsContent::getDataForSelect());
- /*echo $form->fieldSelectMulti($this, 'createdBy')->widget(
- \skeeks\cms\modules\admin\widgets\formInputs\SelectModelDialogUserInput::className()
- );*/
- $result .= $form->fieldSelectMulti($this, 'treeTypeIds', \yii\helpers\ArrayHelper::map(
- \skeeks\cms\models\CmsTreeType::find()->all(), 'id', 'name'
- ));
+ return [
+ 'counters' => [
+ 'class' => FieldSet::class,
+ 'name' => \Yii::t('skeeks/seo', 'Codes counters'),
+ 'fields' => [
+ 'countersContent' => [
+ 'class' => WidgetField::class,
+ 'widgetClass' => \skeeks\widget\codemirror\CodemirrorWidget::class,
+ 'widgetConfig' => [
+ 'preset' => 'htmlmixed',
+ ],
+ ],
+ ],
+ ],
- $result .= $form->field($this, 'sitemap_min_date')->widget(\kartik\datecontrol\DateControl::classname(), [
- 'type' => \kartik\datecontrol\DateControl::FORMAT_DATE,
- ]);
- $result .= $form->fieldSetEnd();
- return $result;
+ 'indexing' => [
+ 'class' => FieldSet::class,
+ 'name' => \Yii::t('skeeks/seo', 'Indexing'),
+ 'fields' => $indexing,
+ ],
- }
+ 'titles' => [
+ 'class' => FieldSet::class,
+ 'name' => \Yii::t('skeeks/seo', 'Заголовки'),
+ 'fields' => [
+ 'title_append',
+ ],
+ ],
+ 'keywords' => [
+ 'class' => FieldSet::class,
+ 'name' => \Yii::t('skeeks/seo', 'Keywords'),
+ 'elementOptions' => [
+ 'isOpen' => false,
+ ],
+ 'fields' => [
+ 'enableKeywordsGenerator' => [
+ 'class' => BoolField::class,
+ 'allowNull' => false,
+ ],
+ 'minKeywordLenth' => [
+ 'class' => NumberField::class,
+ ],
+ 'maxKeywordsLength' => [
+ 'class' => NumberField::class,
+ ],
+ ],
+ ],
- public function init()
- {
- parent::init();
+ 'sitemap' => [
+ 'class' => FieldSet::class,
+ 'name' => \Yii::t('skeeks/seo', 'Sitemap settings'),
+ 'elementOptions' => [
+ 'isOpen' => false,
+ ],
+ 'fields' => [
+ 'activeContentElem' => [
+ 'class' => BoolField::class,
+ 'allowNull' => false,
+ ],
+ 'activeTree' => [
+ 'class' => BoolField::class,
+ 'allowNull' => false,
+ ],
+ 'contentIds' => [
+ 'class' => SelectField::class,
+ 'items' => \skeeks\cms\models\CmsContent::getDataForSelect(),
+ ],
+ 'treeTypeIds' => [
+ 'class' => SelectField::class,
+ 'items' => \yii\helpers\ArrayHelper::map(
+ \skeeks\cms\models\CmsTreeType::find()->all(), 'id', 'name'
+ ),
+ ],
+ 'sitemap_min_date' => [
+ 'class' => WidgetField::class,
+ 'widgetClass' => DateControl::class,
+ 'widgetConfig' => [
+ 'type' => \kartik\datecontrol\DateControl::FORMAT_DATE,
+ ],
+ ],
+ ],
+ ],
+ ];
}
@@ -393,6 +496,12 @@ public function bootstrap($application)
}
});
+ $application->view->on(View::EVENT_BEGIN_PAGE, function ($e) {
+ if ($this->title_append) {
+ \Yii::$app->view->title = \Yii::$app->view->title . $this->title_append;
+ }
+ });
+
$application->view->on(View::EVENT_END_PAGE, function ($e) {
if ($this->_isTrigerEventCanUrl()) {
if ($this->canUrl) {