[Помогите] позиция для вывода модулей

Тема в разделе "OpenCart", создана пользователем cherkas, 16 фев 2016.

  1. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    Здравствуйте, нужно создать позицию для вывода модуля справа от слайдера на главной, читал темы по созданию позиций, но как ее всунуть именно туда так и не понял.

    Помогите решить проблему.
     
  2. bloodlight

    bloodlight

    Регистрация:
    24 мар 2013
    Сообщения:
    46
    Симпатии:
    58
    Для начала покажи сайт, куда именно хочешь всунуть модуль, используешь стандартную тему или нет, больше подробностей пожалуйста.
     
  3. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    http://cherkas.pp.ua/

    модуль вывел но с большими костылями

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

    PHP:
    <?php echo $header?><?php echo $column_left?><?php echo $column_right?>
    <div id="content"><?php if ($content_right_top) echo '<table><tr><td style="width:70%;">'?>
    <?php 
    echo $content_top?>
    <?php 
    if ($content_right_top) echo '</td><td style="width:30%;">'?><?php echo $content_right_top?><?php if ($content_right_top) echo '</td></tr></table>'?>
    <?php 
    echo $content_bottom?></div>
    <?php echo $footer?>
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    А при чём тут вообще таблица? Это уже вопрос вёрстки, а не вывода позиции.
    Кроме того, это всё должно быть внутри позиции. Посмотрите, как выглядят выводы остальных позиций даже в том коде, что вы выложили - только чистый вывод переменной, а всё остальное уже внутри шаблона самой позиции должно быть.
     
  5. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    правильно, но модули занимают всю ширину, а у меня получается что именно рядом со слайдером нужно вставить еще один модуль, т.е. как бы модуль вставить в модуль, что ли.

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

    таблицей как я сделал тоже не получается, пока в топ вывел только слайдер и необходимый модуль, а всё остальное нужно будет выводить в боттом.
     
  6. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Я вообще не понимаю сути проблемы. Если нужно было, чтоб слева от слайдера был какой-то модуль, а дальше всё шло на всю ширину, можно было воспользоваться стандартной позицией левой колонки и просто сделать её разворачивающейся только на высоту своего содержимого.
     
  7. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    так не получиться, так как правая колонка будет задействована на других станицах
     
  8. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Это не проблема, просто добавьте на body класс указывающий текущую страницу и задавайте стили только для нужной страницы.
    То есть, если это нужно только для главной: вешаете на body класс home, а потом в стилях пишите .home #column-left
     
  9. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    не совсем понял где вешать класс. боди он же на всех страницых
     
  10. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Ну так и, например, тег title на всех страницах, но содержимое то в нём разное. Я же выше написал:
    Текущую - значит текущую, то есть именно ту, которая сейчас открыта. Самый простой вариант: просто выдрать из роута часть после слеша, то есть для главной из common/home выдрать home и повесить на body.
     
  11. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    т.е.

    HTML:
    body .home #column_right {
    
    }
    так что ли?

    если так, то будет ли оно работать при включенном ЧПУ, там нету последнего слеша.
    --- Добавлено, 18 фев 2016 ---
    стоп кажется я понял!

    это в header.tpl мне нужно в body добавить что то типа такого

    Код:
    <body  class="<?php echo $_SERVER['REQUEST_URI']" ?>
    а в CSS уже прописать стили.

    Вариант хороший, только если можно подскажите что правильно прописать в body, что бы работало и с ЧПУ и без ЧПУ.
     
    Последнее редактирование: 18 фев 2016
  12. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Нет, вы вообще ничего не поняли ни в одном месте.

    В CSS body писать не надо. Да и без разницы будет этот класс на body или на каком-то внутреннем контейнере страницы, внутри которого колонка.

    И таки да, класс нужно навешивать именно в шаблоне, а в CSS только стили для него, но опять же, не всю ссылку навешивать на body, а вычленить из неё только название текущего контроллера.

    И ЧПУ тут не при чём. Оно будет работать независимо от того, есть оно или нет, потому что речь идёт не о ссылке из адресной строки браузера, а у внутреннем роуте, который есть всегда. И по этой причине $_SERVER['REQUEST_URI'] там не уместен даже в варианте, когда из него вычленяется текущий контроллер, что кстати, для него сделать сложнее, чем вычленить из роута и, действительно, возможно только без ЧПУ.

    Перед тегом body впишите это:
    PHP:
    $class '';
    if(isset(
    $this->request->get['route']) && !empty($this->request->get['route'])){
        
    $class explode('/'$this->request->get['route'])[1];
    }
    А сам тег body будет выглядеть так:
    PHP:
    <body class="<?php echo $class?> //а тут дальше остальные классы, которые на нём изначально либо закрывающая двойная кавычка и остаток тега
    Такой вариант будет работать только в ОК 1.5. В ОК 2 в шаблоне недоступен контекст, так что переменную с классом нужно готовить в контроллере и передавать в шаблон.
     
    cherkas нравится это.
  13. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    Parse error: syntax error, unexpected '[' in /home/atribut/domains/cherkas.pp.ua/public_html/catalog/view/theme/default/template/common/header.tpl on line 67

    PHP:

    64  <?php
    65  $class 
    '';
    66  if(isset($this->request->get['route']) && !empty($this->request->get['route'])){
    67    $class explode('/'$this->request->get['route'])[1];
    68  }
    69  ?>
    выдало ошибку в Вашем коде.
    --- Добавлено, 22 фев 2016 ---
    PHP:
    <?php
    $class 
    '';
    if(isset(
    $this->request->get['route']) && !empty($this->request->get['route'])){
        
    $class explode('/'$this->request->get['route']);
    }
    ?>
    <body class="<?php echo $class[1]; ?>">
    Так заработало!

    Спасибо!
     
  14. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    Dotrox

    Вы не подскажите, в чем может быть причина, почему класс не всегда срабатывает, особенно редко срабатывает при первом заходе, но если перейти по магазину куда нибудь, а потом вернуться на главную, то работает.
     
  15. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Значит у вас слишком старый php. Начиная с 5.4 можно сразу получить значение из массива созданного через explode.

    У главной страницы роута может и не быть в отличии от всех остальных. Можно попробовать так:
    PHP:
    <?php
    $class 
    '';
    if(isset(
    $this->request->get['route']) && !empty($this->request->get['route'])){
        
    $class explode('/'$this->request->get['route']);
        
    $class $class[1];
    } else {
        
    $class 'home';
    }
    ?>
    <body class="<?php echo $class?>">
    То есть, если роута нет или он пустой, считаем, что это главная.
     
    cherkas нравится это.
  16. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    еще раз хочу выразить благодарность!

    уже не в первый раз пригождается
     
  17. cherkas

    cherkas

    Регистрация:
    25 фев 2013
    Сообщения:
    451
    Симпатии:
    57
    Снова здравствуйте, я снова за помощью по этому вопросу, подскажите пожалуйста как подготовить и передать класс для версии 2, и есть ли разница между версиями 2.0 - 2.3 в организации такой передачи.
     
  18. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Вроде, есть, но точно не помню что и где (в 2.0 в шаблонах, вроде, ещё доступен был контекст). Начиная с 2.1, вроде, всё должно быть одинаково. Но в двойке это всё вообще не надо, там уже есть аналог. Посмотрите в конце файла: https://github.com/opencart/opencart/blob/2.3.0.2/upload/catalog/controller/common/header.php
     
    cherkas нравится это.
  19. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    :Smile:
    Только обратил на это внимание
    Бред чистой волы так "классить"
    <body class="product-category-20">

    надо хотя бы так

    Код:
            if (isset($this->request->get['route'])) {
                if (isset($this->request->get['product_id'])) {
                    $class = ' product-' . $this->request->get['product_id'];
                } elseif (isset($this->request->get['path'])) {
                    $class = ' category-' . $this->request->get['path'];
                } elseif (isset($this->request->get['manufacturer_id'])) {
                    $class = ' manufacture-' . $this->request->get['manufacturer_id'];
                } elseif (isset($this->request->get['information_id'])) {
                    $class = ' information-' . $this->request->get['information_id'];
                } else {
                    $class = '';
                }
                $data['class'] = str_replace('/', '-', $this->request->get['route']) . $class;
            } else {
                $data['class'] = 'common-home';
            }
    Тогда все будет пучком
    <body class="product-category category-20">
    --- Добавлено, 6 фев 2017 ---
    в 2.3 уже нет, в 2.1 еще есть
     
  20. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Контекст? Мне чего-то казалось, что после 2.1 уже ничего особо не ломалось.

    Хоть сделано и криво, но стили навешивать всё же не мешает, пусть и не самым простым способом:
    HTML:
    body[class^='product-category']
    Тут бы в идеале вообще не указывать тип страницы одним значением с id, то есть, использовать там какое-то универсальное слово:
    HTML:
    <body class="product-category entity-id-20">
    Чтоб код для чтения самого id (если оно понадобиться) был универсальным и не зависел от типа страницы.