【问题标题】:Only show single item by flexform in Extbase仅在 Extbase 中按 flexform 显示单个项目
【发布时间】:2014-12-31 02:54:36
【问题描述】:

我创建了一个可以显示益智游戏的小扩展。我所做的可切换控制器操作包括列表/显示(可以正常工作)、管理员(也可以)和仅显示。

仅用于显示,我想从 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);
}

所以现在我将操作更改为“仅显示”,为“singlePuzzle”选择一个条目,然后(我认为)我应该很好,但我得到的只是以下错误:

Required argument "puzzle" is not set.

显然我犯了一个错误,但我不明白。

第一:为什么仍然需要“拼图”?这就是我在函数中添加“= NULL”的原因(我还尝试在评论中添加@ignorevalidation $puzzle)。

第二:为什么没有设置?当我调试“$this->settings['singlePuzzle'];”时我得到了一个拼图对象的 ID。

如果有人能指出我的错误,那就太好了,因为我真的被困在这里了。非常感谢!

【问题讨论】:

  • 一个临时的解决方案是像这样?tx_wspuzzle_puzzle[puzzle]在url中添加一个空参数。这很好用。我非常感谢 extbase 所做的所有工作,但有时会发生一些非常奇怪的事情。

标签: typo3 extbase


【解决方案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']);

【讨论】:

  • 是的,它有效!非常感谢,我怀疑是缓存问题,但我忘记了系统缓存。也感谢您的广泛解释,我真的很感激。
猜你喜欢
  • 1970-01-01
  • 2016-12-16
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 2016-09-28
  • 2019-12-15
相关资源
最近更新 更多