我正在建立一个扩展(分类广告)。前端用户可以选择将其广告设置为隐藏,或者广告在一段时间后(广告过期)获得隐藏状态。我面临两个问题:
show Action()
上调用它,那么TYPO3会返回一个错误,说没有找到对象,这是有意义的,因为有限制。如何解决这些问题,以便用户可以编辑他的广告?
环境:
首先,我们必须删除该限制,以便可以呈现listAction()
中的URL。这很容易,因为aspect使用了一个函数createQueryBuilder()
,所以这里唯一要做的就是重写该函数并删除隐藏的限制。为此,我们必须扩展PersistedAliasMapper
类。首先我们必须声明类。
您的\u扩展名/ext\u localconf。php
$GLOBALS['TYPO3_CONF_VARS']['SYS']['routing']['aspects']['AdPersistedAliasMapper'] = \Vendor\YourExtension\Routing\AdPersistedAliasMapper::class;
下一步是实际扩展类。我们不会每次都重写这些限制,但是我们在PersistedAliasMapper
参数中增加了一个字段,这样我们就可以在特定的配置中使用它。
your_extension/类/路由/AdPersistedAliasMapper.php
<?php
namespace Vendor\YourExtension\Routing;
use InvalidArgumentException;
use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Database\Query\QueryBuilder;
use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\FrontendGroupRestriction;
use TYPO3\CMS\Core\Database\Query\Restriction\FrontendRestrictionContainer;
use TYPO3\CMS\Core\Routing\Aspect\PersistedAliasMapper;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class AdPersistedAliasMapper extends PersistedAliasMapper
{
/**
* @var bool
*/
protected $ignoreEnablefields;
/**
* @param array $settings
* @throws InvalidArgumentException
*/
public function __construct(array $settings)
{
$ignoreEnablefields = $settings['ignoreEnablefields'] ?? false;
$this->ignoreEnablefields = $ignoreEnablefields;
parent::__construct($settings);
}
protected function createQueryBuilder(): QueryBuilder
{
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
->getQueryBuilderForTable($this->tableName)
->from($this->tableName);
if ($this->ignoreEnablefields) {
$queryBuilder
->getRestrictions()
->removeAll()
->add(GeneralUtility::makeInstance(DeletedRestriction::class));
}
else {
$queryBuilder->setRestrictions(
GeneralUtility::makeInstance(FrontendRestrictionContainer::class, $this->context)
);
}
$queryBuilder->getRestrictions()->removeByType(FrontendGroupRestriction::class);
return $queryBuilder;
}
}
这样做的目的是评估配置中是否定义了字段
。如果是,那么这个ignoreEnablefields
。yaml
$queryBuilder
->getRestrictions()
->removeAll()
->add(GeneralUtility::makeInstance(DeletedRestriction::class));
将删除所有限制并再次添加DeletedRestriction
。如果希望删除而不是隐藏,则可以执行相反的操作。或者,您可以删除所有内容,然后呈现所有对象的URL。
如果未设置ignoreEnablefields
,则类型3将继续正常行为。
您现在可以在config.yaml中使用以下配置:
config/sites/yourdidentifier/config。亚马尔
Ad:
type: Extbase
extension: YourExtension
plugin: Yourextension
routes:
- routePath: '/{ad}'
_controller: 'Ad::show'
_arguments:
ad: ad
aspects:
ad:
type: AdPersistedAliasMapper
tableName: tx_yourextension_domain_model_ad
routeFieldName: path_segment
ignoreEnablefields: true
现在我们必须取消获取对象的限制,并避免出现错误“未找到UID为x的对象”。我的detailAction
如下所示:
/**
* action show
*
* @param Ad $ad
* @return void
*/
public function showAction(Ad $ad): void
{ }
TYPO3通常做的是获取uid并向服务器发送请求以检索对象。这就是错误的来源。由于对象设置为隐藏,默认限制搜索UID
和hidden=0
和deleted=0
。TYPO3找不到任何东西,因此它会断开。但是我们可以通过在对象到达showAction
之前获取对象来避免这种情况。为了做到这一点,我们使用TYPO3默认值initialize
方法前缀。因此,必须在控制器上设置以下各项:
your_extension/类/控制器/AdController.php
protected function initializeShowAction(): void
{
$adUid = $this->request->getArguments()['ad'];
$ad = $this->adRepository->findByUidAndHidden($adUid);
}
这样做的目的是将隐藏对象分配给$ad
变量,因此当调用showAction()
时,$ad
变量已经包含了该操作所期望的参数对象。
现在findByUidAndHidden()
方法不是TYPO3默认函数,所以我们必须创建它。
您的扩展/类/域/存储库/存储库。php
public function findByUidAndHidden($uid)
{
$query = $this->createQuery();
$query->getQuerySettings()->setIgnoreEnableFields(array('hidden'));
$query->matching(
$query->equals('uid', (int)$uid)
);
return $query->execute()[0];
}
这样做的目的是创建一个不考虑隐藏字段的查询。这意味着在发送请求时不会考虑隐藏列。该函数可以使用findbyidentier()
函数代替。[0]
只返回数组响应的第一个条目,因为总是只有一个结果(如果对象确实存在)。
同样的东西,您可以使用编辑或更新功能。
顺致敬意,
主要内容:实例,jQuery hide() 和 show(),实例,实例,实例,jQuery toggle(),实例隐藏、显示、切换,滑动,淡入淡出,以及动画,哇哦! 因为时间是宝贵的,我们提供快捷方便的学习方法。 在小牛知识库,你可以学习需要的知识。 实例 jQuery hide() 简单的jQuery hide()方法演示。 jQuery hide() 另一个hide()实例。演示如何隐藏文本。 jQuery hide() 和 show() 通过 jQuery,您可以使用 hide() 和
问题内容: 您如何在Tkinter中显示和隐藏小部件?我想有一个输入框,但不要一直显示它。有人可以向我展示在tkinter中显示和隐藏条目小部件和其他小部件的功能吗?我希望能够在没有多个帧的情况下执行此操作。 问题答案: 这已经在stackoverflow上得到了回答。简短的答案是,您可以使用grid_remove,如果先前是通过网格添加的,则将导致该小部件被删除。记住小部件的位置,因此只需简单地
我想隐藏的动作条,当一个activity启动,当用户触摸屏幕显示几秒钟,然后再次隐藏。 下面是我想要的,但我想知道是否有更好的方法(忽略一些样式问题:魔术数字、逻辑重复等)。 我用的是ActionBarSherlock。 谢谢
本文向大家介绍jQuery实现根据类型自动显示和隐藏表单,包括了jQuery实现根据类型自动显示和隐藏表单的使用技巧和注意事项,需要的朋友参考一下 jquery实现表单根据单选按钮进行字段的动画切换,昨天写的,感觉比起初学时写的js/jquery有了很大进步。。在最大化扩展性的情况下经可能使代码精简。 html js 以上所述就是本文的全部内容了,希望大家能够喜欢。
默认情况下,当所有窗口在JavaFX中关闭时,应用程序终止。然而,我使用了,让应用程序保留。现在,当应用程序被激活时,我将如何显示该应用程序?当应用程序从Mac Dock Bar激活时,是否有任何事件监听器可供我收听? 或者,当单击系统关闭按钮时,是否有要侦听的事件,以便我可以隐藏stage应用程序将在激活时显示?
网格视图 网格视图是一个类似数据表的视图,将文档和字段显示为行和列。导航栏可让你快速地切换、插入或删除记录。 添加一条记录 请确保你的光标位于表的第一个空白单元格,然后输入所需的数据。如果你要添加新记录到现有的表,只需简单地点击现有的记录并在导航栏点击 或按 CTRL+N 来得到一个空白显示的记录。 请看记录左侧的选择框。它会由指示当前记录的图形符号 变为指示你正在编辑该记录的图形符号 。 若要保