【问题标题】:Use fluid viewhelper inside own viewhelper which creates html code在创建html代码的自己的viewhelper中使用流体viewhelper
【发布时间】:2019-12-11 21:14:30
【问题描述】:

我为我的扩展创建了一个自己的 viewhelper,它创建了动态 html 代码。 我用

protected $escapeOutput = false;

在我的扩展中。 Fluid viewhelper 的 html 代码将在字符串中返回。

<f:image src='".$lPlay->getIfName()."' alt='Bild' height='50' />

但是 Fluid viewhelper 没有被执行。在网页的源代码中我可以看到

<f:image src='fileadmin/user_upload/AlbumArtSmall.jpg' alt='Bild' height='50' />

我的错误是什么,或者不能在创建 html 代码的 viewhelper 中使用 viewhelper。
也许我可以直接用 php 调用我的 viewhelper 中的流体 viewhelper。但我不知道该怎么做。

    public function render() {
    $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
    $lPlayC = $objectManager->get('HGA\\Mairlist\\Controller\\LastPlayController');
    $lPlays = $lPlayC->sendAction();
    $return  = "\n<div class='lPlay'>\n";
    $return .= "\t<table  class='tx_mairlist' >\n";
    $return .= "\t\t<tr class='header'>\n";
    $return .= "\t\t\t<th colspan='3'><p class='header'>gerade gespielt</p></th>\n";
    $return .= "\t\t</tr>\n";
    $iPos = 1;
    foreach ($lPlays as $lPlay) {
        if ($iPos == 1) {
            $class = "onair";
        } else {
            $class = "gone";
        }
        $return .= "<tr class='".$class."'>\n";
        $date = $lPlay->getDate();
        $temp = $date->format('H:i:s');
        $return .= "<td class='time'> <p class='time'>".$temp."</p>\n";
        $return .= "<p class='space'></br></p>\n";
        $return .= "<p class='duration'>".$lPlay->getDuration()."</p>\n";
        $return .= "</td>\n";
        $return .= "<td> <f:image src='".$lPlay->getIfName()."' alt='Bild' height='50' /></td>\n";
        $return .= "<td> <img src='".PATH_site.$lPlay->getIfName()."' alt='Bild' height='50' /></td>\n";
        $return .= "<td class='info'><b>".$lPlay->getTitle()."</b></br><p class='artist'>".$lPlay->getArtist()."</p></td>\n";
        $return .= "</tr>\n";
        $iPos++;
    }
    $return .= "</table>\n";
    $return .= "</div>\n";
    error_log("ViewHelper: " . $return, 0);
    return $return;
}

【问题讨论】:

  • 请向我们展示您的 ViewHelper 类的 render() 函数。

标签: typo3 fluid view-helpers


【解决方案1】:

您应该在模板中处理 HTML 输出。您可以在 ViewHelper 中将变量添加到 Fluid 并渲染其子项:

$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$lPlayC = $objectManager->get('HGA\\Mairlist\\Controller\\LastPlayController');
$lPlays = $lPlayC->sendAction();
$this->templateVariableContainer->add('plays', $lPlays);
$output = $this->renderChildren();
$this->templateVariableContainer->remove('plays');
return $output;

在您的模板中,您可以像这样使用 ViewHelper:

<ns:myViewHelper>
    <div class="lPlay">
        <table  class="tx_mairlist">
            <tr class="header">
                <th colspan="3"><p class="header">gerade gespielt</p></th>
            </tr>
            <f:for each="{plays}" as="play" iteration="iteration">
                <tr class="{f:if(condition: iteration.isFirst, then: 'onair', else: 'gone')}">
                    <td class="time">
                        <p class="time"><f:format.date format="H:i:s">{play.date}</f:format.date></p>
                        <p class="space"><br /></p>
                        <p class="duration">{play.duration}</p>
                    </td>
                    <td>
                        <f:image src="{play.ifName}" alt="Bild" height="50" />
                    </td>
                    <td class="info">
                        <b>{play.title}</b></br>
                        <p class="artist">{play.artist}</p>
                    </td>
                </tr>
            </f:for>
        </table>
    </div>
</ns:myViewHelper>

【讨论】:

  • Rudy,请您再解释一下。在模板中我看到了 3 次......这是孩子们吗?如果是,我该如何处理不同的孩子?还是只是for循环内的代码,如何在模板中调用子代?
  • 使用$this-&gt;templateVariableContainer-&gt;add('plays', $lPlays);,您可以将 $lPlays 中的数据添加为 Fluid 的变量。使用$this-&gt;renderChildren();,您可以在 ViewHelper 标记(子项)中呈现模板的一部分,您可以在其中使用添加的变量,就像 Fluid 中的任何其他变量一样。当然,您必须自己添加 HTML。我刚刚添加了 for 循环以显示您可以使用该变量。 $this-&gt;templateVariableContainer-&gt;remove('plays'); 从 Fluid 中删除变量,因此它在 ViewHelper 标记之外不可用。
  • Rudy,我的问题是,我目前不明白,我必须在哪里进行更改。依赖于 play 变量,我想修改 html 代码。如果我将 html 代码放入模板中,我该如何进行修改并且我可以控制我的模板中的 return $output 将放置在哪里。例如,在 for 循环中,我想从 更改类名。我怎样才能做到这一点?
  • 我根据您的代码在我的答案中添加了一个更完整的模板。我假设play.ifName 具有图像的完整路径。如果只是文件名,则必须添加 &lt;f:image src="path/to/image/{play.ifName}" alt="Bild" height="50" /&gt; 之类的路径
猜你喜欢
相关资源
最近更新 更多
热门标签