Как переделать вывод преимуществ товара на странице описания из версии 2.x на 4.3 ?

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

dabustard
dabustard
Репутация: 4
Сообщения: 62
Зарегистрирован: 26.01.2018
С нами: 6 лет 2 месяца

Сообщение #1 dabustard » 06.10.2022, 15:58

На странице товара в версии 2.x делал доработку для вывода дополнительной вкладки с преимуществами товара, включающими фото, название и описание каждого преимущества.

Профессиональным разработчиком не являюсь, делал все интуитивно (по аналогии с выводом фотографий/характеристик и т.п.), а сейчас столкнулся с проблемой переноса этой доработки на новую версию (4.3.0), структура файлов и логика совершенно иная и я в полном ступоре... Был бы признателен за любую помощь или совет.

В версии 2.x было реализовано так:

1) через phpmyadmin добавил пары таблиц и импортировал в них нужную информацию: ok_advantages (с полями id, product_id, position) + ok_lang_advantages (с полями lang_id, adv_id, name, description, image)

2) в api/products.php добавил функцию:

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

    public function get_advantages($product_id) {

        $lang_sql = $this->languages->get_query(array('object'=>'advantage', 'px'=>'f'));

        $query = $this->db->placehold("SELECT
            f.id,
            f.product_id,
            f.position,
            $lang_sql->fields
            FROM __advantages AS f
         $lang_sql->join
            WHERE
                f.product_id = ?", $product_id);
        $this->db->query($query);
        return $this->db->results();
    }   


3) в view/ProductView.php в класс ProductView добавил:

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

$product->advantages = $this->products->get_advantages($product->id);      


4) ну и наконец в шаблоне product.tpl добавил их вывод в дополнительном табе:

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

                {if $product->advantages}
            {foreach $product->advantages as $advantage}
            <div>
               <div><img src="../files/uploads/{$advantage->image}"></div>            
               <div>{$advantage->name}</div>
               <div>{$advantage->description}</div>
            </div>            
            {/foreach}                     
                {/if}   

Master
Master
Репутация: 28
Сообщения: 84
Зарегистрирован: 25.01.2016
С нами: 8 лет 2 месяца

Сообщение #2 Master » 06.10.2022, 16:32

На маркетплейсе есть уже готовый модуль
https://okay-cms.com/products/product_advantages-products_advantages

dabustard
dabustard
Репутация: 4
Сообщения: 62
Зарегистрирован: 26.01.2018
С нами: 6 лет 2 месяца

Сообщение #3 dabustard » 06.10.2022, 17:14

Master писал(а):На маркетплейсе есть уже готовый модуль
https://okay-cms.com/products/product_advantages-products_advantages
спасибо, видел, его, хотелось бы разобраться как сделать самому

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

Сообщение #4 korshunov » 07.10.2022, 07:24

dabustard писал(а):
Master писал(а):На маркетплейсе есть уже готовый модуль
https://okay-cms.com/products/product_advantages-products_advantages
спасибо, видел, его, хотелось бы разобраться как сделать самому

Разбирайтесь. Но имейте в виду, это потребует на порядок больше усилий, чем с версиями 1,2, которые почти скопированы с Simpla.
Оценить величину трудностей на этом пути можете хотя бы по тому факту, что на этом форуме один весьма хороший специалист makki в подписи вставил "Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)". Это ведь неспроста...

Можете попробовать создать свой функционал по аналогии с модулем FAQ - похожих элементов довольно много.
И документацию штудируйте https://github.com/OkayCMS/Okay3/tree/master/docs

dabustard
dabustard
Репутация: 4
Сообщения: 62
Зарегистрирован: 26.01.2018
С нами: 6 лет 2 месяца

Сообщение #5 dabustard » 07.10.2022, 16:42

korshunov писал(а):Можете попробовать создать свой функционал по аналогии с модулем FAQ - похожих элементов довольно много
мне именно модулем и не надо, это для меня слишком сложно, я хочу вручную создать таблицу и внести изменения в 2 - 3 файла, чтобы организовать вывод инфо из таблицы на странице товара, по аналогии с тем, как делал во 2й версии. В 4й так сделать нельзя?

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

Сообщение #6 korshunov » 08.10.2022, 06:59

Нельзя. Изменений больше надо, в большем числе файлов. Например, надо дополнительно создавать файл сущности AdvantagesEntity.php. И файл-Helper и файл-Request. И еще разное...

В модуле FAQ имеется 20 файлов. С одной стороны, при прямой разработке без модуля некоторые не потребуются, а с другой, этот модуль не обрабатывает загрузку файлов, а с загрузкой, конечно, добавочная работа.

А еще можете создавать свой функционал на основе функционала брендов - выискивать файлы, отвечающие за работу брендов и создавать по аналогии свои...

