2010-06-04 2 views
0

다음과 같은 딜레마가 있습니다. 나는 복잡한 CMS를 가지고 있으며이 CMS는 그래픽 디자이너가 주제로 삼아야합니다. 템플릿은 몇 가지 중첩 된 흠도가있는 일반 HTML입니다. 디자이너가 페이지의 HTML을보고 수정할 파일을 쉽게 찾을 수 있도록하고 싶습니다.PHP 매크로/인라인 함수 (변수가 범위를 벗어나지 않도록)

function customInclude($what) { 
    print("<!-- Including $what -->"); 
    include($what); 
    print("<!-- End of $what -->"); 
} 

하지만, 무엇을 생각 : 내가 처음에 생각했던

이런 멍청한 짓을 구축했다? 변수는 분명히 포함 된 파일의 범위를 벗어납니다 :-) 나는 그들이 어떻게 호출되는지, 얼마나 많이 있는지를 모르기 때문에 그것들을 전역 변수 또는 매개 변수로 선언 할 수 없습니다.

PHP에서 "매크로 확장"을 구현할 수 있습니까? 그것을 호출하는 또 다른 방법은 aspect 지향 스타일에서 modify 함수의 각 호출을 수정하고 싶습니다.

나는 eval()에 대해 생각해 왔으며, 유일한 방법입니까? 성능에 큰 영향을 미칩니 까?

답변

-6

개체, 네임 스페이스 및 MVC 모델을 사용해야합니다. 그렇지 않으면 귀하의 문제에 대한 순수하고 깨끗한 솔루션가 없습니다. 그리고 제발, eval을 사용하지 마십시오, 악합니다.

+1

이것은 답변이 아니며, 전혀 도움이되지 않았습니다. 다음 번에 주석을 사용하십시오. 어쨌든, 당신은 다른 사람들이 무엇을지지하지 않고 말하는 것을 반복하고 있습니다. 그건 그렇고, 이것은 꽤 복잡한 MVC 구현이지만,이 질문은 완전히 다른 성격입니다. 그래픽 디자이너의 관점에서 보자면 아키텍처는 관련성이 없습니다. 단지 아파치 리디렉션, 라우트, 컨트롤러, 뷰, 매개 변수, 아약스 호출 등을 고려하지 않고 디스크의 특정 파일에 빠르게 액세스하려고합니다. URL을 보는 것만으로 출력물이 너무 복잡합니다. – Palantir

+0

진심이야? 솔루션이 없으면 여전히 대답입니다. 그러나, 나는 다른 사람에 대해서 이야기하는 것이 아니 었습니다 - 당신이 OOP없이 문제가되는 것은 당신입니다. 그것은 당신의 부름이지만 eval을 사용하여 명백한 언어 동작을 우회하려고하지 마십시오. 게다가 나는 여기서 다른 사람이 응답하는 것을 거의 볼 수 없다. MVC 아키텍처는 템플릿과 코드가 각각 속한 코드를 분리하므로 디자이너는 코드를 볼 필요가 없으며 그 반대도 마찬가지입니다. –

+0

더 자세히 읽어보십시오. 나는 OOP와 MVC를 사용하고 있다고 말했다. 일련의 뷰 (예 : node/edit.tpl.php, node/index.tpl.php 등)가 있고, 부분 뷰가 있는데, 나머지 부분 뷰가 차례로 호출됩니다. 나는 디자이너가보기 파일을 빨리 찾을 수 있도록 도와 주려고했다. 이게 터무니없는 것 같니? 다른 "깨끗한"옵션은 각보기의 맨 위에 그 이름을 넣고 밑에서 닫는 것입니다 ... – Palantir

1

질문을 완전히 이해할 수 있을지 모르겠지만 포함 된 파일의 기본 파일 이름을 보여줌으로써 디자이너가 더 쉽게 사용할 수있게하려는 경우 템플릿 파일에서 사용할 수 있습니다.

echo '<!-- Start of '.__FILE__.' -->'; 
....content... 
echo '<!-- End of '.__FILE__.' -->'; 

