Надоел медленный Интернет? 
Попробуй Ускоритель!

Marketscore - бесплатный сервис, практически вдвое увеличивающий скорость загрузки вашим браузером страниц и сайтов в Интернете. В среднем, скорость загрузки вэбстраниц с графикой и текстом ускоряется на 75%. 
Особенно заметен выигрыш, если у вас медленный модем или вы выходите в Интернет на маленьких скоростях (до 56 Кб/сек). Подробнее...

реклама у нас

***

Сервер племени апачей. Продолжение

Артем Cosmic Шманцырев

Сегодня мы продолжаем писать наш интернет-магазин.

Итак, левый фрейм. Как много в этом слове… :-). Как мы уже договорились, левый фрейм будет содержать список отделов нашего ИМ, который он достанет из файла price.csv, находящегося на сервере. .csv — очень удобный для нас формат, так как он поддерживается и РНР, и табличным процессором Microsoft Excel, который, несомненно, установлен у подавляющего большинства юзеров нашей страны :-). Формат CSV представляет собой текстовую таблицу, в которой строки разделены знаком перевода строки, а столбцы — определенным символом. В качестве примера, в файл price.csv с помощью любого текстового редактора мы запишем следующие отделы (Рис. 1).

Эти же строки мы могли бы записать и при помощи таблицы Excel. Для этого нужно создать новую книгу и записать в ячейки перечисленные значения (по одному в каждой ячейке), как показано на Рис. 2.

1   2

После этого выбрать пункт меню Файл > Сохранить как…, перейти в директорию документов ИМ (f:\www\shop) в качестве типа файла указать CSV (разделители — запятые) (*.CSV)», ввести имя файла price и нажать кнопку Сохранить. Вот и вся наука :-). В дальнейшем вы сможете открывать этот файл с помощью Excel и вносить в него те или иные изменения и/или дополнения в ассортимент продукции.

Теперь перейдем к формату файла. Первая буква «о» каждой строки обозначает, что дальнейшая информация в строке представляет собой информацию об отделе. Буква «о» — это условность для наглядности :-). Можно было написать любую другую букву или несколько букв — для программы это некритично, это критично для удобочитаемости текста нашего прайса. Второй символ — точка с запятой — также не является критичным, здесь может стоять любой символ. Главное, чтобы этот символ не повторялся в строке, иначе это вызовет неправильную обработку прайса и, следовательно, неправильный вывод данных в тело левого фрейма.

После первого разделителя идет порядковый номер отдела — последовательно расположенные целые числа. Причем последовательность — необязательное условие при описании отделов ИМ. Вполне возможна ситуация, когда вам понадобится исключить один из тысячи отделов вашего ИМ — после этого совсем необязательно будет менять номера всех оставшихся отделов, дабы сохранить прежний порядок.

После второго разделителя, как вы уже догадались :-), идет название отдела. В принципе, количество отделов и продуктов в ИМ не ограничено — все зависит от вашей фантазии.

При описании структуры ИМ, как видите, я не использую тэгов форматирования, хотя они, несомненно, обеспечили бы нашему творению не только функциональность, но и красивый внешний вид. В нашем общем деле важен принцип, алгоритм написания, а не красивые менюшки и кнопочки, которые вы, без сомнения, сможете сделать в любом фотошопе :-). А у меня четкая задача — вместить максимум информации в минимальное количество символов. Поэтому если вы не знаете, как отцентрировать абзац или применить к нему шрифт с гарнитурой Times, — смело ныряйте с головой в популярное online-руководство html.manual.ru и «учитесь, учитесь и еще раз учитесь :-)».

Исходный код левого фрейма (без тэгов форматирования :-)) приведен здесь.

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

Итак, первая и последняя строки — тэги соответственно начала и окончания участка РНР-кода. Во второй строке происходит открытие для чтения файла price.csv из директории f:/www/shop.

Далее в блоке if проверяется корректность открытия файла - при удачном открытии начинается, собственно, самое интересное. И начинается оно с нового для нас блока while.

Разработчики РНР обозвали операторы if…endif, while…endwhile и некоторые другие управляющими конструкциями. И это правильно :-). Действительно, if направляет интерпретатор туда, куда нам нужно, а while может повторить любой участок кода нужное нам количество раз. Итак, while — это оператор повторения. Синтаксис его следующий:

или

Здесь expr — выражение, истинность которого проверяется оператором while, а statement — оператор или блок операторов, который повторяется, пока условие expr истинно. Кстати, если оператор, который необходимо повторить, всего один, то фигурные скобки можно опустить (в смысле, не писать :-)). Это относится ко всем блокам операторов в РНР.

В качестве условия expr в нашем случае используется оператор присваивания, в котором новой переменной $data присваивается результат выполнения функции fgetcsv().

Функция fgetcsv() возвращает одномерный массив данных, взятый из текущей строки файла $fp, причем возвращаемое значение имеет длину 1 Кб. Каждый элемент массива в файле price.csv разделен символом точки с запятой (;), что мы и указываем в качестве третьего параметра функции. При каждом новом повторении функция fgetcsv() обрабатывает следующую строку файла — и так до конца файла.

Исходя из этого, переменная $data должна быть массивом. Но почему же это нигде не указано? Да потому что мы это подразумеваем — присваиваем переменной значение, не заботясь о ее типе, так как тип будет выбран в процессе работы и всегда может быть изменен.

Итак, обобщим. Интерпретатор должен выполнять инструкции, содержащиеся в блоке while, пока массив $data содержит значения, возвращенные функцией fgetcsv().

В блоке while при помощи оператора if мы проверяем, имеет ли первый элемент массива $data[0] значение в виде буквы «о», и если имеет, выводим третий элемент массива $data[2] (название отдела) в тело фрейма в ссылке, которая при нажатии передаст управление на средний фрейм.

Массивы в РНР не нуждаются в предварительном объявлении, их элементы, как вы уже заметили, доступны по имени массива при указании индекса в квадратных скобках. Нумерация элементов массивов начинается с нуля. Кроме того, РНР поддерживает очень интересную особенность добавления данных в массив, которая заключается в динамическом добавлении данных в конец массива без учета индексов элементов. Поясню на примере.

Кроме того, РНР унаследовал от Perl’а очень полезную конструкцию так называемого хэш-массива. В хэше данные хранятся не в виде последовательности значений, а в виде последовательности пар значений, что позволяет организовать некоторое подобие простейшей базы данных в своем проекте. Например.

Хэш-массив объявляется при помощи функции array(), в которой пары ключ-значение разделяются значком =>. Данные из хэша доступны по имени массива при указании названия ключа в фигурных скобках. Функция array(), кстати, позволяет жестко объявить и обыкновенный массив. При этом параметры функции перечисляются через запятую. Например.

Лирическое отступление закончено, давайте вернемся к нашему ИМ :-).

В блоке if внутри блока while интерпретатор проверяет, является ли текущая строка описанием отдела (первая буква «о»), и если является, генерирует ссылки на каждый отдел магазина.

Ссылки — это самый сложный момент левого фрейма, так как в них мы сталкиваемся с целым рядом новых понятий. Но давайте обо всем по порядку.

Итак, при нажатии на ссылку пользователь по логике вещей должен перейти в тот или иной отдел ИМ. Так оно и происходит, причем содержимое отдела (список продукции) будет выводиться в центральном фрейме. Чтобы при нажатии на ссылку управление передавалось именно центральному фрейму (а не новому окну), мы можем воспользоваться атрибутом target, в качестве значения которого используется имя центрального фрейма, определенное в файле сборки фреймов index.phtml. В качестве значения атрибута href в ссылке служит очень сложная (на первый взгляд) конструкция, которую мы разберем буквально по косточкам :-).

В атрибуте href тэга ссылки указывается путь, по которому должен перейти браузер при активизации ее пользователем. В нашем случае можно выделить файл central.phtml, который при нажатии на ссылку загружается в центральный фрейм интернет-магазина. При этом файлу central.phtml передаются определенные параметры, отделенные от имени файла знаком вопроса. Последний служит затем, чтобы сообщать серверу, что все следующие за ним данные являются динамическими, и их следует обработать определенным в конфигурации способом, а затем вернуть в браузер результат их обработки. Чаще всего эти данные представляют собой пару переменная-значение, разделенные знаком присваивания. Так же и здесь: скрипт передает файлу central.phtml переменную otdel, имеющую значение, соответствующее номеру отдела в нашем ИМ. Разные ссылки будут передавать разные номера, так как в ИМ имеется несколько отделов. Значение номера отдела берется из массива $data[1]. В качестве названия отдела, как мы уже договорились, используется элемент массива $data[2], и все это делается в цикле while, благодаря чему в левом фрейме мы увидим несколько ссылок на разные отделы.

Вывод ссылок я намеренно разбил операторами echo на две части - для того, чтобы показать вам, что так тоже можно делать :-). Это общее свойство для всех HTML-тэгов (в данном случае имеются в виду ссылки), состоящее в том, что браузер одинаково обрабатывает тэги, написанные в несколько строк, и тэги, написанные в одну строку. Часто, для придания тексту лучшей читаемости, приходится разбивать тэги на несколько операторов, поэтому можете не бояться :-).

Обратите внимание, что элементы массива подставляются в строку через точки, используемые в качестве оператора конкатенации (соединения) строк. В качестве примера можно написать так.

Это свойство, общее для всех строк в РНР; мы еще не раз будем использовать его при написании наших скриптов.

Все ссылки отделены друг от друга тэгом физического форматирования <br>, обозначающего перевод строки. Тот же результат в Unix-системах дает использование управляющей последовательности \n. Но в нашей Windows-системе эта последовательность используется для придания исходному тексту левого фрейма более удобочитаемого вида.

Итак, пришло время собирать камни :-). Сохраняем результаты нашей работы, запускаем браузер, в адресную строку вводим http://127.0.0.1/shop и видим примерно следующее (Рис. 3).

Теперь при наведении курсора на любую из ссылок в статусной строке браузера должно отобразиться что-то типа http://127.0.0.1/shop/central.phtml?otdel=3. При просмотре исходного текста левого фрейма вы должны увидеть следующее (Рис. 4).

Левым мышем щелкаем на любой ссылке - и… ничего! Не пугайтесь, так и должно быть. «Что-то» появится после следующей статьи, когда центральный фрейм научится обрабатывать поступающие в него данные и выводить список продукции выбранного отдела.

(Продолжение следует)

Источник: http://www.mycomp.com.ua/

 


Copyright © "Internet Zone"info@izcity.com 
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone", как на источник получения информации. При этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izcity.com/.
При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас. Подробнее условия использования материалов смотрите здесь.