모범 사례:머리글과 바닥글을 구성하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/176856

  •  05-07-2019
  •  | 
  •  

문제

머리글과 바닥글을 구성하는 가장 좋은 방법은 무엇입니까?컨트롤러에서 모두 호출해야 할까요, 아니면 뷰 파일에서 포함해야 할까요?저는 CodeIgniter를 사용하고 있는데 이에 대한 모범 사례가 무엇인지 알고 싶습니다.이렇게 컨트롤러에서 포함된 모든 뷰 파일을 로드하시겠습니까?

class Page extends Controller {

   function index()
   {
      $data['page_title'] = 'Your title';
      $this->load->view('header');
      $this->load->view('menu');
      $this->load->view('content', $data);
      $this->load->view('footer');
   }

}

또는 단일 보기 파일을 호출하고 거기에서 머리글 및 바닥글 보기를 호출합니다.

//controller file    
class Page extends Controller {

   function index()
   {
      $data['page_title'] = 'Your title';
      $this->load->view('content', $data);

   }

}

//view file

<?php $this->load->view('header'); ?>

<p>The data from the controller</p>

<?php $this->load->view('footer'); ?>

나는 두 가지 방법 모두를 보았지만 너무 멀리 가기 전에 지금 선택하고 싶습니다.

도움이 되었습니까?

해결책

이 방법으로 시도 할 수도 있습니다. 기본보기 템플릿을 정의한 다음 컨트롤러가 전달한 변수 (내 예제의 '내용')를 기반으로 컨텐츠를 가져옵니다.

컨트롤러에서 :

$data['content'] = 'your_controller/index';

// more code...

$this->load->vars($data);
$this->load->view('layouts/default');

그런 다음 모든 페이지에 대한 기본 레이아웃을 정의합니다. 예 :보기/레이아웃/default.php

// doctype, header html etc.

<div id="content">
    <?= $this->load->view($content) ?>
</div>

// footer html etc.

그러면 뷰는 순수한 컨텐츠를 포함 할 수 있습니다. 예 : views/your_controller/index.php에는 컨트롤러/데이터 배열에서 전달 된 변수 만 포함 할 수 있습니다.

<?= $archives_table ?>
<?= $pagination ?>
// etc.

CI Wiki/FAQ에 대한 자세한 내용 - (Q.보기 내에보기를 어떻게 포함합니까? 중첩 된 템플릿? ...)

다른 팁

실제로, 이것을 꽤 많이 연구 한 후, 나는 MVC에 헤더와 바닥 글을 포함시키는 모범 사례가 세 번째 옵션, 즉 기본 컨트롤러를 확장한다는 결론에 도달했습니다. 이는 특히 모듈 식 레이아웃 (헤더 및 바닥 글뿐만 아니라 사이드 바 패널, 비 정적 메뉴 등)을 구축하는 경우 HTXT의 제안보다 약간 더 유연성을 제공합니다.

먼저 Base_Controller 클래스를 정의하여 페이지 요소 (헤더, 바닥 글 등)를 출력 문자열에 추가하는 메소드를 만듭니다.

class Base_controller extends Controller
{
    var $_output = '';

    function _standard_header($data=null)
    {
        if (empty($data))
            $data = ...; // set default data for standard header here

        $this->_output .= $this->load->view('header', $data, true);
    }

    function _admin_header($data=null)
    {
        if (empty($data))
            $data = ...; // set default data for expanded header here

        $this->_output .= $this->load->view('admin_header', $data, true);
    }

    function _standard_page($data)
    {
        $this->_standard_header();
        $this->_output .=
            $this->load->view('standard_content', $data, true);
        echo $this->_output; // note: place the echo statement in a
                             // separate function for added flexibility
    }

    function _page_with_admin_header($data)
    {
        $this->_admin_header($data);
        $this->_output .=
            $this->load->view('standard_content', $data, true);
        echo $this->_output;
    }
}

그런 다음 페이지 컨트롤러에서 기본 클래스를 확장하고 기능을 호출하여 페이지를 작성하십시오.

class Page_controller extends Base_controller
{
    function index()
    {
        $data = ...; // Set content data here
        $this->_standard_page($data);
    }

    function admin()
    {
        $data = ...; // Set content and header data here
        $this->_page_with_admin_header($data);
    }
}

기본 컨트롤러를 사용하면 개별 페이지 컨트롤러에서 매우 깨끗한 코드를 달성 할 수 있으며 페이지의 요소에 대한 별도의보기 (뷰와 컨트롤러 모두에서 코드 재사용 허용)가 있습니다. 기본 컨트롤러의 함수로 공통 페이지 '섹션'( 'Fragments'라고 부르고 싶은 유혹)을 정의하기 만하면됩니다.

또한 기본 컨트롤러가 통제 할 수 없을 정도로 성장하기 시작하면 (대형 사이트에서 발생할 수 있음), 하위 클래스에 배치하여 덜 일반적인 기능을 재 배열하고 해당 페이지 컨트롤러가 원래 기본 컨트롤러 대신 해당 페이지 컨트롤러를 확장하도록 할 수 있습니다.

즐기다!

/Jens Roland

나는 당신이하는 첫 번째 방법이 더 깨끗하다고 ​​생각합니다.단순히 그것이 렌더링될 것이라는 것을 아는 관점에서 볼 때.나머지를 찾기 위해 뷰 파일을 입력할 필요가 없습니다.

다른 뷰 내부에서 뷰를 호출하는 것은 나쁜 습관입니다.이는 컨트롤러 뷰 믹싱의 한 형태일 수 있습니다.CI의 보기 기능을 사용하면 해당 보기 출력을 문자열로 반환하도록 하는 세 번째 매개변수를 전달할 수 있습니다.이를 사용하여 복합 뷰를 만들 수 있습니다.

예를 들어:

class Page extends Controller {
   function index() {
      $data['page_title'] = 'Your title';

      $this->load->view('default_layout', array(
         'header'  => $this->load->view('header' , array(), true), 
         'menu'    => $this->load->view('menu'   , array(), true), 
         'content' => $this->load->view('content', $data  , true), 
         'footer'  => $this->load->view('footer' , array(), true), 
      ));
   }
}

default_layout.php

<? echo $header, $menu, $content, $footer; ?>

머리글과 바닥글을 결합하여 이와 같은 템플릿을 만들 수 있습니다.

class Page extends Controller {
   function index() {
      $data['page_title'] = 'Your title';

      $this->load->view('default_template', array(
         'menu'    => $this->load->view('menu'   , array(), true), 
         'content' => $this->load->view('content', $data  , true), 
      ));
   }
}

default_template.php

<html><head></head><body><span>Some Header HTML</span> // this is your header html
<? echo $menu, $content; ?>
<span>some footer HTML</span></body></html>  // this is your footer html
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top