В админке сдублировать бренды

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

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

Сообщение #1 korshunov » 17.01.2021, 10:21

Пытаюсь в Okay3 без использования модулей сдублировать функционал редактирования списка брендов.

1. Созданы таблицы
create table ok_suppliers like ok_brands;
create table ok_lang_suppliers like ok_lang_brands;

2. В меню админки вставлены ссылки на новые страницы.

3. Ищутся папки и файлы, у которых в названии встречается 'brand' или 'Brand', копируются в новые, у которых в названиях 'brand', 'Brand' заменены на 'supplier', 'Supplier'.
Делалось программно, вот список новых файлов
backend/Controllers/SupplierAdmin.php
backend/Controllers/SuppliersAdmin.php
backend/design/html/supplier.tpl
backend/design/html/suppliers.tpl
backend/Helpers/BackendSuppliersHelper.php
backend/Requests/BackendSuppliersRequest.php
design/okay_shop/html/suppliers.tpl
Okay/Controllers/SupplierController.php
Okay/Controllers/SuppliersController.php
Okay/Core/Routes/AllSuppliersRoute.php
Okay/Core/Routes/SupplierRoute.php
Okay/Core/SmartyPlugins/Plugins/GetSuppliers.php
Okay/Entities/SuppliersEntity.php
Okay/Helpers/SuppliersHelper.php
Okay/Helpers/MetadataHelpers/SupplierMetadataHelper.php


4. Вызываю страницу /backend/index.php?controller=SuppliersAdmin
Получаю ошибку
<b>Fatal error</b>: Uncaught Okay\Core\OkayContainer\Exception\ServiceNotFoundException: Service not found: Okay\Admin\Helpers\BackendSuppliersHelper in E:\xampp\htdocs\OkayCMS381\Okay\Core\OkayContainer\OkayContainer.php:64
Stack trace:
#0 E:\xampp\htdocs\OkayCMS381\Okay\Core\ServiceLocator.php(45): Okay\Core\OkayContainer\OkayContainer-&gt;get('Okay\\Admin\\Help...')
#1 E:\xampp\htdocs\OkayCMS381\backend\index.php(219): Okay\Core\ServiceLocator-&gt;getService('Okay\\Admin\\Help...')
#2 E:\xampp\htdocs\OkayCMS381\backend\index.php(201): getMethodParams(Object(Okay\Admin\Controllers\SuppliersAdmin), 'fetch')
#3 {main}
thrown in <b>E:\xampp\htdocs\OkayCMS381\Okay\Core\OkayContainer\OkayContainer.php</b> on line <b>64</b>

Что у меня неверно и как победить ошибку?
Последний раз редактировалось korshunov 18.01.2021, 05:22, всего редактировалось 1 раз.

zyxer M
zyxer M
Возраст: 29
Репутация: 67
Сообщения: 362
Зарегистрирован: 03.02.2016
С нами: 5 лет 1 месяц
Откуда: Днепр

Сообщение #2 zyxer » 17.01.2021, 11:11

Вероятнее всего вы не зарегистрировали Okay\Admin\Helpers\BackendSuppliersHelper в Okay/Core/config/helpers.php. Тоже самое нужно сделать с классами Requests. Вот более детально об DI контейнере https://github.com/OkayCMS/Okay3/blob/master/docs/di_container.md
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

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

Сообщение #3 korshunov » 21.01.2021, 12:40

Спасибо, победил этот момент и еще несколько подобных.

Застрял на таком. В шаблоне главной страницы есть
{get_brands var=all_suppliers visible_supplier=1 limit=9}

Если ставлю по аналогии
{get_suppliers var=all_suppliers visible_supplier=1 limit=9}
то получаю белый экран.

Вообще, как отлавливать такого сорта ошибку? Если в index.php включаю вывод ошибок, то никаких ошибок не показывает, чисто белый экран...

zyxer M
zyxer M
Возраст: 29
Репутация: 67
Сообщения: 362
Зарегистрирован: 03.02.2016
С нами: 5 лет 1 месяц
Откуда: Днепр

Сообщение #4 zyxer » 21.01.2021, 13:10

может в логах что-то есть (окая или сервера). Бывает что при белом экране через ctrl+u видно ошибку. Вообще нужно убедиться что плагин get_suppliers корректно зарегистрирован и внутри него всё верно. И включать стоит debug_mode в конфиге
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

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

