Не так давно столкнулся с проблемой: в результате сбоя сервера была потеряна хорошая статья до того, как могла быть опубликована. Чтобы предотвратить подобные случаи, решил реализовать возможность хранить черновик публикации.В сегодняшнем уроке будет наглядно показано, как добавить необходимый функционал в движок.
Редактор
Используем прекрасный набор иконок fugue, откуда позаимствуем две иконки.
Скрипты
В скриптах нам потребуется реализовать следующий функционал:- Добавление кнопочек в редактор.
- Сохранение содержимого редактора.
- Загрузка черновика в редактор.
- Автоматическое сохранение раз в определенный период (по-умолчанию, раз 30 секунд)
- Предложение восстановиться из черновика, если по какой-то причине публикация не была сохранена.
window.addEvent('domready',function(){
for(name in editor.editors){
var e = editor.editors[name];
e.addButton({keycode:59,title:'ctrl+;',background:'/gears/nodes/img/icon/save_draft.png',action:'save_draft("'+e.el.id+'")',id:'save_draft'})
e.addButton({keycode:39,title:'ctrl+"',background:'/gears/nodes/img/icon/load_draft.png',action:'load_draft("'+e.el.id+'")',id:'load_draft'})
// Save draft every 30 seconds
save_draft.periodical(30000,null,e.el.id);
}
});
function save_draft(id){
var ed = editor.get(id);
var textarea = $(id);
if(textarea.get('value').test(/^\s?$/)) return;
new Request.JSON({
url: '/nodes/draft/save/',
data: 'body='+textarea.get('value'),
onRequest: function(){
loader.inline('save_draft','after');
},
onComplete: function(re){
msg(re.msg,re.success);
loader.inline('save_draft','after',true);
}
}).post();
}
function load_draft(id){
var ed = editor.get(id);
var textarea = $(id);
new Request.JSON({
url: '/nodes/draft/load/',
data: 'body='+textarea.get('value'),
onRequest: function(){
loader.inline('load_draft','after');
},
onComplete: function(re){
if(re.success){
textarea.set('value','');
ed.insert(re.body);
}
msg(re.msg,re.success);
loader.inline('load_draft','after',true);
}
}).post();
} Последний будем загружать отдельно, только если будет найден не аннулированный черновик — "/gears/nodes/js/inline/draft.restore.js".
window.addEvent('domready',function(){
if(confirm(lang.nodes_draft.found)){
load_draft('body');
}
});
Подключим скрипты в самом конце метода createdit контроллера нод.
js('/gears/nodes/js/inline/draft',FALSE,TRUE);
if($body = $this->cache->get('drafts/'.$this->user->get('id'),TRUE)){
js('/gears/nodes/js/inline/draft.restore',FALSE,TRUE);
}
Контроллер
Добавим в контроллер нод функционал, который будет реагировать на ajax-запросы со стороны клиента./**
* Manage draft
*
* @param string action
* @return json
*/
public function draft($action = 'save'){
if(!$this->user->is_logged()) return _403();
d('nodes_draft');
switch($action){
case 'save':
if($body = $this->input->post('body')){
$this->cache->set('drafts/'.$this->user->get('id'),$body);
$msg = t('saved');
$success = TRUE;
}
else {
$msg = t('saved_failure');
$success = FALSE;
}
break;
case 'load':
if($body = $this->cache->get('drafts/'.$this->user->get('id'),TRUE)){
$msg = t('loaded');
$success = TRUE;
}
else {
$msg = t('loaded_failure');
$success = FALSE;
}
break;
}
echo json_encode(array('success'=>$success,'msg'=>$msg,'body'=>$body));
exit();
}
Интернационализация
Добавим в языковой файл нод новый блок.[nodes_draft]
saved = "Черновик сохранен."
saved_failure = "Не удалось сохранить черновик."
loaded = "Черновик загружен."
loaded_failure = "Черновик не найден."
found = "Найден черновик. Восстановить?"


P.S. не могли бы вы посоветовать литературу по JS, а то у меня огромные пробелы в данных скриптах :(
JavaScript следует учиться на примерах.
А PHP можно учить по книгам? Я просто читал, читаю их тоже, а в реальности пользуюсь только книгами написанные по MySQL, так как и Cogear основан на CodeIgniter получается и в этом случаи лучше читать документацию по этому фреймовику.
Мне очень понравилась эта книга.
Если хотите писать хороший код — знанием одно только фреймворка тут не обойдешь. Потому что фреймворк — это рамки, и когда в них рано или поздно упретесь, будет неприятно от осознания собственной неспособности идти дальше.
Ну не нравится мне авторский слог.
Все практикой и мануалами обходился.