Проблема с AJAX'ом Instant CMS 2

 
Посетитель
small user social cms
Сообщений: 71
Всем привет!

Instant CMS 2.3.0

Столкнулся с проблемой аяксовой перезагрузки страницы.

Например, мне нужно перезагрузить часть страницы:
Код PHP:
  1. $('#content_ajax').load(current_url+" #content_ajax", function(){});
Не работает.

В ядре нарыл код:
Код PHP:
  1. private function detectContext(){
  2.  
  3. if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
  4. $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
  5. return cmsRequest::CTX_AJAX;
  6. } else {
  7. return cmsRequest::CTX_STANDARD;
  8. }
  9. }
И понял, что для ajax-запросов идет своя обработка. Но мне бы при своих запросах обходить это.
По совету Fuze попробовал load заменить на ajax и подменить headers, чтоб не передавать XMLHttpRequest.

Код PHP:
  1.  
  2. $.ajax({
  3. type: 'POST',
  4. url: current_url+" #content_ajax",
  5. headers: {
  6. "X-Requested-With":"NULL"
  7. }
  8. }).done(function(data) {
  9. $('#content_ajax').html(data);
  10. });
Работает. Но в консоли вижу, что заново все скрипты подгружаются при load'е. Не есть гуд.

Пока обошелся тем, что в ядре в template.php в функции processRender добавил код:
Код PHP:
  1. if (substr_count($tpl_file, 'item_view.tpl') || substr_count($tpl_file, 'sales_item.tpl') || substr_count($tpl_file, 'projects_item.tpl') || substr_count($tpl_file, 'default_item.tpl')) {
  2. $this->addOutput( $html );
  3. return $html;
  4. }
Но не считаю это элегантным решением.

Какие есть еще варианты?
Редактировалось: 2 раз (Последний: 10 декабря 2015 в 22:09)
Посетитель
small user social cms
МедальКубок зрительских симпатийАвторитет форума
Сообщений: 1164
Антон:
Например, мне нужно перезагрузить часть страницы:
Изначально неверная постановка вопроса. Перезагрузить часть страницы аяксом нельзя.
Антон:
$('#content_ajax').load(current_url+" #content_ajax", function(){});
Смущает меня url, куда отправляется запрос и пустая функция...
Антон:
Работает. Но в консоли вижу, что заново все скрипты подгружаются при load'е. Не есть гуд.
Предлагаю вам озвучить решаемую проблему более подробно, думаю первоначально причина кроется в неверном подходе к решению этой проблемы...
Также куда вы посылаете аякс-запрос? В системный файл InstantCMS или свой компонент? Если свой компонент, то как-то вы сложно все делаете.
Реклама
cms
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1979
Val:
Перезагрузить часть страницы аяксом нельзя.

Вообще то можно.

В методе success, который выполняется в случае удачного обмена данными с сервером, пишем:
Код JQUERY:
  1. success: function(){
  2. $('#content_0').empty().append('сперва очистили, а затем заполняем элемент новым содержимым');
  3. $('#content_1').empty().append('аналогично');
  4. $('#content_2').empty().append('аналогично');
  5. . . . и т.д.
  6. }
И так меняем содержимое всех элементов (то есть ту часть страницы, которую надо перезагрузить при ajax-запросе).

Я понимаю, долго и муторно, но лично я придумать ничего другого не могу... хотя, наверно, более светлые умы более изящное решение предложат)))))
Редактировалось: 2 раз (Последний: 11 декабря 2015 в 03:56)
NOP
Посетитель
small user social cms
МедальКубок зрительских симпатийАвторитет форума
Сообщений: 1164
Странник, я о предназначении технологии - обмен данными с сервером без перезагрузки страницы. Вы описали callback функцию успешного получения данных от сервера, в которой эти данные вставили в соответствующие элементы))) Т.е. результат действительно выглядит как будто мы перезагрузили часть страницы, но по факту аяксом мы только получили данные, а уже как мы распорядились ими - к технологии не относится (могли просто добавить их к существующим элементам, могли заменить существующие элементы, могли частично обновить элементы и еще много чего могли сделать)
Кстати, по моему так будет немного короче:
Код JQUERY:
  1. $('#content_0').html(полученные данные);
хотя реализация зависит от вида данных, которые вернул сервер)))
Посетитель
small user social cms
Сообщений: 71
Например, https://poplavok.market/magazin/primanki/blesny/blesna-vertikalnaja-zimnjaja-s-vpajan-kr-vmc-gvozdik-bol-02-1g-4c.html
При выборе цвета, меняется содержимое #shop_item_details.
Пояснение: "цвета" - это варианты товара, выполненные как товары (связанные между собой кодом). При выборе цвета подгружается информация для нужного варианта. Здесь перезагружается аяксом часть страницы. Этот сайт выполнен на 1 инстанте.

То же самое не работает на 2-м.

Val, смущать Вас эта функция не должна. Она работает. Я всего лишь привел функции jquery load.
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1979
Val:
$('#content_0').html(полученные данные)

Согласен, можно и так. Важно то, что с помощью аякса перезагрузить часть страницы все-таки можно )))

There are more things in heaven and earth, Horatio,
Than are dreamt of in your philosophy...

