2016-08-11 2 views
1

Silverstripe subsite module을 사용합니다. Subsite이 삭제되면 Domains, Settings 등과 같이 Subsite와 관련된 다른 모든 정보도 삭제하고 싶습니다. Subsite 모델을 확장 할 extension을 만들었습니다.SilverStripe Subsite 모듈은 서브 사이트 삭제 관련 데이터를 모두 삭제합니다

<?php 

class SubsiteExtension extends DataExtension { 

     public function onAfterWrite(){ 
      parent::onAfterWrite(); 
      //Some codes here 
     } 

     public function onBeforeDelete(){ 
      //Check if member exist for Subsite, if so show warning. 
     } 

     public function onAfterDelete(){ 
      $id = $this->owner->ID; 

      //DELETE ALL SUBDOMAINS RELATED TO DELETED SUBSITE 
      DB::query("DELETE FROM SubsiteDomain WHERE SubsiteID='".$id."'"); 

      //DELETE SITE CONFIG 
      DB::query("DELETE FROM SiteConfig WHERE SubsiteID='".$id."'"); 

     } 


} 

문제

  1. 코드는 완벽하게 작동합니다. 궁금해하는 다른 테이블에서 관련 레코드를 삭제하는 다른 좋은 방법이 있습니까 ??
  2. onBeforeDelete 메서드에서 "모든 구성원을 삭제하지 않으면이 하위 사이트를 삭제할 수 없습니다"라는 사용자 지정 메시지를 표시하는 방법은 무엇입니까?
+0

나는 이런 식으로 사고를하거나 나중에 (예 :보고 할 때) 데이터를 필요로하므로이 접근법을 제안 할 것입니다 ... https : // github. co.kr/lekoala/silverstripe-softdelete – Barry

답변

3

onAfterDelete을 사용하여 관련 레코드를 삭제하면 실제로 불필요한 작업을하는 것처럼 들리지만 실제로는 문제가되지 않습니다. 누가 어떤 길잃은 DB 항목에 의해 귀찮게 될거야?

귀하의 onBeforeDelete 접근법에 관해서는 : 나는 그렇지 않으면 해결할 것입니다. 이것은 CMS에서 기록의 삭제를 방지 할 수

public function canDelete($member) 
{ 
    if(/* check if member exist for Subsite */){ 
     return false; 
    } 
    // returning null here means that this extension doesn't influence 
    // the delete permission at this point 
    return null; 
} 

: 대신 같은 것을 확장에 canDelete를 재정의합니다. 또한 updateCMSFields을 사용하여 사용자가 레코드를 삭제할 수없는 이유에 대한 알림을 표시 할 수 있습니다.

public function updateCMSFields(FieldList $fields) 
{ 
    if (!$this->owner->canDelete()) { 
     $fields->addFieldToTab(
      'Root.Main', 
      LiteralField::create('_deleteInfo', 'Your info text') 
     ); 
    } 
}