На самом деле в этой статье главное, что я хочу показать - это силу Smarty-шаблонизацию :) И посмотрим мы это на реальном примере. Сразу попрошу не кидаться помидорами по поводу чистоты кода и JS-а в основной части страницы (это все будет в процессе поправлено, пока проект в работе, да и не критично это совсем). Главное - это понять механизм работы расширяемых смарти-шаблонов и блоков в них.
{block name=content}
[[!smarty?tpl=`shop/catalog/list.tpl`]]
{/block}
[[!smarty?tpl=`shop/catalog/ajax/list.tpl`]]
{extends file="shop/catalog/list.tpl"}
{block name=products_content}
{$products_html}
{/block}
То есть все В нем больше ничего нет. И он выводит только основную часть каталога и больше ничего.
В чем магия? Переопределение блока products_content. https://gist.github.com/Fi1osof/03da6107160d12575dad#file-gistfile1-tpl-L23.
То есть все, что выше этого блока (формирование фильтров, вызов процессора, набивка HTML-а товаров и т.п.), и ниже этого блока (если что-то там появится) - все это будет так же выполняться, а основной блок products_content в расширяющем процессоре переопределяется и выводится только HTML товаров.
Таким образом мы имеем единый механизм вывода каталога обычным способом и Ajax-ом.
То есть и логика выборки единая, и оформление единое и т.д. и т.п., но вывод мы аккуратно переопределяем.