2008-09-22 8 views
10

특정 조건 (예 : 로그인 여부, 양식 기입 여부 등)에 따라 페이지가 다르게 보일 수있는 사이트를 만들고 있습니다. 이렇게하면 다른 시간에 다른 HTML 블록을 출력해야합니다.내 PHP가 꽤 유지하기

그런데 이렇게하면 내 PHP 코드가 끔찍 해 보입니다 ... 실제로 코드의 형식과 모양이 엉망입니다. 이 문제를 어떻게 해결해야합니까? 내 스크립트 맨 아래에 사용자 정의 "html dump"기능을 포함 시키시겠습니까? 같은 것을 포함하지만 포함합니까? Heredocs (너무 좋지 않니?)

감사합니다.

답변

25

Do not panic, 모든 새로운 웹 프로그래머는이 문제에 직면합니다.

디스플레이 로직과 프로그램 로직을 분리해야합니다. 단지 PHP 코드 (아무 HTML)와

  • 하나의 변수를
  • HTML과 거의 PHP와 다른
  • 을 채 웁니다 : 첫째, 자신의 솔루션은 각 웹 페이지에 대한 두 개의 파일을 사용하여 만들려고이 당신의 페이지 디자인이다

그런 다음 필요할 때/여기에 포함 시키십시오. EG :

myPageLogic.php

<?php 

// pure PHP code, no HTML 

$name = htmlspecialchars($_GET['name']); 
$age = date('Y') - htmlspecialchars($_GET['age']); 

?> 

myPageView.php

// very few php code 
// just enought to print variables 
// and some if/else, or foreach to manage the data stream 

<h1>Hello, <?php $name ?> !</h1> 

<p>So your are <?php $age?>, hu ?</p> 

(당신이 하나의 alternative PHP syntax을 사용할 수 있습니다하지만이를 완벽하게 만들기 위해 열심히 노력하지 않습니다. 정말 처음.)

myPage.php

<?php 

require('myPageLogic.php'); 
require('myPageView.php'); 
?> 

지금은 성능 문제에 대해 걱정하지 마십시오. 이것은 초보자로서 최우선 순위가 아닙니다. 이 솔루션은 불완전하지만 프로그래밍 수준의 문제를 해결하는 데 도움이되며 기본 사항을 가르쳐줍니다.

그런 다음이 개념에 익숙해지면 MVC 패턴에 대한 책을 구입하거나 스택 오버플로 항목을 찾아보십시오. 그게 뭘 원하는지 NEXT TIME. 그런 다음 몇 가지 템플릿 시스템과 프레임 워크를 시도 할 것이지만 LATER. 지금은 코드를 작성하고 처음부터 배우십시오. 신참처럼 완벽하게 프로젝트를 코딩 할 수 있습니다. 괜찮습니다.난 강력하게 대신 똑똑한의 savant 제안

+0

그게 내가하는 일이야. 스크립트에서 데이터를 처리하려면 해당 '보기'스크립트를 포함하십시오. 뷰 스크립트에서 HTML 내에서만 변수를 반향시키고 필요한 경우 루프를 사용합니다. – Imran

+3

아주 좋은 조언. MVC를 사용하는 것보다 훨씬 낫습니다. – da5id

+3

그래, 때로는 아무도 내 첫 해 동안 그렇게 말한 것을 후회하지 않는다. 사람들은 멍청한 놈들이 그들이 오는 모든 신선한 기술에 대해 완벽한 출발을하도록 요청하는 대신 무언가를하도록해야합니다. –

0

그런 경우에는 모든 것을 점진적으로 변수 또는 때때로 배열에 쓴 다음 변수/배열을 반향합니다. 페이지가 항상 점진적이 아닌 한 번에 렌더링된다는 이점이 있습니다.

0

