【问题标题】:Extbase property mapping for deleted record已删除记录的 Extbase 属性映射
【发布时间】:2016-06-07 06:44:56
【问题描述】:

我想为创建表单构建一个预览页面。我在previewAction 中将记录的“已删除”属性设置为“1”,因为在 BE 中,列表模块用于批准插入的记录 - 因此,如果该记录从未最终保存,则无论如何都将其删除。

问题:我可以创建记录 (deleted=1) - 我可以跳回表单(没有返回历史记录,因为我必须保留创建的对象)。但是如果我再次提交,属性映射会告诉我

未找到标识为“3”的 MyModel 类型的对象。

当然那是因为它被删除了。存储库中忽略已删除的设置未在此处执行。

是的,我可以通过手动填充所有内容来绕过 Extbase 魔法,但这不是我想要的。

这是了解我正在尝试什么的操作

 /**
 * action preview
 *
 * @param MyModel
 * @return void
 */
public function previewAction(MyModel $newModel)
{
    //check if model was already saved
    $uid = $this->request->hasArgument('uid') ? this->request->getArgument('uid') : 0;
    if($uid){
        $newModel = $this->myRepository->findDeletedByUid($uid);
        $this->myRepository->update($newModel);
    }
    else{
        $newModel->setDeleted(true);
        $this->myRepository->add($newModel);
    }

    $this->view->assign('ad', $newModel);
    $this->persistenceManager->persistAll();

    $uid = $this->persistenceManager->getIdentifierByObject($newModel);
    $this->view->assign('uid', $uid);
}

有什么想法吗?

【问题讨论】:

    标签: typo3 extbase typo3-7.6.x


    【解决方案1】:

    Extbase 默认查询设置禁止删除对象。

    由于您已经在存储库中声明了自定义查询 findDeletedByUid(),您只需将其设置为包含已删除的记录。然而,重要的是,如果您想使用对象调用控制器动作,则必须在调用动作之前检索它。为此使用初始化操作。初始化将在操作之前自动调用。

    如果您想设置对象是否被删除,您还需要在域模型中定义一个属性、getter 和 setter,并在 tca 中定义一个适当的定义,以使数据映射器能够访问该列。

    在存储库中:

    public function findDeletedByUid($uid) {
        $query = $this->createQuery();
        $query->getQuerySettings()->setIncludeDeleted(true);
        $query->matching(
            $query->equals('uid',$uid)
        );
        return $query->execute();
    }
    

    在你的控制器类中:

    /**
     * initialize action previewAction
     * Overrides the default initializeAction with one that can retrieve deleted objects
     */
    public function initializePreviewAction(){
        if( $this->request->hasArgument('mymodel') ){
          $uid = $this->request->getArgument('mymodel');
          if( $mymodel = $this->mymodelRepository->findDeletedByUid($uid) ){
              $this->request->setArgument($mymodel);
          } else {
              // handle non retrievable object here
          }
        } else {
          // handle missing argument here
        }
    }
    

    在您的领域模型中:

    ...
    /**
     * @var bool
     */
    protected $deleted;
    
    /**
     * @return bool
     */
    public function getDeleted() {
        return $this->deleted;
    }
    
    /**
     * @param bool $deleted
     */
    public function setDeleted($deleted) {
        $this->deleted = $deleted;
    }
    

    在你的 tca.php 中

    ...
    'deleted' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.deleted',
        'config' => array(
            'type' => 'check',
        ),
    ),
    

    【讨论】:

    • 这不起作用,因为动作参数 previewAction(MyModel $newModel) 是由属性映射器映射的。属性映射器不使用存储库(我认为是这样)。
    • 这实际上是一个非常好的主意 - 模型将使用表单数据进行更新?那么这将是最好的方法。
    • 您应该能够更新存储库中的对象,是的。如果你想设置记录是否被删除,你还需要一个布尔属性,你的领域模型中的 getter 和 setter。再次更新我的答案。
    • 谢谢!我现在不会在这个项目中更改我的实现,但这是我问题的答案。
    • 为隐藏记录的属性映射点赞!
    【解决方案2】:

    您应该使用隐藏字段来允许编辑者预览文档,而不是对已删除进行任何魔术。 您可以告诉您的查询在存储库中包含隐藏的记录。

    【讨论】:

    • 基本上你是对的,但它不是我想要的行为,记录被删除 - 所以它们是暂时的。好吧,不管我认为这一切都是什么 - 所以我决定使用自定义标志“已保存”来了解记录是否已被批准并最终保存,或者该过程是否从未完成。在后端,我现在必须告诉管理员照顾这个标志或床上用品编写一个后端模块来处理这个过程 - 然后它就干净了。
    • 属性映射器忽略存储库设置 - 因此也找不到隐藏对象 - 因此使用隐藏文件具有相同的效果。我错了吗?
    【解决方案3】:

    你的findDeletedByUid($uid) 函数引起了我的注意。如果它不是自定义函数,是否应该将findByDeleted(TRUE)findByDeleted(1)->getFirst()->findByUid() 结合使用?您可以在Extbase manual referenceRepository __call() function API 部分找到讨论。

    【讨论】:

    • 它是一个自定义函数
    【解决方案4】:

    感谢所有提示。

    我认为根据答案,如果不绕过 extbase 属性映射魔法,这是不可能的。所以我认为一般来说这样做不是一个好主意。

    所以我现在将我自己的标志“存储”到模型中。

    在 BE List-Module 中,未“存储”的对象仍然可见,但使用自己的 BE 模块或通过 cron-job 删除未“存储”的对象应该可以完成这项工作。

    如果有人有床头柜的想法,请随时分享:-)

    【讨论】:

    • 我们做到了。此功能不需要单独的标志。只需确定您是否希望对象保留在后端,并基于此使用已删除或隐藏。然后相应地修改您的存储库。
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2015-09-01
    相关资源
    最近更新 更多