Лекция 3.1 Алгоритмизация и программирование PHP

Презентация к лекции

rkpdf


Пример создания простого интернет-магазина с применением многомерных массивов

Задача

Создать работающий макет интернет-магазина, позволяющего условному покупателю выбирать из витрины товаров любой товар и класть его в корзину.

Администратору формировать витрину товаров.

В качестве «хранилища данных» будем использовать пример многомерного массива из лекции 3.

Там мы использовали массив, имеющий следующую структуру:


Array(‘Наименование товара’=>array
(‘Цена товара’=>’целое число’,
’Описание товара’=>’Строка’,
[Следующий товар],
….
);
Где [Следующий товар] следующая аналогичная цепочка 
‘Наименование товара’=>array(…)…


Здесь ключом ассоциативного массива, содержащего параметры товара -Цена и Описание, служит Наименование товара.

Теперь мы доработаем этот массив, добавив в него третий параметр - Изображение.

Этот код демонстрирует структуру нашего обновлённого массива:


$price_list[$product_name]=
		array(
		'Цена'=>$product_price,
		'Описание'=>$product_descr,
		'Изображение'=>$product_img
		);


Именно так мы планируем заполнять информацией о товарах наш массив.

Создадим следующую файловую структуру для нашего микро интернет-магазинчика:

Создаём Бэк энд

Начнём с написания кода формы ввода информации о товаре в файле admin.php, так как он нам нужен прежде всего для заполнения массива информацией о товарах.


////////////отображение формы заполнения прайс-листа/////////////////////////////////////
	echo'<form action="?p=1" method="post">';
	echo'<table align="center" width="600" border="1" cellpadding="3" cellspacing="0" bordercolor="#E2E2E2">
			<tr>
				<td>Наименование товара</td>
				<td> <input type="text" name="product_name"></td>
			</tr>
			<tr>
				<td>Цена товара </td>
				<td><input type="text" name="product_price"></td>
			</tr>
			<tr>
			<td>Описание товара</td>
			<td><textarea name="product_descr" cols="30" rows="5"></textarea></td>
			</tr>
			<tr>
			<td>Ссылка на изображение товара</td>
			<td><input  type="text" name="product_img"></td>
			</tr>
			<tr>
			<td colspan="2"><p align="center"><input type="submit" name="Добавить"></p></td>
			</tr>
			</table>
			';
	echo'</form>';

В параметре action формы мы указываем адрес обработчика "?p=1". Этот  адрес не указывает нам другую страницу, а указывает просто передачу параметра p, равного единице.

Параметр передаётся методом GET , для этого используется вопросительный знак:


<form action="?p=1" method="post">

При этом, остальные данные формы передаются методом POST.

 При отправке формы сформируется следующий URL адрес:

http://shop.ok/admin.php?p=1

К названию файла admin.php приклеивается вопросительный знак и параметр p, равный единице

Выглядеть форма должна так:

Обработчик формы ввода товаров

Теперь напишем обработчик формы, который будет принимать переменные из формы, переданные методом GET и POST, помещать их в массив, сериализовывать массив , записывать полученный после сериализации текст в файл price.txt.

Приём переменных

Сначала напишем код приёма переменных в самом начале файла admin.php:


/////Приём данных из формы///////////
	$product_name=$_POST['product_name'];
	$product_price=$_POST['product_price'];
	$product_descr=$_POST['product_descr'];
	$product_img=$_POST['product_img'];
	
	///////Приём параметров сценария///////
	$p=$_GET['p'];


Теперь напишем собственно обработчик:


////////Обработчик формы ввода нового товара//////////////////
//////этот участок кода работает после отправки формы с данными о новом товаре////////////////////	
	if($p==1)
	{
	///////Заполняем массив прайс-листа/////////////	
		$price_list[$product_name]=
		array(
		'Цена'=>$product_price,// цена товара 
		'Описание'=>$product_descr,//Описание товара 
		'Изображение'=>$product_img//Ссылка на изображение
		);
		//запись прайс-листа в файл
	$serialize_price_list=serialize($price_list);//Сериализация массива
	if($serialize_price_list)//Проверяем сериализовался ли массив?
			{
			//Задаём путь к файлу на сервере (файл находится в той же папке, что и данный скрипт)	
				$puts='price.txt';
                                $fp=fopen($puts,'a');//Открываем файл для записи, создаём дескриптор
				if($fp)
				{
					$res=file_put_contents($puts,$serialize_price_list);//Записываем сериализованный массив в файл
				}

				
			}
	 }


Код обработчика помещаем между кодом приёма переменных и кодом отображения формы.

В результате выполнения этого кода у нас сформируется файл price.txt, если он не был ещё создан с записанным в него текстом сериализованного массива.

Конвертация прайс-листа

Теперь напишем код конвертации нашего прайс-листа, данные для которого получим из файла price.txt. в массив.

Разместим код перед обработчиком формы.


$path='price.txt';//Задаём путь к файлу, где хранится прайс-лист
		///получение прайс-листа из файла
	if(file_exists($path))//проверяем создан ли ли файл
	$import=file_get_contents($path);//Читаем файл
						//Конвертируем текст из файла в массив $price_list
							if($import)//проверяем прочитался ли файл в переменную $import
							$price_list=unserialize($import);//конвертируем текст из файла в массив


Отображение прайс-листа

Теперь напишем код отображения прайс-листа и поместим его под кодом отображения формы:


//////////////отображение прайс-листа////////////////////////
	echo'<h1 align="center">Прайс-лист</h1>';		 	
	echo'<table align="center" width="600" border="1" cellpadding="3" cellspacing="0" bordercolor="#E2E2E2">
			<tr>
				<th>Наименование</th>
				<th>Описание</th>
				<th>Цена</th>
				<th>Изображение</th>
			</tr>';

	if($price_list)
	foreach($price_list as $key=>$value)
			{
				echo '<tr>
							<td>'.$key.'</td>
							<td>'.$value['Описание'].'</td>
							<td>'.$value['Цена'].'&#8381;</td>
							<td><img src="'.$value['Изображение'].'" width="70"</td>
					</tr>';
			}
			echo'</table>';
			echo'<p align="center"><a href="?p=2">Удалить файл прайс-листа</a></p>';


Обработчик запроса на удаление прайс-листа

Как вы, наверное, заметили, последняя строчка формирует ссылку на удаление прайс-листа.

Ссылка содержит параметр p, равный двум, который передаётся методом GET. Нам осталось написать обработчик этой ссылки, который будет удалять наш прайс-лист и поместить его между строкой, которая задаёт путь к файлу и сценарием получения прайс-листа из файла.


//////Обработчик запроса на удаление файла прайс-листа////////
		if($p==2)
		{
			if(file_exists($path))//проверяем создан ли ли файл
			unlink($path);//Удаляем прайс-лист по запросу
		}


Добавим теперь для красоты заголовки над таблицами и формами.

Полный код должен получиться таким:


<?
header('Content-Type: text/html; charset=windows-1251');
	/////Приём данных из формы///////////
	$product_name=$_POST['product_name'];
	$product_price=$_POST['product_price'];
	$product_descr=$_POST['product_descr'];
	$product_img=$_POST['product_img'];
	
	///////Приём параметров сценария///////
	$p=$_GET['p'];
	
	$path='price.txt';//Задаём путь к файлу, где хранится прайс-лист
		//////Обработчик запроса на удаление файла прайс-листа////////
		if($p==2)
		{
			if(file_exists($path))//проверяем создан ли ли файл
			unlink($path);//Удаляем прайс-лист по запросу
		}
		///получение прайс-листа из файла
	if(file_exists($path))//проверяем создан ли ли файл
	$import=file_get_contents($path);//Читаем файл
						//Конвертируем текст из файла в массив $price_list
							if($import)//проверяем прочитался ли файл в переменную $import
							$price_list=unserialize($import);//конвертируем текст из файла в массив
////////Обработчик формы ввода нового товара//////////////////
//////этот участок кода работает после отправки формы с нданными о новом товаре////////////////////	
	if($p==1)
	{
	///////Заполняем массив прайс-листа/////////////	
		$price_list[$product_name]=
		array(
		'Цена'=>$product_price,// цена товара 
		'Описание'=>$product_descr,//Описание товара 
		'Изображение'=>$product_img//Ссылка на изображение
		);
		//запись прайс-листа в файл
	$serialize_price_list=serialize($price_list);//Сериализация массива
	if($serialize_price_list)//Проверяем сериализовался ли массив?
			{
			//Задаём путь к файлу на сервере (файл находится в той же папке, что и данный скрипт)	
				$puts='price.txt';
				$fp=fopen($puts,'a');//Открываем файл для записи, создаём дескриптор
				if($fp)
				{
					$res=file_put_contents($puts,$serialize_price_list);//Записываем сериализованный массив в файл
				}
				fclose($fp);//закрываем файл, используя дескриптор освобождаем ресурсы
			}
	 }
	
	/////////отображение заголовков страницы ////////////////////////////////////////////////
	echo '<h1 align="center">Административная часть</h1>';
	echo'<h2 align="center">Формирование прайс-листа</h2>';
	echo'<p align="center"><a href="index.php">На сайт</a></p>';
	////////////отображение формы заполнения прайс-листа/////////////////////////////////////
	echo'<form action="?p=1" method="post">';
	echo'<table align="center" width="600" border="1" cellpadding="3" cellspacing="0" bordercolor="#E2E2E2">
			<tr>
				<td>Наименование товара</td>
				<td> <input  type="text" name="product_name"></td>
			</tr>
			<tr>
				<td>Цена товара </td>
				<td><input  type="text" name="product_price"></td>
			</tr>
			<tr>
			<td>Описание товара</td>
			<td><textarea name="product_descr" cols="30" rows="5"></textarea></td>
			</tr>
			<tr>
			<td>Ссылка на изображение товара</td>
			<td><input  type="text" name="product_img"></td>
			</tr>
			<tr>
			<td colspan="2"><p align="center"><input type="submit" name="Добавить"></p></td>
			</tr>
			</table>
			';
	echo'</form>';
	//////////////отображение прайс-листа////////////////////////
	echo'<h1 align="center">Прайс-лист</h1>';		 	
	echo'<table align="center" width="600" border="1" cellpadding="3" cellspacing="0" bordercolor="#E2E2E2">
			<tr>
				<th>Наименование</th>
				<th>Описание</th>
				<th>Цена</th>
				<th>Изображение</th>
			</tr>';

	if($price_list)
	foreach($price_list as $key=>$value)
			{
				echo '<tr>
							<td>'.$key.'</td>
							<td>'.$value['Описание'].'</td>
							<td>'.$value['Цена'].'&#8381;</td>
							<td><img src="'.$value['Изображение'].'" width="70"</td>
					</tr>';
			}
			echo'</table>';
			echo'<p align="center"><a href="?p=2">Удалить файл прайс-листа</a></p>';
?>


Пример отображения в браузере

Страница Бэкэнда с заполненными товарами должна выглядеть в браузере примерно так так:

adminka 

Создаём Фронтенд

Здесь мы создадим сценарий выбора товара, отправку его в корзину, просмотр корзины, очистку корзину и условного совершения покупки.

В данном примере для простоты демонстрации отсутствуют сценарии оплаты покупки и сохранения информации о покупке.

Код сценария размещаем в файле index.php.

Запуск сессии

Познакомимся с функцией запуска сессии:

session_start(); Сессия необходима нам для сохранения корзины в глобальной переменной сессии $_SESSION

Это позволит нам не передавать кучу параметров при обновлении страницы, так ка необходимая информация будет храниться в глобальном массиве $_SESSION.

Поместим вызов сессии session_start(); в самое начало файла index.php сразу под дескриптором <?

Конвертация прайс-листа

Теперь напишем знакомый нам код конвертации прайс-листа в массив $price_list:


/////////////Получение прайс-листа//////////////////////////
	if(file_exists($path))//проверяем создан ли ли файл
	$import=file_get_contents($path);//Читаем файл
						//Конвертируем текст из файла в массив $price_list
							if($import)//проверяем прочитался ли файл в переменную $import
							$price_list=unserialize($import);//конвертируем текст из файла в массив


Создаём переменную контента

В данном сценарии мы будем весь отображаемый контент страницы сохранять в переменную $content, накапливая ее html кодом по мере выполнения сценариев.

Позже мы её внедрим в html шаблон web страницы.

Создаём пустую переменную и размещаем эту строчку кода над сценарием конвертации прайс-листа:

$content='';//Создаём пустую переменную контента

Сценарий отображения витрины магазина с товарами


////////////Отображение витрины товаров/////////////////////
	$content.='<h1 align="center">Витрина</h1>
	';
	$content.='<form method="post" action="?cart=1">
	';		 	
	$content.='<table align="center" width="50%" border="1" cellpadding="3" cellspacing="0" bordercolor="#E2E2E2">
			<tr>
				<th>Наименование</th>
				<th>Описание</th>
				<th>Цена</th>
				<th>Изображение</th>
				<th>В корзину</th>
			</tr>
			';

	if($price_list)
	foreach($price_list as $key=>$value)
			{
				//$name_product=addcslashes($key,'"');
				$content.= '<tr>
							<td>'.$key.'</td>
							<td>'.$value['Описание'].'</td>
							<td>'.$value['Цена'].' &#8381;</td>
							<td><img src="'.$value['Изображение'].'" width="70"</td>
							<td><input type="checkbox" name="ch[]" value="'.$key.'"></td>
					</tr>
					';
			}
			$content.='
			<tr>
				<td colspan="5" align="center"><input type="Submit" name="Submit" value="Купить"></td>
			</tr>
			</table>
			</form>
			';


Здесь мы создаём форму для отправки результата выбора товаров с витрины и помещаем в неё таблицу с товарами и чекбоксами формы, строки которой формируются в теле цикла foreach, который выбирает данные из массива $price_list.

Имена чекбоксов так же формируются в теле цикла. Они представляют собой элементы индексированного массива ch[], который автоматически заполняется значениями, содержащими наименования товаров.

Форма содержит кнопку тира Submit со значением Купить, клик по которой осуществляет отправку формы обработчику, который формирует покупательскую корзину.

Атрибут action формы передаёт методом GET параметр cart, равный единице.

На сайте форма выглядит так:

vitrina 

Обработчик формы выбора товаров

Приём переменных

Пишем код приёма переменных из формы и помещаем его в самый верх под session_start().


///////Принимаем данные из формы////////////////////
	$ch=$_POST['ch'];
	$cart=$_GET['cart'];
	$pay=$_GET['pay'];


Сценарий формирования корзины


////////обработчик формы//////////////////////
	if($cart==1)//Формирование корзины
	{
		if($ch)
		{
			foreach($ch as $k=>$v)
			{
				
				$_SESSION['newcart'][]=$v;//Наполнение корзины
			}
		}
	}


Здесь мы проверяем истинность (наличие заполненности) массива $ch, который формировался в форме витрины с товарами и поступил после отправки формы в этот обработчик.

Далее мы раскрываем его в цикле foreash и присваиваем в виде значения глобальному массиву $_SESSION['newcart'][] с автоматическим формированием индекса с помощью квадратных скобок.

Таким образом в переменную сессии записываются названия выбранных товаров, которые хранятся там в течении всего сеанса работы до тех пор, пока не будет закрыт браузер или пока сценарий не очистит эту переменную.

Сценарий отображения ссылок для проверки содержимого корзины и для её очистки

После формирования корзины, покупателю открывается доступ к ссылкам просмотра корзины с указанием количества товаров в корзине и ссылке для очистки корзины от товаров.

Ссылка просмотра позволяет запускать сценарий отображения корзины.

Ссылка очистки корзины позволяет запускать сценарий очистки корзины.

Запишем следующий код и разместим его под сценариями обработчика формы.


if(isset($_SESSION['newcart']))
	{
		$n=count($_SESSION['newcart']);
		$content.='<p align="center"><a href="?cart=2">Ваша корзина('.$n.')</a></p>
		
		<p align="center"><a href="?cart=3">Очистить корзину</a></p>';
	}


Этот сценарий проверяет наличие товаров в корзине, затем с помощью функции подсчёта элементов массива count присваивает значение количества переменной $n.

Далее формируется код ссылки просмотра корзины, где к тексту Ваша корзина присоединяется значение переменной $n в круглых скобках и код ссылки очистки корзины.

В ссылках методом GET с помощью знака ? передаются параметры cart=2 для запуска сценария просмотра корзины и cart=3 для запуска сценария очистки корзины.

Сценарий отображения содержимого корзины


/////////////Формирование контента//////////////////////////
	if($cart==2)//просмотр корзины
	{
		$content.='<p align="center"><a href="?pay=1">Оплатить</a></p>
		<table align="center" width="50%" border="1" cellpadding="3" cellspacing="0" bordercolor="#E2E2E2">
		';
		$sum=0;
		foreach($_SESSION['newcart'] as $k=>$v)
		{
			$sum+=$price_list[$v]['Цена'];
			$content.='<tr>
				<td><img src="'.$price_list[$v]['Изображение'].'" width="70"</td>
				<td>'.$v.'</td>
				<td>'.$price_list[$v]['Цена'].' &#8381;</td>
			</tr>
			';
		}
		$content.='
			<tr>
				<td colspan="2" align="right" ><b>ИТОГО:</b></td>
				<td>'.$sum.' &#8381;</td>
			</tr>
		</table>';
		$content.='
		<hr>';
	}


Данный сценарий формирует ссылку на сценарий, имитирующий оплату покупок, путём передачи методом GET с помощью знака ? параметра pay=1.

Затем формирует таблицу и счётчик в виде переменной $sum=0.

Эта переменная будет суммировать стоимость выбранных в корзину товаров.

С помощью оператора цикла foreach мы просматриваем глобальный массив $_SESSION['newcart']. В цикле мы прибавляем к переменной $sum значение стоимости товара, ключ-наименование которого содержится в переменной $v из массива $price_list[$v] по ключу 'Цена'.

Далее формируем строки таблицы, в столбцы которых вставляем тег изображения с указанием ссылки на него из массива $price_list[$v]  по ключу 'Изображние', наименование товара из переменной $v и цену товара из массива $price_list[$v]  по ключу 'Цена'.

После тела цикла мы формируем строку из двух объединённых столбцов, куда помещаем слово ИТОГО: в тегах b, придающих ему жирность и в другом столбце помещаем значение переменной $sum, которая в цикле выросла до суммы всей корзины.

Завершаем отображение  таблицы прямой линией, формируемой тегом hr.

Сценарии очистки корзины

В заключении сценарной части напишем два сценария очистки корзины и разместим их под сценарием формирования корзины:


if($cart==3)//Очистка корзины от покупок
	{
		unset ($_SESSION);
		session_destroy();
	}
	if($pay==1)//Очистка корзины от покупок
	{
		unset ($_SESSION);
		session_destroy();
		$content.='<h1 align="center">Спасибо за покупку!!!</h1>
		<h2 align="center">Приходите ещё!</h2>
		';
	}


Первый сценарий срабатывает при получении значения переменной $cart, равному трём. С помощью функции unset() мы уничтожаем глобальную переменную $_SESSION, тем самым опустошая корзину, затем функцией session_destroy прекращаем сеанс.

Второй сценарий срабатывает при получении значения переменной $pay, равному единице. Здесь по идее должен быть сценарий осуществления платежа, но мы просто убиваем глобальную переменную и выключаем сессию и формируем текст благодарности за покупку.

Внедрение сформированного контента в html код шаблона страницы интернет-магазина

Теперь, когда мы написали все сценарии по формированию контента для отображения, внедрим переменную $content в html шаблон страницы:


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Интернет-магазин</title>
</head>

<body>
	<?
		echo $content;//Отображаем контент на странице сайта
	?>
</body>
</html>


Этот код мы помещаем в самый низ нашего файла после закрывающего дескриптора PHP ?>.

Результат доступен для просмотра по ссылкам:

Фронтенд

Бэкенд

Полный код фронтенд


<?
	header('Content-Type: text/html; charset=windows-1251');
	session_start();
	///////Принимаем данные из формы////////////////////
	$ch=$_POST['ch'];
	$cart=$_GET['cart'];
	$pay=$_GET['pay'];
	$content='';//Создаём пустую переменную контента
	$path='price.txt';//Задаём путь к файлу, где хранится прайс-лист
	////////обработчик формы//////////////////////
	if($cart==1)//Формирование корзины
	{
		if($ch)
		{
			foreach($ch as $k=>$v)
			{
				$_SESSION['newcart'][]=$v;//Наполнение корзины
			}
		}
	}
	if($cart==3)//Очистка корзины от покупок
	{
		unset ($_SESSION);
		session_destroy();
	}
	if($pay==1)//Очистка корзины от покупок
	{
		unset ($_SESSION);
		session_destroy();
		$content.='<h1 align="center">Спасибо за покупку!!!</h1>
		<h2 align="center">Приходите ещё!</h2>
		';
	}
	if(isset($_SESSION['newcart']))
	{
		$n=count($_SESSION['newcart']);
		$content.='<p align="center"><a href="?cart=2">Ваша корзина('.$n.')</a></p>
		
		<p align="center"><a href="?cart=3">Очистить корзину</a></p>';
	}
	
	/////////////Получение прайс-листа//////////////////////////
	if(file_exists($path))//проверяем создан ли ли файл
	$import=file_get_contents($path);//Читаем файл
						//Конвертируем текст из файла в массив $price_list
							if($import)//проверяем прочитался ли файл в переменную $import
							$price_list=unserialize($import);//конвертируем текст из файла в массив
	/////////////Формирование контента//////////////////////////
	if($cart==2)//просмотр корзины
	{
		$content.='<p align="center"><a href="?pay=1">Оплатить</a></p>
		<table align="center" width="50%" border="1" cellpadding="3" cellspacing="0" bordercolor="#E2E2E2">
		';
		$sum=0;
		foreach($_SESSION['newcart'] as $k=>$v)
		{
			$sum+=$price_list[$v]['Цена'];
			$content.='<tr>
				<td><img src="'.$price_list[$v]['Изображение'].'" width="70"</td>
				<td>'.$v.'</td>
				<td>'.$price_list[$v]['Цена'].' &#8381;</td>
			</tr>
			';
		}
		$content.='
			<tr>
				<td colspan="2" align="right" ><b>ИТОГО:</b></td>
				<td>'.$sum.' &#8381;</td>
			</tr>
		</table>';
		$content.='
		<hr>';
	}
	////////////Отображение витрины товаров/////////////////////
	$content.='<h1 align="center">Витрина</h1>
	';
	$content.='<form method="post" action="?cart=1">
	';		 	
	$content.='<table align="center" width="50%" border="1" cellpadding="3" cellspacing="0" bordercolor="#E2E2E2">
			<tr>
				<th>Наименование</th>
				<th>Описание</th>
				<th>Цена</th>
				<th>Изображение</th>
				<th>В корзину</th>
			</tr>
			';

	if($price_list)
	foreach($price_list as $key=>$value)
			{
				//$name_product=addcslashes($key,'"');
				$content.= '<tr>
							<td>'.$key.'</td>
							<td>'.$value['Описание'].'</td>
							<td>'.$value['Цена'].' &#8381;</td>
							<td><img src="'.$value['Изображение'].'" width="70"</td>
							<td><input type="checkbox" name="ch[]" value="'.$key.'"></td>
					</tr>
					';
			}
			$content.='
			<tr>
				<td colspan="5" align="center"><input type="Submit" name="Submit" value="Купить"></td>
			</tr>
			</table>
			</form>
			';
			
?>


Дистрибутив для скачивания

Заключение

Следует понимать, что реально-работающий магазин следует строить с использованием базы данных, напримен MySQL. 

Приведённый в этой лекции скрипт является учебным. Он раскрывает основной принцип построения электронной витрины и покупательской корзины.

Здесь отсутствует скрипт идентификации администратора, скрипт совершения платежа.

Приведённая здесь структура массива так же не рекомендуется для реального применения, потому что роль ключа здесь выполняет относительно длинная строка. Эта строка не должна содержать кавычек.

Здесь целесообразнее применить структуру массива, где  основным ключом записи товара будет назначаться уникальное целое число.


©  «Эксклюзивные интернет-решения для бизнеса»
© www.oknemuan.ru
2003-2024