$wa_active_theme_path не работает должным образом

В файле theme.xml родительская тема указана, файлы так же маркированы:

<file path="head.html" custom="0" parent="1">

{include file="`$wa_active_theme_path`/head.html" inline}

$wa_active_theme_path - не возвращает адрес родительской темы, как описано в документации.

Если в дочерней теме какой-либо шаблон родительской темы используется по умолчанию, то переменная $wa_active_theme_url будет возвращать разное значение в зависимости от того, какая тема в данный момент использует этот шаблон: URL директории родительской либо дочерней темы в зависимости от того, какое приложение (а точнее поселение, поскольку для каждого поселения может выбрана своя тема оформления) отвечает за формирование текущей страницы фронтенда.

2 ответа

  • 1

    Извините, а с чего вы взяли что эта переменная должна возвратить путь к файлу из родительской темы оформления?

    Даже в имени переменной указано что вы получите путь АКТИВНОЙ темы оформления.

    Возможно вам нужна переменная:

    $wa_parent_theme_path
    По аналогии с $wa_parent_theme_url эта переменная возвращает путь к директории, в которой хранятся файлы родительской темы.


    • +1

      Хорошо, допустим я меняю данную переменную на $wa_parent_theme_path, но в итоге получается опять полная хрень. В итоге в наследованном шаблоне, (например header.html), путь встроенных изображений меняется относительно текущей темы.

      <img src="{$wa_active_theme_url}img/logo.png" alt="" />

      А в текущей теме данных изображений просто нет. В итоге применять костыльные методы?

      • +1

        Вы просто задаете вопрос неверно. Вам не нужно указывать что эти переменные работают не корректно - они работаю ровно таким образом как и предусмотрено. Сформируйте вопрос правильно, примерный шаблон:

        Я делаю вот так(тут описание что сделано), хочу что бы получилось вот так(тут описание как надо), у меня не получается - подскажите как нужно.


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

        Ваш пример:

        <img src="{$wa_active_theme_url}img/logo.png" alt="" />

        Шаблонизатор будет искать файл logo.png в папке img темы оформления текущего приложения. То есть - если вы находитесь в приложении Сайт, то это будет путь(скорее всего): wa-data/public/site/themes/ваша тема/img

        когда же вы перейдете в приложение Магазин: wa-data/public/shop/themes/ваша тема/img

        Отсюда следует что в этом случае вам следует положить файл logo.png в обе эти папки.

        *Указанные переменные не зависят в того в каком файле они вызываются, они возвращают значение точно по спецификации.

        • +1

          Проблема в том, что никому нужны дублированные изображения, это дополнительный вес к страницам сайта. Выходит, эти самые "родительские темы" не фича, а баг сплошной, так как приходится для каждого приложения дублировать код, изображения и прочие файлы. Лучше бы все шаблоны управлялись с одной папки

          • +1

            Боюсь что вы не разобрались с тем как работать с темами оформления.

            Я вам привел пример поведения/работы того кода что вы указали, это совсем не означает что темы оформления построены таким образом.

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

            • +1

              Хорошо, допустим, проблема в моём коде. Какими методами реализовать вывод изображений из папки темы, которая является родительской?

              При этом не дублировать изображения и не указывать прямой путь(так как прямой путь может изменяться).

              • +1

                Пожалуйста:

                {$images = ['img1.jpg','img2.jpg','img3.jpg','img4.jpg','img5.jpg','img6.jpg','img7.jpg',]}
                {foreach $images as $img}
                    <img src="{$wa_parent_theme_url}img/{$img}" alt="">
                {/foreach}

                *где $wa_parent_theme_url - относительный адрес родительской темы оформления, следовательно, если родителем является тема оформления приложения Сайт, то изображения должны находиться в одной из папок(зависит от того оригинал это темы или нет):

                wa-apps/site/themes/ваша тема/img/

                wa-data/public/site/themes/ваша тема/img/

                • +1

                  Но для приложения сайт этот способ не будет работать, поэтому нужно проверять:

                  {if $wa_app == 'site'}{$wa_theme_url}{else}{$wa_parent_theme_url}{/if}

                  *поскольку у родительской темы оформления нет родителя.

                  • +1

                    Для каких-то случаев подойдет, но если есть темы 3х приложений: 1 основная родительская, 2 наследует от родительского файл header.html, у 3 header.html шаблон свой. То в этом случае данный метод не работает, придется либо писать дополнительные условия, либо дублировать файл header и на 2 приложение.

                    Веду я к тому, что если мы уже и обозначили связи каждого из файлов шаблона в theme.xml, то и должна быть переменная которая бы и брала значение пути в зависимости от настройки в theme.xml. А пока что, получается мы устанавливаем значения parent="0/1" только для отображения кода из родительской темы в дочерней в бекенде для редактирования.

                    • +1

                      Хм, ясно - вам нужно для начала продумать структуру вашего шаблона. Механизм для создания семейства тем дизайна достаточен и логичен.

                      Возможно в вашем случае нужно совсем отказаться от семейства тем, а делать отдельные темы оформления для каждого из приложений? Возможно нужно менять не весь header.html, а только его часть?

                      • +1

                        Все скрипты, изображения и стили с темы, все перенес в новую папку в корне сайта. А что с файлами шаблонов, на те которые меняются поставил переменную active, а наследованные таким образом:

                        {if $wa_app == 'site'}{$files_url = $wa_active_theme_path}{else}{$files_url = $wa_parent_theme_path}{/if}
                        {include file="`$files_url`/header.html" inline}
                • +1

                  Этот способ нужен, если блок который вы размещаете, не подключается в основной файл index.html, а в шаблоны какого либо "action", например page.html, category.html и т.п..

                  В случае c файлом index.html просто используйте $wa_theme_url, который указывает относительный путь к папке родительской темы оформления, потому как index.html - файл который принадлежит родительской теме оформления.

  • 1
    Иван Правдоруб 28 февраля 2017 14:09 #

    Повоевал я с этими относительными путями. Итог таков.

    Если в дочерней теме на данный файл прописан параметр parent <file path="block-seo.html" parent="1"/>, то можно просто написать {include file="block-seo.html"} и он подключится из родительской темы.

    $wa_active_theme_path = только рабочая в данный момент тема (блог, магазин)

    $wa_parent_theme_path = только родительская тема (сайт)

    Таким образом, манипулируя параметром "parent" в XML, можно динамично подгружать файл из нужной темы, родительской или рабочей.

    • +1
      Иван Правдоруб Иван Правдоруб 28 февраля 2017 17:59 #

      А вот нифига. Вне зависимости от "parent" всегда подгружает из родительской, даже если в дочерней есть такой файл. Не пойму логики вообще.

      Пришлось сделать такое условие:

      {if file_exists("{$wa_active_theme_path}/block-seo.html")}
          {include file="{$wa_active_theme_path}/block-seo.html" inline}
      {else}
          {include file="{$wa_parent_theme_path}/block-seo.html" inline}
      {/if}

      Если в дочернем шаблоне нет нужного файла — идём в родительский. Шикарный костыль, который можно бы было заменить одной строчкой в коде ПО...

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите