AJAX в компонентах Joomla! 2.5

  • Tutorial
Здраствуйте, хабравчане!
Сегодня хотелось поделиться решением, которое я использовал для реализации AJAX при написании компонентов для Joomla! 2.5.
Сразу хотелось бы предупредить гневные выкрики: «иди в гугл! пользуй поиск! это уже было! бойан!». Это решение не лежит на поверхности и, хоть оно и банальное, чтобы найти его, мне пришлось попотеть.

Лирическое отступление


Также сразу предпрежу, что топик написан с позиции «новичка в Joomla».
Задача передо мной встала тривиальная: сдалать AJAX-запрос со страницы, и получить ответ в формате JSON. Я без всяких подозрений забил в поиск и вместо пары минут тыркания застрял в поисках решения на несколько часов. Конечно я не оставил без внимания топик уважаемого propovednik. Но выяснилось сразу что меня данное решение с параметром tmpl=component не устраивает: Ответ приходил в виде полноценной страницы со всеми заголовками, стилями, подключенными в этих заголовках, и, собственно, JSON ответом, который я выводил в view своего компонента, внутри тега body, но, как и было обещано, без менюшек и прочего великолепия дополнительных модулей. Конечно если бы я использовал фрейм на странице и выдавал ответ темже HTML, все прекрасно, но увы. Применять костыли в виде выдергивания текста из тега body полученной страницы, или второго варианта, предложенного propovednik — можно, но как-то некомфортно, хочется найти более «чистое» решение. И мне все не давала мысль что у такого монстра как Joomla, нет элементарного решения. Порыскав еще немного, на буржуйском форуме наткнулся на ссылку. Вкратце: для Joomla 3 написали специальный компонент для работы с AJAX (неуверенно припоминаю, что даже включили его в комплект «из коробки»), но он совместим и с версией 2.5. Это подтолкнуло меня к мысли что на 2.5 все же нет готового решения, как тогоже index2.php в версии 1.5. Но мы не ищем легких путей и решение ставить еще один компонент не для нас! Тогда я решил посмотреть, что они использовали в своем компоненте.

Решение


А решение оказалось элементарным.
Предположим в Вашем компоненте существует специальный View со своей Model, которые ответственны за вывод неоходимого Вам JSON или XML. Вам всего лишь нужно привести default.php в папке tmpl вашего View к следующему виду
<?php
defined('_JEXEC') or die('Restricted access');
$app = JFactory::getApplication();
JResponse::setHeader('Content-Type', 'text/plain', TRUE);

// здесь выводим Ваш текст
echo $this->text;

$app->close();

где $this->text — данные полученные в Model Вашего View.

На этом все, спасибо за внимание!

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

Only registered users can participate in poll. Log in, please.

Уместна ли подобная информация («мелочи» или краткие туториалы) на страницах Хабра

  • 30.8%Нет28
  • 40.7%Да, но не все подряд37
  • 16.5%Да, но не все подряд. Эта статья тоже не уместна.15
  • 12.1%Да11
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 8

    0
    можно в url добавить tmpl=component&format=raw и сделать view.raw.php
      0
      Натыкался, но к сожалению там ни слова не было про view.raw.php, и как я не мучал браузер параметрами, естественно, он мне ничем помочь не мог, потому что этого файла у меня не было, а был обычный view.html.php.
        0
        joomla ведь намекала при этом :)
        500 — Представление не найдено [name, type, prefix]: customview, raw, componentView
          0
          Признаю свою невнимательность. Уж больно у них шрифт светлый. Я его только сейчас увидел, поначалу даже не стал обращать внимания, решив что это что-то типа бесполезного футера, потому и так обесцвеченного. Неловко-то как…
        0
        На самом деле даже tmpl=component тут лишний, достаточно format=raw и вид view.raw.php в конце которого будет echo json_encode($result);
        0
        И раньше было &no_html=1
          0
          Пробовал. Может я что-то упустил, но когда я ставлю такой параметр, получаю ошибку HTTP 500
            0
            Так было во времена Joomla! 1.0.x. Начиная с 1.5 уже рекомендовано использовать отдельный view. Я обычно это все вообще в контроллере проворачивал:
            class TestController extends JController {
              function foo() {
                $app = JFactory::getApplication();
                $data = array(
                  'foo' => ...,
                  'bar' => ....
                );
                echo json_encode($data);
                $app->close();
              }
            }
            


            Ну и Content-Type по надобности тоже можно здесь же утсановить.

        Only users with full accounts can post comments. Log in, please.