Дополнительное поле для названия товара

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

Евгений
Евгений
Репутация: 3
Сообщения: 38
Зарегистрирован: 15.12.2018
С нами: 2 года 4 месяца

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

V2.3.4
Добавил дополнительное поле перед названием товара, чтобы убрать переспамизицию страницы категории товаров.
На сайте (тематика хобби) представлены разнообразные сборные модели. Для SEO продвижения страницы товара необходимо полностью прописывать в названии "Сборная модель танка Т-64 " или "Сборная модель грузовика ЗиЛ-130" + имя бренда + артикул + масштаб, но при этом на странице категории товаров получается переспамизация слов "Сборная модель" и вида техники. К тому же при пролистывании страниц категорий товаров гораздо приятней для глаз просто "Т-64 + имя бренда + артикул + масштаб".
Удалось создать сам "префикс к названию", вывести его на странице товара, добавить в импорт.

Не могу сообразить как заставить работать Экспорт (добавляется название столбца, но самих данных нет)
Также остались проблемы с переводами.При сохранении в админке "префикса названия" и последующем переходе на вкладку другого языка с сохранением - во всех языках сохраняется последняя сохраненная версия.
Если кто знает, помогите с решением пожалуйста.


1. (SQL запрос) для создания в таблице ok_lang_products поля nfcat:

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

ALTER TABLE `ok_lang_products`
ADD `nfcat` text COLLATE 'utf8_general_ci' NOT NULL AFTER `name`;


2. (SQL запрос) для создания в таблице ok_products поля nfcat:

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

ALTER TABLE `ok_products`
ADD `nfcat` text COLLATE 'utf8_general_ci' NOT NULL AFTER `name`;


3. В файле /backend/design/html/product.tpl
Перед {*Название элемента сайта*} вставляем:

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

<div class="row">
<div class="col-xs-12 col-lg-6 col-md-10">
<div class="heading_label">
{$btr->general_nfcat|escape}</div>
<div class="form-group">
<input class="form-control" type="text" name="nfcat" value="{$product->nfcat}">                     
 </div>
 </div>
 </div>


4. В файлах:
/backend/lang/ru.php в самом конце вставляем строки:

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

$backend_translations->general_nfcat = 'Префикс имени';
$backend_translations->import_field_nfcat = 'Префикс имени';


/backend/lang/en.php в самом конце вставляем строки:

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

$backend_translations->general_nfcat = 'Name prefix';
$backend_translations->import_field_nfcat = 'Name prefix';


/backend/lang/ua.php в самом конце вставляем строки:

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

$backend_translations->general_nfcat = 'Префікс ім’я';
$backend_translations->import_field_nfcat = 'Префікс ім’я';


5. В /design/okay_shop/html/product.tpl кусок кода

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

<h1 class="product_heading">
           <span data-product="{$product->id}" itemprop="name">{$product->name|escape}</span></h1>


меняем на

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

<h1 class="product_heading">
           <span data-product="{$product->id}" itemprop="name">{$product->nfcat|escape} {$product->name|escape}</span></h1>


6. В C backend/core/ProductAdmin.php после строчки

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

$product->name = $this->request->post('name');


добавить строчку

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

$product->nfcat = $this->request->post('nfcat');



-------------------------------------------------------------------------------
7. В файле /api/Impot.php
после строки

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

      'name'=>             array('product', 'name', 'товар', 'название', 'наименование'),

добавляем строку

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

   'nfcat'=>             array('префикс имени', 'name prefix'),



8. В файле /backend/ajax/export.php

после строки

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

'name'=>             'Product',


добавляем строку

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

'nfcat'=>             'Name Prefix',


После строки

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

$v['variant']         = $variant->name;


добавляем строку

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

$v['nfcat']           = $variant->nfcat;


9. В файле /backend/ajax/import.php

После

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

if (isset($item['name'])) {
            $product['name'] = trim($item['name']);
        }


