Подытожим сегодня подключение fck и кое-что еще.
Итак. Задача - подключить fckeditor. Первый шаг, традиционно, - погуглить :) Полушутка. А подключать будем с помощью jquery, для чего скачаем актуальные:
- fckeditor;
- jquery;
- плагин для jquery
и подключим это всё дело. Но сначала надо создать форму для добавления статьи (фцк юзаю там и в новостях) с textarea
, на который, собственно, и будет вешаться фцк. А вешаться он будет следующим образом:function loadFck(e)
{
$('#'+e).fck({path: baseUrl+'/js/fckeditor/'});
}
Эта функция лежит в файле admin.js
(о чем ниже; так же, как и о baseUrl
), и ее надо будет вызвать в нужном месте. На вход приходит id текстэйрии (textarea), к которому будет приаттачен фцк.
Вот, собственно, и всё. Большинство примеров на этом и заканчиваются. Но всё же надо поподробней. Начать хотя бы с того, что мы юзаем jquery. И юзаем его хитро. With a little help from my friend (с) у меня есть замечательный вью хелпер jquery
, который неплохо бы подключить. Иничу я его так:protected function _initJquery()
{
$view = $this->getResource('view');
$view->jquery();
}
Но этого было недостаточно - нужно указать путь к вью хелперам. Поэтому также в буцтрапе я иничу и вью:protected function _initView()
{
if ($this->hasResource('view'))
$view = $this->getResource('view');
else
$view = new Zend_View();
$view->getHelper('BaseUrl')->setBaseUrl($this->getOption('baseurl'));
$view->setEncoding('UTF-8');
$view->addHelperPath('../application/views/helpers', 'Common_View_Helper');
return $view;
}
Интересно, что просто получить ресурс view
я не смог. Без проверки выдает ошибку. Поэтому на всякий случай проверка (рожденная коллективным разумом).
Итак, указали путь к плагину и - внимание - задали baseUrl
. Я наивно полагал, что он (бейзурл) определится сам. Но пришлось задать. $this->getOption('baseurl')
предательски получает переменную конфига ("логично", правда?). В конфиге у меня первой строчкой добавилось baseurl = "http://localhost/мой_проект/public"
. При этом при попытке написать имя переменной верблюжьимОбразом сей опшен был нулл. Что тоже "логично", правда?
А сей бейзурл мы указали для того, чтобы грузить джаваскрипты и цссы. Пока последних нету, так чтоprotected function _initHeadScript()
{
$view = $this->getResource('view');
$view->headScript()->prependScript('var baseUrl = "'.$view->baseUrl().'";')
->prependFile($view->baseUrl().'/js/jquery.js');
}
С помощью prependScript()
прописываем наш бейзурл для использования в наших джаваскриптовых манипуляциях. (Все эти _init*
- в буцтрапе.)
Теперь идем в Admin_ArticleController
:public function init()
{
$this->_model = new Admin_Model_Article();
if(in_array($this->getRequest()->getActionName(), array('add', 'edit'))) // loading fck only if need
{
$this->view->headScript()->appendFile($this->view->baseUrl().'/js/fckeditor/fckeditor.js')
->appendFile($this->view->baseUrl().'/js/jquery.FCKEditor.pack.js');
}
}
Ну тут вроде понятно - комментарий решает. Добавлю только, что второй файл - это плагин для jquery, а модель - приватнная переменная для использования при операциях с БД. Тут же, в addAction()
(а позже и в edit
) вызываем нашу самую первую функцию:public function addAction()
{
$form = new Admin_Form_Article();
$this->view->form = $form;
$fckText = $form->getElement('text')->getId();
$this->view->jquery("loadFck('{$fckText}')");
}
Интересные пироги приключились при попытке подключить admin.js
, в которой находится loadFck()
только для админского модуля (хотя, писуя сию строку, я подумал, что с нижеследующим можно было бы не заморачиваться, буде у нас файл default.js
). Вспомнил я внезапно про Admin_Bootstrap
- буцтрап модуля. Натурально, следует в нем подгрузить admin.js
с помощью _initHeadScript()
, аналогичной тому, что в дефолтном буцтрапе. Но вот беда: не нашелся хелпер headScript()
. Где-то я с подобным сталкивался, подумал я и вспомнил, как полчаса назад у меня не виделся хелпер baseUrl()
по причине отсутствия _initView()
. И застучали пальцы по клавишам...protected function _initView()
{
$view = $this->getApplication()->getResource('view');
return $view;
}
В этом ините нету ничего лишнего. Я даже выкинул из него setBaseUrl()
. К $this->getApplication()
я пришел опытным путем. Чтобы получить $view
, я создавал инстанс дефолтного бутстрапа и хотел из него что-то взять аж через конфиг... а, точно - я ж устанавливал бейзурл. Но конструктор бутстрапа хотел $application
, и получил $this->getApplication()
. После чего для меня стало очевидно, что создавать инстанс нет смысла, и можно обойтись просто $this->getApplication()
...
20 August, 2009
Мой опыт в создании модульного приложения на Zend Framework: Часть 5
Posted at 00:16
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment