hTemplate – 3.4.assign()

템플릿 변수값 할당하기

assign() 함수는 템플릿 변수에 그 값을 할당하는 역할을 합니다. 템플릿 변수에 값을 지정할 때는 아래에 나타나 있는 바와 같이 3가지 방법으로 그 값을 지정할 수 있습니다.

  • assign(변수명, 변수값)
  • assign(array(변수명 => 변수값, …))
  • assign(변수명, array(변수값, …))

변수값의 3가지 형태

변수값으로는 문자열, 템플릿명, 블록변수명을 지정할 수 있습니다.

문자열을 할당하기

  • assign(변수명, 문자열)
  • assign(array(변수명 => 문자열, …))

문자열을 지정할 때는 그 문자열 값이 그대로 변수값으로 할당됩니다.

위와 같이 각 변수를 별개의 문장으로 처리할 수도 있으나 아래와 같이 배열을 이용하면 한 번에 여러 개의 변수에 값을 지정할 수 있습니다.

만약 동일한 변수명으로 중복되어 지정하게 되면 뒤에서 지정된 값이 앞에서 지정된 값을 덮어쓰게 됩니다. 즉 아래와 같은 경우를 보면 템플릿 변수 BODY에는 “계속 돌려봐야지”라는 값만 남아있게 되는 것이지요.

만약 덮어쓰기가 아니라 앞서 저장된 문자열 뒤쪽에 덛붙여서 추가하기를 원한다면 1.0.0 버전부터 지원되는 세 번째 인수를 이용하여 append 방식임을 지정하여 주시기 바랍니다.

이 예제를 실행하게되면 템플릿 변수 BODY에는 “잘되나 돌려봐야지. 계속 돌려봐야지.”이 최종적으로 할당됩니다.

assign() 함수의 두 번째 인수로 배열을 지정할 때

  • assign(변수명, array(서브변수명 => 문자열, …))

위와 같이 지정되는 변수값의 형태가 배열로서 서브변수명을 지정할 수 있습니다. 예를 들면 아래와 같은 경우를 생각할 수 있을 것입니다.

위와 같이 assign() 함수를 실행하게 되면 아래와 같이 4개의 템플릿 변수가 생성됩니다.

< 생성된 템플릿 변수 >
템플릿 변수명 변수값
{upfile.name} Autoexec.bat
{upfile.type} application/octet-stream
{upfile.tmp_name} c:\apache\php10D5.TMP
{upfile.size} 177

이와 같이 변수명과 서브변수명은 마침표(.)로 구분되어지며 이러한 과정은 재귀적으로 이루어지므로 2차원 이상의 다차원배열도 템플릿 변수값으로 지정할 수 있습니다.

“GLOBALS”와 “HTTP_COOKIE”라는 문자열은 서브변수명으로 지정할 수 없는 예약어입니다. 지정하더라도 템플릿 변수를 생성하지 않고 무시해 버립니다.

만약 위의 예에서 assign() 함수의 두 번째 인수로 지정된 배열의 형태가 문자열 인덱스 배열(associative array)가 아닌 정수 인덱스 배열이라면 서브변수명이 문자열 인덱스가 아닌 정수 인덱스를 사용하게 됩니다.

위와 같이 정수 인덱스로 지정된다면 아래와 같이 정수 인덱스를 서브변수명으로 취하여 4개의 템플릿 변수가 생성됩니다.

< 생성된 템플릿 변수 >
템플릿 변수명 변수값
{upfile.0} Autoexec.bat
{upfile.1} application/octet-stream
{upfile.2} c:\apache\php10D5.TMP
{upfile.3} 177

템플릿 처리하기

  • assign(변수명, 템플릿명)
  • assign(array(변수명 => 템플릿명, …))
  • assign(변수명, array(템플릿명, …))

assign() 함수에서 변수값으로 템플릿명을 지정하는 경우에는 해당 템플릿을 가져와서 그 내부에 포함되어 있는 템플릿 변수를 모두 처리한 후 그 결과값을 첫 번째 인수로 지정된 템블릿 변수명에 할당합니다. 따라서 템플릿을 처리할 때는 그 템플릿 내에 존재하는 템플릿 변수가 먼저 assign() 함수를 통해 특정 값으로 할당되어 있어야 합니다. 만약 할당되지 않는 템플릿 변수가 있으면 에러메시지를 출력(버전 0.0.1일 때)하거나 아니면 에러메시지없이 null 값으로 처리(버전 0.0.2부터)됩니다.

템플릿명 처리하는 방식

변수값으로 템플릿이 지정되었을 때는 지정 방법에 따라 세가지 방식(regular, compound, append)으로 처리되어 집니다.

regular 방식

regular 방식은 가장 기본적인 처리방식으로 지정된 템플릿 안에 포함된 템플릿 변수를 그 변수값으로 대치시킨 후 완성된 순수 HTML 코드를 첫 번째 인수로 지정된 또 다른 템플릿 변수에 저장하게 됩니다.

위와 같이 템플릿 내에 {TITLE} 라는 템플릿 변수가 존재할 때 아래와 같이 assign() 함수를 통해 {TITLE} 라는 변수에 “후키템플릿 블록실험”라는 값을 지정하여 보죠.

이런 경우 assign(“MAIN”, “main”)를 수행할 때 템플릿 “main”에 존재하는 템플릿 변수 {TITLE}가 모두 assign() 함수를 통해 미리 지정된 “후키템플릿 블록실험”라는 값으로 대치되는 것이지요. 대치된 결과는 첫 번째 인수로 지정된 MAIN이라는 또 다른 템플릿 변수에 저장됩니다. 이 예제의 경우 MAIN이라는 템플릿 변수에는 아래와 같이 순수 HTML 코드가 저장됩니다.

만약 assign() 함수를 통해 여러 개의 템플릿을 처리하는 경우라면 아래와 같이 작성하게 될 것입니다.

이러한 경우 배열을 이용하면 한 번에 처리할 수도 있습니다.

compound 방식 – 버전 1.0.0부터는 지원되지 않습니다.

compound 방식은 템플릿 변수를 통해 연결되어 있는 두 가지 이상의 문서를 동시에 처리할 때 유용합니다. 예를 들어 main.htm 및 table.htm이라는 두 가지 템플릿이 아래와 같이 있다고 하지요.

이러한 경우를 보면 $tpl->assign(“MAIN”, array(“table”, “main”));의 의미는 아래와 같이 두 개의 문장으로 나누어 기술할 수 있습니다. 즉, 우선 템플릿 table을 먼저 분석하여 그 결과값을 새로운 템플릿 변수 MAIN에 저장한 후 템플릿 main 분석결과를 템플릿 변수 MAIN에 다시 저장하는 것입니다.

assign() 함수의 두 번째 인수가 배열일 경우에는 변수값으로 문자열과 템플릿을 혼용하여 지정할 수 없습니다.

append 방식

마지막으로 append 방식에 대하여 알아보겠습니다. append 방식은 템플릿 변수를 새롭게 생성하는 것이 아니라 이전에 있던 템플릿 변수값에 새로운 값을 추가할 때 사용합니다.

append 방식을 처리하는 방법이 1.0.0 버전에서 약간 변경되었습니다.

1.0.0 이전 버전에서는 append 방식으로 적용하기 위해서는 아래와 같이 지정하는 템플릿명 앞에 마침표(.)를 붙여주면 됩니다.

  • assign(변수명, “.템플릿명”)

템플릿 변수값이 템플릿명(또는 블록명)일 때를 살펴보면 템플릿명(또는 블록명)의 첫자가 ‘.’인 경우에는 해당 템플릿에 대하여 append 방식으로 처리합니다.

이와같은 dot 문자에 의한 append 기능은 1.0.0 버전부터는 이를 공식적으로는 지원하지 않으며(동작은 하지만 향후 버전과 호환성없음), 1.2.0 버전부터는 기능 자체가 삭제되었습니다. 따라서 append 기능을 사용하려면 아래와 같이 세 번째 인수를 true로 설정하기 바랍니다.

  • assign(변수명, 템플릿명, true)

템플릿 파일 row.htm의 내용이 아래와 같다고 가정하겠습니다.

템플릿 파일 row.htm을 가지고 아래와 같은 PHP 문서를 실행하여 보지요.

우선 $tpl->assign(“ROWS”, “row”) 문장에 의해 템플릿 변수 ROWS에는 아래와 같은 값이 기록되겠지요.

다음 $tpl->assign(“ROWS”, “row”, true) 문장을 추가로 수행하게 되면 결과값이 템플릿 변수 ROWS의 기존의 값을 지우지 않고 그 뒤에 추가로 기록하게 되며, 최종적으로 템플릿 변수 ROWS에 기록되는 값은 아래와 같을 것입니다.

append 방식이냐 아니냐를 나타내는 세 번째 인수는 1.0.0 버전부터 지원되며 이를 이용하면 템플릿 변수값이 일반 문자열일 때도 append 방식으로 처리할 수 있습니다.

예를 들어 아래와 같이 regular 방식으로 처리되는 예제를 살펴보겠습니다.

이 예제를 실행하게되면 템플릿 변수 TEST에는 “456”이 최종적으로 할당됩니다.

이제 일반 문자열에 대하여 append 방식으로 처리하도록 두 번째 문장을 regular 방식이 아닌 append 방식으로 변경하여 보지요.

이 예제를 실행하게되면 템플릿 변수 TEST에는 “123456”이 최종적으로 할당됩니다.

블록변수(다이나믹 블록) 처리하기

블록변수(다이나믹 블록) 처리방법은 템플릿 처리방법과 동일합니다.

  • assign(변수명, 블록변수명)
  • assign(array(변수명 => 블록변수명, …))
  • assign(변수명, array(블록변수명, …))

템플릿을 처리하는 것과 다른 점이 한가지 있습니다.

지정된 해당 블록 내용을 가져와서 그 내부에 포함되어 있는 변수를 모두 처리한 후 그 결과값을 지정된 블록변수명에 해당하는 변수에 할당합니다. 각 블록에는 지정된 템플릿 변수가 미리 정의되어 있습니다. 이 변수명은 블록변수명과 동일합니다.

0.0.1 버전에서의 assign() 함수의 첫 번째 인수 처리 방식

이러한 이유로 후키템플릿 버전 0.0.1에서는 블록을 처리할 때 지정되는 첫 번째 인수에 어떠한 이름을 지정하더라도 상관없이 이를 무시하고 블록명을 가지고 템플릿 변수명으로 강제 지정하여 처리해 줍니다.

예를 들어 블록변수(다이나믹 블록)이 포함된 템플릿 파일 및 이를 처리하는 PHP 코드가 아래와 같다고 할 때 여기에서 보면 블록 “row”를 assign() 함수로 처리할 때 첫 번째 인수가 “DUMMY”로 지정하였으나 “DUMMY”라는 템플릿 변수명은 의미없는 이름이며 어떠한 이름을 지정하여도 관계없습니다.

지정된 이름이 무엇이든지 관계없이 블록명 “row”를 템플릿 변수명으로 강제 지정합니다. 즉, 블록 “row”의 처리결과는 강제 지정된 템플릿 변수명 “row”에 저장되는 것이지요.

따라서 아래의 예들은 모두 새로운 템플릿 변수 “row”라는 것을 생성하여 블록 “row”의 처리 결과를 저장합니다. 여기서 “DUMMY”, “STAR”, “hwooky”는 모두 의미없는 인수로 무시되어 버립니다.

0.0.2~0.0.4 버전에서의 assign() 함수의 첫 번째 인수 처리 방식

 버전 0.0.2에서는 첫 번째 인수를 반드시 두 번째 인수로 지정되는 블록명과 동일하게 지정하도록 수정하였습니다.

버전 0.0.1을 가지고 제 홈페이지에 적용하여 실험하다보니 의미없는 첫 번째 인수로 인해 소스 코드에서 블록을 처리하는 assisgn 함수 부분의 의미가 불명확하게 되고 이에 따라 소스 코드의 가독성도 떨어진다는 생각이 들었습니다.

따라서 첫 번째 인수의 의미를 분명히 하는 것이 좋겠다는 판단이 들어 첫 번째 인수가 진정 의미하고 있는 실제 템플릿 변수를 지정하도록 그 문법을 엄격하게 적용하게 되었습니다.

만약 위와 같이 버전 0.0.1에서 하던 습관대로 작성하게 되면 “In CASE is block, must specify template variable name equally with block name.: [assign(“DUMMY”, “row”) => assign(“row”, “row”)]” 라는 에러메시지를 출력하도록 되어 있습니다. 따라서 이러한 에러메시지를 피하려면 아래와 같이 수정하시기 바랍니다.

수정하지 않더라도 에러메시지만 출력할 뿐 실행에는 버전 0.0.1과 마찬가지로 정상적으로 처리되고 있습니다.

1.0.0 버전에서의 assign() 함수의 첫 번째 인수 처리 방식

버전 1.0.0부터는 다이나믹 블록을 처리할 때 첫 번째 인수를 반드시 두 번째 인수로 지정되는 블록명과 동일하게 지정하여야 합니다.

만약 이를 지키지 않으면 0.0.2 ~ 0.0.4 버전과 달리 에러메시지 출력하는 즉시 스크립트가 중지되어 버립니다.

템플릿 변수 삭제하기

후키템플릿에서는 템플릿 변수를 삭제하는 함수를 별도로 제공하지 않습니다. 대신에 assign(변수명, “”)와 같이 assign() 함수를 이용하여 빈문자열을 할당하게 되면 변수값을 지울 수 있습니다. 변수값을 지우는 경우는 아래와 같이 주로 이중 블록 처리할 때 순환문 시작(또는 끝) 부분에 위치하게 될 것입니다.

답글 남기기