2009-10-10 50 views
0

我正在构建的网站的一部分需要某种形式的修订系统,因此 决定保持它简单并使用类似于堆栈溢出的一个。修订系统 - 帮助改进我的代码

我很快创建了以下工作,虽然看起来有点杂乱。我知道我可以使用beforeSave和afterSave,但我不知道如何实现它。

我知道我可能会更多地转向模型,但他们是否有任何其他方式来改善它?

修订控制器:

class RevisionsController extends AppController { 
    var $name = "Revisions"; 
    var $helpers = array('Diff'); 

    /** 
    * View a list of existing revisions. 
    * Displays the changes between revisions with the 
    * Diff helper. 
    */ 
    function view($seriesId = null) { 
     if ((!$seriesId && empty($this->data))) { 
      $this->Session->setFlash('That Series does not exist', true, array('class' => 
       'error')); 
      $this->redirect('/'); 
     } 

     $revisions = $this->Revision->find('all', array('conditions' => array('Revision.series_id' => 
      $seriesId), 'order' => 'revision desc', 'contain' => false)); 
     $this->set('revisions', $revisions); 
    } 

    /** 
    * Create a new revision by editing the most recent one. 
    * This seems very messy. 
    */ 
    function edit($seriesId = null) { 
     if ((!$seriesId && empty($this->data))) { 
      $this->Session->setFlash('That Series does not exist', true, array('class' => 
       'error')); 
      $this->redirect('/'); 
     } 

     if (empty($this->data)) { 
      $latest = $this->Revision->find('first', array('conditions' => array('is_latest' => 
       1, 'series_id' => $seriesId))); 
      $this->data['Revision']['description'] = $latest['Revision']['description']; 
     } else { 
      $this->data['Revision']['revision'] = $this->Revision->getNext($seriesId); 
      $this->data['Revision']['series_id'] = $seriesId; 
      $this->Revision->create(); 
      if ($this->Revision->save($this->data)) { 
       $this->Revision->setLatest($this->Revision->id, $seriesId); 

       $this->Session->setFlash('The edit has been saved.', true, array('class' => 
        'success')); 
       $this->redirect(array('controller' => 'series', 'action' => 'view', $seriesId)); 
      } 
     } 

     $this->set('seriesId', $seriesId); 
    } 


    /** 
    * Creates a new revision using data from a previous one. 
    * Currently clones the previous revision rather than 
    * just linking it. May need to be changed. 
    */ 
    function rollback($seriesId = null, $revision = null) { 
     if (!$seriesId || !$revision) { 
      $this->redirect('/'); 
     } 

     $this->data = $this->Revision->find('first', array('conditions' => array('Revision.series_id' => 
      $seriesId, 'Revision.revision' => $revision), 'contain' => false)); 

     $this->data['Revision']['revision'] = $this->Revision->getNext($seriesId); 
     $this->data['Revision']['is_rollback'] = 1; 
     $this->data['Revision']['rollback_rev'] = $revision; 
     unset($this->data['Revision']['id']); 
     $this->Revision->create(); 
     if ($this->Revision->save($this->data)) { 
      $this->Revision->setLatest($this->Revision->id, $seriesId); 

      $this->Session->setFlash('The rollback has been saved.', true, array('class' => 
       'success')); 
      $this->redirect(array('controller' => 'series', 'action' => 'view', $seriesId)); 
     } 
    } 

} 

修订型号:

class Revision extends AppModel { 

    var $name = 'Revision'; 

    var $belongsTo = array('Series' => array('counterCache' => true)); 
    var $actsAs = array('Containable'); 

    function getCurrent($seriesId = null) { 
     if (!$seriesId) 
      return false; 

     $series = $this->Series->find('first', array('conditions' => array('Series.id' => 
      $seriesId), 'contain' => false)); 
     return $series['Series']['revision_count']; 
    } 

    function getNext($seriesId = null) { 
     if (!$seriesId) 
      return false; 

     $revision = $this->getCurrent($seriesId); 
     return $revision + 1; 
    } 

    function setLatest($id, $seriesId = null) { 
     $this->updateAll(array('Revision.is_latest' => 0), array('Revision.series_id' => 
      $seriesId)); 

     $this->id = $id; 
     $this->saveField('is_latest', 1); 
    } 

} 

回答

1

除非这是要适用于所有型号的东西,这将是更适合作为Behavior。将这种修订特定的逻辑移出AppModel并转化为行为就是一种情况。

+0

你说得对,我只是看着野花CMS,它具有可版本化,一个很好的小行为,完全可以做到这一点。 http://wf.klevo.sk/如果其他人想要它。 – DanCake 2009-10-11 15:52:35