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