Joomla 1.7 Получение данных методом AJAX тормозит сайт

Тема в разделе "Программирование", создана пользователем yiooxir, 20.01.2012.

  1. Offline

    yiooxir Недавно здесь

    Регистрация:
    18.01.2012
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    Уважаемые господа, просьба помочь с решением такого вопроса:

    Реализовал обычный компонент "hello, world!", по ссылке: syte/index.php?option=com_hello&view=hello слово отображается
    Теперь я вызвал тоже самое с помощью AJAX:
    Код (CODE):
    1. function ajax_search(){
    2. $.ajax({
    3.         type: "GET",
    4.         url: "index.php",
    5.         data: "option=com_hello&view=hello&tmpl=component",
    6.         success: function(date){$("#showw").html(date);}
    7.     });
    8. }


    Все отлично заработало, слово показывается в блоке #showw Но! каждый раз при реализации запроса сайт подвисает на несколько секунд, при этом он вообще не активен, как будто зависает сам броузер.
    Консоль JavaScript показывает, что в это время выполняются jquery и widjetkit
    Собственно вопрос, есть ли в моем случае какое-нибудь альтернативное решение? или можно например во время выполнения запроса сделать так, чтобы сам запрос выполнялся в фоновом режиме (к примеру поставить на поле вывода инф. какие-нибудь часики), но чтобы сайт был при этом активным?
    Дело в том, что без joomla этот скрипт отрабатывает со свистом. И еще один минус, то что запрос этот пустячный, реализованный с целью поучиться, а если будет обращение к БД, то сайт вообще будет конкретно подвисать.
    Просьба помочь или дать совет, куда зреть?

    Да, еще интересное замечание:
    В Hrome сначала виснет сайт, потом появляется результат, а в Mozila наоборот, сразу появляется результат, но потом сайт некоторе время также подвисает.
     
  2.  
  3. Offline

    Legolazzzzz Недавно здесь

    Регистрация:
    02.06.2010
    Сообщения:
    25
    Симпатии:
    1
    Пол:
    Мужской
    Код (CODE):
    1. function ajax_search(){
    2.     $.ajax({
    3.                type: "GET",
    4.                url: "index.php",
    5.                data: "option=com_hello&view=hello&format=row",
    6.                success: function(date){$("#showw").html(date);}
    7.     });
    8. }



    Советую чаще пользоваться firebug'ом, и проверять, что приходит в ответ на AJAX запрос, помещая html код возвращённый от сервера как текст в тестовый div:
    Код (CODE):
    1. <div id="test"></div>

    Таким скриптом(для JQuery):
    Код (CODE):
    1. $("#test").text(date);



    А по теме:
    "&tmpl=component" заставляет джумлу выводить компонент без шаблона сайта но со всеми заголовками нужными джумле.
    Для AJAX запросов следует использовать вместо "&tmpl=component", переменную format равную row ("&format=row"), что заставит джумлу вывести html из указанного шаблона указанного вида( в Вашем случае шаблон "default" из вида "hello").

    Сам запрос выполняется в фоновом режиме. AJAX запрос который вы написали используя JQuery асинхронный. Все последующие команды будут выполнятся незамедлительно. Просто функция указанная в параметре 'success:' будет выполнена, когда запрос соизволит вернуть данные и они обработаются браузером пользователя. Соответственно Вы можете выполнить любую анимацию ещё до начала AJAX запроса и прекратить её при возвращении результата(или при ошибке!).

    Задавайте вопросы, если таковые остались.
     
    Последнее редактирование: 20.01.2012
  4. Offline

    yiooxir Недавно здесь

    Регистрация:
    18.01.2012
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    Огромное спасибо за ответ. Думал, пошлют учить матчасть :) Я всего два дня изучаю возможность использовать AJAX в joomla и API joomla по этому многие элементарные вопросы меня пока ставят в тупик.
    Вы оказались очень правы, сказав, что &tmpl=component выводит все заголовки. ИМЕННО ТАК И ЕСТЬ. Я это обнаружил, отобразив результат запроса через alert(date). И, как оказалось, тормозил у меня не запрос, а метод html(date), так как там обертка из ненужных тегов просто огромная получалась. А &format=row не работала, потому что шаблон default.php лежал не в папке вида, а в папке views/hello/tmpl. Если бы вы мне про этот шаблон не намекнули, я б наверно еще целый день потратил на разбор полетов.
    В общем большое спасибо, пока вопросов больше нет, буду двигаться дальше.
     
  5. Offline

    yiooxir Недавно здесь

    Регистрация:
    18.01.2012
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    Блин, опят запарка. Оказывается с переменной &format=row все заработало не из-за шаблона defoult.php, а из-за того, что я переименовал view.html.php на view.row.php. Нифига не понимаю. Что это за переменная такая "row", которая обертку убирает и где идет ее обработка.
    А файл defoult.php действительно должен лежать в папке views/hello/tmpl, так как без него перестает работать запрос с переменной &tmpl=component.
    Ладно, пойду учить матчасть :) Разберу несколько элементарных примерчиков, потом приду с новыми вопросами.
     
  6. Offline

    yiooxir Недавно здесь

    Регистрация:
    18.01.2012
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    В общем целом разобрался. Сделал такую вещь:
    - Прикрутил к joomle Jquery и наладил работу скрипта (оказывается это не так просто, если не знать элементарных правил)
    - На странице сайта есть форма с инпутом и кнопкой.
    - В базу SQL внес свою таблицу с полями.
    Суть тестового примера: При изменении данных в поле инпут идет AJAX запрос к базе (через скрипт на jquery) и делается выборка, которая тут же ниже и выводится. При этом страница не перегружается. (Ну к примеру, как интерактивная телефонная книга, вводите букву, а он сразу выводит совпадения).
    При реализации данного примера старался уложиться во все паттерны MVC характерные для joomla. (Не знаю уж, уложился ли ил нет, я эту калабродину всего третий день изучаю).

    Понимаю, что для сколь-нибудь опытного програмиста на joomle это пустяк, но я, как начинающий, потратил на этот пустяк кучу времени (просто дофига). В сети есть куча примеров но все они либо очень сложные для начального понимания, либо не решают поставленную мною задачу.

    Сразу здесь мусорить не буду, может это вообще никому не интересно, но если интересно, отпишитесь, я выложу код с описанием, чего куда прикручивал, и где острые моменты.
     
  7. Offline

    Legolazzzzz Недавно здесь

    Регистрация:
    02.06.2010
    Сообщения:
    25
    Симпатии:
    1
    Пол:
    Мужской
    Как вы подключали js?
    Я обычно подключаю js и css компонента в файле шаблона вида:
    Код (CODE):
    1. <?php defined('_JEXEC') or die('Restricted access');
    2.  
    3. $com_path = 'components/com_mycomponent';
    4. JHTML::stylesheet( 'css/mycss.css', $com_path );
    5. JHTML::script( 'js/jquery.js', $com_path );
    6. JHTML::script( 'js/myjs.js', $com_path );
    7.  
    8. ?>

    Не претендую на правильность этого кода.. Была одна проблема с вызовом этого-же шаблона через AJAX. Дело в том, что эти стили и скрипты подключаются по новой, что совсем не правильно. Приходилось передавать в шаблон переменную из вида, сигнализирующую о том, что шаблон вызван для AJAX.
     
  8. Offline

    yiooxir Недавно здесь

    Регистрация:
    18.01.2012
    Сообщения:
    5
    Симпатии:
    0
    Пол:
    Мужской
    В моем случае претендовать на правильность кода вообще наверное смешно. Я ведь только-только начал все это изучать. И тем не менее. Я подключал библиотеку jquery, как собственно и свой скрипт через файл шаблона сайта index.php строкой:
    Код (CODE):
    1. <script type="text/javascript" src="<?php echo $this->baseurl ;?>/templates/yoo_shelf/js/jquery.js" ></script>
    2. <script type="text/javascript" src="<?php echo $this->baseurl ;?>/components/com_hello/m_find.js" ></script>

    Т.е. в моем случае все скрипты подключаются при инициализации сайта и сохраняются на протяжении всей сессии. (Наверное :) )
    Вообще с подключением скриптов у меня проблем как-то и не возникло. Я нашел в шаблоне сайта строки, где подключаются какие-то рабочие скрипты шаблона и добавил рядом свои строчки.

    А проблема у меня возникла в следующем.
    То, что мой скрипт подключился, я видел с помощью firebug. Но он упорно не хотел работать. Я понимал, что идет конфликт jquery с mootools. И это было видно, когда мой скрипт отрабатывал, управление передавалось на mootools. И вот с этой проблемой я собственно напарился, как черт в бане. Весь интернет исписан обычными рекомендациями, которые мне никак не подходили, типа:
    - отключить mootools. Это во первых в joomla 1.7 оказалось не так тривиально, как в joomla 1.5 (по крайней мере там я их как-то быстро отключал). Во вторых это и не правильно, потому что многие фичи в сайте сделаны на mootools, и соответственно, отключив его есть шанс словить какой-нибудь глюк.
    - использовать функцию: jquery.noconflict(). Чего она там делает, я так и не понял, но понял что она мне не помогает, и что в 90% случаев, те кто ее рекомендует сами не особо знают ее принцип работы. В общем с ней тоже не прокатило.

    Решение оказалось тривиальным.
    В JQuery есть такая конструкция: jQuery(document).ready(function(){}), она везде позиционируется как функция, которая следит за полной загрузкой DOM документа, но здесь она как раз и пришлась кстати.
    В своем скрипте пишем: jQuery(document).ready(function($){ваш скрипт}),
    обращаю внимание на знак $ в параметрах функции, можно вместо него поставить любой знак или символ, и в теле использовать его вместо обычного для jquery $. К примеру можно поставить JQ и тогда к примеру конструкция $("#ddd"). будет писаться JQ("#ddd")
    Наверно это тривиально для знающих людей, но я не мало работаю с jquery, но именно на этот момент я убил кучу времени, причем прочел кучу советов по конфликтам jquery и mootools, но именно такого совета так и не встретил (ну или встретил как-то замыленно).
     
  9. Offline

    more_john Недавно здесь

    Регистрация:
    24.02.2012
    Сообщения:
    1
    Симпатии:
    0
    Пол:
    Мужской
    Уважаемый yiooxir, мне очень интересен код с описанием. Ну, или хотя бы только код компонента. В данный момент озадачен проблемой стыковки mvc и ajax, а без простых примеров трудно понять. Буду благодарен.
     

Поделиться этой страницей

Загрузка...