1

我写了一个viewhelper renderChildren()...我收到了这个错误,这对我来说毫无意义: 模板标签没有正确嵌套。预期: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();
}
4

2 回答 2

1

这是否意味着结束标签区分大小写,而开始标签不区分大小写?

因为我喜欢 100% 完整的答案,所以我想在这里添加解释。原因有两部分:第一,PHP 类名不区分大小写(尽管类加载器可能不区分大小写,具体取决于文件系统等) - 第二,Fluid 本身跟踪分配给 ViewHelpers打开节点的类名它匹配关闭节点的解析类名。

因此,当命名空间声明或 ViewHelper 引用的大小写错误时会发生什么:

  • 当标签自动关闭时,会询问 PHP 解析的类名是否存在,如果 PHP 能够加载该类,则会使用它。如果之前在同一个请求中成功加载了类,或者如果您的类加载器和文件系统组合允许加载不区分大小写的路径的类文件,则会发生这种情况。
  • However, when a tag is not self closing, Fluid keeps the ViewHelperNode that was created with the class name (which may have succeeded even though the class name is technically incorrect, given the conditions above) and when detecting the closing node that sits on the same hierarchy level as the opening node, Fluid will attempt to resolve the ViewHelper class name once more and then compare that 1:1 to the opening node's class name. That means Fluid may judge your class names to be incorrect even if PHP is technically able to load the class (because of the perfect storm of class loading and case sensitivity or because it was previously loaded with a correctly cased class name and then reused because class_exists is case insensitive on already loaded classes).

所以结合上面的触发器,你可以看到使用结束标签确实意味着 Fluid 与使用内联符号或自结束标签相比表现不同,你可以看到 PHP 类加载与 Fluid 行为相结合在某些边缘情况下会导致这种类型发生的错误。

于 2016-09-03T00:25:27.663 回答
0

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

错误的:{namespace h=Tx_hplusinfo_ViewHelpers}

右:({namespace h=Tx_Hplusinfo_ViewHelpers}大写h

奇怪的是,这种拼写错误对于开始标签或任何内联视图助手来说都不是问题,例如

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

这是否意味着结束标签区分大小写,而开始标签不区分大小写?

于 2013-04-01T21:40:17.590 回答