Объясните, пожалуйста, логику работы с переменными в opencart 3.0

Тема в разделе "Общие вопросы", создана пользователем konstpon, 13 дек 2017.

  1. konstpon

    konstpon Пользователь

    Сообщения:
    39
    Симпатии:
    1
    Я пока нахожусь на стадии активного изучения OpenCart 3.0 Уже разобрался, что для того, чтобы вывести значение той или иной переменной необходимо:
    1. В контроллере задать эту переменную
    2. В языковом файле (не обязательно) прописать название соответствующего поля для вывода в шаблоне
    3. В шаблоне (в коде) вставить те самые переменные, которые прописаны в п.1 и п.2

    Понял, что структура папок в контроллере, в языковом файле и в файлах шаблона абсолютно идентична и на этом в opencart всё и построено.

    У меня пока получалось только (бездумно) вставлять соответствующие (даденные кем-то другим) коды в контроллеры, языковые файлы и фалы шаблона. В бОльшей части всё получалось и срабатывало. А если не срабатывало, то не всегда получалось разобраться почему, потому как логику (порядок работы с переменными) я пока еще не уловил.

    Можете помочь с этим разобраться?

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

    Я понимаю, что для этого я в файле catalog/view/theme/default/template/product/manufacturer_list.twig
    строку
    Код:
    <div class="col-sm-3"><a href="{{ manufacturer.href }}">{{ manufacturer.name }}</a></div>
    должен изменить на что-нибудь типа
    Код:
    <div class="col-sm-3"><img src="{{ manufacturer.image }}" title="{{ manufacturer.name }}" alt="{{ manufacturer.name }}"><br /><a href="{{ manufacturer.href }}">{{ manufacturer.name }}</a><a href="{{ manufacturer.href }}">{{ manufacturer.name }}</a></div>
    
    
    Здесь мне, в принципе, всё понятно кроме {{ manufacturer.image }}

    Что именно я должен прописать (я так понимаю в контроллере /catalog/controller/product/manufacturer.php) чтобы OpenCart взял из админки (Каталог - Производители - Конкретный производитель - Изображение) соответствующую ссылку (изображение) и подставил её в эту переменную.

    Можно в качестве ответа не просто "сделай вот так и всё заработает", а что-нибудь вроде
    краткого комментария-разъяснения, типа "нужная вам переменная в opencart объявляется вот так-то (здесь код) значения для этой переменной задаются так-то (здесь код).

    Заранее благодарю за ответ...
     
    DanMir нравится это.
  2. Ravilr

    Ravilr Специалист

    Сообщения:
    4.225
    Симпатии:
    1.452
    С производителями тут просто.

    Если посмотреть в то место где формируется массив и как прописываются значения и ключи
    PHP:
    'name' => $result['name'],
    то по логике вещей можно понять, что данные берутся из массива, result
    А сам result формируется запросом из модели
    PHP:
    $results = $this->model_catalog_manufacturer->getManufacturers();
    В моделе конечно sql запрос.

    Сам массив который пришел выглядет так... пример
    Код:
    array (size=5)
      'manufacturer_id' => string '8' (length=1)
      'name' => string 'Apple' (length=5)
      'image' => string 'catalog/demo/apple_logo.jpg' (length=27)
      'sort_order' => string '0' (length=1)
      'store_id' => string '0' (length=1)
    Посему достаточно добавить
    PHP:
    'image' => $result['image'],
    и на выходе получите ссылку на фото.

    Но это конечно для примера, ведь изображение лучше пропускать через ресайз
    PHP:
    $this->model_tool_image->resize($result['image'],100,100)
     
    konstpon нравится это.
  3. konstpon

    konstpon Пользователь

    Сообщения:
    39
    Симпатии:
    1
    Благодарю за разъяснение. Но, похоже, я что-то недопонял

    Добавил в контроллере после
    Код:
    'name' => $result['name'],
    Код:
    'image' => $result['image'],
    Проверил (почистил все кеши) - у меня не сработало.

    Этого недостаточно? Нужно ещё куда-то (куда именно?) вставить
    Код:
     $this->model_tool_image->resize($result['image'],100,100) 
    Вот про это дело (про эту строку) я недопонял. Ну что такое ресайз - догадался, а вот сама строка - сама команда - можно поподробнее. Что именно она делает, и куда именно в коде (в контроллере) её нужно вставлять?
     
  4. Ravilr

    Ravilr Специалист

    Сообщения:
    4.225
    Симпатии:
    1.452
    Что проверили? В шаблоне ссылка выводится? В переменной должна быть ссылка из базы.

    В том же контрллере посмотрите пример... там же есть. Да в любом контроллере это есть.. попробуйте сами догадаться как работает и что делает.
     
  5. konstpon

    konstpon Пользователь

    Сообщения:
    39
    Симпатии:
    1
    В общем у меня получилось поставить логотипы на страницу производителей. Если кому нужно, вот решение для openCart 3.0

    в файл catalog\controller\product\manufacturer.php
    Код:
    $data['categories'][$key]['manufacturer'][] = array(
                    'name' => $result['name'],
                    'href' => $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $result['manufacturer_id']),
    );
    меняем на
    Код:
    $data['categories'][$key]['manufacturer'][] = array(
                    'name' => $result['name'],
                    'href' => $this->url->link('product/manufacturer/info', 'manufacturer_id=' . $result['manufacturer_id']),
                    'logo' => $this->model_tool_image->resize($result['image'], 100, 100),
    );
    т.е. по сути добавляем туда одну строку
    Код:
    'logo' => $this->model_tool_image->resize($result['image'], 100, 100),
    Ну и, соответственно, в файле catalog\view\theme\default\template\product\manufacturer_list.twig
    строку
    Код:
    <div class="col-sm-3"><a href="{{ manufacturer.href }}">"{{ manufacturer.name }}"</a></div>
    меняем на
    Код:
            <div class="col-sm-3">
               {% if manufacturer.logo %}
                   <a href="{{ manufacturer.href }}"><img src="{{ manufacturer.logo }}" alt="{{ manufacturer.name }}" class="img-responsive" /></a>
                   <a href="{{ manufacturer.href }}">"{{ manufacturer.name }}"</a>
               {% else %}
                   <a href="{{ manufacturer.href }}">"{{ manufacturer.name }}"</a>
           {% endif %}
           </div>
    PROFIT

    Но вопрос у меня, как видите выше, был совсем в другом. Т.е. почему в данном случае не понадобилась строка
    Код:
    'image' => $result['image'],
     
  6. Ravilr

    Ravilr Специалист

    Сообщения:
    4.225
    Симпатии:
    1.452
    Вы ведите две переменные
    так
    PHP:
    'image' => $result['image'],
    и так
    PHP:
    'logo' => $this->model_tool_image->resize($result['image'], 100, 100),
    и увидите, что мало того пути отличаются, так еще и названия файлов разные и соответсвенно и размеры файлов.

    Суть второй строки, сделать ресайз изображения, ведь если лого у меня 1000*2000 зачем мне такое??
     
  7. konstpon

    konstpon Пользователь

    Сообщения:
    39
    Симпатии:
    1
    Благодарю за разъяснение. Вам бы преподавателем работать. Или уже где-то преподаёте? ;-)

    Короче, если ничего с переменной делать не надо, а достаточно достать её из базы и передать в неизменённом виде куда следует, то формат

    Код:
    'test' => $result['test'],
    а строка
    Код:
    'logo' => $this->model_tool_image->resize($result['image'], 100, 100),
    это типа то же самое, только "в расширенном формате" - когда переменную, взятую из базы нужно сначала обработать и только потом в обработанном виде отправить дальше по цепочке.

    Я суть верно уловил?

    Тогда последний (в этой ветке) вопрос.

    А вот эти вот "model_tool_image", "resize" и т.д. - это вообще откуда взято? Это к чему относится, к PHP, к OpenCart, к Twig или к чему-то другому?
     
  8. Ravilr

    Ravilr Специалист

    Сообщения:
    4.225
    Симпатии:
    1.452
    Конечно к опенкарт. \catalog\model\tool\image.php
     
  9. Harry

    Harry Новичок

    Сообщения:
    4
    Симпатии:
    0
    Ravirl, а подскажите пожалуйста. OC 303 файл admin\view\template\setting\setting.twig, строка 1182 - откуда берётся переменная {{ entry_seo_url }}. В файле контроллера admin\controller\setting\setting.php нет такой конструкции $data['entry_seo_url'] = $this->language->get('entry_seo_url');
     
  10. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    240
    значит есть модификация файла
    storage/modification/admin\controller\setting\setting.php
     
  11. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    240
    model_tool_image - это обращение к модели ModelToolImage находящейся по пути catalog/model/tool/image.php
    resize - это метод модели ModelToolImage
     
  12. Harry

    Harry Новичок

    Сообщения:
    4
    Симпатии:
    0
    А в чистом OC разве должны быть модификации?
     
  13. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    240
  14. Harry

    Harry Новичок

    Сообщения:
    4
    Симпатии:
    0
    Есть. Файл admin\view\template\setting\setting.twig, строка 1182
     
  15. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    240
    да я протупил
    там магия происходит в system/engine/loader.php в методе language
     
  16. Ravilr

    Ravilr Специалист

    Сообщения:
    4.225
    Симпатии:
    1.452
    Из файла перевода \admin\language\ru-ru\setting\setting.php
    как бы автоматом залетает в шаблон без контроллера. Потому что магия :)
    Но если нужно что то свое, то да, можно и так в контроллере
    PHP:
    $data['entry_seo_url'] = $this->language->get('entry_seo_url');