포럼
템플릿 문법 내에서 함수 만들고 호출하기.
2012.05.12 23:24
빵조각 기능을 만들기 위해 만들게 되었는데 안타깝게도 기존의 생각대로 하면 3단, 4단 처럼 정해진 수만큼만 뽑아낼 수 있더군요. 물론 메뉴도 그렇구요. 그래서 함수를 재귀적으로 호출하게 된다면 ∞단(XE가 지원하는 최대 만큼)만큼 메뉴와 빵조각을 뽑아낼 수 있다고 생각해서 함수를 짜려고 했으나 !! 안타깝게도 XE 템플릿 문법에서는 {, }를 마음껏 표현할 수 없었습니다. (NHN 개발자들 기술력의 한계를 느끼며, 템플릿 문법 치환을 앞 뒤로 파악해 쪼여주는게 아니라 대충 분석해서 치환시키는 구조인게 문제, preg나 ereg 계열 정규식이 어떻게 동작하는지 대충 훑어봐도 어떻게 치환해줄지 감이 올텐데.. 안타까움)
그래서 우회적인 방법을 동원하였지요.
{@ $_traceRoot = create_function('', strtr('if(true) #[ return true; ]#', array('#[' => chr('123'), '#]' => chr('125')))); echo call_user_func($_traceRoot); }
대략 템플릿 문법에서 PHP 구문을 실행하기 위해서는 {@ ~~ } 으로 묶어주지요?
그러나 저 구문 안에서는 {, }를 쓰면 템플릿 문법이랑 충돌하는 탓에 에러가 뿜는 바람에
function() {}으로 노골적으로 함수를 선언할 수 없어서 우회적인 방법으로 PHP에 내장된 함수를 이용해
함수를 만들어서 반환해주는 create_function 함수를 사용해서 함수를 만들어냅니다.
물론 저 안에서도 if문이라던지 각종 구문에서 {, }가 필요한데 일부로 {를 #[으로 적고 }를 ]#으로 표기한 다음에
저 부분을 통째로 strtr 함수를 이용해서 #[을 {, #]을 }으로 각각 치환시키는데 여기서도 {, }을 직접 표기 못하니까
우회적인 방법으로 {, }의 아스키 코드인 123, 125를 chr 함수를 이용해 문자열로 바꾸어 주도록 표현했습니다.
그런데 가장 큰 문제점은 어이없게도 저렇게 만들어낸 함수를 직접 호출하면 선언되지 않은 함수라고 호출되지 않더군요.
그래서 call_user_func를 통해 변수에 담아둔 함수를 실행시키도록 했습니다.
(매번 짜면서 느끼는거지만 PHP에는 수 많은 유용한 함수가 있다는 것에 감탄)
댓글 5
-
Xiso
2012.05.14 11:13
-
언벨리티
2012.05.14 21:10
물론 그 점도 생각해보았는데 레이아웃을 서버에 추가할 때 레이아웃을 배포 받은 사용자마다 함수를 일일히 넣어야 하도록 하는 번거로움이 있는 탓도 있고 레이아웃을 만들때 조금 고생하면 배포할 때 편리하게 할 수 있겠지요.
-
Xiso
2012.05.15 23:02
아. ... 배포가 문제군요! 하하..
-
CMD
2013.01.02 19:39
{@eval(base64_decode('xxxxxxxxxxxxxxxxxxxxxxxxxxxx'))} 이런식으로 해도 될 것 같네요~
-
언벨리티
2013.01.06 15:34
헠 ; eval이 먹히던가요? ㄷㄷ 감사합니다 ~
./config/config.user.inc.php 파일을 생성하시면 funciton을 마음껏생성하실 수 있습니다.
위파일을 생성하면 index에서 require 해오므로, context 에서도, 애드온에서도, 모듈에서도, 템플릿에서도 funciton을 호출할 수 있습니다.