Как создать HMENU / TMENU с иконками из поля «Маска» (текст)? - PullRequest
0 голосов
/ 23 марта 2019

С расширением «Маска» я добавил несколько полей в шаблонах страниц для назначения значков страницам. Также вы можете использовать флажок, чтобы активировать выбранный значок в меню. Это означает следующее меню: я также создал элемент содержимого с маской, в котором вы вводите только UID, и все подстраницы этого UID будут создаваться как <li> список.

Я настроил следующие поля в шаблонах страниц:

  • page_01_icon (String): будет содержать что-то вроде "icon-home"
  • page_02_color (String): это будет цвет значка или цвет фона для элемента списка; зависит от `page_color_background`, допустимыми значениями являются любые шестнадцатеричные цвета CSS, такие как" # a5011c "
  • page_02_color_text (String): если установлено, цвет текста будет изменен на этот
  • page_03_menu (флажок): флажок == `page_icon` будет отображаться; иначе только заголовок страницы
  • page_04_icon_only_menu (флажок): отмечен == будет отображаться только значок, заголовок нет (не требуется для моего вопроса, я использую его только в главном меню)
  • page_05_color_background (флажок): если установлен флажок, `page_color 'используется в качестве цвета фона для этого элемента списка, если нет, значок будет окрашен в` page_color`; если `page_color` вообще не установлен, ни значок, ни фон не получат цвет

Я очень новичок в Typo3, но на самом деле этот код работает с обычным меню заголовка на моей странице. Это был трудный путь, но эта часть работает. Для меню заголовка я мог бы сделать это во FLUID, но теперь это библиотека, и мне нужно сделать то же самое здесь, но с TypoScript - независимо от того, что я пытаюсь, я не могу сделать это правильно. Большинство примеров и инструкций основаны на том, что if uid = 1..25 ​​делает что-то еще. Но мне нужно несколько, если еще для этого. Я думаю, что то, что я сделал во FLUID, является правильным способом, теперь я пытаюсь получить ту же логику для TypoScript ... и в итоге здесь

Поля шаблона страницы в маске
Так я добавил поля в маске

Content-Fields
Страницы -> Правка -> Поля содержимого (из полей маски)

Строка главного меню
Это то, что я сделал с FLUID (строка главного меню). Только значок + значок и заголовок + только заголовок.

Говоря в простой логике PHP, я хотел бы сделать следующее (просто чтобы объяснить основное мышление / способ, которым я пробую в TypoScript):

    // dont need to check if page_01_icon is set: field is required
    // dont need to check if page_03_menu is checked: icons in this typo3 lib will always be displayed
    // just assume that $title holds the title and $url the url to that page

    foreach(....) {
      // save html/css code in var for text color if a color is set
      if(isset($page_02_color_text)) {
        $textColorHTML = ' style="color' . $page_02_color_text . '"';
      } else {
        $textColorHTML = '';
      }

      // save html/css code in background of <li> if background-checkbox is checked and a color is set
      if ($page_05_color_background == 1 && isset(page_02_color)) {
        $liBackgroundHTML = ' style="background-color:' . $page_05_color_background . '"';
      } else {
        $liBackgroundHTML = '';
      }

      echo '<li' . $liBackgroundHTML . '><a href="' . $url . '" ' . $textColorHTML . '><i class="' . $page_01_icon . '"></i> ' . $title . </a></li>';
    }

В основном это то, что я пытался попробовать в TypoScript:)

Что я "имею":
Шаблон-файл маски со следующим содержимым:

<f:cObject typoscriptObjectPath="lib.linkListAuto" data="{data}" />

Файл lib.linkListAuto:
Это версия по умолчанию без логики php сверху. здесь мне нужно "перевести" логику php в .. Я даже не смог опубликовать сценарий наполовину беспокойства, потому что все, что я пробовал, закончилось неправильно: /

lib.linkListAuto = COA
lib.linkListAuto {
    1 = HMENU
    1 {
        special = directory
        special.value.field = tx_mask_link_root_id

        wrap = <ul class="list-group">|</ul>
        stdWrap.if.isTrue.data = register:count_menuItems

        1 = TMENU
        1 {
            NO = 1
            NO {
                allWrap = <li class="list-group-item">|</li>
                stdWrap.htmlSpecialChars = 1
                ATagTitle.field = description // subtitle // title
            }
        }
    }
}

Как я могу сказать в TypoScript "рендеринг таким образом каждой ссылки (подстраницы), которая появляется",
но если цвет установлен и установлен флажок для use_color_as_background: измените рендеринг для этой записи и присвойте <li> цвет фона
также измените цвет текста, если он установлен
и наконец добавьте иконку перед заголовком страницы

Пожалуйста, помогите с идеями, которые не подходят к примерам "если uid равен X". Если их достаточно, они работают, да, но я не могу изменить их на то, что я пытаюсь сделать.

1 Ответ

0 голосов
/ 24 марта 2019

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

Таким образом вы настраиваете рендеринг.

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

Другая важная функция - это конкатенация строк:в TypoScript вы можете использовать COA s (Content Object Array), чтобы создать строку, в которой вы решаете, для каждого элемента массива, как он отображается.

Для создания строки <li' . $liBackgroundHTML . '><a href="' . $url . '" ' . $textColorHTML . '><i class="' . $page_01_icon . '"></i> ' . $title . </a></li> вы можете использовать что-то вроде:

temp.li_tag = COA
temp.li_tag {
    10 = TEXT
    10.value = <li

    // if ($page_05_color_background == 1 && isset(page_02_color)) {
    //   $liBackgroundHTML = ' style="background-color:' . $page_05_color_background . '"';
    // } else {
    //   $liBackgroundHTML = '';
    // }
    20 = TEXT
    20.field = page_05_color_background
    20.noTrimWrap = | style="background-color:|"|
    20.if.isTrue.field = page_02_color

    30 = TEXT
    30.value = ><a href="

    40 = TEXT
    40.field = title
    40.dataWrap = <i class="{field.page_01_icon}"></i>&nbsp;|
    40.stdWrap.typolink {
       parameter.field = uid

       // if(isset($page_02_color_text)) {
       //   $textColorHTML = ' style="color' . $page_02_color_text . '"';
       // } else {
       //   $textColorHTML = '';
       // }
       ATagParams.cObject = TEXT
       ATagParams.cObject {
         field = page_02_color_text
         wrap = style="color|"
         if.isTrue.field = page_02_color_text
       } 
    }

    50 = TEXT
    50.value = </li>
}
...