2016-06-07 142 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