@RA
RA
28 Nov 2016

Вечный вопрос. Мне нужен шаблонизатор. В новом проекте хочется уйти с xslt.
Порекомендуйте шаблонизатор, но такой чтобы в нём было что-то подобное xsl:call-template. Может оно там макросами зовётся. В двух словах это выглядит примерно так

<xsl:template name="f_button">
  <xsl:param name="color">red</xsl:param>
  <xsl:param name="text">caption</xsl:param>
  <span>
    <button style="color:{$color}"><xsl:value-of select="$text"/></button>
  </span>
</xsl:template>

Потом в нужном месте вызываем

<xsl:call-template name="f_button">
  <xsl:with-param name="color">green</xsl:with-param>
  <xsl:with-param name="text">my text</xsl:with-param>
</xsl:call-template>
28 Nov 2016

Такое практически любой умеет.

$this->view('f_button', ['color' => 'green', 'text' => 'my text']);

Это даже на коленке за полдня написать можно.

28 Nov 2016

вот это $this->view вызывается как-то из шаблона в виде <?php $this->view... />
да?

#oozirt/2 в ответ на /1
28 Nov 2016

RA, ну да, это в основном шаблоне воткнуто.

#oozirt/4 в ответ на /2
28 Nov 2016

f_button.php

<span>
  <button style="color: <?= $this->color; ?>"><?= $this->text; ?></button>
</span>
#oozirt/3 в ответ на /1
28 Nov 2016

это не подходит. Если надо так

<xsl:call-template name="f_button">
  <xsl:with-param name="color">green</xsl:with-param>
  <xsl:with-param name="text">зелёная кнопка</xsl:with-param>
</xsl:call-template>
И РЯДОМ
<xsl:call-template name="f_button">
  <xsl:with-param name="text">красная</xsl:with-param>
</xsl:call-template>
#oozirt/5 в ответ на /3
28 Nov 2016

RA, а это уже зависит от того, как ты f_button напишешь.

#oozirt/6 в ответ на /5
28 Nov 2016

RA, ты что, условные операторы писать не умеешь? ;)

#oozirt/7 в ответ на /5
28 Nov 2016

я очень хочу избежать вот такого в php коде

 public function button($text, $href='', $onclick='', $type='default', $size='', $class_add='') {
        $btn_text = '<a class="btn pointer';
        $btn_text.= ' btn-'.$type;
        if($size!='') $btn_text.= ' btn-'.$size;
        if($class_add!='') $btn_text.= ' '.$class_add;
        $btn_text.= '"';
        if($href!='') $btn_text.= ' href="' . $href . '"';
        if($onclick!='') $btn_text.= ' onclick="' . $onclick . '"';
        $btn_text.= '>' . $text . '</a>';

        echo $btn_text;
    }

Все эти теги по-хорошему должны быть в шаблонах.

#oozirt/8 в ответ на /7
28 Nov 2016

RA, через массив передавай. Зачем ты плодишь 100-500 параметров?

#oozirt/9 в ответ на /8
28 Nov 2016

пофиг на параметры. Это паста с непойми какого проекта. Проблема в том, что такой код совсем не читается и не место html-тегам в php коде.
Массив тоже плохо - такой параметр плохо документируется и придётся постоянно в код заглядывать, чтобы узнать как называются ключи в массиве.

#oozirt/11 в ответ на /9
28 Nov 2016

RA, ключи обычно называются как параметры у соответствующего html тега.

#oozirt/12 в ответ на /11
28 Nov 2016

RA, ты вот сейчас пхп ни с чем не перепутал?

#oozirt/13 в ответ на /11
28 Nov 2016

не понял мысль

#oozirt/14 в ответ на /13
28 Nov 2016

RA, про "не место хтмл тегам в пхп" :)

#oozirt/16 в ответ на /14
28 Nov 2016
public function button($text, $options = array()) {
   $btn_text = '<a class="btn pointer';
   if (isset($options['type'])) {
      $btn_text .= ' btn-'.$options['type'];
   } else {
      $btn_text .= ' btn-default';
   }
   ...
}
#oozirt/10 в ответ на /8
29 Nov 2016

это пример хорошего кода?

#oozirt/17 в ответ на /10
28 Nov 2016

Не имел дела с XSLT, поэтому не очень распарсил суть проблемы.
А чем Twig плох?

29 Nov 2016

вчера на него смотрел. У него есть макросы, что похоже на то, что мне нужно.
Но под него не нашёл нормального плагина для ide (eclipse), так чтобы были автодополнение названий макросов и их параметров.

#oozirt/18 в ответ на /15
29 Nov 2016

У него и наследование есть, и импорты. Про Eclipse не знаю, я в PhpStorm только работаю - там поддержка есть.

#oozirt/19 в ответ на /18
29 Nov 2016

Немножко офтопик, но в Ruby можно так:

def button(opts)
  %(<button style="color: #{opts[:color]}">#{opts[:text]}</button>)
end

puts %(
<html><head></head>
<body>
  #{button color: "red", text: "Click me!"}
</body>
</html>
)

Можно так:

def method_missing(method_id, *args, &block)
  return super unless args.size == 1 and args.first.is_a? Hash
  "<#{method_id} #{args.first.map { |key, value| %(#{key}="#{value}") }.join(" ")}>#{(block or lambda { "" }).call}</#{method_id}>"
end

def button_(opts)
  button(style: "color: #{opts[:color]}") { opts[:text] }
end

puts button_(color: "red", text: "Hello!")

А еще есть ERB.

Комментарий был отредактирован в 20:37:43 29.11.2016
#oozirt/21

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.