Комментарии

Применение AJAX в Joomla
( 0 Голосов )

Как упоминалось ранее, JavaScript применяется также для обработки асинхронных запросов к серверу. Преимущество таких запросов заключается в том, что они могут быть выполнены в фоновом режиме и не требуют обновления всей страницы. Сценарий JavaScript выполняется в браузере непрерывно и поэтому способен управлять всем процессом.

Подобная технология называется AJAX и применяется, например, при установке Joomla. Подробное описание процесса создания AJAX-ориентированных приложений выходит за рамки этой книги, и поэтому здесь нет места для детального анализа кода JavaScript. В связи с этим применение AJAX в Joomla будет рассмотрено лишь в самых общих чертах, но с акцентом на взаимодействие кода JavaScript и РНР.

Программы установки Joomla представляют собой отдельное приложение, находящееся в специально выделенной для него папке. Такие программы обычно выполняются один раз для установки экземпляра Joomla, а затем вся установочная папка удаляется из соображений безопасности.

Точкой входа в установку нового экземпляра Joomla служит файл installation/index.php, который, в свою очередь, запускает на выполнение файл installation/controller.php. В этом файле сначала загружаются требующиеся классы платформы и переменные окружения, указывающие пути к файлам, а затем устанавливается исходное представление для выбора языка (первый экран, появляющийся при установке Joomla). Для этой цели выполняется представление типа JInstallationViewLanguage из файла installation/views/language/view.html.php, а также компоновка installation/views/language/tmp/default.php. Шаблон для установки находится в файле installation/template/index.php. В файле шаблона index.php имеется следующий код для загрузки требующихся файлов JavaScript:

// загрузить поведения JavaScript
JHtml::_('behavior.framework', true);
JHtml::_('behavior.keepalive');
JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
JHtml::_('script', 'installation/template/js/installation.js', true);
?>

В последней строке приведенного выше кода загружается файл installation.js, используемый для управления всем процессом установки. Далее в файле шаблона index. php можно обнаружить приведенный ниже фрагмент кода JavaScript, размещаемый в элементе разметки script.

<script  type="text/javascript">
window.addEvent('domready', function() {
window.Install = new  Installation('rightpad', <?php echo JURI::current () ; ?>');
Locale.define('<?php echo JFactory::getLanguage()->getTag (); ?>', 'installation', {
sampleDataLoaded: '<?php  echo  JText::_('INSTL_SITE_SAMPLE_LOADED', true); ?>' }) ;
Locale.use('<?php echo  JFactory::getLanguage()->getTag();  ?>'); }); </script>

Сначала в этом фрагменте кода функция JavaScript связывается с событием domready, которое инициируется, как только HTML-документ будет полностью загружен. Затем в этом коде создается новый объект Install типа Installation по сценарию JavaScript из файла installation/template/j s/installation. j s. Этот сценарий берет на себя дальнейшее управление всем процессом установки. В правом верхнем углу экрана представления для выбора языка имеется кнопка Next (Далее), как показано на рис. 12.13. В разметке этой кнопки атрибуту onclick присвоено имя метода Install.submitform(). Этот метод выполняется для объекта Install, создаваемого по сценарию JavaScript при наступлении события domready в связи с загрузкой страницы.

На данном этапе управление процессом установки переходит к объекту Install по сценарию JavaScript из упомянутого выше файла. Вместо загрузки страниц по отдельным запросам, отправляемым из браузера на сервер, объект Install посылает асинхронные запросы на сервер, чтобы обновить имеющиеся на странице данные. Метод s ubmi t f о rm () из объекта Install считывает задачи из элемента разметки form с атрибутом name=" task", используя эти сведения для ввода задачи в запрос. В первый запрос, посылаемый объектом Install, вводится задача task=setup.setlanguage&format=json. Этот запрос посылается после того, как пользователь щелкнет на кнопке Next в правом верхнем углу экрана выбора языка (см. рис. 12.13), но посылается он на сервер асинхронно. Это означает, что сценарий JavaScript продолжает работать в то время, как на сервере выполняется задача по данному запросу.

Этот запрос обрабатывается сервером, как и обычный запрос от браузера, после чего процесс установки возвращается к выполнению обычных программ Joomla на РНР. В данном случае выполняется метод setlanguage () из класса JInstallationControllerSetup, объявляемого в файле installation/controllers/setup, json.php. Следует заметить, что указание формата f ormat=j son в URL по данному запросу приводит к загрузке файла setup. j son. php. В методе setlanguage () получаются некоторые данные из модели, проверяются ошибки, а завершается он следующим фрагментом кода:

// переадресовать  на следующую страницу
$r->view = 'preinstall'; $this->sendResponse($r);

В этом фрагменте кода переменная $г ссылается на поле view объекта типа Jobject, в котором устанавливается имя preinstall следующего представления в процессе установки Joomla. Затем вызывается метод sendResponse (). Именно здесь и начинается самое интересное. В методе sendResponse () проверяются ошибки, а завершается он следующим фрагментом кода:

// отправить запрос в формате JSON
echo json_encode(new JIinstallationJsonResponse($response));
// закрыть приложение
$app = JFactory::getApplication();
$app->close();

В этом фрагменте кода сначала создается новый объект типа JlnstallationJson-Response, а затем он передается обратно браузеру закодированным в формате JSON. В данном случае текст в формате JSON содержит сеансовый маркер, язык, состояние ошибки и данные с именем следующего отображаемого представления аналогично приведенному ниже.

{"token":"c8de8295d8be5a299c66045157ba29df","lang": "en-US","error":false,"data":{"view":"preinstall"}}

После передачи этого текста обратно браузеру приложение закрывается] В обычном цикле запроса на данном этапе можно ожидать отображения в окне браузера некоторого текста в формате JSON. Но в процессе установки Joomla происходит переход на экран предварительной установки. Рассмотрим подробнее, как это происходит.

