1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

1.4.4 JSON

Тема в разделе "Основные вопросы по XenForo", создана пользователем mad@Max, 27.02.2015.

Загрузка
  1. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    Имеется свой роутинг с подстраницами, по типу 'route/somepage'. Появилась необходимость в ajax. Выявилась проблема, что при ответе не отдается JSON с этих страниц, т.е. формат то такой же, но преобразования не происходит.
    К примеру, если мы вешаем класс OverlayTrigger на любую ссылку форума, то все ок - окно в окне, но если на 'route/somepage' из 'route/', то вот это
    [​IMG]
    плюс с ошибкой в консоли SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data.
    Не пойму, то ли не правильно прописал роутинг, то ли нужно делать специальное описание ViewPublic, но я не передаю параметры на эту страницу.

    ЧЯДНТ?
     

    Вложения:

    • json.png
      json.png
      Размер файла:
      14,9 КБ
      Просмотров:
      34
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    А Вы в коде как отдаете JSON? Обычно это делается через ViewPublic и метод renderJson. Посмотрите, например, XenForo_ViewPublic_Member_Find.
     
  3. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    В том то и проблема, сейчас у меня так
    PHP:
      public function renderJson()
       {
         
    $output $this->_renderer->getDefaultOutputArray(get_class($this), $this->_params'DimelaManagment_visit_add');
         
    $template $this->createTemplateObject('', array());

         
    $output['css'] = $template->getRequiredExternals('css');
         
    $output['js'] = $template->getRequiredExternals('js');
         return 
    XenForo_ViewRenderer_Json::jsonEncodeForOutput($output);
       }
    Но в итоге воз и ныне там...
     
  4. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    А Вы попробуйте не кодировать вывод. Возвращайте $output.
     
  5. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    PHP:
    return $output;
    SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
    Может что то еще упускаю?

    P.S. пол года назад тоже писал "окно в окне", как то решил, но не имею доступа к файлам :(
     
  6. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Хм. А не пробовали возвращать только кодировку? У меня, например, так:
    Код:
    class SP_ViewPublic_Delivery extends XenForo_ViewPublic_Base
    {
      public function renderJson () {
      return XenForo_ViewRenderer_Json::jsonEncodeForOutput($this->_params);
      }
    }
    А в контроллере так:
    Код:
    return $this->responseView('SP_ViewPublic_Delivery', 'sp_office_input', $viewParams);
    Соответственно, все параметры у меня еще в контроллере передаются.
    AJAX у меня используется для парсинга вводимых данных в поле формы в процессе набора.

    Вы вообще что прикручиваете с помощью AJAX? Может быть в шаблоне что-то не то или как раз при формировании массива параметров. А может быть и в js проблема. Я не привожу свой шаблон и javascript, так как это закрытая разработка, а вырезать оттуда куски в общем бессмысленно.
     
  7. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    Я не передаю в шаблон никаких данных. Т.е. я пробовал делать "пустой" шаблон типа
    HTML:
    <xen:title>bla bla</xen:title>
    
    <div class="section">123</div>
    И вылетает та же ошибка с JSON. Может быть я роутинг не правильно описал?
    PHP:
    class DimelaManagment_Route_Dimela implements XenForo_Route_Interface
    {
        public function 
    match($routePathZend_Controller_Request_Http $requestXenForo_Router $router)
        {
            
    $action $router->resolveActionWithIntegerParam($routePath$request'dimela_id');
            
    $routeMatch $router->getRouteMatch('DimelaManagment_ControllerPublic_Index'$action'Dimela'$routePath);
            return 
    $routeMatch;
        }

        public function 
    buildLink($originalPrefix$outputPrefix$action$extension$data, array &$extraParams)
        {
            return 
    XenForo_Link::buildBasicLinkWithIntegerParam($outputPrefix$action$extension$data'dimela_id');
        }
    }
     
  8. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Роутинг точно не причем. У Вас что-то с формированием массива параметров. Кстати, параметры все равно в массив передаются хотя бы в виде пустого массива.
    В общем проще в отладке это смотреть, что и как передается. А гадать на кофейной гуще малопродуктивно :)
     
  9. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    Как поймать, что передается в JSON?
     
  10. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    Если в ViewPublic сделать такую конструкцию
    PHP:
            XenForo_ViewRenderer_Json::jsonEncodeForOutput($this->_params);
            return 
    json_last_error();
    то запрос вернет 0, т.е. JSON_ERROR_NONE
     
  11. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    Залил сам плагин. Ибо руки опускаются, а дальше нужно все на ajax писать :(

    P.S. localhost/index.php?Dimela/visits, справа ссылка iversia_faq_delete_category для теста.
     

    Вложения:

    • Dimela.zip
      Размер файла:
      13,1 КБ
      Просмотров:
      6
  12. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    1. Для OverlayTrigger не надо использовать JSON.
    2. Соответственно, для вызова вьювера первый параметр оставьте пустым.
    3. Соответственно, ViewPublic не нужен вообще.
    4. Форма, вызываемая оверлейно, отрисовывается из шаблона, который одинаков как для оверлейной формы, так и для обычной. По сути с помощью OverlayTrigger мы просто не переходим по ссылке, а открываем эту ссылку в оверлейном окне. То есть без OverlayTrigger форма должна отображаться примерно также, как и оверлейно. Более подробно в туториале на офе.
     
  13. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    Должна, но не отображается. К ViewPublic я пришел от безысходности, ибо имею ошибку с JSON. Или у вас не воспроизводится ошибка из плагина?
     
  14. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Я же дал рекомендации, как надо сделать было. У себя я проверил. Все работает так, как и должно работать.
    То есть убираем использование вьювера. Указываем во втором параметре нужный шаблон. В третьем параметре передаем массив параметров, если он есть, либо пустой массив. И все работает без всяких ошибок. У меня работает такой вариант:
    Код:
    public function actionTest()
    {
       $viewParams = array();
       return $this->responseView('', 'DimelaManagment_index', $viewParams);
    }
    Я использовал шаблон DimelaManagment_index просто потому, что он есть. Соответственно, Вы используйте нужный.
     
  15. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    Ничего не понимаю. У меня не работает, я даже откатывался на 1.4.3 и апгрейдил до 1.4.5. И на локальном сервере, и на хосте появляется эта ошибка с JSON, но при этом внутренние ссылки форума работают без проблем.
     
  16. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    Какой то бред. Беру другой плагин, меняю контроллер в его классе роутинга на свой, и по его префиксу получаю свои данные через JSON. Но если у этого плагина поменять в префиксе класс роутинга на мой, то я получаю ту же ошибку с JSON...
     
  17. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Давайте еще раз. У Вас без всякого AJAX открывается ссылка?
     
  18. mad@Max

    mad@Max Местный

    Регистрация:
    04.12.10
    Сообщения:
    22
    Симпатии:
    19
    Версия XF:
    1.2.2
    Ну как, через OverlayTarget, т.е. да.
     
  19. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    OverlayTrigger?
    Итак, я изменил actionTest так, как указывал выше. После этого изменения все работает без ошибок. Что у Вас не работает?
     

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