/ PHP

Migration Smarty to Raintpl3

달라진 점. (difference)

  1. {if condition}
  • {if="condition"}
  1. {elseif condition}
  • {elseif="condition"}
  1. {include "filename.tpl"}
  • {include="filename"}
  1. {Func()}
  • {function="Func()"}
  1. {Func($param,3)}
  • {function="Func($param,3)"}
  • {$param|Func:3} (Similar as smarty)
  1. {foreach $array as $_key => $_val}key:{$_key} val:{$_val}{/foreach}
  • {loop="$array" as $_key => $_var}key:{$_key} val:{$_val}{/loop}
  • {loop="$array"}key:{$key} val:{$val}{/loop}
  1. {($variable)|number_format} (Syntax Error)
  • {($variable)|number_format}
  1. {for $i=1 to $targetCount}
  • {loop="range(1,$targetCount)" as $i}
  1. {assign var=myObject value=MyClass::myStaticMethod({$variable})} (Undefined Feature, Syntax Error ({$variable**}**))
  • {$myObject=MyClass::myStaticMethod($variable)}

추가적으로 참고용. (Additional)

  1. {filemtime("{constant("__ROOT__")}/static/css2/min.css")}
  • {function="filemtime(__ROOT__.'/static/css2/min.css')"}
  1. {'text'|__}
  • {"text"}

정규식 Replace

  1. \{if (.*?)\}
  • \{if="$1"\}
  1. \{include file="(.*?)\.tpl"\}
  • \{include="$1"\}
  1. \{foreach \$(\S*) as \$(\S*) => \$(\S*)\}
  • \{loop="\\$$1" as \\$$1 as \\$$2\}
  1. \{foreach \$(\S*) as \$(\S*)\}
  • \{loop="\\$$1" as \\$$2\}
  1. \{/foreach\}
  • \{/loop\}
  1. \{([a-zA-Z]*)\((.*?)\)\}
  • \{function="$1($2)"\}
  1. \{\((.*?)\)\|(\S*?)\}
  • \{$1|$2\}

모두 치환 한 뒤에는 직접 하나하나 보면서 처리해야할 부분들이 많다. 특히 변수의 사용에 있어서 복잡한 수식이나 함수의 사용이 있을 경우 ({$test->func($variable*100)} 등) 직접 손으로 수정해야할 코드가 많다.

특히 Smarty 와 비슷한 연산자인 | 와 : 를 사용해 함수를 쓰는 부분에서는 Smarty 와 약간 동작을 다르게 하고 있다. Smarty 의 경우에는 | 의 바로 왼쪽에 있는 token 을 대상으로 연산, raintpl 은 {으로부터 시작해 | 의 바로 왼쪽까지 있는 코드를 모두 연산한다.

예를들어 $var 이 10일 때,

  • (Smarty) {$var*0.7|round} : 10
  • (Raintpl3) {$var*0.7|round} : 7

또 Smarty 에 존재하던 {include "filename" variable1=$variable} 와 같이 인라인으로 변수를 할당하는 문법이 존재하지 않으므로 수동으로 위에서 지정해줘야하며, 또 역시 이로 인한 버그가 존재 할 수 있다.

Smarty

{$var="2"}
{$var}
{include "file.tpl" $var="1"}
{$var}

Result

2
2

Raintpl3

{$var="2"}
{$var}
{$var="1"}
{include="file"}
{$var}

Result

2
1

위의 소스만을 보고 판단하면 당연한 결과지만, 보통 {$var="2"} 을 소스의 아주 윗 부분이나 혹은 php 에서 assign 하여 사용하던 변수일 경우가 많으므로, 이런 버그가 생길 가능성은 충분히 크다. (issue on github)

발견한 버그

  • {loop="$array" as $key => $someValue} 이렇게 key 변수를 $key로 지정해주면 버그가 생김. ($key는 기본값임) (issue on github)