TYPO3 Extbase / Fluid Viewhelper问题:“标签没有正确嵌套”

时间:2013-03-29 12:41:46

标签: typo3 fluid extbase

我用renderChildren()写了一个viewhelper ...我得到了这个错误,这对我来说没有意义: 模板标签没有正确嵌套。预期: Tx_Hplusinfo_ViewHelpers_RehaKatViewHelper;实际: Tx_hplusinfo_ViewHelpers_RehaKatViewHelper

以下是导致此消息的模板部分:

<f:if condition="{demand.pageId}=={settings.sucheRehaPid}">
  <h:rehaKat klinik="{entfernung.klinik}" demand="{demand}" as="kat">
    <td><f:if condition="{kat.isStationaer}">&#10003;</f:if></td>
    <td><f:if condition="{kat.isAmbulant}">&#10003;</f:if></td>
  </h:rehaKat>
</f:if>

这是viewhelper渲染功能:

/**
 *
 * @param Tx_Hplusinfo_Domain_Model_Klinik $klinik
 * @param Tx_Hplusinfo_Domain_Model_SearchDemand $demand
 * @param string $as Iteration variable
 * @return string
 */
public function render(Tx_Hplusinfo_Domain_Model_Klinik $klinik, Tx_Hplusinfo_Domain_Model_SearchDemand $demand, $as ) {
        $isAmbulant = false;
        $isStationaer = false;

        foreach($klinik->getReha() as $klinikreha) {
                foreach($demand->getRehas() as $demandreha) {
                       if($klinikreha->getReha()->getUid() == $demandreha) {
                                if(!$isStationaer)
                                        $isStationaer = $klinikreha->getIsStationaer();
                                if(!$isAmbulant)
                                        $isAmbulant = $klinikreha->getIsAmbulant();
                                break;
                        }
                }
                if ($isAmbulant && $isStationaer)
                        break;
        }
        $this->templateVariableContainer->add($as, array('isAmbulant'=>$isAmbulant, 'isStationaer'=>$isStationaer));
        return $this->renderChildren();
}

2 个答案:

答案 0 :(得分:1)

  

这是否意味着结束标记区分大小写,开放标记不是?

由于我希望答案100%完成,我想在此处添加解释。原因是两部分:一,PHP类名称不区分大小写(尽管类加载器可能不是,取决于文件系统等) - 以及两个,Fluid本身跟踪分配给ViewHelpers的类名打开节点,它与结束节点的已解析类名相匹配。

那么当根据大小写错误地命名空间声明或ViewHelper引用时会发生什么:

  • 当标签自动关闭时,会询问PHP是否存在已解析的类名,并且如果PHP能够加载该类,则会使用它。如果先前在同一请求中成功加载了类,或者您的类加载器和文件系统组合允许使用不区分大小写的路径加载类文件,则会发生这种情况。
  • 但是,当标签不是自动关闭时,Fluid会保留使用类名创建的ViewHelperNode(即使类名在技术上不正确,在给定上述条件的情况下也可能成功)并且检测到关闭节点时与开放节点位于同一层级,Fluid将再次尝试解析ViewHelper类名,然后将该1:1与开放节点的类名进行比较。这意味着Fluid可能会判断你的类名是不正确的,即使PHP在技术上能够加载类(因为类加载和区分大小写的完美风暴,或者因为它之前加载了正确的类名,然后重用,因为{ {1}}对已加载的类不区分大小写。)

因此,结合上面的触发器,您可以看到使用结束标记确实意味着与使用内联表示法或自闭项标记相比,Fluid的行为有所不同,您可以看到PHP类加载与Fluid行为结合在某些边缘情况下的结果在这种类型的错误发生。

答案 1 :(得分:0)

最后,我发现了这个问题:这是命名空间的低/低错误拼写:

错误:{namespace h=Tx_hplusinfo_ViewHelpers}

右:{namespace h=Tx_Hplusinfo_ViewHelpers}(资本 h

奇怪的是,这个拼写错误不是开场标签或任何内联浏览器的问题,例如。

{h:myFormatter(inp:{xy})}

这是否意味着结束标记区分大小写,开放标记不是?