bender-nvkz

bitrix ajax componentTemplate php

Jul 25th, 2016
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.54 KB | None | 0 0
  1. <?php
  2. /*
  3. result_modifier:
  4. --------------------------------------
  5. */
  6. // Ввожу признак CUSTOM_AJAX_MODE в параметрах (можно указывать в параметрах вызова компонента, можно нет, так как без указания режим будет включен, по сути в параметрах его можно только выключить)
  7. $arResult['CUSTOM_AJAX_MODE'] = $this->__component->arParams['CUSTOM_AJAX_MODE'] = isset($arParams['CUSTOM_AJAX_MODE']) ? $arParams['CUSTOM_AJAX_MODE'] : 'Y';
  8. // Определяю ключ доступа к компоненту по ajax (кодирую массив параметров и название шаблона)
  9. $arResult['PARAMS_HASH'] = md5($arParams.$this->GetName());
  10. // Сохраняю в инстанс компонента ключ
  11. $this->__component->arResult['PARAMS_HASH'] = $arResult['PARAMS_HASH'];
  12. // Сохраняю ключ в кеше инстанса
  13. $this->__component->SetResultCacheKeys(array('PARAMS_HASH'));
  14. // Определяю текущий вызов - это ajax?
  15. $arResult['AJAX'] = (isset($_REQUEST['AJAX']) && isset($_REQUEST['KEY']) && $_REQUEST['KEY'] == $arResult['PARAMS_HASH']) ? true : false;
  16.  
  17. /*
  18. template:
  19. --------------------------------------
  20. */
  21. // в начале файла объявляю переменную булева типа с признаком ajax запроса, если собираемся использовать разные выводы при обычном и аякс запросе
  22. $isAjaxRequest = $arResult['CUSTOM_AJAX_MODE'] == 'Y' && $arResult['AJAX'] ? true : false;
  23. ?>
  24. // в нужном месте добавляю html в начале предполагаемой отдачи ajax
  25. <!--template-name-ajax-stack-->
  26.     *тут выполняется цикл или прочие конструкторы html, можно использовать if($isAjaxRequest)... для модификации
  27. <!--template-name-ajax-stack-->
  28. // и в конце ^
  29. // в итоге у нас то, что должно отдаваться аяксом обернуто в определенный html комментарий
  30. // для реализации динамической навигации внутри ajax комментариев вставляю:
  31. <input type="hidden" class="js-template-name-ajax-key" value="<?=$arResult['PARAMS_HASH']?>">
  32. // это инпут, в котором будет ключ для доступа к компоненту по ajax
  33.  
  34. // так же размещаю там кнопку для "показать ещё":
  35. <div class="template-name__show-more js-template-name-show-more">
  36.     <?if($arResult['NAV_RESULT']->NavPageNomer < $arResult['NAV_RESULT']->NavPageCount):?>
  37.         <button type="button" class="template-name__ajax-pagen js-template-name-nav-ajax" data-nav="<?=$arResult['NAV_RESULT']->NavNum?>" data-page="<?=$arResult['NAV_RESULT']->NavPageNomer+1?>">
  38.             <span>Показать ещё</span>
  39.         </button>
  40.     <?endif?>
  41. </div>
  42. // классы js-... для контроллера у нас
  43. //  в целом в этой конструкции мы проверяем, что есть ещё следующие страницы, и если они есть, то выводим кнопку "Показать ещё", в data-атрибутах которой будут указаны значения кода навигации на странице и значение номера следующей страницы.
  44.  
  45. <?php
  46. /*
  47. component_epilog:
  48. ----------------------------------------
  49. */
  50. // Определяем метод выполнения шаблона (Это аякс запрос?)
  51. $isAjaxRequest = (isset($_REQUEST['AJAX']) && isset($_REQUEST['KEY']) && $_REQUEST['KEY'] == $this->arResult['PARAMS_HASH']) ? true : false;
  52. // Если это аякс
  53. if ($ajaxRequest && $this->arParams['CUSTOM_AJAX_MODE']) {
  54.     // забираем вывод в переменную
  55.     $content = ob_get_contents();
  56.     // закрываем стек буфферизации
  57.     ob_end_clean();
  58.     // перезапускаем буффер
  59.     $APPLICATION->RestartBuffer();
  60.     // забираем данные из обозначенного стека
  61.     list(, $content_html) = explode('<!--template-name-ajax-stack-->', $content);
  62.     // отправляем данные
  63.     echo $content_html;
  64.     // служебный эпилог
  65.     require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
  66.     // выход
  67.     exit();
  68. }
Add Comment
Please, Sign In to add comment