如何使用来自掩码字段(文本)的图标创建 HMENU/TMENU?

How to create a HMENU/TMENU with Icons that came from a Mask field (text)?

使用扩展名 "Mask" 我在页面模板中添加了一些字段以将图标分配给页面。您也可以使用复选框来激活菜单中选定的图标。菜单意味着这种情况:我还制作了一个带掩码的内容元素,您只需输入一个 UID,该 UID 的所有子页面将被创建为 <li> 列表。

我在页面模板中设置了以下字段:

我是 Typo3 的新手,但实际上我在页面上使用正常的 header 菜单使上面的代码工作。这是一条艰难的道路,但那部分是有效的。对于 header 菜单,我可以在 FLUID 中完成,但现在这是一个库,我需要在这里做同样的事情,但使用 TypoScript - 无论我尝试什么,我都无法做到正确。大多数示例和 how-tos 依赖于 "if uid = 1..25" 做其他事情。但是我需要多个if elses。我认为我在 FLUID 中所做的是正确的方式,现在尝试将相同的逻辑用于 TypoScript... 并在此处结束。

Page Template Fields in Mask
这就是我在 Mask

中添加字段的方式

Content-Fields
页面 -> 编辑 -> Content-Fields(共 Mask-Fields)

Main Menu Bar
这就是我对 FLUID(主菜单栏)所做的。 Icon-only + 图标和标题 + 仅标题。

用简单的 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 中尝试的方法:)

我"have":
具有以下内容的掩码 template-file:

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

库linkListAuto-file:
这是默认版本,没有上面的 php 逻辑。在这里我需要 "translate" php 逻辑到..我什至不能 post 写脚本的一半因为我尝试过的一切都以错误的方式结束了:/

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 说 "render this way every link (sub-page) that comes",
但如果设置了颜色列表并选中了 use_color_as_background 的复选框:更改此条目的渲染并给 <li> 一个 background-color
如果已设置,还会更改文本颜色
最后在 page-title 前面添加图标
?

请帮助提供未提出 "if uid equals X" 示例的想法。有足够的它们,它们可以工作,是的,但我无法将它们更改为我正在尝试做的事情。

您需要了解 TypoScript 的概念。
所以这个名字可能会产生误导。 TypoScript 不是一种脚本语言,而是一种配置语言。所以你不能使用顺序计算的概念。

您可以通过这种方式配置渲染。

无论如何,您可以以 .stdWrap.if 函数的形式向渲染添加一些逻辑,它可以控制是否在输出中打印值。

另一个重要的功能是字符串连接:在 TypoScript 中,您可以使用 COAs(内容对象数组)构建一个字符串,您可以在其中决定每个数组元素的显示方式。

为了构建字符串 <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>
}