Как установить несколько значений для одного и того же атрибута в атрибутах tal: с помощью TALES - PullRequest
3 голосов
/ 08 ноября 2011

Я пытаюсь установить несколько классов CSS для одного элемента.

К сожалению, это не работает, так как возвращает: LanguageError: Duplicate attribute name in attributes.

<ul>
    <li tal:repeat="item mainnav"
        tal:attributes="class 'first' if repeat.item.start else nothing; 
                        class 'last' if repeat.item.end else nothing;
                        class 'active' if item.active else nothing">
        <a tal:attributes="href item.href" tal:content="item.title">title</a>
    </li>
</ul>

Объединение этих трех случаев водно выражение делает его довольно сложным, потому что есть 6 различных состояний css :

  • first + active
  • first
  • last + active
  • последний
  • активный
  • (нет)

Существует 2 возможных решения, о которых я могу подумать:

->проверьте каждую комбинацию inline:

<ul>
    <li tal:repeat="item mainnav" 
        tal:attributes="
            class 'first active' if (repeat.item.start and item.active) else
                  'first'        if repeat.item.start else
                  'last active'  if (repeat.item.end and item.active) else
                  'last'         if repeat.item.end else
                  'active'       if item.active else nothing">
        <a tal:attributes="href item.href" tal:content="item.title">title</a>
    </li>
</ul>

-> создайте метод, который возвращает объединенные классы css

Теперь, есть ли лучший подход, и если нет, какой из этих 2 лучше (вероятно,последний, как если бы он усложнялся, встроенный скрипт станет нечитаемым / неуправляемым).

Кстати, есть ли хорошие ресурсы и примеры о Chameleon, TALES (кроме http://chameleon.repoze.org/docs/latest)

Ответы [ 3 ]

7 голосов
/ 28 июля 2012

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

<tal:loop repeat="item mainnav">
    <li tal:define="class_first  'first'  if repeat.item.start else '';
                    class_last   'last'   if repeat.item.end else '';
                    class_active 'active' if item.active else '';"
        tal:attributes="class string:$class_first $class_last $class_active">
       <a tal:attributes="href item.href" tal:content="item.title">title</a>
    </li>
</tal>

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

Что касается дополнительной документации;Chameleon - это реализация TAL , изначально разработанная для шаблонов страниц Zope.Таким образом, вы обнаружите, что много документации для последнего также применимо к Chameleon, если принять во внимание, что значение по умолчанию TALES для Chameleon равно python:, в то время как ZPT по умолчанию равно path:.Глава Расширенные шаблоны страниц * Книги Зопе относится, например, и к Хамелеону.

4 голосов
/ 28 января 2013

В Хамелеоне вы можете сделать:

<ul>
    <li tal:repeat="item mainnav"
        class="${'first' if repeat.item.start else ''}
               ${'last' if repeat.item.end else ''}
               ${'active' if item.active else ''">
        <a tal:attributes="href item.href" tal:content="item.title">title</a>
    </li>
</ul>

[Изменить] Или лучше так:

<ul>
    <li tal:repeat="item mainnav"
        class="${('first ' if repeat.item.start else '') +
                 ('last ' if repeat.item.end else '') +
                 ('active' if item.active else '')}">
        <a tal:attributes="href item.href" tal:content="item.title">title</a>
    </li>
</ul>
0 голосов
/ 04 мая 2012

Вы не используете tal: condition, у него есть цель. Мне не нравятся чрезмерно вложенные условные выражения, они вас никуда не ведут. Не проверял это, но вы можете понять.

<ul>
    <tal:myloop tal:repeat="item mainnav">
        <li tal:condition="item.active" tal:attributes="class 
            'active first' if repeat.item.start 
            else 'active last' if repeat.item.end 
            else 'active'">
            <a tal:attribute="href item.href" tal:content="item.title"></a>
        </li>
        <li tal:condition="not item.active" tal:attributes="class 
            'first' if repeat.item.start 
            else 'last' if repeat.item.end else None">
            <a tal:attribute="href item.href" tal:content="item.title"></a>
        </li>
    </tal:myloop>
</ul>
...