Передача Smarty include с assign в описание товара

Здравствуйте!

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

{if $product.features}
    <table class="features" id="product-features">
        {foreach $product.features as $f_code => $f_value}
            <tr{if $features[$f_code].type == 'divider'} class="divider"{/if} itemprop="additionalProperty" itemscope itemtype="http://schema.org/PropertyValue">
                <td class="name" itemprop="name">{$features[$f_code].name|escape}:</td>
                <td class="value" itemprop="value">
                    {if is_array($f_value)}
                        {if $features[$f_code].type == 'color'}
                            {implode('
', $f_value)} {else} {implode(', ', $f_value)} {/if} {else} {$f_value} {/if} </td> </tr> {/foreach} </table> {/if}

Код вынесен в отдельный файл features.html. В product.html указано:

{include file="features.html" assign=product_features}

При этом переменная {$product_features}, указанная в теле карточки (в описании) через HTML, не передается, то есть там пустота - возможны только стандартные переменные типа {$product.name}.

В настройках 'can_use_smarty' => true,

Как это реализовать? Если выводить блок features.html напрямую без include assign, то всё показывается, но это слишком большой и неудобный кусок, который придется выводить в каждом товаре в различных местах. Хотелось бы просто указывать {$product_features} в необходимом месте описания товара.

Как это реализовать?

2 ответа

  • 2
    Алексей Webasyst 21 декабря 2017 14:19 #

    Меня немного смущает блок

    assign=product_features

    Сравните с примером
    {include file="list-thumbs-mini.html" products=$crossselling ulclass="related-bxslider"}

    может вам стоит использовать что-то вида

    {include file="features.html" product=$product}

    Ну и вы можете в шаблоне добавить {wa_tpl_vars} чтобы узнать что в него вообще передаётся

  • 1
    Worker 21 декабря 2017 18:16 #

    {wa_tpl_vars} показал, что в $product_features пустота.

    Про product=$product не очень понял, ведь assign присваивает переменной $product_features содержимое include file.

    Если в products.html прописать {include file="features.html" assign=product_features} и сразу же вывести {$product_features}, то в товарах всё выводится, а вот в описании товара эта переменная пуста, что логично. Собственно, я и спрашиваю, как её передать или же реализовать затею через какой-либо другой способ. Куда можно записать содержимое features.html, чтобы его можно было вызывать одной переменной или строкой, дабы не намешивать кашу в описании каждого товара.

    • +1
      info@ravencode.ru info@ravencode.ru 23 декабря 2017 04:22 #

      читай внимательно https://www.smarty.net/docs/en/language.function.i...

      • +1
        Worker Worker 23 декабря 2017 14:12 #

        Разумеется, я всё это сразу прочитал, а что конкретно я должен оттуда к подчерпнуть к моей задаче и где я ошибся? В плане логики и синтаксиса всё должно быть в порядке, вот присвоение содержимого include в $navbar:

        Example 7.52. {include} and assign to variable
        
        This example assigns the contents of nav.tpl to the $navbar variable, which is then output at both the top and bottom of the page.
        
        <body>
          {include 'nav.tpl' assign=navbar}
          {include 'header.tpl' title='Smarty is cool'}
            {$navbar}
            {* body of template goes here *}
            {$navbar}
          {include 'footer.tpl'}
        </body>
        • +1
          info@ravencode.ru info@ravencode.ru 23 декабря 2017 14:33 #
          assign string No n/a The name of the variable that the output of include will be assigned to

          тебе перевести или сам справишься?

          • +1
            Worker Worker 23 декабря 2017 15:04 #

            А если меньше языком чесать и больше по делу? По-нашему в переводе присвоение вывода include указанной переменной через assign. Я это писал во всех трех сообщениях.

            Описание товаров не видит переменные, определенные в шаблоне, только изначальные родные. Это и надо разрулить или предложить реализуемый план решения.

            • +1
              info@ravencode.ru info@ravencode.ru 23 декабря 2017 17:05 #
              {include file="features.html" product=$product features=$features assign=product_features}
              • +1
                Worker Worker 23 декабря 2017 20:38 #

                На странице товара в {wa_tpl_vars} в переменной product_features отобразилось нужное содержимое, но при выводе {$product_features} пусто.

                Стал проверять, как себя ведут другие, более "стандартные" переменные:

                {$wa_app} отображает shop, а {$wa_active_theme_url} нет, хотя в этой переменной через {wa_tpl_vars} есть значение.

                Решить проверить зависимость от значения can_use_smarty, и такое ощущение, что этот параметр работает наоборот:

                При значении false переменная {$product.name} отображается, а при true - пропадает. Разумеется, кэши сбрасывал, включал debug...

                Обнаружил, что здесь на форуме многие не могут вывести переменные вне зависимости от can_use_smarty.

                • +1
                  info@ravencode.ru info@ravencode.ru 23 декабря 2017 22:30 #

                  распиши конкретнее что и в каких шаблонах вызываешь, переменные из общего шаблона index.html не передаются в шаблоны страниц page.html\login.html и т.д.

                  • +1
                    Worker Worker 27 декабря 2017 02:49 #

                    В отдельном файле features.html:

                    {if $product.features}
                        <table class="features" id="product-features">
                            {foreach $product.features as $f_code => $f_value}
                                <tr{if $features[$f_code].type == 'divider'} class="divider"{/if} itemprop="additionalProperty" itemscope itemtype="http://schema.org/PropertyValue">
                                    <td class="name" itemprop="name">{$features[$f_code].name|escape}:</td>
                                    <td class="value" itemprop="value">
                                        {if is_array($f_value)}
                                            {if $features[$f_code].type == 'color'}
                                                {implode('<br /> ', $f_value)}
                                            {else}
                                                {implode(', ', $f_value)}
                                            {/if}
                                        {else}
                                            {$f_value}
                                        {/if}
                                    </td>
                                </tr>
                            {/foreach}
                        </table>
                    {/if}

                    В product.html:

                    {include file="features.html" product=$product features=$features assign=product_features}

                    В описании товара: {$product_features}

                    В $product_features через {wa_tpl_vars}

                    'product_features' => '    <table class="features" id="product-features">
                                        <tr itemprop="additionalProperty" itemscope itemtype="http://schema.org/PropertyValue">
                                    <td class="name" itemprop="name">Состав:</td>
                                    <td class="value" itemprop="value">
                                                               Имбирь, яблоко, мята
                                                        </td>
                                </tr>
                                </table>
                    ',

                    Сам вывод пустой - при любых значениях can_use_smarty

                • +2
                  BNP (Дмитрий) BNP (Дмитрий) 23 декабря 2017 22:44 #

                  product_features - это массив. Он так и не отобразится. Если надо увидеть содержимое

                  {$product_features|wa_dumpc}
                  • +1
                    Worker Worker 23 декабря 2017 22:51 #

                    Нет, это не массив, а строковая переменная, в которой содержится html+smarty.

                    На всякий случай проверил - страница крашится при добавлении |wa_dumpc

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

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