Для понимания рассматриваемого здесь кода РНР очень важно иметь в виду, что он выполняется под управлением класса Installation (а по существу, объекта Install) из сценария JavaScript. Запрос AJAX посылается с помощью метода post() из класса Request. JSON, входящего в библиотеку MooTools. В этом классе определяется событие onSuccess, инициируемое по завершении обработки данного запроса. В этот момент выполнение сценария JavaScript продолжается с кода обработки события onSuccess, наступающего при успешном завершении данного запроса.

Когда приложение Joomla на РНР закрывается вызовом метода $app->close (), управление передается обратно объекту Install из сценария JavaScript, а точнее, коду обработки события onSuccess, наступающего при успешном завершении данного запроса. Сначала в этом коде считывается символьная строка формата JSON, передаваемая обратно браузеру с помощью метода sendResponse (), а затем получается представление из элемента data в символьной строке формата JSON (в данном случае представление под именем preinstall) и далее вызывается метод goToPage (), которому в качестве аргумента передается имя данного представления. В методе goToPage () выдается новый запрос AJAX на загрузку представления preinstall в процессе установки Joomla. В представлении preinstall определяется кнопка Next для вызова goToPage('license') функции JavaScript. Это приводит к непосредственной загрузке следующего представления под названием license.

При переходе от одного экрана к другому в процессе установки Joomla соблюдается определенный порядок действий. Так, если на экране требуется выполнить задачу, отличающуюся от простого отображения, то происходит следующее.

При выборе кнопки Next вызывается метод submitform () для объекта Install из сценария JavaScript. В этом методе задача считывается из элемента task разметки формы, который обычно скрыт.

Метод submitform () посылает новый запрос AJAX на обработку данной задачи. По завершении ее обработки в программе на РНР из последней передается символьная строка в формате JSON обратно браузеру, а затем приложение Joomla на РНР закрывается.

Инициируется событие onSuccess, и объект Install переходит к коду обработки этого события. В данном случае имя следующего представления считывается из символьной строки формата JSON, после чего данное представление загружается по следующему запросу AJAX.

Если же на экране требуется только загрузить следующее представление без дополнительной обработки, то происходит следующее.

  • При выборе кнопки Next вызывается метод goToPage () для объекта Install из сценария JavaScript, чтобы перейти к следующему представлению.
  • В методе goToPage () формируется новый запрос AJAX на загрузку следующего представления.

Процесс установки Joomla продолжается описанным выше образом до тех пор, пока установка не завершится или пользователь не прервет сам процесс. Весь этот процесс требует загрузки лишь двух полных страниц. Первая страница загружается с первоначальным представлением для выбора языка. А вторая загружается после того, как пользователь удалит установочную папку и перейдет к административной или пользовательской части вновь установленного веб-сайта.

Как видите, этот процесс соответствует обычному шаблону MVC (Модель-Контроллер-Представление) в Joomla, где один цикл запроса может служить доя выполнения задачи, а другой — для отображения компоновки. Но его отличие заключается в том, что запросы делаются асинхронно, а в оперативной памяти все время находится один и тот же сценарий JavaScript, управляющий данным процессом.


Понравился материал? Пригодилась информация? Плюсани в социалки!


 
Похожие новости
Добавить комментарий


Защитный код