문제

나는 주로 템플릿을 스스로 포함시키는 것을 기반으로 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는 간단해야합니다. 이것은 소리가 들리지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top