문제

궁금합니다.

{{HEADER}}

Hello my name is {{NAME}}

{{#CONTENT}}
    This is the content ...

    {{#PERSONS}}

        <p>My name is {{NAME}}.</p>

    {{/PERSONS}}

{{/CONTENT}}

{{FOOTER}}

물론 이것은 결국 다소 템플릿 시스템이되기위한 것이므로, 내 계획은 템플릿을 "배치"할 수있는 해시 맵을 작성하는 것입니다.

$hash = array(
    'HEADER' => 'This is a header',
    'NAME' => 'David',
    'CONTENT' => array('PERSONS' => array(array('NAME' => 'Heino'), array('NAME' => 'Sebastian')),
    'FOOTER' => 'This is the footer'
    );

"섹션"( #로 시작하는 태그)이 두 번 이상 반복 될 수 있다는 점에 주목할 가치가 있으며, 이것이 나를 여행하는 것이라고 생각합니다 ...

또한 모든 섹션은 다른 여러 섹션과 일반 태그를 포함 할 수 있습니다 ...

그래서 .. 어떻게 했어?

도움이 되었습니까?

해결책

다음과 같은 예상 출력입니다.

이것은 헤더입니다

안녕하세요 제 이름은 David입니다

This is the content ...

My name is Heino.

My name is Sebastian.

이것은 바닥 글입니다


해시 맵의 중첩 어레이와 템플릿의 반복 가능한 섹션과의 관계를 어떻게 관리하고 있습니까? 템플릿의 실제 동작은 무엇입니까? 비 섹션 요소의 배열이 제공되면 어떻게됩니까? 섹션 요소에 단일 값이 제공되면 단일 요소 만있는 배열과 동일하게 처리됩니까 (그렇게 가정합니까?

어쨌든, 템플릿의 파서와 관련하여 (데이터 매핑으로 무엇을하든) ... 내가 할 일은 각 유형의 토큰에 대한 클래스를 만드는 것입니다. . 이들은 우선적 인 구문 분석, 렌더링 및 맵 메소드가있는 일반적인 토큰 기본 클래스에서 상속됩니다.

상태 다이어그램을 도표화하고 각 상태에 대한 입력 및 출구 포인트가 무엇인지 파악한 다음 토큰 간의 통화 구조로 인코딩하십시오. 결국 템플릿을 설명하는 열거 가능한 토큰 컬렉션을 생성하려고합니다.

이를 추상적 인 형태로 사용하면 토큰의 컬렉션 호출 맵을 통해 해시 맵에서 토큰으로 데이터를 할당 한 다음 렌더를 호출하여 템플릿을 최종 양식으로 렌더링합니다.

도움이되기를 바랍니다.

다른 팁

가장 효율적인 방법은 엮다 PHP 코드에 대한 템플릿. 그리고 그냥 포함 컴파일 된 버전.

그만큼 스마트 템플릿 엔진 비슷한 일을합니다. Smarty 소스를보고 태그를 구문 분석하는 방법을 확인할 수도 있습니다.

XML 또는 JSON과 같은 기존 파서와 함께 무언가를 사용하는 것이 더 나을 것입니다. 따라서 자신의 파서를 작성할 필요가 없으므로 다른 사람들이 특수 도구없이 구문 분석기를 쉽게 쓸 수 있도록합니다. 그러나 자신의 파서를 쓰고 싶다면 아마도 사용을 살펴보고 싶을 것입니다. 법률 그리고 YACC.

나는 더 똑똑하고 더 열심히 일하는 것을 좋아하기 때문에 타사 파서와 함께 갈 것입니다. 그러나 운동으로 이것을하고 있거나 자신의 템플릿 엔진을 만들고 싶다면 (PHP에서 태그 때문에 가정), 나는, 나는, 나는, 나는, 나는, 나는, 나는, 나는, 나는, 나는, 나는, 나는, 나는 것이다. 디자인 패턴을 검토하는 것으로 시작합니다 복합 디자인 패턴 구체적으로.

복합 패턴은 XML 파싱을 포함한 이와 같은 것들을 위해 Java 프레임 워크에서 많이 사용됩니다.

a .php 별도 파일 안에 이와 같은 것을 사용합니다.

<?php echo $HEADER ?>

Hello my name is <?php echo $NAME?>

<div id="CONTENT">
    This is the content ...

    <?php foreach ($PERSONS as $PERSON) : ?>

        <p>My name is <?php echo $PERSON['NAME']?>.</p>

    <?php endforeach ?>

</div>

<?php echo $FOOTER ?>

위의 파일을 참조 된 변수가 채워진 파일 안에 포함하십시오.

믿거 나 말거나, PHP는 이미 구현할 것이라고 주장하는 시스템 템플릿을 제공하는 모든 기능을 제공합니다. PHP 위에 다른 추상화 (및 복잡성)를 추가 할 필요가 없습니다.

나는 사용한다 PHP의 DOM 이것을 위해. 내 템플릿 언어는 단순히 ID 및 클래스 속성이있는 HTML입니다. 그래도 계획을 고수하고 싶다면 preg_replace_callback 구문과 일치하는 패턴과 해시에서 적절한 교체를 찾는 콜백 함수로 컨테이너 요소에서 재귀 적으로 호출합니다.

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