Модуль нужен чтобы убрать переспамизицию страницы категории товаров.
На сайте (тематика хобби) представлены разнообразные сборные модели. Для SEO продвижения страницы товара необходимо полностью прописывать в названии "Сборная модель танка Т-64 " или "Сборная модель грузовика ЗиЛ-130" + имя бренда + артикул + масштаб, но при этом на странице категории товаров получается переспамизация слов "Сборная модель" и вида техники. К тому же при пролистывании страниц категорий товаров гораздо приятней для глаз просто "Т-64 + имя бренда + артикул + масштаб".
Создаем папку PrefixProductName. Дальше указываю путь к файлу из этой папки и код.
PrefixProductName/Backend/Controllers/DescriptionAdmin.php:
Код: Выделить всё
<?php
namespace Okay\Modules\SYO\PrefixProductName\Backend\Controllers;
use Okay\Admin\Controllers\IndexAdmin;
class DescriptionAdmin extends IndexAdmin
{
public function fetch()
{
$this->response->setContent($this->design->fetch('description.tpl'));
}
}
PrefixProductName/Backend/design/html/description.tpl:
Код: Выделить всё
{$meta_title = $btr->syo__prefix_name_title|escape scope=global}
{*Название страницы*}
<div class="row">
<div class="col-lg-12 col-md-12">
<div class="wrap_heading">
<div class="box_heading heading_page">
{$btr->syo__prefix_name_title}
</div>
</div>
</div>
<div class="col-md-12 col-lg-12 col-sm-12 float-xs-right"></div>
</div>
<div class="alert alert--icon">
<div class="alert__content">
<div class="alert__title">{$btr->general_module_description}</div>
<p>{$btr->syo__prefix_name_description}</p>
</div>
</div>
PrefixProductName/Backend/design/html/import_fields_association.tpl:
Код: Выделить всё
<option value="{Okay\Modules\SYO\PrefixProductName\Init\Init::PREFIX_NAME_FIELD}" data-label="{$btr->getTranslation('sm__prefix_product_name__title')}">
{$btr->getTranslation('sm__prefix_product_name__title')}
</option>
PrefixProductName/Backend/design/html/prefix_name_field.tpl:
Код: Выделить всё
<div class="col-xs-12 col-md-8 col-lg-6">
<div class="">
<div class="heading_label">
<span>{$btr->sm__prefix_product_name__title|escape}</span>
</div>
<div class="form-group">
<input name="prefix_name" class="form-control" type="text" value="{$product->prefix_name|escape}" />
</div>
</div>
</div>
PrefixProductName/Backend/lang/en.php:
Код: Выделить всё
<?php
$lang['sm__prefix_product_name__title'] = 'Prefix name';
PrefixProductName/Backend/lang/ru.php:
Код: Выделить всё
<?php
$lang['general_module_description'] = 'Описание';
$lang['general_module_instruction'] = 'Инструкция';
$lang['general_module_code'] = 'Код';
$lang['general_module__params'] = 'Настройки';
$lang['sm__prefix_product_name__title'] = 'Префикс названия товара';
$lang['syo__prefix_name_description'] = 'Данный модуль предназначен для добавления префикса названия товара. ';
$lang['syo__prefix_name_title'] = 'Префикс название товара';
PrefixProductName/Backend/lang/ua.php:
Код: Выделить всё
<?php
$lang['sm__prefix_product_name__title'] = 'Префікс назви товару';
PrefixProductName/design/html/prefix_product_name.tpl:
Код: Выделить всё
$(document).on('mouseover', '.product_preview__name_link', function() {
var add_name = $(this).closest('div').data('additional_name');
if (add_name !== ''){
$(this).children('.fn_product_name').text(add_name);
}
});
$(document).on('mouseout', '.product_preview__name_link', function() {
var p_name = $(this).closest('div').data('name');
if (p_name !== ''){
$(this).children('.fn_product_name').text(p_name);
}
});
PrefixProductName/Extenders/BackendExtender.php:
Код: Выделить всё
<?php
namespace Okay\Modules\SYO\PrefixProductName\Extenders;
use Okay\Core\Modules\Extender\ExtensionInterface;
use Okay\Core\Request;
use Okay\Modules\SYO\PrefixProductName\Init\Init;
class BackendExtender implements ExtensionInterface
{
private $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function parseProductData($product, $itemFromCsv)
{
if (isset($itemFromCsv[Init::PREFIX_NAME_FIELD])) {
$product[Init::PREFIX_NAME_FIELD] = trim($itemFromCsv[Init::PREFIX_NAME_FIELD]);
}
return $product;
}
public function extendExportColumnsNames($fields)
{
$fields[Init::PREFIX_NAME_FIELD] = Init::PREFIX_NAME_FIELD;
return $fields;
}
public function getModulesColumnsNames($modulesColumnsNames)
{
$modulesColumnsNames[] = Init::PREFIX_NAME_FIELD;
return $modulesColumnsNames;
}
public function postProduct($product)
{
$product->prefix_name = $this->request->post('prefix_name');
return $product;
}
}
PrefixProductName/Init/Init.php:
Код: Выделить всё
<?php
namespace Okay\Modules\SYO\PrefixProductName\Init;
use Okay\Admin\Helpers\BackendExportHelper;
use Okay\Admin\Helpers\BackendImportHelper;
use Okay\Admin\Requests\BackendProductsRequest;
use Okay\Core\Modules\AbstractInit;
use Okay\Core\Modules\EntityField;
use Okay\Entities\ProductsEntity;
use Okay\Modules\SYO\PrefixProductName\Extenders\BackendExtender;
class Init extends AbstractInit
{
const PREFIX_NAME_FIELD = 'prefix_name';
public function install()
{
$this->setBackendMainController('DescriptionAdmin');
$this->migrateEntityField(ProductsEntity::class, (new EntityField(self::PREFIX_NAME_FIELD))->setTypeVarchar(512)->setIsLang()->setIndex(100));
}
public function init()
{
$this->registerBackendController('DescriptionAdmin');
$this->addBackendControllerPermission('DescriptionAdmin', 'syo__prefix_name');
$this->registerEntityField(ProductsEntity::class, self::PREFIX_NAME_FIELD, true);
$this->registerChainExtension(
[BackendProductsRequest::class, 'postProduct'],
[BackendExtender::class, 'postProduct']
);
$this->addBackendBlock('import_fields_association', 'import_fields_association.tpl');
$this->registerChainExtension(
['class' => BackendImportHelper::class, 'method' => 'parseProductData'],
['class' => BackendExtender::class, 'method' => 'parseProductData']
);
$this->registerChainExtension(
['class' => BackendExportHelper::class, 'method' => 'getColumnsNames'],
['class' => BackendExtender::class, 'method' => 'extendExportColumnsNames']
);
$this->registerChainExtension(
['class' => BackendImportHelper::class, 'method' => 'getModulesColumnsNames'],
['class' => BackendExtender::class, 'method' => 'getModulesColumnsNames']
);
$this->addFrontBlock('front_scripts_after_validate','prefix_product_name.tpl');
}
}
PrefixProductName/Init/module.json:
Код: Выделить всё
{
"userName": "***",
"userEmail": "***",
"Okay": "4.4.0",
"version": "1.1.0",
"moduleName": "Префикс название товара",
"vendor": {
"email": "***",
"site": "***"
},
"modifications": {
"backend": [
{
"file": "product.tpl",
"changes": [
{
"find": "<div class=\"fn_step-1\">",
"appendBefore": "prefix_name_field.tpl"
}
]
},
{
"file": "index.tpl",
"changes": [
{
"find": "url = $('input[name=\"name\"]').val();",
"replaceWith": "url = $('input[name=\"prefix_name\"]').val() + $('input[name=\"name\"]').val();"
},
{
"find": "$('input[name=\"name\"]').keyup(function() { set_meta(); });",
"appendAfter": "$('input[name=\"prefix_name\"]').keyup(function() { set_meta(); });"
}
]
}
],
"front": [
{
"file": "product.tpl",
"changes": [
{
"find": "<span data-product=\"{$product->id}\" itemprop=\"name\">",
"appendBefore": "{if !empty($product->prefix_name)}<span>{$product->prefix_name}</span>{/if}"
}
]
}
]
}
}
PrefixProductName/Init/services.php:
Код: Выделить всё
<?php
namespace Okay\Modules\SYO\PrefixProductName;
use Okay\Core\OkayContainer\Reference\ParameterReference as PR;
use Okay\Core\OkayContainer\Reference\ServiceReference as SR;
use Okay\Core\Request;
use Okay\Modules\SYO\PrefixProductName\Extenders\BackendExtender;
return [
BackendExtender::class => [
'class' => BackendExtender::class,
'arguments' => [
new SR(Request::class),
]
],
];
Добавлено спустя 4 минуты 27 секунд:
Модуль создает "prefix_name" и выводит его как в бекэнде, так и во фронтэнде.
Проблема возникает при попытке внести значение "prefix_name" генерацию URL в файле module.json в строках:
Код: Выделить всё
{
"file": "index.tpl",
"changes": [
{
"find": "url = $('input[name=\"name\"]').val();",
"replaceWith": "url = $('input[name=\"prefix_name\"]').val() + $('input[name=\"name\"]').val();"
},
{
"find": "$('input[name=\"name\"]').keyup(function() { set_meta(); });",
"appendAfter": "$('input[name=\"prefix_name\"]').keyup(function() { set_meta(); });"
}
]
}
Они просто не подключается.
Если кто знает подскажите пожалуйста, что не так?