2016-06-07 146 views
2

我想建立一个创建表单的预览页面。在previewAction中,我将记录的“已删除”属性设置为“1”,因为在BE中,列表模块用于批准插入的记录 - 因此如果记录永远不会最终保存,则无论如何它都会被删除。删除记录的Extbase属性映射

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

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

当然是因为它被删除了。 Repository中用于忽略已删除的设置在这里没有采取措施。

是的,我可以通过手动填写了一切绕过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); 
} 

任何想法?

回答

3

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', 
    ), 
), 
+0

这不起作用,因为动作参数previewAction(MyModel $ newModel)由属性映射器映射。属性映射器不使用存储库(我认为是这样)。 –

+0

这实际上是一个非常好的主意 - 模型将用表单数据更新?那么这将是最好的方式。 –

+0

然后,您应该能够更新存储库中的对象,是的。如果你想设置记录是否被删除,你还需要一个布尔属性,getter和setter在你的域模型中。再次更新我的答案。 – j4k3

0

而不是做任何魔法与删除的,你应该使用隐藏域,让编辑预览的文件。 您可以告诉您的查询在存储库中包含隐藏的记录。

+0

基本上你是正确的共享,但它不是行为我想有,该记录被删除 - 所以他们是一种暂时的。好吧,无论我认为这些都是不好的 - 所以我决定使用一个自定义标志“保存”来知道该记录是否被批准并最终保存,或者该过程是否完成。在后端,我现在告诉管理员要照顾这个标志或bedder写一个后端模块来处理这个过程 - 然后它的干净。 –

+0

属性映射器忽略存储库设置 - 所以隐藏的对象也将被找到 - 所以使用隐藏的字段具有相同的效果。我错了吗? –

0

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

+0

其自定义函数 –

0

感谢您的所有提示。

我想这取决于以无旁路extbase属性映射神奇的答案其不可能的。所以我认为一般来说这样做并不是一个好主意。

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

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

如果任何人有一个想法bedder随意:-)

+0

我们做到了。您不需要为此功能提供单独的标志。只需确定是否希望对象保留在后端,并根据该对象使用已删除或隐藏的对象。然后相应地修改你的仓库。 – j4k3