webtechnick / draft
CakePHP Draft 插件
Requires
- php: >=5.3.0
- composer/installers: *
This package is not auto-updated.
Last update: 2024-09-24 02:57:45 UTC
README
- 作者: Nick Baker
- 版本: 1.0
- 许可: MIT
- 网站: http://www.webtechnick.com
特性
CakePHP 插件,用于自动保存任何模型的草稿,允许在身份验证超时或断电的情况下恢复持久化进度。
要求
CakePHP 2.x jQuery(如果您想使用助手中的自动草稿和保存草稿按钮)
变更日志
- 1.0 初始版本
- 0.1 项目开始
安装
将仓库克隆到您的 app/Plugin/Draft
目录
$ git clone git://github.com/webtechnick/CakePHP-Draft-Plugin.git app/Plugin/Draft
将模式运行到您的数据库中
$ cake schema create --plugin Draft
设置
在您的 bootstrap.php 中加载插件。更新您的 app/Config/bootstrap.php
文件
CakePlugin::load('Draft');
描述
草稿是一种将当前生产记录的“未来”状态公开给多人查看和编辑的方法,而无需实际保存到表中。理念是用户永远不会失去他们在表单中创建的工作,并且能够从上次离开的地方继续工作。草稿还具有在身份验证超时以及任何其他表单完成中断的情况下持久化的额外好处。
您可以将草稿视为 Google Doc,其中任何记录在任何时候只有一个“草稿”状态,用户会被追踪为谁最近对草稿进行了更改。任何有权编辑记录的人都可以访问覆盖/更新草稿状态。
您还可以为尚不存在的记录(新记录)创建草稿。因此,您可以为新内容创建草稿状态,并将其与您的用户关联(AuthComponent::user('id') 或 $Model->getUserId() 定义)。您可以从草稿状态中找到并继续编辑任何新内容,点击保存将在模型成功保存后删除草稿。
该插件提供了一些功能以及用于自动保存为草稿的助手(需要 jQuery)。
用法
将 Draftable 行为附加到任何您希望允许草稿的模型。
public $actsAs = array('Draft.Draftable');
保存草稿
在行为中有三种保存当前记录草稿版本的方法。所有这些都不会更新实际记录,而是为稍后恢复/编辑创建记录的草稿。
$data = array(
'Model' => array(
'field1' => 'value',
)
);
//saves the data as a draft
$this->Model->save($data, array('draft' => true));
$data = array(
'Model' => array(
'draft' => true, //magic key!
'field1' => 'value',
)
);
//will save as draft because 'draft' is set to true in $data['Model']
$this->Model->save($data);
$this->Model->data = array(
'Model' => array(
'field1' => 'value',
)
);
//will save any data in $Model->data as draft.
$this->Model->saveDraft();
查找草稿
恢复草稿记录并将其与您的实际记录合并以继续编辑(保持原始记录不变)
首先查找数据,使用模型查找,但也查找此记录的草稿。然后合并数据,其中 'Model' 键将是草稿版本。将创建一个新的键 ModelOriginal
,其中包含原始记录。
$data = $this->Model->find('first', array(
'draft' => true
));
$this->request->data = $this->Model->mergeDraft($data);
另一种选择是使用 contain,其余相同。
$this->Model->bindDraft();
$data = $this->Model->find('first', array(
'contain' => array('Draft')
));
$this->request->data = $this->Model->mergeDraft($data);
您还可以使用自定义的 findDraft 方法来自动合并
$this->request->data = $this->Model->findDraft(array(
'conditions' => array(
'Model.id' => 1,
//your other conditions
),
'contain' => array(
//your contains
)
));
返回(和合并)的数据将包括您包含的任何 contains 以及草稿。如果有活动草稿,草稿更改将合并到模型中,并将创建一个新的键 ModelOringial
以供您参考和方便在草稿和原始记录之间切换(草稿是默认可编辑的)。
具有活动草稿的模型。
$data = array(
'Model' => array(
'field' => 'value',
'field2' => 'value',
'is_draft' => true,
),
'Draft' => array(
'id' => 'long-string-id',
'user_id' => 1,
//...
),
'ModelOriginal' => array(
'field' => 'original_value',
'field2 => 'original_value',
)
);
没有活动草稿的模型。
$data = array(
'Model' => array(
'field' => 'value',
'field2' => 'value',
),
'Draft' => array(
'id' => null,
'user_id' => null,
//...
),
);
按用户查找草稿
您还可以保存尚未实际创建的记录的草稿。草稿自动跟踪到用户,要使用此功能,您需要使用 AuthComponent::user('id')
或定义 $Model->getUserId()
注意:您可以在 AppModel 中定义 getUserId()
。
public function getUserId() {
//your custom method to get the user_id string or int.
}
否则将使用 AuthComponent::user('id');
。
一旦您可以追踪用户,您就可以检索与它们无关的草稿(未保存的新记录)。
$this->request->data = $this->Model->findDraftByUser(); //Find draft by logged in user
$this->request->data = $this->Model->findDraftByUser(1); //Find draft by user_id of 1
删除草稿
$this->Model->deleteDraft(); //will delete any draft data saved to $Model->id;
$this->Model->deleteDraft(1); //will delete any draft data saved to this model with the model's id of 1;
示例设置
控制器更改
更新您的控制器以查找和合并与请求数据相关的草稿。
$this->request->data = $this->Model->findDraft(array(
'conditions' => array('Model.id' => $id),
));
编辑函数的完整示例。
//Example Edit finding and restoring draft data
function edit($id = null) {
if (!empty($this->request->data)) {
if ($this->Model->saveAll($this->request->data)) {
$this->Session->setFlash('Success!');
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash('Failures');
}
}
//Altered!
if ($id && empty($this->request->data)) {
$this->request->data = $this->Model->findDraft(array(
'conditions' => array('Model.id' => $id),
'contain' => array('Association')
));
}
}
如果您打算允许未保存内容(新记录)的草稿,则还需要修改您的添加函数。
if ($data = $this->Model->findDraftByUser()) {
$this->request->data = $data;
}
添加函数的完整示例。
//Example Add Pulling up Draft data from unsaved records.
function add() {
if (!empty($this->request->data)) {
if ($this->Model->save($this->request->data)) {
$this->Session->setFlash(__('The Model has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The Model could not be saved. Please, try again.'));
}
}
//Altered!
if ($data = $this->Model->findDraftByUser()) {
$this->request->data = $data;
}
}
视图更改
保存草稿按钮
您需要添加“保存草稿”按钮。此功能需要您有草稿功能的模型名称以及您希望草稿的表单的 HTML ID。
如果您有一个这样的表单
<?php echo $this->Form->create('Model', array('id' => 'ModelForm')); ?>
您的草稿按钮将是这样的
<?php echo $this->Draft->button('Save Draft', array('model' => 'Model', 'form_id' => 'ModelForm')); ?>
此功能使用 jQuery 通过 Ajax 将草稿保存操作附加并执行到自定义草稿控制器(推荐设置)。如果您不想使用自动脚本并且希望自行处理草稿保存,您可以在选项中添加 'script' => false
来关闭自动脚本。
<?php echo $this->Draft->button('Save Draft', array('model' => 'Model', 'script' => false)); ?>
将任何附加选项放入选项数组中。
<?php echo $this->Draft->button('Save Draft', array('class' => 'btn btn-large', 'escape' => false, 'model' => 'Model')); ?>
丢弃按钮
您还需要“丢弃草稿”按钮。当您正在编辑草稿时,您还希望添加丢弃草稿按钮,以便用户可以删除草稿并重新开始。
<?php echo $this->Draft->discard('Discard Draft', array('model' => 'Content', 'model_id' => $this->Form->value('Model.id'))); ?>
您可以将任何链接选项传递给选项,它将保留。
<?php echo $this->Draft->discard('Discard Draft', array('class' => 'btn btn-large btn-danger', 'model' => 'Content', 'model_id' => $this->Form->value('Model.id'))); ?>
提示:仅当您正在积极编辑草稿时显示丢弃按钮。通过检查数据中的 is_draft
字段来实现。
<?php if (isset($this->request->data['Model']['is_draft'])): ?>
<?php echo $this->Draft->discard('Discard Draft', array('model' => 'Model', 'model_id' => $this->Form->value('Model.id'))); ?>
<?php endif; ?>
自动草稿功能
您可以设置自动计时器以在特定间隔(默认为每 60 秒)保存草稿。同样,像保存草稿功能一样 -- 此功能需要 jQuery 来工作。
<?php echo $this->Draft->autoDraft(60, array('model' => 'Model', 'form_id' => 'ModelForm')); ?>
基本管理员
您可以使用内置的管理系统查看和搜索所有打开的草稿。
导航到 http://example.com/admin/draft/drafts
查看您保存的所有草稿。