Шаблон модуля с определенным id

Тема в разделе "Общие вопросы", создана пользователем Neumann, 3 мар 2016.

  1. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    Добрый день.
    Подскажите, пожалуйста.

    Я создал "HTML Content > МойТекст" основанный на модуле "HTML Content".
    Затем я добавляю его в нижнюю часть (вместе с парой других) макета Home

    Мне нужно обернуть этот блок определенной версткой, но только его, другие "HTML Content" нужно по другому. Как я могу изменить только его?

    - Если я изменю module/html.tpl - это изменит все версии "HTML Content", а не только эту.
    - В $content_bottom в common/home.tpl находится вся выдача низа страница, то есть выделить этот блок от остальных не получится
    - Изменять common/content_bottom.tpl тоже не вариант, он используется на всех страницах внизу.

    Может быть существует что-то типа common/home--module_id.tpl или module/html__moduleid.tpl ?

    Или может быть в файле module/html.tpl я смогу как-то получить id модуля.
    if ($module_id == 39) { /*all for one*/ } else ($module_id == 43) { /* other */ }
    Было бы очень удобно. Но я пробовал $module_id, $module, $id, нигде нет((

    Как можно это сделать?
     
  2. solunski.d

    solunski.d Эксперт

    Сообщения:
    1.565
    Симпатии:
    429
    1. Можно сделать доп. поле в админке для модуля. Туда вы будите вписывать название макета. Будите выводить в контроллер название макета и менять tpl файл.
    2. Я думаю можно получить id, только я не смотрел как.
     
    Последнее редактирование: 3 мар 2016
  3. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    Спасибо за ответ. А где это можно сделать (во 2-ом опенкарте)?
    Не могу найти, где модулям можно поля добавлять.
     
  4. solunski.d

    solunski.d Эксперт

    Сообщения:
    1.565
    Симпатии:
    429
    Да во 2-ом OpenCart'e.
    Надо знать PHP и HTML.
    Идете в admin/controller/module/html.php и там создаете переменную. Потом идете в view и находите tpl файл, создаете там поле.
    А потом в catalog/controller/module/html.php и там делаете проверку
     
  5. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    я думал так сделать! но как в самом контроллере узнать, какой именно модуль в данный момент отрабатывает, какой id модуля?
    function index($setting) - в $setting нет информации об id модуля.
     
  6. solunski.d

    solunski.d Эксперт

    Сообщения:
    1.565
    Симпатии:
    429
    Поэтому 1. вариант проще.
     
  7. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    1 вариант - про доп. поле для модуля?
    А где в админке можно устанавливать поля модулям. Искал, не нашел.
     
  8. solunski.d

    solunski.d Эксперт

    Сообщения:
    1.565
    Симпатии:
    429
    Я же писал выше как создается. В админке нет функционала создания доп. полей, все зависит от самого модуля.
     
  9. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    ааа, я #4 сообщение еще раз перечитал.
    я так понял, нужно менять и контроллер модуля в админке. и вьюху модуля а админке. а потом еще и контроллер, и вьюху модуля в пользовательской части.
    а если захочется еще для какого-то модуля, то всё заново.

    непростой путь получается...)

    странно, конечно, что нельзя получить id модуля в контроллере. это было бы так логично. ведь при создании экземпляра модуля, ему присваивается id который виден в адресной строке (при редактировании модуля в админке).
    Эх... если бы был способ проверять этот айди в контроллере в польз. части... как было бы это хорошо...)
     
  10. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    А вот если не через макет? Если не подстегивать модуль к макету.

    Есть способ вообще загрузить через модуль программно? Через контроллер?
    как-нибудь типа $this->loadModule('module/html', 39)

    тогда я бы загружал это в контроллере и передавал бы во вьюху home.tpl
     
    Последнее редактирование: 4 мар 2016
  11. Ален

    Ален Эксперт

    Сообщения:
    2.055
    Симпатии:
    635
    А почему не сделать сразу нужную разметку в контенте?? В исходниках контента делайте нужный div с нужным классом.
    Если га блок у вас есть стили, то уберите/измените все ненужное в html.php
     
  12. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    Вопрос не только в стилях css.
    Допустим, мне надо рядом с блоком html-модуля добавить три ссылки или какую-нибудь картинку. Чтобы это было рядом с выдачей этого модуля.
    Но только, когда он выводится на главной внизу. А на других страницах эти ссылки и картинка не нужны.

    И это касается не только этого модуля. Допустим, модуль "рекомендуемые". Я хочу чтобы у них внешний вид на разных страницах был разный. На главной, допустим, большие картинки, и только цена. А на какой-то другой странице хочу, чтобы рекомендованные выводились с небольшой картинкой, и помимо цены были какие-то характеристики.

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

    Ален Эксперт

    Сообщения:
    2.055
    Симпатии:
    635
    Есть класс в body на какой странице находимся, его и применяем.
    зато есть название модуля! Этого не достаточно? Если названия модулей одинаковое, то можно прямо к названию и приписывать id модуля, например Модуль 11
    Затем при выводе модуля вырезаем последние два символа и используем их как id
     
  14. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    вот об этом и я думал!
    но надеялся, что может есть обычный способ) не самое элегантное ведь решение,
     
  15. Ален

    Ален Эксперт

    Сообщения:
    2.055
    Симпатии:
    635
    в файле \catalog\controller\common\content_top.php

    ищем
    PHP:
    $setting_info $this->model_extension_module->getModule($part[1]);
    и ниже добавим
    PHP:
    $setting_info['module_id'] = $part[1];
    и так же в остальных контроллера положения.

    В итоге получим в самом модуле, id модуля в $setting['module_id']
     
    solunski.d и RoS нравится это.
  16. Ален

    Ален Эксперт

    Сообщения:
    2.055
    Симпатии:
    635
    Или вариант с изменением одной модели \catalog\model\extension\module.php

    найти
    PHP:
    return json_decode($query->row['setting'], true);
    заменить на
    PHP:
                $settings json_decode($query->row['setting'], true);
                
    $settings['module_id'] = $module_id;
                return 
    $settings;
    В итоге получим в самом модуле, id модуля в $setting['module_id']
     
    Ravilr, solunski.d, Romans и ещё 1-му нравится это.
  17. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    спасибо, буду пробовать
     
  18. Neumann

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

    Сообщения:
    35
    Симпатии:
    1
    попробовал вариант, описанный в сообщении #15 - работает!
    спасибо, Ален.
     
  19. Barney

    Barney Новичок

    Сообщения:
    1
    Симпатии:
    0
    В OC 2.2 не работает: Undefined variable: setting in...
    Может кто подскажет, в чем может быть дело?