Префикс для имени товара (v4.4.0)

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

Евгений M
Евгений M
Возраст: 37
Репутация: 4
Сообщения: 95
Зарегистрирован: 15.12.2018
С нами: 5 лет 4 месяца
Откуда: Киев

Сообщение #1 Евгений » 18.10.2023, 14:18

Решил переделать модуль из версии 2,3,5 (viewtopic.php?f=10&t=1989&p=8765#p8765) для версии 4,4,0.
Модуль нужен чтобы убрать переспамизицию страницы категории товаров.
На сайте (тематика хобби) представлены разнообразные сборные модели. Для 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(); });"
      }
    ]
}

Они просто не подключается.

Если кто знает подскажите пожалуйста, что не так?

korshunov
korshunov
Репутация: 148
Сообщения: 1862
Зарегистрирован: 03.12.2015
С нами: 8 лет 4 месяца
Skype

Сообщение #2 korshunov » 18.10.2023, 15:44

Модуль хорошо бы выложить единым архивом...

Евгений M
Евгений M
Возраст: 37
Репутация: 4
Сообщения: 95
Зарегистрирован: 15.12.2018
С нами: 5 лет 4 месяца
Откуда: Киев

Сообщение #3 Евгений » 18.10.2023, 16:06

В бекенде в index.tpl есть код, отвечающий за генерацию URL при создании страницы нового товара.

Код: Выделить всё

function generate_url() {
        url = $('input[name="name"]').val();
        url = translit(url);
        if (is_translit_alpha.size() > 0) {
            url = url.replace(/[^0-9a-z]+/gi, '').toLowerCase();
        } else {
            url = url.replace(/[\s]+/gi, '-');
            url = url.replace(/[^0-9a-z_\-]+/gi, '').toLowerCase();
        }
        return url;
    }

Здесь вместо

Код: Выделить всё

url = $('input[name="name"]').val();

необходимо прописать

Код: Выделить всё

 url = $('input[name="prefix_name"]').val() + $('input[name="name"]').val();

Также в index.tpl после

Код: Выделить всё

$('input[name="name"]').keyup(function() { set_meta(); });

добавляем

Код: Выделить всё

$('input[name="prefix_name"]').keyup(function() { set_meta(); });


Когда ради теста прописываю напрямую в index.tpl, то все работает как надо, но когда подключаю этот код через module.json, то этот код не подключается.

korshunov
korshunov
Репутация: 148
Сообщения: 1862
Зарегистрирован: 03.12.2015
С нами: 8 лет 4 месяца
Skype

Сообщение #4 korshunov » 18.10.2023, 16:26

Похоже, так работать не будет.
Файл module.json не работает просто как замена текста, работает с нодами.
https://github.com/OkayCMS/Okay3/blob/master/docs/tpl_modifiers.md
https://городец870.рф/faq/cto-takoe-noda-v-progra ... iya?ysclid=lnvyi2ddan722722159

Для Ваших целей можно попробовать вставлять целиком фрагмент <script>...</script>, в котором отключать стандартную JS-функцию и прописывать свою...


Название раздела: Предложения по улучшению OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Предложения по улучшению OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 105 гостей