>백엔드 개발 >PHP 튜토리얼 >CodeIgniter: 뷰 및 템플릿 탐색

CodeIgniter: 뷰 및 템플릿 탐색

王林
王林원래의
2023-08-31 12:01:011078검색

뷰는 모든 MVC 애플리케이션의 핵심 구성 요소이며 CodeIgniter 애플리케이션도 예외는 아닙니다. 오늘은 뷰가 무엇인지, 뷰를 사용하여 CodeIgniter 프로젝트용 템플릿 솔루션을 만드는 방법을 알아 보겠습니다.

이 튜토리얼의 첫 번째 부분에서는 CodeIgniter 초보자에게 뷰가 무엇인지, 일반적인 애플리케이션에서 뷰를 사용하는 방법을 소개합니다. 후반부에서는 템플릿 솔루션을 찾는 동기에 대해 논의하고 독자에게 간단하면서도 효과적인 템플릿 라이브러리를 만드는 데 필요한 단계를 안내합니다.

CodeIgniter로 더 많은 작업을 수행하려면 Envato Market에서 다양한 CodeIgniter 플러그인과 코드 스크립트를 확인하세요.

CodeIgniter: 뷰 및 템플릿 탐색


뷰란 무엇인가요?

뷰는 애플리케이션 출력을 위한 마크업을 저장하는 데 사용되는 CodeIgniter의 특수 파일로, 일반적으로 HTML과 간단한 PHP 마크업으로 구성됩니다.

"뷰는 단지 웹 페이지이거나 헤더, 바닥글, 사이드바 등과 같은 페이지 조각입니다. 실제로 뷰는 계층적으로 필요한 경우 다른 뷰(다른 뷰 등 내)에 삽입할 수 있는 유연성을 가지고 있습니다. 시스템의.”

뷰는 컨트롤러 메서드 내에서 로드되고 뷰 내의 콘텐츠는 브라우저에 표시됩니다.


뷰 로드 방법

CodeIgniter에서 뷰를 로드(및 표시)하기 위해 내장된 Loader 라이브러리를 사용합니다.

으아악

이 코드 줄은 CodeIgniter가 application/views 文件夹中查找 hello_world.php에 있음을 알리고 해당 파일의 내용을 브라우저에 표시합니다.

CodeIgniter를 사용하면 .php 접미사를 제외할 수 있으므로 로드할 보기 파일 이름을 입력할 때 일부 키 입력을 저장할 수 있습니다.

두 번째 매개변수

$data선택사항이며 연관 배열 또는 개체를 사용합니다. 이 배열/객체는 데이터를 뷰 파일에 전달하여 뷰에서 사용하거나 참조할 수 있도록 하는 데 사용됩니다.

마지막

ional 매개변수는 뷰의 내용이 브라우저 창에 표시되는지 아니면 문자열로 반환되는지를 결정합니다. 이 매개변수의 기본값은 브라우저에 콘텐츠를 표시하는 false입니다. 템플릿 솔루션을 만들 때 이 매개 변수를 사용하는 방법은 이 자습서의 뒷부분에서 살펴보겠습니다.


뷰 생성 및 표시

첫 번째 보기를 설정하려면

에 새 파일을 만들고 그 안에 다음과 같은 간단한 HTML을 작성하세요. application/views 中创建一个名为 hello_world.php 으아악

이제 이 뷰를 브라우저에 표시하려면 위 메서드를 사용하여 컨트롤러 메서드에 로드해야 합니다.

그럼

에 새로운 컨트롤러 파일을 생성하고 그 안에 다음 코드를 넣어보겠습니다. 이 컨트롤러에서 새로 생성된 뷰를 로드합니다. application/controllers 中创建一个名为 hello_world.php 으아악

브라우저에서

의 HTML을 가리키면 브라우저에서 출력을 얻을 수 있습니다. 뷰를 성공적으로 로드했습니다! http://your-ci-install.com/index.php/ 现在将导致 application/views/hello_world.php

여러 보기 로드

뷰를 여러 파일로 분할하면 사이트를 더 쉽게 유지 관리하고 코드 중복 가능성을 줄일 수 있습니다.

단일 보기를 표시하는 것은 좋지만 출력을

머리글, 콘텐츠 및 바닥글보기와 같은 여러 다른 파일로 분할할 수 있습니다.

여러 뷰를 로드하려면

메서드를 여러 번 호출하면 됩니다. 그런 다음 CodeIgniter는 뷰의 내용을 브라우저에 표시하기 전에 함께 결합합니다. $this->load->view()

