当前位置: 首页 > 知识库问答 >
问题:

在前端显示、编辑和更新隐藏记录(类型3)

斜淳
2023-03-14

我正在建立一个扩展(分类广告)。前端用户可以选择将其广告设置为隐藏,或者广告在一段时间后(广告过期)获得隐藏状态。我面临两个问题:

  1. 如果我试图在show Action()调用它,那么TYPO3会返回一个错误,说没有找到对象,这是有意义的,因为有限制。
  2. 在list操作中,show操作的URL不会呈现,因为persistedAliasMapper方面发送了包含相同限制的请求。

如何解决这些问题,以便用户可以编辑他的广告?

环境:

  • 打字3:10
  • 模式:作曲家
  • PHP:7.4

共有1个答案

孙乐逸
2023-03-14

首先,我们必须删除该限制,以便可以呈现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并向服务器发送请求以检索对象。这就是错误的来源。由于对象设置为隐藏,默认限制搜索UIDhidden=0deleted=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 来得到一个空白显示的记录。 请看记录左侧的选择框。它会由指示当前记录的图形符号 变为指示你正在编辑该记录的图形符号 。 若要保