CodeIgniter의 뷰 내에 뷰를 포함하는 가장 좋은 방법
대규모 codeigniter 프로젝트를 시작하고 있으며 다른 페이지 / 컨트롤러에 표시 될 수있는 데이터 루프와 같은 콘텐츠 스 니펫에 대해 재사용 가능한 '미니'뷰를 생성하려고합니다.
메인 컨트롤러의 뷰에서 뷰를 호출하는 것이 더 낫습니까? 그렇다면 어떻게? 아니면 컨트롤러에서 '미니 뷰'를 호출하여 뷰의 코드를 메인 뷰로 전달해야합니까?
다른보기 내의보기를 중첩보기 라고 합니다 . CodeIgniter에 중첩 된 뷰를 포함하는 두 가지 방법이 있습니다.
1. 컨트롤러 내부에 중첩 된 뷰로드
미리보기를로드하고 다른보기로 전달합니다. 먼저 이것을 컨트롤러에 넣으십시오.
<?php
// the "TRUE" argument tells it to return the content, rather than display it immediately
$data['menu'] = $this->load->view('menu', NULL, TRUE);
$this->load->view ('home', $data);
?>
그런 다음 <?=$menu?>메뉴를 표시하려는 지점에 뷰를 놓습니다.
2.보기 "내부에서"보기로드
먼저 이것을 컨트롤러에 넣으십시오.
<?php
$this->load->view('home');
?>
그런 다음 이것을 /application/views/home.php뷰에 넣으십시오 .
<?php $this->view('menu'); ?>
<p>Other home content...</p>
가장 좋은 방법은 두 번째 방법보다 첫 번째 방법을 선호합니다. 첫 번째 방법을 사용하면 코드를 섞을 필요가 없기 때문에 PHP를 포함하는 것과 같지 않습니다 . 간접적으로는 둘 다 동일하지만 첫 번째 방법은 두 번째 방법보다 명확하고 깨끗합니다!
솔직히 저는 템플릿 뷰를 가지고 컨트롤러에서 필요한 데이터를로드하여이를 수행하는 것을 선호합니다. 이것은 훨씬 덜 반복되는 코드를 의미하며 뷰에서 뷰를로드하는 것보다 DRY 개념을 더 잘 따릅니다. 특히 머리글, 바닥 글 및 메뉴와 같은 것입니다.
따라서 내 템플릿보기는 다음과 같습니다.
template.php
$this->load->view('header',$title);
$this->load->view('sidebar',$sidebar_content);
$this->load->view('main_content',$main_content);
$this->load->view('footer');
그런 다음 컨트롤러에서 다음과 같이 필요한 데이터를 템플릿에 전달합니다.
$data['title'] = 'Home Page';
$data['sidebar_content']='pages/standard_sidebar';
$data['main_content'] ='pages/my_home_page';
$this->load->view('template',$data);
이렇게하면 여러 가지 이점이 있습니다. 첫 번째는 여러 템플릿을 가질 수 있다는 것입니다. 예를 들어, 제 경우에는 사이드 바가없는 전체 페이지보기 용과 사이드 바가있는 페이지 용으로 하나씩 두 개의 기본 템플릿이 있습니다. 또한 포함 할 헤더를 결정하기 위해 if 문을 호출합니다. 일반 또는 관리자 메뉴가있는 것.
예, 모든 기본보기 페이지에 머리글, 사이드 바 및 바닥 글을 포함 할 수 있지만 그 결과 수많은 중복 코드가 생성됩니다. 예를 들어 내 모든 페이지에 새로운 내용, 다른 작은 스 니펫이 있으면 어떻게됩니까? 템플릿을 사용하여 적절한 템플릿에 스 니펫을 추가하면 완료됩니다. 다른 경로로 이동하면 모든 페이지를 찾고 거기에 스 니펫보기를 추가하는 것은 내 생각에 페이지에 CSS를 포함하는 것과 동일하며 낭비적이고 궁극적으로 유지 관리 할 수 없습니다.
방법 1
이 방법을 내 뷰에 사용하여 원하는 위치에 포함 뷰를 삽입합니다.
$this->load->view('include/include_view');
방법 2
또는 컨트롤러에서 다음과 같은보기 이상을로드 할 수 있습니다.
$this->load->view('header_view');
$this->load->view('list_view');
$this->load->view('footer_view');
어떤 방법도 다른 방법보다 낫지 않습니다. 일부 데이터를 전달해야하는지 (이 경우 method2 사용) 또는 기본보기의 특정 부분에보기를 포함하려는 경우 (이 경우 method1을 사용하는 것이 더 좋습니다) )
방법 3
기본보기에서 포함보기로 데이터 전달
컨트롤러에 :
$data['title'] = "Title";
$this->load->view('main_view',$data);
당신의 관점에서
$data2['title'] = $title;
$this->load->view('include/include_view',$data2);
전체 데이터를 include 뷰에 전달하려면 다음과 같이 할 수 있습니다. 컨트롤러에서 :
$data['nestedView']['title'] = 'title';
당신의 관점에서
$this->load->view('includes/included_view', $nestedView);
이것은 뷰 내에 뷰를 포함하는 간단한 방법입니다. 뷰를 미리로드 할 필요가 없습니다. 뷰 경로를 다른 뷰로 전달하기 만하면됩니다.
컨트롤러에서 다음을 사용하십시오.
$data['middle'] = 'includeFolder/include_template_view'; //the view you want to include
$this->load->view('main_template_view',$data); //load your main view
main_template_view에서 다른 뷰를 포함 할 수 있습니다.
$this->load->view($middle);
이 문제를 더 효율적으로 해결하기 위해 내 의견으로는 다음과 같이했습니다.
You create a new helper (in application/helpers) with name (es. common_helpers.php, the underscore is important). In this file, you put all the functions for example build pieces of html in common.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
function getHead(){
require_once(APPPATH."views/common/head.php");
}
function getScripts(){
require_once(APPPATH."views/common/scripts.php");
}
function getFooter(){
require_once(APPPATH."views/common/footer.php");
}
In your controller you call only one view in respect of MVC and call the functions from your custom helper.
class Hello extends CI_Controller {
public function index(){
$this->load->helper('common');
$this->load->view('index');
}
}
In the controller
controller
<?php
public function view($page = NULL)
{
if ( ! file_exists(APPPATH.'views/pages/'.$page.'.php'))
{
$data['title'] = ucfirst($page); // Capitalize the first letter
// Whoops, we don't have a page for that
show_404();
}
$data= array('');
$data['title'] = ucfirst($page); // Capitalize the first letter
$data['page_layout']='pages/'.$page;
$this->load->view('page_layout', $data);
}
?>
In the Views folder create a page called page_layout.php
page_layout.php
//This is where you set the layout to call any view through a variable called $page_layout declared in the controller//
<?php
$this->load->view('header');
$this->view($page_layout);
$this->load->view('footer');
?>
'Program Club' 카테고리의 다른 글
| requestAnimationFrame 재귀 / 루프를 중지하는 방법은 무엇입니까? (0) | 2020.11.23 |
|---|---|
| @ Url.Action에서 컨트롤러 함수로 매개 변수를 전달하는 방법 (0) | 2020.11.23 |
| C ++에서 std :: vector를 반환하는 효율적인 방법 (0) | 2020.11.23 |
| JAXB : XML 문서를 비 정렬 화하는 동안 네임 스페이스를 무시하는 방법은 무엇입니까? (0) | 2020.11.23 |
| XmlSerializer에서 Null 값 형식을 내 보내지 못하도록합니다. (0) | 2020.11.23 |