Простейший вариант библиотеки загрузки страницы (Layout)

Материал из Wiki

Перейти к: навигация, поиск

Часто спрашивают, как упростить вывод страницы. Я набросал простенькую библиотеку, которая просто выводит главную страницу.

class Layout {

	private $ci			= null;
	private $scripts 		= array();
	private $styles 		= array();
	private $js_code 		= array();
	private $js_code_onload = array();
	private $css_code 		= array();

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


	private function head_tags()
	{
		$tags = '';

		if ($this->scripts)
		{
			foreach ($this->scripts as $filename) {
				$tags .= sprintf('<script type="text/javascript" src="/js/%s" ></script>'."\n", $filename);
			}
		}

		if ($this->styles)
		{
			foreach ($this->styles as $filename) {
				$tags .= sprintf('<link type="text/css" rel="stylesheet" href="/css/%s" />'."\n", $filename);
			}
		}

		if ($this->js_code_onload)
		{
			$this->js_code[] = sprintf("$(function() { %s });", implode(" ", $this->js_code_onload));
		}

		if ($this->js_code)
		{
			$tags .= '<script type="text/javascript">';
			$tags .= implode(" ", $this->js_code);
			$tags .= '</script>';
		}

		if ($this->css_code)
		{
			$tags .= '<style type="text/css">';
			$tags .= implode(" ", $this->css_code);
			$tags .= '</style>'."\n";
		}

		return $tags;
	}


	function add_scripts($scripts)
	{
		if ( ! is_array($scripts))
		{
			$scripts = array($scripts);
		}

		$this->scripts = array_merge($this->scripts, $scripts);

		return $this;
	}


	function add_styles($styles)
	{
		if ( ! is_array($styles))
		{
			$styles = array($styles);
		}

		$this->styles = array_merge($this->styles, $styles);

		return $this;
	}


	function add_js_code($js, $onload = FALSE)
	{
		if ($onload)
		{
			$this->js_code_onload[] = $js;
		}
		else
		{
			$this->js_code[] = $js;
		}

		return $this;
	}


	function add_css_code($css)
	{
		$this->css_code[] = $css;

		return $this;
	}


	function add_js_var($name, $value, $onload = FALSE)
	{
		$js_code = sprintf("var %s = %s;\n", $name, $value);

		if ($onload)
		{
			$this->js_code_onload[] = $js_code;
		}
		else
		{
			$this->js_code[] = $js_code;
		}

		return $this;
	}


    function view($vars = array(), $page = FALSE)
    {
    	$page = $page ? $page : 'main_page';

		$content = array(
			'head_tags' => $this->head_tags(),
		);
		$content = array_merge($content, $vars);

		$this->ci->load->view($page, $content);
    }
}

?>

К ней прилагается простенький шаблон (view) main_page.php.

<!doctype html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>Your title here</title>
	
	<link rel="stylesheet" type="text/css" href="css/reset.css"/>
	<link rel="stylesheet" type="text/css" href="css/base.css"/>
	<script type="text/javascript" src="/js/jquery.js" ></script>
	
	<? if (isset($head_tags)) print $head_tags ?>
</head>

<body>

	<div id="header">
		Заголовок
	</div>

	<div id="content" class="holygrail">
		<div class="wrapper">
			<div class="columns">
				<div class="center">
					Центр
				</div>

				<div class="left">
					Лево
				</div>

				<div class="right">
					Право
				</div>
			</div>
		</div>
	</div>

	<div id="footer">
		Подвал
	</div>

</body>
</html>

Единственное, что в этом шаблоне статично — переменная $head_tags. Все остальное — чистая заготовка.

Это не образцовая библиотека, а просто пример для новичков, для тех, кому сложно определиться, как и что делать. С помощью библиотеки можно подключать файлы css, куски css-кода, аналогично с js + js-код, который должен грузиться на onReady (реализация под jQuery).

Что с этим делать дальше? Например, если у вас стандартный сайт, состоящий из 3-х основных блоков (хидер, контент, футер), вы можете создать для каждого из этих блоков свою функцию в библиотеке и делать так:

function header()
	{
		// здесь, возможно, вызов модели и загрузка шаблона хидера
	}


	function content()
	{
		// аналогично с контентом. Наверняка, здесь будет несколько вызов различных моделей
	}

	function footer()
	{
		// вероятнее всего, здесь загрузка шаблона с подвальной менюшкой и счетчиками
	}

	// ...

    function view($vars = array(), $page = FALSE)
    {
    	$page = $page ? $page : 'main_page';

		$content = array(
			'head_tags' => $this->head_tags(),
			'header' => $this->header(),
			'content' => $this->content(),
			'footer' => $this->footer(),
		);
		$content = array_merge($content, $vars);

		$this->ci->load->view($page, $content);
    }

Надеюсь, это поможет вам начать думать в верном направлении.

Личные инструменты