Добавляем

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

              if (isset($item['nfcat'])) {
            $product['nfcat'] = trim($item['nfcat']);

korshunov
korshunov
Репутация: 87
Сообщения: 1391
Зарегистрирован: 03.12.2015
С нами: 5 лет 5 месяцев
Skype

Сообщение #2 korshunov » 01.12.2020, 07:39

Во-первых, надо определиться, что за поле Вы создаете - языковое или нет.
Если нет, то как минимум, обязательно надо в api/Products.php добавить новое поле в список полей.
Если языковое, то в api/Languages.php добавить новое поле в функции get_fields. А может, и еще где...

Вообще вопрос непростой, поднимался довольно давно:
viewtopic.php?f=9&t=177&p=4955#p4955
viewtopic.php?f=9&t=929&p=4711#p4711
В тех темах разработчики давали обещания, потом долго тянули с таким сравнительно простым для них вопросом, и в итоге дали ответ весьма небрежный и лишь частично по делу.

Евгений
Евгений
Репутация: 3
Сообщения: 38
Зарегистрирован: 15.12.2018
С нами: 2 года 4 месяца

Сообщение #3 Евгений » 02.12.2020, 07:22

Поле должно быть языковым. Но когда в api/Languages.php вставляю в $fields['products'] свое значение, чтобы получилось так
$fields['products'] = array('name', 'nfcat', 'meta_title', 'meta_keywords', 'meta_description', 'annotation', 'description', 'special');
то отображение ранние введенных префиксов названий товаров пропадает со страниц товаров. При этом появляется возможность вносить и сохранять префиксы названий вручную на всех языках. Но так, как на сайте несколько тысяч товаров, то заниматься этим будет полное безумие. Необходимо, чтобы система автоматически подтягивала ранее введенные данные. К тому же все еще не работает экспорт - название столбца создается, но данных в нем нет.

makki M
makki M
Репутация: 189
Сообщения: 631
Зарегистрирован: 12.08.2016
С нами: 4 года 9 месяцев
Откуда: Киев
Сайт

Сообщение #4 makki » 02.12.2020, 09:19

Евгений писал(а):Поле должно быть языковым. Но когда в api/Languages.php вставляю в $fields['products'] свое значение, чтобы получилось так
$fields['products'] = array('name', 'nfcat', 'meta_title', 'meta_keywords', 'meta_description', 'annotation', 'description', 'special');
то отображение ранние введенных префиксов названий товаров пропадает со страниц товаров. При этом появляется возможность вносить и сохранять префиксы названий вручную на всех языках. Но так, как на сайте несколько тысяч товаров, то заниматься этим будет полное безумие. Необходимо, чтобы система автоматически подтягивала ранее введенные данные.

Попробуйте таким запросом заполнить все языковые значения из ранее введенных.

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

UPDATE ok_lang_products l LEFT JOIN ok_products p ON p.id = l.product_id SET l.nfcat = p.nfcat

Запрос не проверял но должен сработать. На всякий случай перед выполнением запроса сделайте бэкап базы данных.
Евгений писал(а):К тому же все еще не работает экспорт - название столбца создается, но данных в нем нет.

ИМПОРТ ЭКСПОРТ НОВОЕ ПОЛЕ

1. api/Import.php
- Добавляем новое поле в массив соответствия полей в базе и имён колонок в файле
public $columns_names
2. backend/ajax/import.php
- Обрабатываем новое поле и добавляем в базу
3. backend/ajax/export.php
- Добавляем новое поле (столбец) для файла экспорта в массив private $columns_names
- Извлекаем значение из базы и подготавливаем к экспорту
4. backend/lang/ru.php
- Добавляем перевод нового поля строго в формате import_field_НОВОЕ_ПОЛЕ
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

Евгений
Евгений
Репутация: 3
Сообщения: 38
Зарегистрирован: 15.12.2018
С нами: 2 года 4 месяца

Сообщение #5 Евгений » 02.12.2020, 17:25

makki писал(а):Попробуйте таким запросом заполнить все языковые значения из ранее введенных.
КОД: ВЫДЕЛИТЬ ВСЁ

UPDATE ok_lang_products l LEFT JOIN ok_products p ON p.id = l.product_id SET l.nfcat = p.nfcat

Запрос не проверял но должен сработать. На всякий случай перед выполнением запроса сделайте бэкап базы данных.
Запрос работает. Все как надо.

makki писал(а):ИМПОРТ ЭКСПОРТ НОВОЕ ПОЛЕ

1. api/Import.php
- Добавляем новое поле в массив соответствия полей в базе и имён колонок в файле
public $columns_names
2. backend/ajax/import.php
- Обрабатываем новое поле и добавляем в базу
3. backend/ajax/export.php
- Добавляем новое поле (столбец) для файла экспорта в массив private $columns_names
- Извлекаем значение из базы и подготавливаем к экспорту
4. backend/lang/ru.php
- Добавляем перевод нового поля строго в формате import_field_НОВОЕ_ПОЛЕ

1.В api/Import.php в массив public $columns_names добавил строку:

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

      'nfcat'=>             array('префикс имени', 'name prefix'),

2. В backend/ajax/import.php после

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

 if (isset($item['name'])) {
            $product['name'] = trim($item['name']);
        }

добавил

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

if (isset($item['nfcat'])) {
            $product['nfcat'] = trim($item['nfcat']);
        }

3.В backend/ajax/export.php в массив private $columns_names добавил

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

'nfcat'=>             'Name Prefix',

После

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

$v['variant']         = $variant->name;

добавил

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

   $v['nfcat']           = $variant->nfcat;

4. В backend/lang/ru.php, backend/lang/en.php, backend/lang/ua.php
соответственно
$backend_translations->import_field_nfcat = 'Префикс имени';
$backend_translations->import_field_nfcat = 'Name prefix';
$backend_translations->import_field_nfcat = 'Префікс ім’я';

И по прежнему в файл экспорта добавляется лишь название столбца, но не сами данные.
Импорт работает лишь для русскоязычной версии. Если даже провожу импорт на англоязычной версии, то импортирует все равно в русскоязычную.

korshunov
korshunov
Репутация: 87
Сообщения: 1391
Зарегистрирован: 03.12.2015
С нами: 5 лет 5 месяцев
Skype

Сообщение #6 korshunov » 03.12.2020, 11:03

В п.3 добавление строки
$v['nfcat'] = $variant->nfcat;
есть действие совсем неправильное. Оно приводит к тому, что в поле nfcat при экспорте записывается пустое значение из неопределенной переменной.

korshunov
korshunov
Репутация: 87
Сообщения: 1391
Зарегистрирован: 03.12.2015
С нами: 5 лет 5 месяцев
Skype

Сообщение #7 korshunov » 04.12.2020, 06:45

Евгений писал(а):Импорт работает лишь для русскоязычной версии. Если даже провожу импорт на англоязычной версии, то импортирует все равно в русскоязычную.

Импорт работает с языком, который установлен по умолчанию (первым в списке языков).

Разработчики сделали это не слишком хорошо:
1. Для админки есть свой выбор активный язык. И логично было бы использовать именно его.
2. Чтобы сделать несколько экспортов-импортов, надо каждый раз перемещать на первую позицию нужный язык - весьма неудобно. А если делать экспорты-импорты частями (например, по отдельным категориям), то это вообще и мучение и риск ошибок...
3. Если первый язык не активен, по экспорт-импорт выбирает для работы второй (если он активен). То есть для импорта в нужный язык его надо не только ставить первым, но и делать активным. При этом он будет работать на витрине, что может быть весьма плохо для активно работающего сайта, в котором идет работа над языком, который пользователю показывать еще рано.

Недостатков в функционале экспорта-импорта хватает...


Вернуться в «Полезные решения для OkayCMS»

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

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