已删除记录的 Extbase 属性 映射
Extbase property mapping for deleted record
我想为创建表单构建一个预览页面。我在 previewAction
中将记录的 "deleted" 属性 设置为“1”,因为在 BE 中,列表模块用于批准插入的记录 - 所以如果记录从未最终保存它无论如何都删除了。
问题:我可以创建记录 (deleted=1
) - 我可以跳回表单(没有历史返回,因为我必须保留创建的对象)。但是如果我再次提交 属性 映射会告诉我
未找到标识为“3”的 MyModel 类型的对象。
当然是因为它被删除了。 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);
}
有什么想法吗?
与其对已删除的内容施展魔法,不如使用隐藏字段让编辑者预览文档。
您可以告诉您的查询在存储库中包含隐藏记录。
您的 findDeletedByUid($uid)
函数引起了我的注意。如果它不是自定义函数,它是否应该将 findByDeleted(TRUE)
或 findByDeleted(1)
与 ->getFirst()
或 ->findByUid()
结合使用?您可以在 Extbase manual reference and the Repository __call() function API 部分找到讨论。
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();
}
在你的控制器中 class:
/**
* 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',
),
),
感谢所有提示。
我认为根据答案,如果不绕过 extbase 属性-mapping 魔术是不可能的。所以我认为一般来说这样做不是一个好主意。
所以我现在将自己的标志 "stored" 放到模型中。
在 BE List-Module 中,not "stored" 对象仍然可见,但使用自己的 BE 模块或通过 cron-job 删除 not "stored" 对象应该可以完成这项工作。
如果有人有更好的想法,请随时分享:-)
我想为创建表单构建一个预览页面。我在 previewAction
中将记录的 "deleted" 属性 设置为“1”,因为在 BE 中,列表模块用于批准插入的记录 - 所以如果记录从未最终保存它无论如何都删除了。
问题:我可以创建记录 (deleted=1
) - 我可以跳回表单(没有历史返回,因为我必须保留创建的对象)。但是如果我再次提交 属性 映射会告诉我
未找到标识为“3”的 MyModel 类型的对象。
当然是因为它被删除了。 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);
}
有什么想法吗?
与其对已删除的内容施展魔法,不如使用隐藏字段让编辑者预览文档。 您可以告诉您的查询在存储库中包含隐藏记录。
您的 findDeletedByUid($uid)
函数引起了我的注意。如果它不是自定义函数,它是否应该将 findByDeleted(TRUE)
或 findByDeleted(1)
与 ->getFirst()
或 ->findByUid()
结合使用?您可以在 Extbase manual reference and the Repository __call() function API 部分找到讨论。
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();
}
在你的控制器中 class:
/**
* 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',
),
),
感谢所有提示。
我认为根据答案,如果不绕过 extbase 属性-mapping 魔术是不可能的。所以我认为一般来说这样做不是一个好主意。
所以我现在将自己的标志 "stored" 放到模型中。
在 BE List-Module 中,not "stored" 对象仍然可见,但使用自己的 BE 模块或通过 cron-job 删除 not "stored" 对象应该可以完成这项工作。
如果有人有更好的想法,请随时分享:-)