파일의 처음 몇 줄에. application/views 中创建一个名为 header.php 的新文件,并剪切并粘贴原始 hello_world.php 으아악

마찬가지로

의 마지막 두 줄로 이동합니다. application/views 中创建另一个名为 footer.php 的文件,并将 hello_world.php 으아악

이렇게 하면

보기 파일에 페이지 콘텐츠만 포함됩니다. hello_world.php 으아악

이제 페이지를 다시 표시하려면 컨트롤러에 세 가지 보기(header.php, hello_world.php, footer.php)를 모두 순차적으로 로드해야 합니다.

application/controllers/hello_world.php를 다시 열고 기존 호출 위와 아래에 새

호출을 추가합니다. application/controllers/hello_world.php 并在现有调用的上方和下方添加新的 $this->load->view() 으아악

이제 머리글 및 바닥글 보기가

보기와 분리되었으므로 사이트의 다른 보기와 함께 사용할 수 있습니다. 이는 머리글 및 바닥글 파일의 코드를 이 코드가 필요한 프로젝트의 다른 보기에 복사할 필요가 없음을 의미합니다. hello_world

뷰의 HTML이나 콘텐츠에 대한 모든 변경(예: 헤더에 새 스타일시트 추가)은 모든 파일이 아닌 하나의 파일에서만 수행될 수 있으므로 분명히 이는 큰 이점입니다!


在视图中使用来自控制器的数据

现在,我们将研究从控制器传递数据,以便可以在视图内使用或输出它们。

为此,我们将传递一个关联数组 $data 作为 $this->load->view() 调用中的第二个参数。

该数组的将在加载的视图中作为变量进行访问,由各自的命名。

$data = array(

	'title'		=>	'Hello World!',
	'content'	=>	'This is the content',
	'posts'		=>	array('Post 1', 'Post 2', 'Post 3')

);

$this->load->view('hello_world', $data);

上面的代码将为变量 $title 赋予值“Hello World!”在 hello_world 视图内。

如何在视图中使用变量

一旦我们将数据传递到视图文件,就可以按照通常的方式使用变量。

通常,视图文件将使用传递的数据来:

  • 显示变量的值
  • 循环数组或对象属性
  • 使用条件语句显示或隐藏标记

我将通过快速示例来说明如何执行每个操作。

要显示变量的内容,请使用简单且熟悉的 echo 语句:

	<h1><?php echo $title; ?></h1>

循环遍历数组或对象是视图文件中的常见任务,可以使用 foreach 循环来实现:

<ul>
<?php foreach($posts as $post) { ?>
	
	<li><?php echo $post; ?></li>
	
<?php } ?>
</ul>

可以在视图文件中使用简单的条件语句来稍微改变输出,具体取决于传递的数据。

一般来说,您希望尽量减少视图中条件语句的使用,因为过度使用可能会导致包含“业务逻辑”的复杂视图文件。将视图拆分为不同的文件,并决定在控制器中显示哪个文件是更可取的。

<?php if ( $logged_in ) { ?>

	<p><?php echo 'Welcome '.$user_name; ?></p>
	
<?php } else { ?>

	<p>Please login</p>
	
<?php } ?>

上面的示例将显示“欢迎”消息,或要求用户登录的请求,具体取决于 $logged_in 的值(true/false)。


CodeIgniter 中的模板

我们已经了解了如何将视图拆分为单独的较小文件可以帮助组织和减少 CodeIgniter 项目中的文件数量,但现在每个显示页面的实例都需要进行多个加载视图调用。

假设您有单独的页眉和页脚视图,它们用于形成模板。项目中您希望使用此模板加载和显示页面的每个实例,都必须调用三个视图加载。这不仅会使您的控制器变得混乱,还会导致大量重复代码 - 这正是我们希望通过拆分文件来摆脱的事情。

如果您现在想向此模板添加额外的标记,例如侧边栏菜单。它可以放在标题视图中,但更适合放在自己的单独视图中。将这个新视图添加到现有模板意味着要遍历视图加载的每个实例,然后添加另一个实例。这可能会很快变得混乱。

我们需要一种方法,能够将显示单个页面内容的视图文件嵌入模板内,而无需重复代码,并且允许轻松高效地对模板进行修改。

以下步骤将指导您创建一个简单的 CodeIgniter 库来满足这些需求,以及:

  • 为您的视图实施可预测且可维护的目录结构
  • 允许使用多个不同的模板
  • 将页面视图的加载减少为一行代码

一旦库被编写并放入我们的 CodeIgniter 工具带中,我们将能够显示一个模板化页面,如下所示:

$this->template->load('template_name', 'body_view');

好多了!

