2

我想为创建表单构建一个预览页面。我在输入时将记录的“已删除”属性设置为“1”,previewAction因为在 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);
}

有任何想法吗?

4

4 回答 4

5

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',
    ),
),
于 2016-06-12T19:56:10.397 回答
0

感谢所有提示。

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

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

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

如果有人有床上用品的想法,请随时分享:-)

于 2016-06-13T12:07:21.170 回答
0

你的findDeletedByUid($uid)功能引起了我的注意。如果它不是自定义函数,是否应该使用类似findByDeleted(TRUE)或与orfindByDeleted(1)结合使用的东西?您可以在Extbase 手册参考存储库 __call() 函数 API部分中找到讨论。->getFirst()->findByUid()

于 2016-06-08T19:53:12.810 回答
0

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

于 2016-06-08T16:07:25.037 回答