Powered by CodeIgniter

Уроки

(28)
14
16 голосов
Учиться, учиться и еще раз учиться — развитие личности идет таким путем.
Черновик Не так давно столкнулся с проблемой: в результате сбоя сервера была потеряна хорошая статья до того, как могла быть опубликована. Чтобы предотвратить подобные случаи, решил реализовать возможность хранить черновик публикации.
В сегодняшнем уроке будет наглядно показано, как добавить необходимый функционал в движок.
Первым делом было решено не создавать новую шестеренку, а усовершенствовать стандартную «Публикации».

Редактор

Используем прекрасный набор иконок fugue, откуда позаимствуем две иконки.

screenshot-2009-10-01-v-15.41.52.png

Первая будет служить для сохранения публикации, вторая — для загрузки.

Скрипты

В скриптах нам потребуется реализовать следующий функционал:
  • Добавление кнопочек в редактор.
  • Сохранение содержимого редактора.
  • Загрузка черновика в редактор.
  • Автоматическое сохранение раз в определенный период (по-умолчанию, раз 30 секунд)
  • Предложение восстановиться из черновика, если по какой-то причине публикация не была сохранена.
Первые четыре задачи поместим в файл "/gears/nodes/js/inline/draft.js".
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 = "Найден черновик. Восстановить?"

Заключение

Собственно, это все. Дистрибутив обновлен.
16:51 ← 01 октября 2009 Отправить в Твиттер adminadmin  RSS comments 12

Комментарии (12) ↓

mobman mobman time 16:59 ← 01 октября 2009 #
Отличный урок!
P.S. не могли бы вы посоветовать литературу по JS, а то у меня огромные пробелы в данных скриптах :(
Автор
admin admin time 17:06 ← 01 октября 2009 #
Я посоветую вам официальную документацию MooTools, а также их страницу с демками. Также можно обратиться к Google за литературой по MooTools и jQuery.
JavaScript следует учиться на примерах.
mobman mobman time 17:07 ← 01 октября 2009 #
Спасибо большое! Будемс изучать :)
inetlover inetlover time 18:20 ← 01 октября 2009 #
JavaScript следует учиться на примерах.

А PHP можно учить по книгам? Я просто читал, читаю их тоже, а в реальности пользуюсь только книгами написанные по MySQL, так как и Cogear основан на CodeIgniter получается и в этом случаи лучше читать документацию по этому фреймовику.
Автор
admin admin time 18:26 ← 01 октября 2009 #
PHP в первую очередь стоит учить по книгам, чтобы знать все возможности. Бывало так — сидишь, пишешь нужную функцию, а она, оказывается, уже есть в PHP. Да, и реализована на порядок умнее.
Мне очень понравилась эта книга.
Если хотите писать хороший код — знанием одно только фреймворка тут не обойдешь. Потому что фреймворк — это рамки, и когда в них рано или поздно упретесь, будет неприятно от осознания собственной неспособности идти дальше.
inetlover inetlover time 18:48 ← 01 октября 2009 #
Спасибо, за совет.
Fr3nzy Fr3nzy time 22:42 ← 01 октября 2009 #
Честно говоря, ни одну книгу по пхп, яве, etc я так и не смог осилить :)
Ну не нравится мне авторский слог.

Все практикой и мануалами обходился.
Автор
admin admin time 02:15 ← 04 октября 2009 #
Почитайте книги Дмитрия Котерова (dklab.ru) — он очень хорошо пишет.
imdogma imdogma time 22:52 ← 01 октября 2009 #
я когда начал изучать пхп, купил книгу, которая оказалась обычным справочником по ф-иям. Тогда думал — вот говно-то. Сейчас цены ей нет :)
imdogma imdogma time 22:55 ← 01 октября 2009 #
Я считаю без знания языка пользоваться фреймворками — неблагодарное дело. По этой причине забросил РоР, ибо было очень тягостно от непонимания, чтоже «под капотом» у него и как изменить при необходимости
inetlover inetlover time 18:21 ← 01 октября 2009 #
Спасибо за урок!
Автор
admin admin time 02:14 ← 04 октября 2009 #
Всегда пожалуйста!