20 August, 2009

Мой опыт в создании модульного приложения на Zend Framework: Часть 5

Подытожим сегодня подключение 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()...

No comments: