仅在Extbase中按flexform显示单个项目

时间:2014-11-04 09:15:30

标签: typo3 extbase

我创建了一个可以显示益智游戏的小扩展程序。我制作的可切换控制器动作包括list / show(工作正常),admin(也很好)和仅显示。

仅对于show我想从flexform中选择一个数据库条目,然后由单个视图显示。为此,我在flexform中添加了一个新字段:

                <settings.singlePuzzle>
                    <TCEforms>
                        <label>Puzzle to show</label>
                        <config>
                            <type>select</type>
                            <foreign_table>tx_wspuzzle_domain_model_puzzle</foreign_table>
                            <items>
                                <numIndex index="0" type="array">
                                    <numIndex index="0">-- Choose --</numIndex>
                                    <numIndex index="1"></numIndex>
                                </numIndex>
                            </items>
                            <size>1</size>
                            <maxitems>1</maxitems>
                            <minitems>0</minitems>
                        </config>
                    </TCEforms>
                </settings.singlePuzzle>

到目前为止一切顺利,如果我在这里选择一个项目并在列表视图中调试它,它似乎选择了正确的id。

现在我将控制器中的showAction更改为:

/**
 * action show
 *
 * @param \Websafari\Wspuzzle\Domain\Model\Puzzle $puzzle
 * @return void
 */
public function showAction(\Websafari\Wspuzzle\Domain\Model\Puzzle $puzzle = NULL) {
    if(is_null($puzzle)) $puzzle = $this->puzzleRepository->findByUid($this->settings['singlePuzzle']);

    $this->view->assign('puzzle', $puzzle);
}

现在我将操作更改为&#34;仅显示&#34;,为&#34; singlePuzzle&#34;选择一个条目然后(我认为)我应该很高兴,但我得到的只是以下错误:

Required argument "puzzle" is not set.

显然我犯了一个错误,但我没有得到它。

第一:为什么&#34;拼图&#34;还需要吗?这就是为什么我添加&#34; = NULL&#34;该函数(我也尝试将@ignorevalidation $ puzzle添加到评论中)。

第二:为什么没有设定?当我调试&#34; $ this-&gt;设置[&#39; singlePuzzle&#39;];&#34;我得到一个拼图对象的id。

如果有人可以指出我的错误会很好,因为我真的被困在这里。 Thnx很多!

1 个答案:

答案 0 :(得分:1)

问题是类(参数等)的反射信息被缓存在Extbase中。因此,如果您更改定义并且不清除相应的缓存,则仍需要您的参数。

您需要清除TYPO3中的“系统缓存”。有三种方法可以做到:

  • 如果您在development context,则后端会显示按钮(带红色闪烁图标)。
  • 您可以使用options.clearCache.system = 1在生产环境中通过用户TSconfig启用该按钮。
  • 清除系统缓存的按钮位于安装工具的“重要操作”部分。

您也可以手动清除PhpMyAdmin中所有缓存相关的表

TRUNCATE table cf_cache_hash;
TRUNCATE table cf_cache_hash_tags;
TRUNCATE table cf_cache_pages;
TRUNCATE table cf_cache_pagesection;
TRUNCATE table cf_cache_pagesection_tags;
TRUNCATE table cf_cache_pages_tags;
TRUNCATE table cf_cache_rootline;
TRUNCATE table cf_cache_rootline_tags;
TRUNCATE table cf_extbase_object;
TRUNCATE table cf_extbase_object_tags;
TRUNCATE table cf_extbase_reflection;
TRUNCATE table cf_extbase_reflection_tags;
TRUNCATE cf_extbase_typo3dbbackend_queries;
TRUNCATE cf_extbase_typo3dbbackend_queries_tags;
TRUNCATE cf_extbase_typo3dbbackend_tablecolumns;
TRUNCATE cf_extbase_typo3dbbackend_tablecolumns_tags;
TRUNCATE cf_extbase_datamapfactory_datamap;
TRUNCATE cf_extbase_datamapfactory_datamap_tags;

这也会截断查询缓存等。在某些情况下可能会有用。

清除缓存后,它应该可以正常工作。

顺便说一句,为了安全起见,你应该从FlexForm中对UID进行类型转换:

   if(is_null($puzzle)) $puzzle = $this->puzzleRepository->findByUid((int)$this->settings['singlePuzzle']);