Smarty에서 재귀를 처리하는 가장 좋은 방법은 무엇입니까?
문제
나는 주로 템플릿을 스스로 포함시키는 것을 기반으로 Smarty에서 재귀를 처리하는 몇 가지 방법을 찾았습니다. 이는 말도 안되는 자원 낭비처럼 보입니다. 나는 Smarty에서 Messju가 옳은 것처럼 보이는 하나의 솔루션을 찾았습니다. 그러나 그것은 최신 버전의 Smarty에서 지원되지 않고 실패합니다.
사람들에게 : 내가 똑똑하게 인쇄하기를 원하는 것은 항목 배열로 정의 된 토론 스레드입니다. 항목에 하나 이상의 답변이있는 경우, 그 답변은 배열에서 해당 항목 등을 어린이로 표시합니다.
array(
array(
'id'=>0,
'headline'=>"My parent headline",
'body' =>"My parent body",
'children'=>array(
array(
'id'=>1,
'headline'=>"My firstChild headline",
'body' =>"My firstChild body",
'children'=>array()
),
array(
'id'=>2,
'headline'=>"My secondChild headline",
'body' =>"My secondChild body",
'children'=>array()
)
)
),
);
중첩 어레이에는 임의의 깊이가 있으며 각 항목에는 임의의 어린이가 있습니다. 나에게 이것은 순수한 디스플레이 로직을 고려하기 때문에 템플릿의 범위 내에서 내가하고 싶은 일이다. 템플릿 외부에서 HTML 또는 일부 유형의 HTML 자리 표시자를 처리 할 필요가 없습니다.
나는 이것을 중첩 된 목록으로 인쇄하기를 원한다 :
<ul>
<li>
<h1>My parent headline</h1>
<p>My parent body</p>
<ul>
<li>
<h1>My firstChild headline</h1>
<p>My firstChild body</p>
</li>
<li>
<h1>My secondChild headline</h1>
<p>My secondChild body</p>
</li>
</ul>
</li>
</ul>
나는 이것이 사례별로 문제 일 수 있다는 것을 깨닫기 시작했기 때문에, 만능 솔루션을 가지고 있지만,이를 구체적으로 처리하기 위해 Smarty 플러그인을 작성할 것입니다.
방법이 있습니까?
해결책
"재귀를 이해하려면 먼저 재귀를 이해해야합니다 ..."
농담. 이것은 당신이 원하는 것을해야합니다.
<?php
/*
* Smarty plugin
* ————————————————————-
* File: function.recurse_array.php
* Type: function
* Name: recurse_array
* Purpose: prints out elements of an array recursively
* ————————————————————-
*/
function smarty_function_recurse_array($params, &$smarty)
{
if (is_array($params['array']) && count($params['array']) > 0) {
$markup = '';
$markup .= '<ul>';
foreach ($params['array'] as $element) {
$markup .= '<li>';
$markup .= '<h1>' . $element['headline'] . '</h1>';
$markup .= '<p>' . $element['body'] . '</p>';
if (isset($element['children'])) {
$markup .= smarty_function_recurse_array(array('array' => $element['children']), $smarty);
}
$markup .= '</li>';
}
$markup.= '</ul>';
return $markup;
} else {
return 'not array';
}
}
파일을 Smarty/Plugins 폴더에 배치하십시오. 배열을 Smarty에 할당 한 다음 템플릿에서 다음과 같이 호출하십시오.
{recurse_array array=$data}
다음은 맞춤형 스마트 기능을 만들기위한 훌륭한 자습서입니다.
이 예제가 기본 데이터 구조에 의존하는 종속성을 알고 있어야합니다. 또한 비정상적으로 길거나 깊게 중첩 된 데이터 세트는 실제로 느릴 수 있습니다. 복잡성을 관리하고 문서화를 잘 유지하면 괜찮을 것입니다. 행운을 빕니다!
다른 팁
Smarty 3을 사용하면 {function}을 사용하여 수행 할 수 있습니다. 다음 코드는 필요한 OUPUT를 생성합니다.
{function name=printList}
<ul>
{foreach $items as $item}
<li>
<h1>{$item['headline']}</h1>
<p>{$item['body']}</p>
{if $item['children']}
{call name=printList items=$item['children']}
{/if}
</li>
{/foreach}
</ul>
{/function}
{call name=printList items=$comments}
자세한 정보는 다음에서 확인할 수 있습니다 문서.
참고 : 복잡하거나 재귀적인 것이기 때문에 템플릿 내부에있을 수 없다는 의미는 아닙니다. 하나님을 위해 HTML Ul-Li 구조는 자연스럽게 재귀 적이며 그것을 숨기거나 다른 곳으로 이동함으로써 (템플릿에 비해 너무 복잡하기 때문에) 응용 프로그램에 추가 복잡성을 소개합니다.
Smarty 용 사용자 정의 기능/수정 자/플러그인 작성을 고려할 수 있습니다. 기능이 사용해야하는 템플릿을 정의하면서 배열을 사용자 정의 기능으로 전달하십시오. 간단한 경우 특정 장소에 텍스트를 삽입하는 경우 만 기능 내에서 템플릿을로드하고 Regexes/str_replace/...
또는 Smarty Templates를 사용하지 않고 PHP에서 직접 수행하십시오. 필요한 모든 것은 H1, UL, Li 및 P 태그 만 있으므로 레이아웃 사용 CSS를 변경하십시오.
또는 우려가 Smarty에서 파일을 열고 닫는 오버 헤드 인 경우, 90%의 수준의 양이 얼마인지 추정하고 90%를 커버하는 템플릿을 작성하십시오. 나머지는 템플릿 자체를 포함하여 재귀를 사용합니다 ...
가장 좋은 방법은 그렇게하지 않는 것입니다.
Smarty는 간단해야합니다. 이것은 소리가 들리지 않습니다.