Joomla + Ajax + MVC

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

  1. Offline

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

    Регистрация:
    20.05.2007
    Сообщения:
    166
    Симпатии:
    0
    Пол:
    Мужской
    Здравствуйте, мне надо модернизировать собственный компонент, добавить туда функционал на ajax.
    Какие встроенные классы есть для этого в джумле ? что нужно почитать про джумла и аякс ? с чего начать ?
    И мне что то непонятно, как MVC - в джумле, работает с аякс - например, в шаблоне, вызов аякс функции - там ведь отдельные файлы должны быть для серверного выполнения ? - т.е. уже не файлы самого mvc ?
     
  2.  
  3. Offline

    botanist специалист

    Регистрация:
    15.02.2009
    Сообщения:
    461
    Симпатии:
    49
    Пол:
    Мужской
  4. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    Вы форум вообще читаете ? )))) ЛИНК !
     
    Последнее редактирование модератором: 31.03.2014
  5. Offline

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

    Регистрация:
    20.05.2007
    Сообщения:
    166
    Симпатии:
    0
    Пол:
    Мужской
    Спасибо, будем разбираться.
     
  6. Offline

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

    Регистрация:
    20.05.2007
    Сообщения:
    166
    Симпатии:
    0
    Пол:
    Мужской
    Re: Joomla + Ajax + MVC + JQuery

    Блин я не понял как это работает, может кто нибудь привести пример Joomla MVC + Ajax на JQuery ?
    Нужно просто выполнить из шаблона функцию из модели и получить результат, её выполнения -
    Т.е. обычными методами вроде этого -

    //Если сохранение прошло успешно
    if ($model->save_data($data)){
    $message = JText::_(JText::_('P_SAVED'));
    }
    // Если сохранить запись не удалось
    else {
    $message = JText::_(JText::_('P_MSG_SAVE_FAIL_CHECK_DATA'));
    $message .= ' ['.$model->getError().']'; // Сообщение об ошибке из модели
    }

    $lang= JRequest::getVar('lang');

    // Перенаправление
    $this->setRedirect('index.php?option=com_mycom'.$task.'&lang='.$lang.'&Itemid='.Itemid, $message);

    Тут сообщение об ошибке, выводиться в стандартном для этого месте джумлы.

    Нужен пример, как Аяксом вызвать функцию из модели, принадлежащей шаблону и возвратить её результат(успешно или нет) в шаблон.

    Нашёл для JQuery такие примеры
    $(document).ready(function(){ // по окончанию загрузки страницы
    $('#example-1').click(function(){ // вешаем на клик по элементу с id = example-1
    $(this).load('ajax/example.html'); // загрузку HTML кода из файла example.html
    })
    })

    Но тут вызывается не функция из файла, а загружается сам файл
     
  7. Offline

    botanist специалист

    Регистрация:
    15.02.2009
    Сообщения:
    461
    Симпатии:
    49
    Пол:
    Мужской
    Так вызываеш загрузку она и происходит. Ищи функцию отправки
    в mootools так
    var myRequest = new Request({url: 'mypage.html', method: 'get'}).send('some=data');
     
  8. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    Не ужели в ,приведенной мною, статье не понятно описан принцип работы аякса в джумле ?
     
  9. Offline

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

    Регистрация:
    20.05.2007
    Сообщения:
    166
    Симпатии:
    0
    Пол:
    Мужской
    Я не понял, блин, я с аяксом до этого не работал, и этот jquery таким языком написан, мне непривычным, что да непонятно....
    $(document).ready(function(){
    $("#ajax-loader").bind("ajaxSend", function()....

    Понял что при загрузке документа, к ссылке привязывается событие, потом при нажатии на это событие вызывается функция ajaxEvent, в которой вызывается функция linkAction($(this - это что такое this ???));
    далее из этой функции вызывается $.post(cURL, getData); - это типа аяксовский аналог метода пост - т.е. он вызывает php функцию в контроллере, но блин непонятно как параметр cURL сформировался.
    А где выходной параметр ? т.е. результат загрузки нового хтмл шаблона - как он устанавливается ?

    и что самое непонятное, как php функция возвращает результат своей работы обратно аяксу, т.е. в этом примере, как я понял в рабочую область компонента, грузятся последовательно шаблоны, т.е. php функция не возвращает результат своего выполнения, а просто перезагружает рабочую область -
    var ajaxMode = "&tmpl=component&format=raw";
    $this->getView('model2','html');
    Но непонятно, как эти заново установленные view - загружаются в рабочую область - т.е. ещё с этими примудростями библиотеки jquery разберусь,

    но пока хотелось бы простой пример,
    1. как из мвс шаблона, аяксом вызвать функцию, из модели, которая бы возвращала простое число(например 3)
    2. и это число(возвращаемый парамерт функции) установить аяксом в какой нибудь элемент рабочей области(кнопка, ссылка, div)

    Если можете пожалуйста приведите пример.
     
  10. sergiks
    Offline

    sergiks специалист

    Регистрация:
    10.10.2010
    Сообщения:
    362
    Симпатии:
    36
    Пол:
    Мужской
    Пример

    1. Обращение будет, как обычная загрузка страницы, к какому-то URL. Поэтому, чтобы выдавалось только число 3, без мишуры - меню, стилей, модулей левых - нужно вызывать вид &tmpl=component - тогда выдаст только выход компонента. Либо вариант &format=raw, и тогда нужно делать в виде view.raw.php и в tmpl/ соотв. темплейт подготовить.

    2. Вот пример с api.jquery.com/jQuery.ajax/ который отправляет данные и получает сообщение:
    Код (CODE):
    1. $.ajax({
    2.    type: "POST",
    3.    url: "some.php",
    4.    data: "name=John&location=Boston",
    5.    success: function(msg){
    6.      alert( "Data Saved: " + msg );
    7.    }
    8.  });


    Вместо some.php тут будет http://site.ru/index.php?option=com_xxxx&view=yyy&format=raw

    Полученный msg можно запихнуть в любой элемент страницы, например в div с id="myId":
    Код (CODE):
    1. $('#myId").html('<p>Получен ответ: '+msg+'</p>');
     
  11. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    не торопитесь ... скоро напишу )
     
  12. Offline

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

    Регистрация:
    20.05.2007
    Сообщения:
    166
    Симпатии:
    0
    Пол:
    Мужской
    Re: Пример

    Т.е. надо вызывать функции не напрямую, а как обычно через контроллер, отправляя параметры в урл, а там контроллер сам вызывет нужную ? - http://site.ru/index.php?option=com_xxxx&view=yyy - Теперь кажеться становиться понятней.

    А что такое - format=raw ?

    и параметр в функции - $.ajax - ниже, задаёт функцию, которая будет выполнена в результате успешного выполнения на сервере ? а входной параметр msg - автоматом становиться выходным параметром функции выполненной на сервере ? - Блин этот jquery написан как то по марсиански.
    success: function(msg){
    alert( "Data Saved: " + msg );


    Чтобы для точности, во вложении простой пример, при нажатии на кнопке, аяксом происходит обращение к файлу на сервере, который просто выдаёт оутпут.

    Но там есть ещё и функция "get_data2", можете сделать чтобы при нажатии на кнопке 2, в эту функцию передавался параметр - "привет", а выходной параметр функции отображался на надписе кнопки.
    И выложить это вложение обратно для примера.
     

    Вложения:

    • joom.rar
      Размер файла:
      562 байт
      Просмотров:
      12
  13. sergiks
    Offline

    sergiks специалист

    Регистрация:
    10.10.2010
    Сообщения:
    362
    Симпатии:
    36
    Пол:
    Мужской
    Бесплатно, увы, не могу — очень мало времени.

    Я думаю, вы суть ajax ухватили, дальше - дело техники, курения доков и анализа примеров и чужих работ. Весь JS любого сайта можно посмотреть )
     
  14. Offline

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

    Регистрация:
    20.05.2007
    Сообщения:
    166
    Симпатии:
    0
    Пол:
    Мужской
    Помогите, не могу разобраться, блин

    В шаблоне
    <div id="test_ajax" onclick="exec_aj_function(this);">Запустить функцию</div>

    Js файл
    function exec_aj_function(param){
    $.post('index.php?com_mycom&task=save_ajax_param&ajparam='+param.id, al_from_aj);
    // alert(param.id);
    }

    function al_from_aj(data){
    alert(data);
    }

    В контроллере
    // Функция тестирования ajax запросов
    function save_ajax_param(){
    $ajparam = JRequest::getString('ajparam');
    if ($ajparam == 1)
    return "Запрос выполнен ".$ajparam;
    else
    return "Запрос не выполнен ".$ajparam;
    }

    После клике на divе - алертом выходит не "Запрос не выполнен ", а весь вывод html джумлы (((((

    Нужно чтобы просто выводилось алертом сообщение из функции контроллера.
    если при передаче параметров, добавляю к урл &format=raw - ничего не происходит.

    И ещё вопрос, а если мне надо вернуть из функции контроллера, не просто строку, а объект, массив - как это сделать ?
     
  15. Offline

    botanist специалист

    Регистрация:
    15.02.2009
    Сообщения:
    461
    Симпатии:
    49
    Пол:
    Мужской
    Да брось ты это дело, раз не выходит.
     
  16. Offline

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

    Регистрация:
    20.05.2007
    Сообщения:
    166
    Симпатии:
    0
    Пол:
    Мужской
    Что значит брось ? Мне надо это сделать, значит это будет сделано.
    По теме бы написал - советчик.

    Просто пока с этим Jquery и аяксом не разобрался - синтаксис для меня непривычный.
     
  17. Offline

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

    Регистрация:
    20.05.2007
    Сообщения:
    166
    Симпатии:
    0
    Пол:
    Мужской
    Я так понял, что чтобы из джумлы выводилась только строка, необходимо задать один из следующих параметров
    &format=raw
    &no_html=1
    &tmpl=component

    Но когда я один из них или все добавляю к url в строке
    $.post('index.php?com_mycom&task=save_ajax_param&a jparam='+param.id, al_from_aj); - то при нажатии на див - ничего не происходит, и ошибки js тоже не возникает, но и как будто функция вызова контроллера в джумле тоже не вызывается.

    Что это может быть ?
     
  18. woojin
    Offline

    woojin Местный Команда форума

    Регистрация:
    31.05.2009
    Сообщения:
    3 209
    Симпатии:
    335
    Пол:
    Мужской
    ни какой разницы не видишь?
    Код (html):
    1. index.php?option=com_content

    и вот тут
    что за лишний пробел?
     
    magistr_yoda нравится это.
  19. Offline

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

    Регистрация:
    20.05.2007
    Сообщения:
    166
    Симпатии:
    0
    Пол:
    Мужской

    Чёрт чёрт чёрт - действительно я забыл поставить option= - теперь всё работает.
    Блин два дня с этой хренью парился. :)

    woojin Большое спасибо.


    Там нет пробела, просто это в форум так вставилось.
     
  20. Offline

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

    Регистрация:
    14.10.2010
    Сообщения:
    18
    Симпатии:
    0
    Пол:
    Мужской
    Можно и я отмечусь?
    Подскажите как обновлять сам <select>street. Пока выкрутился поместив его в <div>temp.
    Сразу скажу, что WEB пока изучаю, думаю заметно )))

    controller.php
    Код (PHP):
    1. $streets_list  = $model->getStreets($id);
    2.         if (streets_list)
    3.         {
    4.             $streets[]=JHTML::_('select.option',  null, JText::_( '' ) );
    5.             for ($i=0, $n=count($streets_list ); $i < $n; $i++)
    6.             {
    7.                 $row = $streets_list[$i];
    8.                 $streets[] = JHTML::_('select.option',  $row->id, $row->name);
    9.             }
    10.         echo JHTML::_('select.genericlist',   $streets, 'street', ' class="inputbox" ', 'value', 'text', $street );
    11.                         }


    .js
    Код (CODE):
    1. $('type').addEvent('change', function(e)
    2.      {
    3.         //var sel = $('state').value;  
    4.         var type = $('type').value;    
    5.         var url = 'index.php?option=com_hsearch&task=street_info&format=row&street_type='+type;
    6.  
    7.         ajax = new Ajax(url,
    8.          {
    9.             update: $('temp'),
    10.             method: 'post',
    11.  
    12.         }).request();
    13.     });


    view.html.php
    Код (PHP):
    1. $form = new stdClass();
    2. $streets = array();
    3. $streets[] = JHTML::_('select.option',  null, JText::_( 'Виберіть тип' ) );
    4. $form->streetField  = JHTML::_('select.genericlist',   $streets, 'street', ' class="inputbox" ', 'value', 'text', $street );
    5. $this->assign('street'          , $street);
    6. $this->assignRef('form',        $form);


    default.php
    Код (PHP):
    1. <div id="temp"><?php echo $this->form->streetField; ?></div>


    Вроде все файлы включил.
    З.Ы. ОФ: Что-то смайла с пивом не нашел, не употребляем? )))
     
  21. omfgpanda
    Offline

    omfgpanda специалист

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской

    Вложения:

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

Загрузка...