AJAX загрузка блоков в теме
Задался вопросом: а где хранить контент модальных окон темы, вызываемых через 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 комментария
А можно просто запретить индексировать страницу, которая идёт в Ajax, через доп. параметры. И точно также через доп. параметры скрыть её из меню страниц.
Не уверен что этот запрет нужен и будет работать - в sitemap страница все равно попадет.