【问题标题】:Display language icon in Fluid template在 Fluid 模板中显示语言图标
【发布时间】:2018-07-10 09:30:57
【问题描述】:

我想通过显示相应的语言图标来显示为每条记录分配的语言。

我计划在 BE 模块的 Fluid 模板中使用 TYPO3 8 和现有的 TYPO3 图标来执行此操作。

我可以从记录中读取 sys_language_uid 的值。

图标已经由 TYPO3 提供,我可以在 pid=0 的“网站语言”列表中看到。

我还找到了一个 ViewHelper 来执行此操作

所以,我要做的是:

  • 从 sys_language_uid 的值,从 sys_language.language_isocode 读取正确的代码(例如 'en'、'es')
  • 从 isocode 中获取图标的正确名称
  • 使用 ` ViewHelper 显示图标

是否有一个 ViewHelper 已经这样做了?我必须从头开始写吗?有什么有效的方法来做到这一点?

【问题讨论】:

    标签: typo3 fluid


    【解决方案1】:

    这里的主要问题是语言没有图标。请不要将语言与通常使用旗帜作为图标的国家/地区混淆。

    相反,您应该以其语言显示该语言,例如Deutsch 用于德语。

    这可以通过加载记录中的语言字段所引用的sys_language记录来实现(通常是sys_language_uid)。有很多方法可以解决这个问题,由于您已经使用 Fluid,您可以尝试从 vhs TYPO3 扩展名中使用 <v:resource.record/> viewhelper

    <v:resource.record
        table="sys_language"
        field="title"
        uid="{data.sys_language_uid}"
        as="languageTitle">
        {languageTitle}
    </v:resource.record>
    

    要将其应用于每条记录,您可以复制 customize the Default.html layout of Fluid StyledContent 并在那里输出处理记录的语言。

    【讨论】:

    • 要使用resource.record ViewHelper,你需要额外的扩展“vhs”。
    【解决方案2】:

    从 TYPO3 9 开始:

    如果你已经解决了代码中的图标,你可以使用核心图标 ViewHelpers,例如

    DE: <core:icon identifier="flags-de"/>
    EN: <core:icon identifier="flags-en-us-gb"/>
    

    您可以看到核心如何使用SiteLanguage 中的renderLanguageFlag()PageLayoutView.php 中创建图标。 (您可以将 languageFlag 传递给 core:icon ViewHelper)。

    重要提示:这是后端代码。

    $icon = $this->renderLanguageFlag($this->siteLanguages[(int)$row['sys_language_uid']]);
    
    protected function renderLanguageFlag(SiteLanguage $language)
    {
        $title = htmlspecialchars($language->getTitle());
        if ($language->getFlagIdentifier()) {
            // instead of this, you can getFlagIdentifier() and pass to Fluid
            $icon = $this->iconFactory->getIcon(
                $language->getFlagIdentifier(),
                Icon::SIZE_SMALL
            )->render();
            return '<span title="' . $title . '">' . $icon . '</span>&nbsp;' . $title;
       }
       return $title;
    }
    
    protected function resolveSiteLanguages(int $pageId)
    {
        $site = GeneralUtility::makeInstance(SiteMatcher::class)->matchByPageId($pageId);
        $this->siteLanguages = $site->getAvailableLanguages($this->getBackendUser(), true, $pageId);
    }
    

    您也可以为此创建 ViewHelpers,但我认为在控制器中执行一次会更有效(以防您在视图中多次使用标志)。

    【讨论】:

      【解决方案3】:

      使用 ICON API(无需 VHS 扩展)

      https://docs.typo3.org/typo3cms/CoreApiReference/8.7/ApiOverview/Icon/

      您的控制器可以从以下位置获取 isocode:

      $this->TCP=GeneralUtility::makeInstance(TranslationConfigurationProvider::class);
      $this->languages = $this->TCP->getSystemLanguages();
      $this->view->assign('languages', $this->languages);
      

      在 FLUID 中你可以得到这样的图标:

      {namespace core = TYPO3\CMS\Core\ViewHelpers}
      
      <f:for each="{languages}" as="language" iteration="i">
          <core:icon identifier="flags-{language.flag}" size="small" />
      </f:for>
      

      其中 {language.flag} 是您首选的小写 isocode。

      core:icon 属性 »overlay« - 在这种情况下未使用 - 可以将图标粘贴在一起。

      在此处查找标识符名称:https://typo3.github.io/TYPO3.Icons/

      对于语言标志,您必须在小写 isocode 前加上:“flags-”

      【讨论】:

        猜你喜欢
        • 2017-10-03
        • 2011-09-15
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 2018-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多