AJAX загрузка блоков в теме

2

Задался вопросом: а где хранить контент модальных окон темы, вызываемых через AJAX?

Можно использовать страницы, но это не всегда удобно т.к. придется как-то исключить страницы окон из общего списка {$wa->site->pages()}.

A можно использовать блоки, но при установке темы не имеют возможности создавать блоки, как это делают приложения. Можно добавить их в шаблонах темы используя {wa_action}, но я считаю что это плохое решение.

Логично было бы реализовать в теме шаблоны с контентом окон. Не обошлось без проблем и тут - как вызвать такой шабон, ведь прямого адреса, как у страниц, нет!

В итоге я сделал так:

Контент окон темы размещается в шаблонах в подпапке ajax_blocks. Если владелец темы хочет добавить свой контент или переопределить имеющийся, то он создает для этого блоки в приложении Сайт. Блоки могут быть как общими для всех приложений ("block_name"), так и персональными ("site.block_name", "blog.block_name").

page.html темы дизайна:

{if waRequest::isXMLHttpRequest()}
  {* Получаем имя блока из GET данных запроса *}
  {$block = ['name' => $wa->get('ajax_block')]}
  {* Если задан блок, то попытаемся загрузить его *}
  {if $block.name}
    {* Получаем доп.параметры блока *}
    {$block.params = $wa->get('ajax_block_params', [])}
    {* Блок для текущего приложения *}
    {if $block.content = $wa->block("`$wa_app`.`$block.name`", $block.params)}
      {$block.content|strip}
    {* Пробуем найти блок общий для всех приложений *}
    {elseif $block.content = $wa->block($block.name, $block.params)}
      {$block.content|strip}
    {* Ищем шаблон в теме *}
    {elseif file_exists("`$wa_active_theme_path`/ajax_blocks/`$block.name`.html")}
      {include file="`$wa_active_theme_path`/ajax_blocks/`$block.name`.html" params=$block.params}
    {* Выводим предупреждение об отсутствии блока\шаблона в режиме отладки *}
    {elseif $wa->debug()}
      <div class="alert alert-warning">
        {sprintf(
          '[`Block <b>%s</b> not exists, create him in <a href="%s">backend</a>.`]',
          $block.name,
          "`$wa_backend_url`site/#/blocks/"
        )}
      </div>
    {/if}
  {* Если блок не задан, то отображаем контент без "обёртки" *}
  {else}
    {$page.content|strip}
  {/if}
{else}
  {* Не отображаем заголовок страницы на главной *}
  {if trim($page.url, '/') != trim($wa_app_url, '/')}
    <h1 class="page-title" itemprop="name">{$page.title|escape}</h1>
  {/if}
  <div class="page-content" itemprop="description">
    {$page.content|strip}
  </div>
{/if}

Для получения контента окон нужно отправить get запрос к любой текстовой странице.

В качестве главной я использую текстовую страницу, поэтому AJAX запрос выглядит так:

http://site.ru/?ajax_block=feedback&ajax_block_params[param1]=1&ajax_block_params[param2]=2

В приложении Магазин в качестве главной используется home.html, чтобы не изменять page.html, я просто переношу контент из home.html в текстовую страницу, а в home.html оставляю только отображение её контента:

{$page = $wa->shop->page($theme_settings.shop_homepage)}
{$page['content']|strip}

Если же приложение Магазин является основным, а Сайт не используется в фронтенде, то лучше перенести код из page.html в home.html.

2 комментария

  • +1
    Владимир Сергеев Владимир Сергеев 26 июня 2018 12:05 #

    А можно просто запретить индексировать страницу, которая идёт в Ajax, через доп. параметры. И точно также через доп. параметры скрыть её из меню страниц.

    • +1
      enso_studio@mail.ru enso_studio@mail.ru 26 июня 2018 12:36 #
      Я ориентировался на коммерческие темы под магазин wa, поэтому так много способов загрузки.

      Не уверен что этот запрет нужен и будет работать - в sitemap страница все равно попадет.

      Добавить комментарий

      Чтобы добавить комментарий, зарегистрируйтесь или войдите