Тема: Snakeskin
Показать сообщение отдельно
  #338 (permalink)  
Старый 10.11.2014, 21:49
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Цитата:
1. как подключить не скомпилированный шаблон на страницу (в формате *.ss)?
https://github.com/kobezzza/Snakeski...B5%D1%80%D0%B5

Цитата:
{proto my_pro() =>}
//содержание
{/proto}
Да, мне казалось это очевидно, спс за наводку

Цитата:
Можно ли вызвать шаблон внутри шаблона?
Конечно, ты же можешь вызывать любую функцию в шаблоне, а шаблон - это функция, есть даже сахарок для этой задачи: https://github.com/kobezzza/Snakeskin/wiki/call

Цитата:
4. В каких случаях лучше использовать Блоки, а в каких Прототипы?
Тут нужно пояснить: с прототипами всё ясно, но какие блоки ты имешь ввиду: статичные или вызываемые?

Отвечу пока кратко тут: прототипы и вызываемые блоки - это методы шаблона, только прототипы приватные, а блоки - публичные, также у них есть некоторые принципиально архитектурные отличия: прототип обрабатывается на этапе трансляции, блок в рантайме, следовательно: прототип увеличивает время трансляции и размер конечного файла, но выполняется супер быстро (+ оптимизация хвостовой рекурсии), но менее гибкий чем блок, а блок быстрее транслируется и занимает меньше места в конечном файле и более гибкий, но работает медленне и нет оптимизации рекурсии, главное, что нужно знать, что их можно использовать друг с другом, т.е. блок вкладывать в протип и наоборот и получать достоинства обеих реализаций.

Цитата:
Как/можно_ли объявить независимый прототип/блок, который можно использовать в любом шаблоне?
Формально такое сделать нельзя, если ты хочешь заюзать блок или прототип шаблона А в шаблоне Б, то нужно шаблон Б отнаследовать от А и все его методы (а прототипы и блоки фактически таковыми являются) отнаследуются с ним, но то, что хочешь сделать ты делается очень просто: просто общий функционал, который нужен во всех независимых шаблонах выносится в отдельные шаблоны и всё:

/// Независимый блок - это шаблон
{template blockName(arg)}
  {arg}
{/template }

{template a()}
  {call blockName('аргумент')}
{/template}

{template b()}
  {call blockName('другой аргумент')}
{/template}


Вариант наследования более гибкий, т.к. в дочернем шаблоне тот или иной блок или прототип можно переопределить или доопределить с помощью директивы super.

Я обычно завожу уровень супершаблонов, в котором реализован базисный функционал и потом наследуюсь от них, как раз для таких задач были введены директивы placeholder и interface.

- proto base->logo()
   ...

- proto base->icon()
   ... 

- placeholder base()

...

- template button() extends base
   - apply logo()


В моём проекте 3-и уровня супершаблонов, это позволят добится максимального code-reuse и очень просто поддерживать. Вообще ОО-подход - это главная фича SS и сделана лучше всего, поэтому не нужно боятся создавать уровни наследования, т.к. сама либа это пропагандирует.

***

Спасибо за вопросы, распишу ответы в FAQ, приступлю скорее всего с пятницы, т.к. сейчас завал по другим делам.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 10.11.2014 в 22:27.
Ответить с цитированием