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

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 10 декабря 2015 в 22:06
Всем привет!

Instant CMS 2.3.0

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

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

В ядре нарыл код:
  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.

  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 добавил код:
  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 11 декабря 2015 в 01:05

Например, мне нужно перезагрузить часть страницы:

Антон
Изначально неверная постановка вопроса. Перезагрузить часть страницы аяксом нельзя.

$('#content_ajax').load(current_url+" #content_ajax", function(){});

Антон
Смущает меня url, куда отправляется запрос и пустая функция...

Работает. Но в консоли вижу, что заново все скрипты подгружаются при load'е. Не есть гуд.

Антон
Предлагаю вам озвучить решаемую проблему более подробно, думаю первоначально причина кроется в неверном подходе к решению этой проблемы…
Также куда вы посылаете аякс-запрос? В системный файл InstantCMS или свой компонент? Если свой компонент, то как-то вы сложно все делаете.
#3 11 декабря 2015 в 03:46

Перезагрузить часть страницы аяксом нельзя.

Val

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

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

Я понимаю, долго и муторно, но лично я придумать ничего другого не могу… хотя, наверно, более светлые умы более изящное решение предложат)))))
#4 11 декабря 2015 в 08:54
Странник, я о предназначении технологии — обмен данными с сервером без перезагрузки страницы. Вы описали callback функцию успешного получения данных от сервера, в которой эти данные вставили в соответствующие элементы))) Т.е. результат действительно выглядит как будто мы перезагрузили часть страницы, но по факту аяксом мы только получили данные, а уже как мы распорядились ими — к технологии не относится (могли просто добавить их к существующим элементам, могли заменить существующие элементы, могли частично обновить элементы и еще много чего могли сделать)
Кстати, по моему так будет немного короче:
  1. $('#content_0').html(полученные данные);
хотя реализация зависит от вида данных, которые вернул сервер)))
#5 11 декабря 2015 в 10:45
Например, 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.
#6 11 декабря 2015 в 10:51

$('#content_0').html(полученные данные)

Val

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

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

Есть многое в природе, друг Горацио,
Что и не снилось нашим мудрецам…
#7 11 декабря 2015 в 10:57

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

Val
Насколько я понял у Val страсть к демагогии: "Давайте выучим какой-нибудь термин и будем холиварить по поводу сути данного термина".
Нужно решение проблемы, а не обсуждение технологии.
Суть проблемы в том, что не работает стандартный jquery load, который загружает нужный мне блок со страницы донора в нужный блок на страницу цели.

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

Так вот: кто знаком с ядром движка и логикой обработки аякс-запросов движком — подскажите как обойти эту проблему.
#8 11 декабря 2015 в 11:11

не работает стандартный jquery load, который загружает нужный мне блок со страницы донора

Антон
Позвольте мне уточнить. ГДЕ расположена страница "донор"? Насколько мне известно, технология ajax обменивается данными с файлом, который специально пишется для ответа на данный ajax-запрос. Адрес этого файла и указан, по видимому, в переменной current_url. Этот файл в природе существует? Выведите нам, плиз, содержимое этой переменной.
И еще. Val вам старается помочь. Если будете обвинять помощников в холливаре — помощников у вас очень быстро не останется. Компрене ву?
#9 11 декабря 2015 в 11:21

Позвольте мне уточнить. ГДЕ расположена страница "донор"?

Странник
Так я ж привел в пример интернет-магазин.
Донор — это страница товара на этом же сайте.

И еще. Val вам старается помочь. Если будете обвинять помощников в холливаре — помощников у вас очень быстро не останется. Компрене ву?

Странник
instantcms.ru/novosti/release230.html#comment_86604
Обратите внимание на мой вопрос и ответ Fuze. Без демагогий на тему использования понятий человек дал мне конкретный совет (правда выше я описал чем он меня не устроил).

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

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

Поэтому прошу помочь людей знакомых с работой ядра. Либо указать на неправильную подмену Headers.
#10 11 декабря 2015 в 11:26

Донор — это страница товара на этом же сайте

Антон
Вот ваша ошибка. Но поскольку меня могут обвинить, вслед за Val в демагогии, больше ни слова не скажу. Разбирайтесь сами.
#11 11 декабря 2015 в 13:00

Вот ваша ошибка.

Странник
Предполагаю Вы подразумеваете более правильным использование ajax для обращения к php скрипту, который генерит непосредственно нужный кусок кода для вывода в нужном месте. Да это круто, только не всегда подходит.

Когда мне нужно обновить тупо всю страницу кроме шапки, не писать же php-скрипт генерации той же страницы только без шапки.
#12 11 декабря 2015 в 13:02
В сухом остатке советов по делу нет scratch
#13 11 декабря 2015 в 13:49

Val, смущать Вас эта функция не должна. Она работает. Я всего лишь привел функции jquery load.

Антон
Меня смутил непонятный url c решёткой на конце и пустая callback функция. Если вы никак не обрабатываете полученные данные зачем вообще ее указывать?

Предполагаю Вы подразумеваете более правильным использование ajax для обращения к php скрипту

Антон
Если вы пишете компонент, то этот вариант был бы более логичным, но...
1. Через аякс можно загрузить в том числе и обычный .html файл
2. iCMS работает так, что вы все равно обращаетесь к php-скрипту (или множеству скриптам), которые формируют вам ответ в виде html страницы или json или др.
Повторю вам свой вопрос вы куда обращаетесь своим аякс-запросом? К системному файлу InstantCMS или к своему файлу? Если свой — сформируйте правильно ответ на сервере, если системный — то к какому файлу и какой ответ файл пересылает?
#14 11 декабря 2015 в 14:24
В callback было написано много кода. Я удалил его, чтоб не смущать hohoа получилось наоборот. Про current_url даже не подумал, что вызовет вопрос. Просто переменная, которая генерится ранее.

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

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

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

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

Поэтому я делаю load этой же страницы. При этом запросе сервер получает XMLHttpRequest (и ядро его обрабатывает иначе, чем простой запрос) и в ответ приходит только содержимое контентной части.
#15 11 декабря 2015 в 15:14

В сухом остатке советов по делу нет

Антон
Вам уже указали на вашу ошибку, но вы или не слышите, или наивно полагаете, что вам тут кто-то что до должен. Представьте, не должен. Никто.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.