Опубликован: 22.10.2016 | Уровень: для всех | Доступ: платный
Лекция 2:

Редактор сайта

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >

Меню

Вы ещё не устали постоянно вводить параметры вида index4.php?id=1, index4.php?edit в адресную строку? Давайте создадим небольшое меню. В режиме отладки (DEBUG is true) дописываем туда ?edit и прочие полезные любопытному человеку вещи. Пока у нас одна страница, меню в общем-то и не работает, просто показывает текущую страницу жирным ("мы здесь"). Если две страницы, уже интереснее. Ну, а поскольку сейчас режим DEBUG у нас включён, вы будете видеть в меню минимум 5 пунктов. Вот код функции:

<?php
function menu1() {
	$menu = '';
	$link = mysqli_connect("localhost", "admin", "adminadmin@", "unsinn");
	$sql = 'set names utf8';
	mysqli_query($link, $sql);
	$sql = 'select `id`, `title` from `mypages`';
	$result = mysqli_query($link, $sql);
	while ($row = mysqli_fetch_assoc($result)) {
		$menu .= menu1_item($row);
	}
	
	if (DEBUG) $menu .= 
		' • <a href="?code">PHP-код файла</a>'
		. ' • <a href="?out">Выход</a>'
		. ' • <a href="?edit">Авторизация</a>';
	return $menu;
}

Вы можете видеть, как сильно возрастает сложность кода.

1. Начнём с более простого: у нас появилась константа DEBUG. Мы ввели её и инициализировали в начале файла index4-1.php вместо переменной $debug – потому что внутри функций такие ("глобальные") переменные не видны. Можно, конечно, заставить функцию увидеть глобальную переменную, но ведь это сделано в Php не случайно (что глобальные переменные не видны внутри функций), и мы пока вполне можем следовать этой заданной линии поведения (а не сразу начинать плыть против течения).

2. Далее, мы ввели ссылку с параметром ?out, чтобы дать возможность пользователю отменить текущую авторизацию (и, например, авторизоваться под другим именем). Это значит, мы должны описать в скрипте (в нашей программе, в файле index4-1.php), действия, которые надо делать при получении параметра out. Добавляем ещё один "else if" в нашей "секции" array_key_exists($key, $_GET) и указываем, что при получении параметра out надо выполнять функцию sessdestroy(). А внизу файла, где функции, опишем эту функцию (она просто уничтожает сессию и пересылает пользователя на основную страницу, без $_GET-параметров).

3. Меню генерирует ссылки. Каждая такая ссылка у нас будет создаваться отдельной функцией-шаблоном "menu1_item()". Сейчас это кажется лишним: почему бы не написать a href="?{$id}">{$title}</a> прямо внутри функции menu1(), зачем создавать для такой малости отдельную функцию? Мы сразу думаем о будущем Каталоге Товаров, где один пункт меню будет содержать и картинку, и заголовок Категории, и фрагмент описания... А главное, даже наши простые ссылки вовсе не так просты: мы проверяем (обязательно!), не совпадает ли адрес ссылки меню с адресом текущей страницы, и в случае совпадения вместо тэга "<a>" используем тэг "<b>":

<?php
function menu1_item($arr) {
	extract($arr);
	$href = '?id=' . $id;
	$loc_id = _es($_GET, 'id', 1);
	$nohref = $loc_id == $id ? true : false;
	return !$nohref
		? <<<TPL
	<a href="{$href}">{$title}</a>
TPL
		: <<<TPL
	<b>{$title}</b>
TPL;
}

Потому что это дурной тон – заставлять посетителя щёлкать по ссылкам, ведущим на ту страницу, где он сейчас находится.

4. И последняя маленькая (trifle) проблемка: что вот это вот за ерунда, что за чепуха, что за unsinn – строка:

$link = mysqli_connect("localhost", "admin", "adminadmin@", "unsinn");

– внутри функции menu1()? Кажется, мы уже один раз в нашем файле писали что-то подобное. И, если это не дежавю, то это опять повторяющийся фрагмент, который надо выносить в функцию. Причём, не в одну. Поколдовав немного с логикой работы программы, мы достаточно быстро придём к выводу, что наступил случай организации нескольких функций в общий класс, потому что такая организация обойдётся здесь дешевле "обычных функций". ("Скидывать товар предполагалось на загородных рынках, но партия была такой большой, что темные люди, поколдовав над своими калькуляторами, решили проплатить телерекламу, чтобы ускорить оборот" – "Generation „П"").

< Лекция 1 || Лекция 2: 1234 || Лекция 3 >
Михаил Гутентог
Михаил Гутентог

Этот курс ( Практикум по разработке CMS ) создавался, когда у PHP была версия 5.3 или 5.4. Со временем какие-то функции PHP устаревают (mysql, each), какие-то начинают работать по-другому (empty). Пожалуйста, следите за изменениями в PHP по сайту php.net!

Александр Мельников
Александр Мельников

Изучаю курс "Практикум по созданию CMS" в листинге 4.3

$n = count($_GET); if ($n > 0) { $param = each($_GET); // самое простое: пропускаем только первый параметр if ($n > 1 || !isset($valid[$param['key']])) { _404(); }

При попытке просмотра в браузере получаю ошибку: Deprecated: The each() function is deprecated.  И не пойму как исправить ситуацию.

Елена Суханова
Елена Суханова
Россия, Москва, МИЭТ, 2011
Анастасия Щитова
Анастасия Щитова
Россия, Москва, ФГБОУ ВО "Московский государственный юридический университет имени О.Е. Кутафина (МГЮА)", 2016