Есть многое в природе, друг Горацио,
Что и не снилось нашим мудрецам...
NOP
Посетитель
small user social cms
Сообщений: 71
Val:
Вы описали callback функцию успешного получения данных от сервера, в которой эти данные вставили в соответствующие элементы))) Т.е. результат действительно выглядит как будто мы перезагрузили часть страницы, но по факту аяксом мы только получили данные, а уже как мы распорядились ими - к технологии не относится (могли просто добавить их к существующим элементам, могли заменить существующие элементы, могли частично обновить элементы и еще много чего могли сделать)
Насколько я понял у Val страсть к демагогии: "Давайте выучим какой-нибудь термин и будем холиварить по поводу сути данного термина".
Нужно решение проблемы, а не обсуждение технологии.
Суть проблемы в том, что не работает стандартный jquery load, который загружает нужный мне блок со страницы донора в нужный блок на страницу цели.

И самое главное - данная штука зарезается движком.

Так вот: кто знаком с ядром движка и логикой обработки аякс-запросов движком - подскажите как обойти эту проблему.
Редактировалось: 2 раз (Последний: 11 декабря 2015 в 10:59)
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1979
Антон:
не работает стандартный jquery load, который загружает нужный мне блок со страницы донора
Позвольте мне уточнить. ГДЕ расположена страница "донор"? Насколько мне известно, технология ajax обменивается данными с файлом, который специально пишется для ответа на данный ajax-запрос. Адрес этого файла и указан, по видимому, в переменной current_url. Этот файл в природе существует? Выведите нам, плиз, содержимое этой переменной.
И еще. Val вам старается помочь. Если будете обвинять помощников в холливаре - помощников у вас очень быстро не останется. Компрене ву?
NOP
Посетитель
small user social cms
Сообщений: 71
Странник:
Позвольте мне уточнить. ГДЕ расположена страница "донор"?
Так я ж привел в пример интернет-магазин.
Донор - это страница товара на этом же сайте.

Странник:
И еще. Val вам старается помочь. Если будете обвинять помощников в холливаре - помощников у вас очень быстро не останется. Компрене ву?
http://instantcms.ru/novosti/release230.html#c86604
Обратите внимание на мой вопрос и ответ Fuze. Без демагогий на тему использования понятий человек дал мне конкретный совет (правда выше я описал чем он меня не устроил).

Повторюсь проблема не в скрипте и не jquery load, а в том что для своих целей (насколько я понимаю для оптимизации быстродействия) движок режет ajax-запросы.

Решение с подменой Headers не подошло, либо я неверно его использовал.

Поэтому прошу помочь людей знакомых с работой ядра. Либо указать на неправильную подмену Headers.
Редактировалось: 1 раз (Последний: 11 декабря 2015 в 11:25)
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1979
Антон:
Донор - это страница товара на этом же сайте
Вот ваша ошибка. Но поскольку меня могут обвинить, вслед за Val в демагогии, больше ни слова не скажу. Разбирайтесь сами.
NOP
Посетитель
small user social cms
Сообщений: 71
Странник:
Вот ваша ошибка.
Предполагаю Вы подразумеваете более правильным использование ajax для обращения к php скрипту, который генерит непосредственно нужный кусок кода для вывода в нужном месте. Да это круто, только не всегда подходит.

Когда мне нужно обновить тупо всю страницу кроме шапки, не писать же php-скрипт генерации той же страницы только без шапки.
Посетитель
small user social cms
Сообщений: 71
В сухом остатке советов по делу нет scratch
Посетитель
small user social cms
МедальКубок зрительских симпатийАвторитет форума
Сообщений: 1164
Антон:
Val, смущать Вас эта функция не должна. Она работает. Я всего лишь привел функции jquery load.
Меня смутил непонятный url c решёткой на конце и пустая callback функция. Если вы никак не обрабатываете полученные данные зачем вообще ее указывать?
Антон:
Предполагаю Вы подразумеваете более правильным использование ajax для обращения к php скрипту
Если вы пишете компонент, то этот вариант был бы более логичным, но...
1. Через аякс можно загрузить в том числе и обычный .html файл
2. iCMS работает так, что вы все равно обращаетесь к php-скрипту (или множеству скриптам), которые формируют вам ответ в виде html страницы или json или др.
Повторю вам свой вопрос вы куда обращаетесь своим аякс-запросом? К системному файлу InstantCMS или к своему файлу? Если свой - сформируйте правильно ответ на сервере, если системный - то к какому файлу и какой ответ файл пересылает?
Посетитель
small user social cms
Сообщений: 71
В callback было написано много кода. Я удалил его, чтоб не смущать hoho а получилось наоборот. Про current_url даже не подумал, что вызовет вопрос. Просто переменная, которая генерится ранее.

Сейчас объясню подробнее назначение.

InstantCMS 2. Компонент "контент". Все махинации происходят на странице записи.

Есть необходимость смены категории нажатием на 1 кнопку (категория - это статус записи).
На странице выводится селект со списком категорий и кнопка "изменить".
Это реализовано аяксом, идет пост к php-файлу, который меняет категорию записи. Все просто, все работает.

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

Поэтому я делаю load этой же страницы. При этом запросе сервер получает XMLHttpRequest (и ядро его обрабатывает иначе, чем простой запрос) и в ответ приходит только содержимое контентной части.
Редактировалось: 1 раз (Последний: 11 декабря 2015 в 14:27)
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатий
Сообщений: 1979
Антон:
В сухом остатке советов по делу нет
Вам уже указали на вашу ошибку, но вы или не слышите, или наивно полагаете, что вам тут кто-то что до должен. Представьте, не должен. Никто.
NOP
В начало страницы
Предыдущая темаСледующая тема Перейти на форум: