글쓴사람 앙푸
글쓴시간2004년 5월 30일 오전 5시 35분 16초
    제목PHP코딩으로 loop용 array설정
여러 페이지에 삽입되는 모듈을 tpl로 작성하려는데
해당 모듈을 사용할때마다 각 php 페이지에 해당 함수를 사용하려니
번거로운 면도 있고 실수로 빠뜨릴 가능성도 있고 해서
직접 해당 tpl에 PHP코딩으로 사용하려고 했더니 작동이 안되더군요.

<? {list} = getlist() ?>
{@ list}....{/}
이런식으로 했더니 원하는데로 동작을 하지 않습니다.

PHP코딩이 권장사항이 아닐 수는 있지만 제 생각에는 이렇게 하는게 더 직관적이고 편하게 보입니다.

컴파일된 tpl.php를 보면
$TPL_xx_1=... 을 페이지 처음에 몰아놓아서 생기는 문제 같은데
실제 루프 코드 바로 앞에서 이부분을 처리하면 해결되겠네요.

Template_compiler.php:460 (function _compile_statement())
460: //return array(2, 'if($TPL_'.$src.'_'.$d.'){');
461:  $loop_array = '$TPL_VAR["'.$src.'"]';
462: return array(2, $size .= $this->nl.'$TPL_'.$src.'_'.$d.'=empty('.$loop_array.')||!is_array('.$loop_array.')?0:count('.$loop_array.');'.'if($TPL_'.$src.'_'.$d.'){');

이렇게 바꿔보니 소기의 목적은 달성했습니다.

검토해 보시고 문제가 없다면 다듬어서 반영을 해주셨으면 좋겠습니다.

--PS
훌륭한 라이브러리를 공개해 주신데 대해 정말 감사드립니다.
좀더 바라는게 있다면 template_를 프로젝트에 적용하는 유형에 대한 실전예제가 있었으면 좋겠습니다.
물론 직접 이런작업까지 하시기는 힘드시겠지만
홈페이지에 위키를 달아 사용자들이 참여할 공간을 만들어 놓는다면 이런부분도 해결이 가능하지 않을까 하는 생각이 듭니다.
관리자 앙푸님 안녕하세요.

$TPL_xx_1 이 처음에 몰려있는 이유는.. size_ 예약어를 해당루프 앞 쪽에서도 사용할 수 있도록 하기 위한 것이구요..

알고 질문하신 건지 모르겠는데.. 설명서 3-16 보시면..

{@ getlist()} {.title} {.name} .. {/}

이런 식으로 하실 수 있습니다. 이 방법으로 만족하실 수 없다면 말씀해 주시구요..


예전에 파란님께서 제안하신..

{@ list = getlist()} {list.title} {.name} {/}

형식이 있었는데.. 루프구문에 한정되더라도 템플릿 내에서 할당연산 허용여부는 결정하기 어려운 문제이네요.


그리고 위키를 생각 못하고 있었는데.. 붙여보도록 하겠습니다.

의견 주셔서 감사합니다.
04-05-30 10:37
관리자 P.S. 권장사항이 아니라고 하긴 했지만.. 말씀하신 php 코드가 안되는 것이.. 역시 바람직해 보이지는 않네요.
04-05-30 10:51
앙푸 size_에 문제가 있을꺼라는 생각이 문득들어서 덧글을 달려고 했는데 벌써 답변을 주셨네요.
이미 그런 방법이 있는것도 모르고 쓸데없는 짓을 했네요.
빠른답변 감사합니다.
04-05-30 12:49
앙푸 근데 size_도 필요한 경우는 대책이 없네요.
<? {list} = getlist() ?>이런식으로 php코딩에 array가 정의 됐을때 마다 php코드를 파싱해서 $TPL_xx_1을 재 정의하는건 현실적으로 불가능 하고
template_ 태그를 추가해야만 가능할 듯...
04-06-01 00:49
앙푸 이런 얘기를 하는건
예를들어 {list}에 항목이 있을때만
<table>을 추가하고 루프에서 <tr>...</tr>만 넣을 경우라던지 {list}가 비었으면 다른 내용을 출력해야 될때 사용 할 수 있습니다.
04-06-01 01:22
앙푸 확인해보니 {@}...{:}...{/}형식이 먹히네요.

알면 알수록 template_ 대단하네요.
04-06-01 01:25
관리자 표현식을 사용할 때도 loop else 명령 {:} 이 됩니다.

그리고 배열의 크기가 필요하거나.. 같은 루프를 여러 번 돌릴 경우..를 위해서 객체나 객체플러그인을 사용해 볼 수 있습니다.

function getList() {
 if (isset($this->list)) return $this->list;
 $this->list = ....;
 return $this->list;
}

이렇게 하면 메서드를 여러 번 호출해도 한 번만 코드가 실행되니까.. 괜찮긴 한데.. 비즈니스로직을 전부 플러그인으로 만드는 분도 계시고.. 아무튼 적절히 편한대로 하시면 될 거 같습니다.
04-06-01 09:31
    이름
비밀번호
 
Since 2003-03-03 hosted on vultr.com