내가이 상황에서 수행하게되는 것은 내가 포함하는 HTML 데이터의 '템플릿'파일을 작성한 다음 정규식으로 구문 분석하는 것입니다. 코드를 깨끗하게 유지하고 디자이너 나 다른 HTML 담당자에게 손쉽게 조각을 전달할 수 있습니다. Wikipedia

7

에서

체크 아웃 MVC 프로그래밍 관행 뒤에 이상은 MVC 접근 방식을 사용합니다.

http://www.phpmvc.net/

는 몇 시간에 데리러 것이 아닙니다. 당신은 정말로 그것을 연습해야합니다. 가장 중요한 것은 컨트롤러가 모델 (db 레이어)에 액세스하고, 데이터를 처리 한 다음 렌더링을 위해 뷰로 전송하는 것입니다. 이것은 지나치게 단순화되었지만 이해하고 이해하기 위해서는 그것을 읽고 연습해야합니다.

이것은 내가 그것을 배우는 것을 돕기 위해 사용 된 것입니다. http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html

1

문제의 소리에서 볼 때 코드에서 논리와 표현 사이에 별개의 문제가 없을 수도 있습니다. 응용 프로그램을 설계 할 때 이것은 현재 직면하고있는 상황에 의해 정확하게 설명 된 이유로 매우 중요한 고려 사항입니다.

아직 PHP 템플릿 엔진이 없다면 Smarty을 참조하십시오.

4

콘텐츠와 레이아웃을 최대한 코드에서 분리하십시오. .php 파일에 HTML을 쓸 때는 언제든지 "이 이 정말로에 속합니까?"

한 가지 해결책은 템플릿을 사용하는 것입니다. 꽤 사용하기 쉬운 옵션 인 Smarty 템플릿 시스템을 살펴보십시오.

+0

모든 템플릿 엔진은 MVC 프레임 워크의 오버 헤드없이이를 해결할 수 있습니다. 멋쟁이는 가장 훌륭한 선택입니다. – Ian

+1