__FILE__는 하나 몇 가지 Magic Constants의입니다.

또한 포함 된 모든 파일의 배열을 반환하는 get_included_files() 함수가 있습니다 (예 : 이름에 'tpl'이 포함 된 모든 포함 파일 목록을 출력 할 수 있음).

+0

첫 번째 사실은 지금 제가하고있는 일입니다 :) 불행히도, 그것은 헤더와 각 서식 파일의 바닥 글. 조금 어색함. Get_included_files가 흥미로 보입니다. 소스의 끝에 출력 할 수 있습니다. 중첩이 표시되지 않기 때문에 여전히 최적이 아닙니다. – Palantir

1

나는 이것이 오래된 질문이라는 것을 알고 있지만, 나는 그것에 비틀 거 렸고, 나는 그것을하기 위해 자주 사용했던 것을 생각 나게한다.

매우 이상한 변수를 사용하여 함수를 작성하면 어떻습니까? 당신이 기능을 사용할 수있는이 방법으로

<?php 
function customInclude($___what___) { 
    echo '<!-- Including '.$___what___.' -->'; 
    include($what); 
    echo '<!-- End of '.$___what___.' -->'; 
} 
?> 
나는 보통, 당신은 다른 사람들이 알고 싶지 않아 필요한 경우에만 해당 태그를 표시하기 위해 가능한 변수를 추가하는 것이 좋습니다

...

<?php 
function __printIncludeInfo($info, $dump = false){ 
    //print only if the URL contains the parameter ?pii 
    //You can modify it to print only if coming from a certain IP 
    if(isset($_GET['pii'])){ 
     if($dump){ 
      var_dump($info); 
     } else { 
      echo $info; 
     } 
    } 
} 
function customInclude($___what___) { 
    __printIncludeInfo('<!-- Including '.$___what___.' -->'); 
    include($what); 
    __printIncludeInfo('<!-- End of '.$___what___.' -->'); 
} 
?> 

당신이 필요로하는 다른 정보를 인쇄하십시오.

1

이것은 사용자 정의에 대한 내 100 % harcoded 솔루션입니다. 전역 변수를 사용하여 다음 include 파일을 가리킨 다음 사용자 정의 프록시 포함 파일을 포함하십시오. (사용자 정의 프록시 포함 함수를 대체합니다)

1 -이 코드를 전역 포함에 추가하십시오 (customInclude 함수가 정의 됨)

$GLOBALS['next_include'] = ""; 
    $GLOBALS['next_include_is_once'] = false; 
    function next_include($include_file) { 
     $GLOBALS['next_include_is_once'] = false; 
     $GLOBALS['next_include'] = $include_file; 
    } 

    function next_include_once($include_file) { 
     $GLOBALS['next_include_is_once'] = true; 
     $GLOBALS['next_include'] = $include_file; 
    } 

2 - 일부는 "debug_include"라는 include-include-file을 만듭니다.PHP는 "

<?php 
    if(empty($GLOBALS['next_include'])) die("Includes Problem"); 

    // Pre-include code 
    // .... 

    if($GLOBALS['next_include_is_once']) { 
     include_once($GLOBALS['next_include']); 
    } else { 
     include($GLOBALS['next_include']); 
    } 

    // Post-include code 
    // .... 

    $GLOBALS['next_include'] = ""; 

3 - 검색을 수행하고 모든 파일에서 대체 : (debug_include.php 제외)
검색 : '포함 ((*).);' (*) (*.) 'include_once 문; reg.exp
같이'{; '

검색 (debug_include.php)를 포함 next_include ($ 1)'} '하십시오 reg.exp으로
는 교체 로 교체 : '{(debug_include.php') next_include_once ($ 1)를 포함 ';}'일부 비표준

include (....  include (....  include (.... 
같이 포함되어있는 경우에 어쩌면 당신은 다른 필요합니다

검색 - 및 - 대체


더 나은 검색 및 바꾸기 패턴을 찾을 수 있다고 생각하지만 일반 표현 사용자가 아니므로 그것은 어려운 길이다.

관련 문제