Успехов!

dabustard
dabustard
Репутация: 4
Сообщения: 62
Зарегистрирован: 26.01.2018
С нами: 6 лет 2 месяца

Сообщение #7 dabustard » 13.10.2022, 15:37

Подскажите, если знаете, как клонировать имеющийся модуль, чтобы можно было установить его как еще один независимый?

Будет ли достаточно этих действий:
    1. Переименовать:
      а) каталог с модулем
      б) файл Бек-контроллера модуля
      в) файл Entity модуля
      г) переменную-шорткод
      д) переменную с массивом данных модуля
    2. Отредактировать все файлы модуля, в которых упоминаются переименованные значения
    3. Переименовать создаваемые модулем таблицы
    4. Переименовать название модуля в файле module.json

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

Сообщение #8 korshunov » 14.10.2022, 13:48

Вопрос весьма общий и сложный. Скорее всего, ответ на него столь же расплывчатый, как и вопрос - для каких-то модулей этих действий будет достаточно, для других - нет.

К тому же вопрос весьма неопределенный, например:
1.б) таких файлов может быть несколько,
1.в) таких файлов может быть несколько,
1.г) таких переменных может быть несколько, а может не быть вообще,
1.д) что это такое, неизвестно.
4. в файле module.json может быть много прочего, что потребует переименования...

А также

5. Helper-файлы также надо переименовывать. А также Request-файлы. Возможно, и еще некоторые прочие,
6. В языковых файлах тоже надо изменять,
7. Роуты надо менять (если они есть в модуле),
8. Наверняка найдутся и другие файлы и элементы...

Пробуйте и сообщайте о результатах...

dabustard
dabustard
Репутация: 4
Сообщения: 62
Зарегистрирован: 26.01.2018
С нами: 6 лет 2 месяца

Сообщение #9 dabustard » 18.10.2022, 14:29

korshunov писал(а):Пробуйте и сообщайте о результатах...

Сообщаю, клонировал модуль успешно, ошибок пока не обнаружено:
    1. Переименовать:
      а) каталог с названием модуля
      б) переменную-шорткод для фронта и бэка
      в) переменную с массивом данных модуля, передаваемую в tpl
      г) языковые переменные в файлах каталогов design/lang и Backend/lang и их перевод ($btr и $lang)
      д) имена элементов форм (input, textarea) в tpl-файлах бэкенда, которые используются в Request-файле
      е) id и классы в html и css которые используются в javascript
    2. Отредактировать все файлы модуля, в которых упоминаются переименованные значения
    3. Переименовать создаваемые модулем таблицы
    4. Переименовать путь для хранения изображений
    5. Переименовать название модуля в module.json

Проверено на модуле "Преимущества товаров"

dabustard
dabustard
Репутация: 4
Сообщения: 62
Зарегистрирован: 26.01.2018
С нами: 6 лет 2 месяца

Сообщение #10 dabustard » 21.10.2022, 09:33

korshunov писал(а):Нельзя. Изменений больше надо, в большем числе файлов. Например, надо дополнительно создавать файл сущности AdvantagesEntity.php. И файл-Helper и файл-Request. И еще разное...
можно, причем довольно просто

Покажу на примере вышеуказанной задачи действия, чтобы получить аналогичный результат в версии 4+

1) вручную создать таблицы (аналогично с версией 2)
2) в каталоге Okay/Entities/ создать новый файл AdvantagesEntity.php

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

<?php

namespace Okay\Entities;
use Okay\Core\Entity\Entity;

class AdvantagesEntity extends Entity
{
    protected static $fields = [
        'id',
        'product_id',      
        'position',
    ];

    protected static $langFields = [
        'name',   
        'description',
        'image',
    ];

    protected static $defaultOrderFields = [
        'position ASC',
    ];

    protected static $table = '__advantages';
    protected static $langObject = 'adv_id';
    protected static $langTable = 'advantages';
    protected static $tableAlias = 'adv';

}


3) В файле Okay/Controllers/ProductController.php добавить следующие строки:
после

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

use Okay\Entities\CategoriesEntity;

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

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

use Okay\Entities\AdvantagesEntity;

после

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

ProductsHelper $productsHelper,

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

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

AdvantagesEntity $AdvantagesEntity,      

после

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

$this->design->assign('comments', $comments);

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

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

        // Особенности товара
   $advantages = $AdvantagesEntity->find(['product_id' => $product->id]);
        $this->design->assign('advantages', $advantages);      

4) в шаблоне product.tpl
заменить

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

$product->advantages

на

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

$advantages


Название раздела: Вопросы по работе с OkayCMS
Правила раздела: faq.php?mode=okay

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


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

   

Вернуться в «Вопросы по работе с OkayCMS»

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

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