원칙적으로 다른 템플릿 시스템 (PHP 자체) 위에 템플릿 시스템 (Smarty)이 있습니다. 나는 XSL 변환 (http://www.w3schools.com/xsl/) Twan – Twan

+1

남자와 같은 기술을 사용하기 위해 모든 노력을 기울이고있다 ... XSLT는 너무 복잡하고 OP가 무엇을 말하고 있었는지 확실히 불필요하다. 처음에는 XML을 변환해야합니다. – nickf

0

프레임 워크가 필요합니다. 이렇게하면 이미 언급 한 모델 - 뷰 컨트롤러 패턴 (MVC) 때문에 코드가 꽤 단순해질뿐만 아니라 이미 작성된 구성 요소로 인해 시간이 절약됩니다.

나는 QCodo를 권장합니다. 다른 사람들도 있습니다 - CakePHP, Symfony.

0

큰 프로젝트 인 경우 프레임 워크가 순서 일 수 있습니다. 그렇지 않은 경우 템플릿 파일을 만들고 페이지 상단에 포함 할 템플릿 파일을 결정하십시오.예를

if ($_SESSION['logged_in']) 
    include(TPL_DIR . 'main_logged_in.tpl'); 
else 
    include(tPL_DIR . 'main.tpl'); 

단순한 예를 들어

.. 당신이 증상을 해결하는, 문제가 아니라 위에서 언급 한 바와 같이
0

..

당신이 필요로하는 것은 논리의 분리이며, 표시. 어느 mvc 프레임 워크 일종의 할 수 있습니다. 비록 당신이 mvc 프레임 워크로 끝까지 가고 싶지 않더라도 템플릿 엔진은 적어도 로직이 복잡해서 설명하는 것에 어려움을 겪어야 만합니다.

0

,

  • 당신이 템플릿을 생성하기 위해 새로운 템플릿 "언어"를 배울 필요가 없습니다, 학자 템플릿을 PHP로 작성
  • 당신이 돈이 ' t는 컴파일러와 함께 자신의 템플릿 "언어"를 정의 할 수 있습니다 PHP를 사용하려면이 presenta에서

분리 논리를 자신의 PHP에 의해 쉽게 확장 오브젝트 것

  • 모든 비즈니스 논리가 PHP와 프리젠 테이션 논리에 있어야한다는 것을 의미하지는 않습니다. 분리는 개념적인 것입니다. 데이터를 준비하는 논리를 분리하는 논리가 있습니다. 분명히 비즈니스 로직은 표현 요소를 포함 할 필요가 없습니다. 하는 템플릿 시스템 (PHP 자체)의 상단에 템플릿 시스템을 구현 기본 당 오버 헤드를 만드는 대신에

    0

    , 당신은 또한 MVC princples (제공은 분리해서 당신의 데이터 - 준수 XSL Transformations 같은보다 강력한 솔루션 갈 수 XML을 다른 파일과 함께 표시하는 논리를 개인적으로 분리했습니다.

    테이블에 표시하려는 배열에 다음 정보가 있다고 상상해보십시오.

    Array 
    { 
        [car] => green 
        [bike] => red 
    } 
    
    쉽게 XML이 정보를 출력하는 스크립트를 만들

    :

    echo "<VEHICLES>\n"; 
    foreach(array_keys($aVehicles) as $sVehicle) 
        echo "\t<VEHICLE>".$sVehicle."</NAME><COLOR>".$aVehicles[$sVehicle]."</COLOR></VEHICLE>\n"; 
    echo "</VEHICLES>\n"; 
    

    다음과 같은 XML 결과 :

    <VEHICLES> 
        <VEHICLE> 
        <NAME>car</NAME> 
        <COLOR>green</COLOR> 
        </VEHICLE> 
        <VEHICLE> 
        <NAME>bike</NAME> 
        <COLOR>red</COLOR> 
        </VEHICLE> 
    </VEHICLES> 
    

    지금이 모든 우수를,하지만하지 않습니다 좋은 형식으로 표시하십시오. XSLT가 들어오는 곳이다 간단한 코드를 사용하면 테이블에이 변환 할 수 있습니다.

    <xsl:template match="VEHICLES"> 
        <TABLE> 
        <xsl:apply-templates select="VEHICLE"> 
        </TABLE> 
    </xsl:template> 
    
    <xsl:template match="VEHICLE"> 
        <TR> 
        <TD><xsl:value-of select="NAME"></TD> 
        <TD><xsl:value-of select="COLOR"></TD> 
        </TR> 
    </xsl:template> 
    

    잇 짜잔, 당신은이 간단한 예를 들어 지금

    <TABLE> 
        <TR> 
        <TD>car</TD> 
        <TD>green</TD> 
        </TR> 
        <TR> 
        <TD>bike</TD> 
        <TD>red</TD> 
        </TR> 
    </TABLE> 
    

    , 이것은 조금이다 과잉 살상; 대형 프로젝트의 복잡한 구조의 경우 스크립트 로직을 마크 업에서 멀리 유지하는 절대적인 방법입니다.

    +0

    xml/html을 문자열 연결로 만들 때 htmlspecialchars를 사용하십시오. – troelskn

    +0

    당신은 절대적으로 옳습니다. 그리고 CDATA 태그도 항상 좋습니다. 하지만 그들은이 게시물의 목표를 혼란스럽게 할 뿐이 기 때문에 이들을 버렸습니다. – Twan

    0

    체크 PHP와 HTML을 분리하는 약이 question는 자기 작성 템플릿 시스템, 등 스마티, 그것의 자신의 템플릿 시스템, 등 등 등 ...

    로 PHP와 같은 템플릿 시스템 등을 할 수있는 다양한 방법이 있습니다
    0

    여기에 두 가지 옵션이 있다고 생각합니다. MVC 프레임 워크를 사용하거나 게으른 템플릿 방식을 사용하여 코드에 상당한 오버 헤드가 발생할 수 있습니다. 분명히 저는 전임 교수님과 함께합니다. MVC를 배우는 것이이 책에서 최고의 웹 개발 트릭 중 하나라고 생각합니다.

    2

    그러나 이렇게하면 내 PHP 코드가 끔찍 해 보일 수 있습니다. 실제로 코드의 서식과 모양이 엉망입니다. 이 문제를 어떻게 해결해야합니까?

    PHP와 HTML을 하나의 일관된 들여 쓰기 구조로 단일 계층 구조로 취급하십시오.따라서 'if'나 'for'와 같은 PHP enclosing-structure는 새로운 수준의 들여 쓰기를 도입하며 그 내용은 항상 시작과 끝 태그의 균형 집합입니다. 기본적으로 XHTML을 실제로 사용하는지 여부에 관계없이 XML의 의미에서 PHP를 '올바른 형식'으로 만들 수 있습니다.

    예 :

    <div class="prettybox"> 
        Hello <?php echo(htmlspecialchars($name)) ?>! 
        Your food: 
        <?php foreach($foods as $food) { ?> 
         <a href="/food.php?food=<?php echo(urlencode($food)) ?>"> 
          <?php echo(htmlspecialchars($food)) ?> 
         </a> 
        <?php } ?> 
        <?php if (count($foods)==0) { ?> 
         (no food today) 
        <?php } ?> 
    </div> 
    

    여기에 다시 답변에 머리를 양육 논리와 마크 업을 분리 주위에 종교 교리주의하십시오. 물론 비즈니스 로직을 페이지 출력 코드에서 제외하고 싶다고해서 반드시 개별 파일, 클래스, 템플릿 및 프레임 워크를 사용하여 발생하는 오버 헤드로드가 실제로 수행중인 작업에 필요하다는 것을 의미하지는 않습니다. 간단한 응용 프로그램의 경우에는 파일 위쪽과 페이지 출력에 액션/로직을 넣는 것만으로 충분합니다.

    (위의 코멘트 하나, 반드시 htmlspecialchars 일 (에서 예)를 들어 당신은 확실히 항상. 모든 비즈니스 로직에 혼합하여 PHP의 액션 비트에 넣어하지 않으 페이지 출력 기능입니다 텍스트를 응용 프로그램 논리를 벗어날 때까지 일반 이스케이프 처리되지 않은 문자열로 유지하십시오. 'echo (htmlspecialchars (...))'를 입력하면 항상 너무 어리 석고 'h와 같은 짧은 이름으로 함수를 만들 수 있습니다. '도 마찬가지입니다.)

    +0

    이것은 템플릿/뷰에서'urlencode'와'htmlspecialchars'를 사용하는 흥미로운 방법입니다. 컨트롤러/프레임 워크 뷰 객체를 사용하여 문자를 이스케이프하고 데이터를 뷰에 표시하여 에코로 사용하는 것보다 더 나은 방법입니까? 나는 개인적으로 후자를 사용한다. 컨트롤러는 데이터 가져 오기 및 조작을 담당합니다. 이것은 견해 책임이 아닙니다. 데이터를 조작하지 않고 단순히 에코합니다. –

    +0

    프레임 워크 (컨트롤러가 훨씬 적음)는 출력보기 단계에서 벗어나야 할 일을 어떻게 알 수 있습니까? HTML 이스케이프뿐만 아니라 URL에 템플릿 값을 넣을 수도 있습니다 (비트에 따라'urlencode' /'rawurlencode') 또는 JavaScript 문자열 리터럴 ('json_encode'), CSS 문자열 리터럴 또는 붙여 넣기 가능한 HTML 코드 조각 (HTML을 두 번 인코딩하는), 또는 콘텐츠를 일반 텍스트 전자 메일 (인코딩하지 않음)으로 뱉어 낼 수도 있습니다. 컨트롤러가 HTML로 모든 것을 미리 인코딩하면 작동하지 않습니다. 컨텍스트 탈출은 절대적으로 뷰의 핵심 관심사입니다. – bobince