2009-04-19 5 views
5

CodeIgniter 또는 코어 PHP에서; Rails의 뷰 부분 및 템플릿과 동일한 기능이 있습니까?레일즈 부분과 템플릿에 해당하는 CodeIgniter 또는 PHP

부분적으로는 내보기에서 다른보기 조각을 렌더링 할 수 있습니다. 일반적인 navbar.php보기를 사용하여 내 homepage.php보기를 가리킬 수 있습니다. 템플리트는 한 곳에서 HTML 페이지의 전체 셸을 정의하고 각보기가 본문을 채우도록합니다.

CodeIgniter 설명서에서 가장 가까운 것은 Loading multiple views이며 컨트롤러에서 여러 개의보기가 순차적으로 렌더링됩니다. 그것은 컨트롤러 내 페이지의 시각적 인 모습을 지시하는 이상한 것 같습니다. (즉 내 디자이너가 컨트롤러를 편집해야하는 navbar를 이동하는 것).

난 스택 오버플로 이것을 수행하는 PHP 방법을 찾고 있습니다. 나는 this page을 찾았는데, 부분적으로는 ob_start으로 시뮬레이션하는 것에 대해 이야기하고 있습니다. 이것이 CodeIgniter 내부의 권장 접근법입니까?

+0

시도의 눈을 위해, 그것을 확인할 수 있습니다 http://codeigniter.com/wiki/Ocular_Layout_Library/ – Geshan

답변

13

나는 MVC 규칙을 어긴 것일 수도 있지만, 필자는 항상 개별 뷰에 "조각"을 배치하고 CodeIgniter 스타일을 필요로하는 다른보기에서로드했습니다. 거의 내 모든보기는 각각 상단과 하단에 머리글과 바닥 글보기를로드

<? $this->load->view("header"); ?> 
//Page content... 
<? $this->load->view("footer"); ?> 

나 자신에서 이동 발견 같은 방식의 Navbar의를 포함하는 다음 수 헤더 등

+1

이것은 자신의 데이터가 필요없는 부분 데이터로 이동하는 방법입니다. 그러나 데이터가 필요한 부분 뷰 ("위젯")의 경우 타사 "모듈 식 확장 HMVC"와 같은 것이 좋은 선택입니다. – rick

+0

이것이 부분을 렌더링하는 가장 간단한 방법이라고 생각합니다. '$ this-> load-> view()'함수를 컨트롤러에서보다는 ** view file **에 넣으십시오 ('$ data' 배열 키를 통해). – hohner

0

이것은 불행히도 CodeIgniter에만 국한된 것은 아니지만 Savant3 템플릿 시스템을 살펴 보시기 바랍니다. 템플릿을 문자열로 렌더링 할 수 있습니다. 그런 다음 원하는 곳으로 간단하게 붙일 수 있습니다.

아마도 CodeIgniter에는 이와 비슷한 것이 있습니까?

보기를 렌더링 할 때, 템플릿을 렌더링 할 때, 그리고 그 안에 들어있는 모든 하위 템플릿을 사용할 때 기능을 추가하는 방법을 생각해 볼 수 있습니다.

3

PHP에서 당신은 CodeIgniter를하고 멋지 함께 잘 재생 include

+0

를 즉, 영업 이익은 요구를 정확히인지 모르겠어요. 평가할 때 포함 된 파일을 실행한다고 생각합니다. OP는 Rails 스타일의 인클루드를 요구하고있다 (인클루드 된 파일은 먼저 평가되고, IIRC는 나중에 합성된다). 페이지/부분 /보기 내용에 따라 페이지 템플릿 을 결정할 때 큰 차이가 있습니다. –

0

을 사용하십시오.

render_partial('/path/to/person.phtml', array('dennis', 'dee', 'mac', 'charlie'), array('say_hello' => true)); 

및 /path/to/person.phtml에

가지고 :

<?= if($say_hello) { "Hello, " } ?><?= $person ?> (<?= $person_counter ?>) 
이 있습니다

function render_partial($file, $data = false, $locals = array()) { 
    $contents = ''; 

    foreach($locals AS $key => $value) { 
     ${$key} = $value; 
    } 

    ${$name . '_counter'} = 0; 
    foreach($data AS $object) { 
     ${$name} = $object; 

     ob_start(); 
     include $file; 
     $contents .= ob_get_contents(); 
     ob_end_clean(); 

     ${$name . '_counter'}++; 
    } 

    return $contents; 
} 

이 같은 전화 :

5

내가 무엇을 사용 본질적으로

이것은 어떤 일이 벌어지고 있는지 더 잘 파악하는 데 도움이되는 마술입니다. 전체 파일 : view.class.php

+4

추출 ($ 지역); – Mario

+0

jeej i tkRenderPartial() a lot myself;) +1 – Ropstah

2

Rails도 CI로, partials로 내가 한 것은 기본적으로 뷰의 부분을 변수로 렌더링하고 컨트롤러에서 설정합니다.

그래서보기에는 (_partial.PHP) :

<h2>Here Comes The Partials</h2> 
<?= $some_partials ?> 

그리고 당신이 좋아하는 컨트롤러에서 설정할 수 있습니다 :

$this->load->view('the_view', 
    array('some_partials', 
     $this->load->view('_partial', array(), TRUE) 
    ) 
); 

가 개인적으로, 나는 대신위한 ob_start의 CI의보기를 사용하는 것을 선호하지만 저예요 =) PS :로드 뷰 첫 번째 인수는 뷰 이름이고, 두 번째 인수는 뷰에 전달할 매개 변수이고 세 번째 인수는 기본적으로 CI에 직접 렌더링할지 아니면 뷰의 값을 반환 할지를 나타내는 "ECHO"플래그입니다. 기본적으로 내가 그 예제에서 한 일.

좋은 해결책이라고 생각하지 않지만 저에게는 효과적입니다. 누구나 더 나은 해결책이 있습니까?

+0

컨트롤러에서'ob_start()'를 사용할 수 없다고 생각합니다. 왜냐하면'CI_Loader'가 뷰를로드 할 때 그것을 사용하기 때문입니다. 그래서 당신은 오류를 얻을 것입니다. '$ this-> load-> view ('view_name', $ data, true); 메소드를 사용하여 렌더링 된 뷰를 문자열로 반환하는 것이 가장 좋습니다. – sholsinger

2

내 최근에 출시 된 Template library은 이러한 방식으로 작동합니다.

템플릿 라이브러리는 내 Dwoo implementation과 함께 멋지게 재생되어 훨씬 더 많은 의견을 제공합니다.

0

당신은 파셜 및 템플릿

http://code.google.com/p/ocular/wiki/Introduction