我们的模板解决方案将使用包含模板完整标记的视图文件,以及要嵌入其中的另一个视图文件(包含页面内容)的占位符。

占位符实际上只是一个名为 $body 的变量。当使用我们的库加载模板化视图时,相应的正文视图文件的内容将被分配给此 $body,将视图嵌入到模板中。


第 1 步:设置目录

我们希望为要存放的视图文件强制执行一个合理且可预测的目录系统,以便我们的视图:

  • 易于定位
  • 轻松确定它们属于应用程序的哪个区域
  • 易于维护

我们的目录系统还允许库巧妙地确定在哪里查找视图文件,从而减少加载模板化视图所需的代码量。

application/views 目录中创建一个新文件夹,并将其命名为 templates。该文件夹将保存不同的模板视图。


第 2 步:创建库

CodeIgniter 中的库只是 PHP 类,并且像视图一样加载到控制器中。

$this->load->library('class_name');

您在 CodeIgniter 项目中使用的自定义库存储在 application/libraries 文件夹中。要开始编写我们的模板库,请在此文件夹中创建一个名为 Template.php 的新文件,并将以下代码放入:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

	class Template 
	{
		var $ci;
		
		function __construct() 
		{
			$this->ci =& get_instance();
		}
	}

上面的代码定义了一个名为 Template 的新类或库,以及其中的 __construct() 方法。

此方法将 CodeIgniter 超级对象分配给 $ci 类变量,从而通过在通常的方法调用中将 $this 替换为 $this->ci 来允许使用 CodeIgniter 的所有资源。

当CodeIgniter框架加载该库时,会自动调用__construct()方法。

编写加载方法

现在我们将编写实际加载模板视图的方法。我们希望向此函数传递最多三个参数:

  • 模板名称
  • 主体视图名称(可选)
  • 要传递给视图的数据(可选)

调用此方法的结果将是在浏览器中显示模板视图,并嵌入其中的正文视图(如果提供了)。

__construct() 方法下面,放置以下代码:

function load($tpl_view, $body_view = null, $data = null) 
{
	if ( ! is_null( $body_view ) ) 
	{
		if ( file_exists( APPPATH.'views/'.$tpl_view.'/'.$body_view ) ) 
		{
			$body_view_path = $tpl_view.'/'.$body_view;
		}
		else if ( file_exists( APPPATH.'views/'.$tpl_view.'/'.$body_view.'.php' ) ) 
		{
			$body_view_path = $tpl_view.'/'.$body_view.'.php';
		}
		else if ( file_exists( APPPATH.'views/'.$body_view ) ) 
		{
			$body_view_path = $body_view;
		}
		else if ( file_exists( APPPATH.'views/'.$body_view.'.php' ) ) 
		{
			$body_view_path = $body_view.'.php';
		}
		else 
		{
			show_error('Unable to load the requested file: ' . $tpl_name.'/'.$view_name.'.php');
		}
		
		$body = $this->ci->load->view($body_view_path, $data, TRUE);
		
		if ( is_null($data) ) 
		{
			$data = array('body' => $body);
		}
		else if ( is_array($data) )
		{
			$data['body'] = $body;
		}
		else if ( is_object($data) )
		{
			$data->body = $body;
		}
	}
	
	$this->ci->load->view('templates/'.$tpl_view, $data);
}

上面的代码首先检查 $body_view 参数是否已提供给该方法。该变量将保存要用作模板视图中的正文的视图的名称。

	if ( ! is_null( $body_view ) )

如果提供了该参数,则会进行一系列 file_exists 检查,以尝试在目录系统中找到视图文件。

if ( file_exists( APPPATH.'views/'.$tpl_view.'/'.$body_view ) ) 
{
	$body_view_path = $tpl_view.'/'.$body_view;
}
else if ( file_exists( APPPATH.'views/'.$tpl_view.'/'.$body_view.'.php' ) ) 
{
	$body_view_path = $tpl_view.'/'.$body_view.'.php';
}

该代码首先尝试在 application/views 文件夹中与模板同名的文件夹内找到视图文件。

如果项目的各个部分与其他部分截然不同并且使用不同的模板,这非常有用。在这些情况下,将这些视图文件分组在一起是有意义的。

例如,许多网站为不同的部分(例如博客)显示不同的模板。在我们的系统中,博客视图文件可以放置在 application/views/blog 文件夹中,将它们与主站点视图分开。

如果无法在此文件夹中找到视图文件,则将 .php 附加到文件名末尾,并再次进行检查。这只是为了像本地 $this->load->view() 调用一样排除 .php

如果仍然找不到该文件,则会进一步检查其位置。