Сообщение #5 korshunov » 14.02.2021, 09:25

Пробую сдублировать функционал брендов созданием модуля.
Удается редактировать набор новых сущностей (supplier), создать новое поле supplier_id в таблице товаров, зарегистрировать его, чтоб в шаблоне было доступно {$product->supplier_id}.
В админке на странице товара получилось редактировать значение новой сущности выпадающим списком.

Как на витрине на странице товара получить в шаблоне переменную {$supplier}, аналогичную {$brand} ?
Не нахожу в текущих имеющихся модулях аналогичных моментов. Если есть, ткните носом, пожалуйста...

zyxer M
zyxer M
Возраст: 29
Репутация: 67
Сообщения: 362
Зарегистрирован: 03.02.2016
С нами: 5 лет 1 месяц
Откуда: Днепр

Сообщение #6 zyxer » 15.02.2021, 08:24

Бренд передается в дизайн в Okay\Controllers\ProductController. В вашем случае можно расширить метод Okay\Helpers\MainHelper::commonAfterControllerProcedure() и в экстендере написать что-то вроде

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

if (Router::getCurrentRouteName() == 'product') {
    $product = $design->getVar('product');
    $supplier = $suppliersEntity->findOne(['id' => $product->supplier_id]);
    if (!empty($supplier) && $supplier->visible) {
        $design->assign('supplier', $supplier);
    }
}


Или альтернативный метод, в классе Init зарегистрировать свой фронт блок с добавлением callback ф-ции

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

$this->addFrontBlock('my_block', 'my_block.tpl', function (Design $design, SuppliersEntity $suppliersEntity) {
    $product = $design->getVar('product');
    $supplier = $suppliersEntity->findOne(['id' => $product->supplier_id]);
   
    if (!empty($supplier) && $supplier->visible) {
        $design->assign('supplier', $supplier);
    }
});

В my_block.tpl делаете верстку вывода поставщика и в товар добавляете

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

{get_design_block block="my_block"}


Вот дока по второму методу https://github.com/OkayCMS/Okay3/blob/master/docs ... .md#user-content-addfrontblock
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS

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

Сообщение #7 korshunov » 17.02.2021, 09:20

Альтернативным методом получается, работает.

А с основным не выходит.
В Init.php добавил

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

        $this->registerQueueExtension(
            ['class' => MainHelper::class, 'method' => 'commonAfterControllerProcedure'],
            ['class' => Extender2::class, 'method' => 'attachSupplier']
        );

В файле Extender2.php стоит

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

<?php

namespace Okay\Modules\Tobas\Suppliers\Extenders;

use Okay\Core\Modules\Extender\ExtensionInterface;
use Okay\Core\Router;


class Extender2 implements ExtensionInterface
{
    public function attachSupplier()
    {
      if (Router::getCurrentRouteName() == 'product') {
         $product = $design->getVar('product');
         
         $supplier = $suppliersEntity->findOne(['id' => $product->supplier_id]);
         if (!empty($supplier) && $supplier->visible) {
            $design->assign('supplier2', $supplier);
            
         }
   
      }      
   }

   
   
}


Получаю ошибку Call to a member function getVar() on null in E:\xampp\htdocs\OkayCMS400\Okay\Modules\Tobas\Suppliers\Extenders\Extender2.php:35

Надо как-то передавать параметр $design в расширяющую функцию. Мои попытки не увенчались успехом.

zyxer M
zyxer M
Возраст: 29
Репутация: 67
Сообщения: 362
Зарегистрирован: 03.02.2016
С нами: 5 лет 1 месяц
Откуда: Днепр

Сообщение #8 zyxer » 17.02.2021, 09:35

Вам нужно зарегистрировать ваш Extender2 как сервис https://github.com/OkayCMS/Okay3/blob/master/docs/di_container.md и в ServiceReference передать ему Design и EntityFactory (с которой уже в классе достать SuppliersEntity), зависимости ловить в конструкторе.

Или же можно прямо в методе attachSupplier получить ServiceLocator и получить нужные вам классы с него https://github.com/OkayCMS/Okay3/blob/master/docs/service_locator.md.

Кстати, в registerQueueExtension можно не писать ключи массива 'class' и 'method', они не обязательны.
Всё сказанное мной, является лично моим мнением, и не является официальной позицией OkayCMS


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

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


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

   

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

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

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