为什么在渲染TYPO3 Flow流体模板时抛出重复的变量声明异常?

时间:2014-11-05 18:55:33

标签: typo3 fluid typo3-flow

如何调试此异常?它位于显示最近查看的项目的部分中,该项目位于显示单个项目的页面上。两个部分的模板在for循环中使用相同的变量名称,例如<f:for each="{productArticles}" as="productArticle">,但是当列出最近查看的项目时,并不总是抛出异常(只显示那些项目的链接)。例外情况似乎只发生在: 我在显示礼品卡的页面上,然后我从下拉菜单中选择一张不同的礼品卡(显示不同的礼品卡面额),然后当页面刷新以显示不同的卡片然后我想现在显示的第一张卡片最近浏览过的项目之一。但是,如果我转到另一页然后返回礼品卡页面,则可能不会出现错误。

    Exception while rendering
page<TYPO3.Neos:Page>/
body<TYPO3.TypoScript:Template>/
content/
main<TYPO3.Neos:PrimaryContent>/
default<TYPO3.TypoScript:Matcher>/
element<TYPO3.Neos:ContentCollection>/
itemRenderer<TYPO3.Neos:ContentCase>/
default<TYPO3.TypoScript:Matcher>/
element<TYPO3.Neos.NodeTypes:TwoColumn>/
columns<TYPO3.TypoScript:Collection>/
itemRenderer<TYPO3.Neos.NodeTypes:MultiColumnItem>/
columnContent<TYPO3.Neos:ContentCollection>/
itemRenderer<TYPO3.Neos:ContentCase>/
default<TYPO3.TypoScript:Matcher>/
element<MyCompany.Store:RecentlyViewedProduct>:
Duplicate variable declaration, "productArticle" already set! (20141105131932df2032)

以下是模板:

<f:layout name="Default" />
<f:section name="Title">
    <h3>
        <f:translate id="MyCompany.Store.Recently-Viewed">Recently Viewed</f:translate>
    </h3>
</f:section>
<f:section name="Content">
    <f:if condition="{productArticles}">
        <f:then>
            <f:for each="{productArticles}" as="productArticle">
                <f:link.action action="showProductArticle" controller="Product" arguments="{productArticle: productArticle}">{productArticle.product.name}</f:link.action><br />

            </f:for>
        </f:then>
        <f:else>
            <p>
            <f:translate id="MyCompany.Store.No-Recently-Viewed">No recently viewed product</f:translate>
            </p>
        </f:else>
    </f:if>
</f:section>

和模板的操作:

    /**
     * Shows most recently viewed products
     *
     * @param \MyCompany\Store\Domain\Model\ProductArticle $productArticle
     * @return void
     */
    public function recentlyViewedProductsAction() {
        $recentProduct = $this->cart->getProductArticle();
        $recentProductThree = array_reverse($recentProduct);

        array_splice($recentProductThree, 3);
        if (count($recentProduct) !== 0) {
            $this->view->assign('productArticles', $recentProductThree);
        }
    }

关于重复var的消息对我来说是有意义的,如果异常总是抛出,因为另一个模板也使用它,但因为它只是偶尔抛出,我不知道该怎么做。

异常日志如下所示

  

第116行中未捕获的异常#1224479063   /home/thebigcat/domains/store.thebigcat.ca/public_html/releases/20131219160416/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/TYPO3_Fluid_ViewHelpers_ForViewHelper.php:   重复变量声明,“productArticle”已设置!

     

115   TYPO3 \液\核心\视图助手\ TemplateVariableContainer_Original ::添加( “productArticle”   TYPO3 \流\持久性\原则\ Proxies__CG __ \ MyCompany的\店\域\型号\ ProductArticle)   114   TYPO3 \液\ ViewHelpers \ ForViewHelper_Original :: renderStatic(阵列| 5 |,   闭包,TYPO3 \ Fluid \ Core \ Rendering \ RenderingContext)113 {closure}()   112   TYPO3 \液\核心\视图助手\ AbstractConditionViewHelper :: renderThenChild()   111 TYPO3 \ Fluid \ ViewHelpers \ IfViewHelper_Original :: render(TRUE)110   call_user_func_array(array | 2 |,array | 1 |)109   TYPO3 \ Fluid \ Core \ ViewHelper \ AbstractViewHelper :: callRenderMethod()108   TYPO3 \液\核心\视图助手\ AbstractViewHelper :: initializeArgumentsAndRender()   107   FluidCache_Mycompany_Store_Product_action_recentlyViewedProducts_1f6458e2b69625fca8d5707e4161562d5d061770 :: section_4f9be057f0ea5d2ba72fd2c810e8d7b9aa98b469(TYPO3 \液\核心\渲染\ RenderingContext)   106 TYPO3 \ Fluid \ View \ AbstractTemplateView :: renderSection(“Content”,   数组| 1 |,FALSE)

并且Security_Development.log的底部看起来像这样,上面有许多类似的错误,所以我怀疑它与问题有关:

  

14-11-05 13:48:48 64.39.189.157 INFO Flow
  资源上拒绝访问(0拒绝,0授予,1弃权)   “TYPO3_Neos_Backend_GeneralAccess”。

由于

1 个答案:

答案 0 :(得分:3)

问题是productArticle as用于f:for f:for之前已分配到此模板($this->view->assignMultiple(array( 'message' => 'xxx', 'messages' => $messages, )); 之外)。所以例如在你的行动中你做:

<f:for each="{messages}" as="message">

您无法执行message,因为已经分配了msg。使用类似loopedMessage<f:debug> ..

的内容

您可以在f:之外使用{{1}}来检查您的productArticle是否为NULL。

关于拒绝访问 - 当您向控制器添加新操作时,您必须刷新缓存。