else if ( file_exists( APPPATH.'views/'.$body_view ) ) 
{
	$body_view_path = $body_view;
}
else if ( file_exists( APPPATH.'views/'.$body_view.'.php' ) ) 
{
	$body_view_path = $body_view.'.php';
}
else 
{
	show_error('Unable to load the requested file: ' . $tpl_name.'/'.$view_name.'.php');
}

这次,代码检查视图文件是否位于 application/views 文件夹内,如果找不到,则追加 .php 并再次检查。

如果文件位于这些位置之一,则将路径分配给 $body_view_path,否则使用 CodeIgniter 内置的 show_error() 函数会抛出错误消息,并终止脚本。

如果成功找到正文视图文件,则内容将分配给 $body 变量。

	$body = $this->ci->load->view($body_view_path, $data, TRUE);

我们将 $data 参数(如果未提供则为 null)传递给视图加载调用,并将第三个参数设置为 true 以将视图的输出作为字符串返回。

我们现在将这个 $body 变量添加到 $data 中的数据列表中,以便在加载时可以将其嵌入到模板视图中。

if ( is_null($data) ) 
{
	$data = array('body' => $body);
}
else if ( is_array($data) )
{
	$data['body'] = $body;
}
else if ( is_object($data) )
{
	$data->body = $body;
}

如果 $data 未提供给 load() 调用,则 $data 会被分配到键 body 下包含 $body 的数组。如果提供了参数,则将 $body 添加到列表中,方法是将其分配给数组键或对象属性,两者也都命名为 body

$body 变量现在可以在模板视图文件中用作嵌入视图的占位符

我们方法的最后一行从 application/views/templates 文件夹加载模板视图文件,并在第二个参数中传递 $data 变量。

	$this->ci->load->view('templates/'.$tpl_name, $data);

就是这样!该库现在可以投入使用了。


使用库

要开始使用我们的库,让我们在 application/views/templates 中创建一个名为 default.php 的模板视图,并将以下 HTML/PHP 放入其中:

<!DOCTYPE html>
<html>

	<head>
		<title><?php echo $title; ?></title>
	</head>

	<body>
	
		<h1>Default template</h1>
		
		<div class="wrapper">
			
			<?php echo $body; ?>
			
		</div>
		
	</body>
	
</html>

在此模板中,我们引用两个变量,$title$body

回想一下,在我们的模板文件中,$body 用作嵌入视图的占位符。

我们现在将制作另一个视图嵌入到该模板中。在 application/views/ 中创建一个名为 content.php 的新文件,并将以下简单的 HTML 放入其中:

<p>
	Hello world!
</p>

我们现在准备从控制器内加载模板化页面视图。

在任何控制器方法内,放置以下代码以在 default 模板内显示 content 视图。

$data = array(

	'title' => 'Title goes here',
	
);

$this->load->library('template');
$this->template->load('default', 'content', $data);

注意:必须先加载该库,然后才能调用 load 方法。为了避免每次需要显示模板视图时加载库,

通过将类添加到 application/config/autoload.php 中的库数组来自动加载该类。

如果您希望在模板中嵌入字符串而不是视图文件,只需使用键 body 将字符串分配给 $data 数组,并传递 null 作为加载调用中的第二个参数。

$data = array(

	'title' => 'Title goes here',
	'body'	=> 'The string to be embedded here!'
	
);

$this->template->load('default', null, $data);

快速提示

我发现按控制器甚至它们所属的方法将视图文件分组到文件夹中确实有助于使我的视图井然有序且易于查找。

以这种方式组织视图会导致目录结构紧密遵循 controller/method 的 URL 架构。

例如,假设您的项目有一个名为 Members 的控制器,包含方法 list

list 视图文件的适当位置应位于 application/views/membersapplication/views/members/list(如果此方法加载多个视图)。

然后可以使用我们的库通过以下代码将该视图嵌入到模板中:

$this->template->load('template_name', 'members/list');

结论

本教程中讨论的模板解决方案只是在 CodeIgniter 中实现模板的众多不同方法之一。

希望您现在应该知道什么是视图,以及如何在您的 CodeIgniter 项目中有效且高效地使用它们。

本教程中讨论的模板解决方案只是在 CodeIgniter 中实现模板的众多不同方法之一。有多种不同的方法,我鼓励读者研究其他方法并确定哪种方法最适合您的项目。

如果您对本教程有任何意见或疑问,或者对不同模板解决方案有任何见解,请在下面发表评论!感谢您的阅读。

위 내용은 CodeIgniter: 뷰 및 템플릿 탐색의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.