Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2





Скачать 374.02 Kb.
НазваниеПрограмма по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2
Дата публикации02.02.2014
Размер374.02 Kb.
ТипУрок
100-bal.ru > География > Урок


(не удаляя эти теги) и вместо него ввести новый код:


  • #rs_worldregions.regionID#">#rs_worldregions.regionName#




  • Подобная проблема уже возникала прежде: без разрыва строки все регионы будут расположены в одной строке. Для правильного форматирования списка достаточно вставить внутри цикла тег
    . К сожалению, в случае с ColdFusion Dreamweaver генерирует неподходящий код цикла, поэтому вместо простого добавления тега
    потребовалось переписать всю строку кода.



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

    1. Сохраните файл, загрузите его на сервер и протестируйте в браузере.

    На странице будут показаны все восемь регионов. При щелчке на любом из них загрузится страница tours_detail.asp, которая, несмотря на новый параметр URL-адреса, выглядит и функционирует как и прежде.

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




    Повторите шаги с 1 по 7, чтобы создать динамический список на главной странице, – вместо существующего списка регионов. Обратите внимание на дополнения и изменения, приведенные ниже.

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




    После завершения указанных действий следует сохранить страницу, загрузить ее на сервер и протестировать в браузере добавленные ссылки. Важно убедиться, что при щелчке на ссылке загружается страница tours_detail.asp, и что каждая ссылка передает на страницу свой параметр URL-адреса.



    Обновление запроса и комментирование кода с целью тестирования и отладки

    Ссылки с названиями регионов пересылают на страницу tours_detail.asp переменные URL-адреса, однако эта страница не способна обработать полученные переменные. В этом упражнении на страницу будет добавлен необходимый сценарий. Но здесь есть одна загвоздка.

    Обычно, если страница должна получить переменную URL-адреса, но при загрузке страницы эта переменная не была передана, то появляется сообщение об ошибке. Но в данном случае, когда посетитель щелкает на ссылке View All (Просмотр всей информации), на страницу не передается никаких переменных. В будущем, после того, как на страницу будет добавлена форма, позволяющая выбрать страну из списка, появится другой способ для перехода на страницу tours_detail.asp без использования параметров URL-адреса. Таким образом, страница не должна зависеть от наличия переменных URL-адреса.

    При создании приложений (даже таких простых, как это) разработчику необходимо приложить максимум усилий, чтобы предотвратить появление сообщений об ошибках. Порой для этого требуется выработать определенную стратегию, поэтому, прежде, чем двигаться дальше, следует обдумать описанные ниже моменты. Цель веб-дизайнера состоит в том, чтобы страница отображала нужные результаты на основе полученного типа данных (или на основе их отсутствия).

    Если на страницу переданы данные (например, переменные формы или URL-адреса), они будут использоваться только в одном месте: в SQL-запросе для фильтрации записей. Больше ничего на странице не зависит от этих данных. Чтобы избежать ошибок, требуется предотвратить запуск кода, который зависит от несуществующих на странице переменных. Как известно, для управления запуском или блокирования возможности для выполнения тех или иных участков кода прекрасно подходят условные конструкции (if…else). Таким образом, одно из решений проблемы заключается в размещении нескольких SQL-инструкций внутри условной конструкции – по одному запросу на каждый тип поиска. На основе наличия или отсутствия указанных переменных, условная конструкция обеспечит корректное выполнение запроса.

    Условная конструкция будет записана к концу этого урока. Но в данный момент требуется создать SQL-инструкцию, которая будет выполняться в том случае, если на страницу передана переменная URL-адреса regionID. Эта инструкция отличается от существующей SQL-инструкции, которая извлекает из базы данных все записи. Запрос, созданный ранее, тоже нужен, поскольку он соответствует варианту, когда на страницу не передано ни одной переменной. Итак, следует скопировать существующую SQL-инструкцию и настроить ее на работу с переменными URL-адреса.

    Но это приведет к другой проблеме, когда в коде появятся два несовместимых запроса. Эта проблема будет решена позднее при помощи условной конструкции. Но как быть во время создания и отладки нового запроса? Для этого потребуется временно отключить существующий запрос. Запрос перестанет обрабатываться, однако код останется на странице, и впоследствии снова будет активирован. Чтобы воспользоваться этой возможностью, следует закомментировать код существующего запроса. Как говорилось ранее, интерпретаторы кода ASP, ColdFusion и PHP игнорируют комментарии, так что код останется на странице, но не повлияет на процесс тестирования. Этот прием, как уже упоминалось, называется комментированием кода и при разработке сложных приложений является исключительно полезным средством.

    Совет. При написании кода многие программисты используют следующую стратегию – на каждом из этапов решать по одной четко определенной задаче. Если попытаться одновременно создать и новый запрос, и условную конструкцию, то в случае возникновения проблем будет непонятно, какой участок кода включает ошибку. Поэтапное выполнение одной конкретной задачи одновременно облегчает отладку кода.

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

    1. Откройте страницу tours_detail.asp. В режиме Code (Код) найдите код запроса, расположенный в верхней части документа.

    В моем случае в документах ASP и ColdFusion код запроса начинается со строки 4. В документе PHP он расположен немного ниже, в строке 12 [mysql_select_db()]. Цель данного шага заключается в том, чтобы изолировать код SQL-запроса (который начинается со строки SELECT * FROM tbl_tours) и в то же время в минимальной степени повредить код ASP, ColdFusion или PHP.

    1. Веб-дизайнерам, программирующим на ASP, ColdFusion и PHP рекомендуется выполнить предлагаемые ниже действия:

      • Пользователям ASP. Полностью выделите строку, начинающуюся с кода rs_tourDetail.Source =. Скопируйте ее и вставьте в следующую строку, так, чтобы получилось две одинаковые копии. Поместите курсор в начало первой строки и добавьте одинарную кавычку (‘), чтобы закомментировать строку.



    Итак, исходный запрос скопирован и временно заблокирован. Теперь можно изменять и проверить копию.

      • Пользователям ColdFusion. Найдите SQL-инструкцию, расположенную между тегами . Если потребуется, удалите все разрывы строки так, чтобы инструкция помещалась в одной строке. Поместите курсор перед первой SQL-инструкцией и введите . После этого перейдите в конец строки и введите - - ->.

    Исходный запрос скопирован и временно заблокирован. Теперь можно изменить и проверить копию.




    Пользователям PHP. Полностью выделите строку, начинающуюся с кода $query_rs_tourDetail = "SELECT. Скопируйте ее и вставьте в следующую строку так, чтобы получилось две одинаковые копии. Поместите курсор в начало первой строки и добавьте две косые черты (два слэша) (//), чтобы добавить комментарий к этой строке.

    Первоначальный запрос скопирован и временно заблокирован. Теперь можно изменить и тестировать копию.




    Непосредственно перед предложением ORDER BY, расположенным ближе к концу SQL-инструкции, введите следующий код:

    Для ASP:

    WHERE tbl_country.region=" & Request.QueryString("regionID") & "

    Для ColdFusion:

    WHERE tbl_country.region = #url.regionID#

    Для PHP:

    WHERE tbl_country.region =". $_GET['regionID'] ."




    После закрывающих кавычек (") в ASP и PHP, а также после закрывающего знака # в ColdFusion должен стоять пробел. Другими словами, предложение ORDER BY не должно без пробела примыкать к кавычкам или знаку #.

    Совет. Как говорилось ранее, в ASP оператор & применяется для конкатенации (или объединения) текстовых строк. С той же целью используется точка (.) в PHP. Конкатенация необходима в обоих случаях, поскольку смешиваются литеральные строки (составляющие большую часть SQL-запросов), которые ASP или PHP должны передать без изменения, и специальный код ASP или PHP, который требуется оценить, например, Request.QueryString () (ASP) или $_GET() (PHP). Строки заключаются в кавычки, а выражения нет. Для их совместного употребления следует объединить участки кода при помощи оператора & или точки. При использовании ColdFusion такой проблемы не возникает, поскольку в этом случае выражения, которые требуется оценить, помещаются между знаками #…#.

    Итак, для чего предназначен добавленный в запрос код? Он создает дополнительный критерий для отбора, который значительно сужает первоначально заданную область поиска. При выполнении первого варианта поиска из базы данных извлекается вся информация, необходимая для отображения всей информации о турах. Новый запрос делает то же самое, но при этом извлекает только те путешествия, которым соответствует значение поля regionID, равное значению переданного на страницу параметра URL-адреса.

    Приведем конкретный пример. Каждому путешествию соответствует поле, в котором можно указать страну. Как известно из предшествующих уроков, в этом поле содержится внешний ключ, указывающий на таблицу tbl_country. Таким образом, двум турам, проводимым во Франции, соответствует одно и то же значение внешнего ключа countryID. Это общее поле связывает таблицу путешествий с таблицей стран (в данном случае все туры, проводимые во Франции, посредством этого поля связаны со значением France в таблице tbl_country).

    Одно из полей в таблице стран (tbl_country) является внешним ключом из таблицы регионов (tbl_region). Таким образом, Франции будет соответствовать значение 3 в поле regionID, поскольку 3 – это идентификатор Европы, а Франция, естественно, входит в Европу. Помимо Франции, в Европе находятся Соединенное Королевство и Италия, – так что каждой из этих стран соответствует идентификатор региона, равный 3. Японии соответствует значение regionID, равное 4 (East Asia [Восточная Азия]). Следовательно, все путешествия, которые проводятся в Японии, соответствуют значению regionID, равному 4, а не 1 или 3. Поскольку Таиланд тоже находится в Восточной Азии, и ему соответствует значение regionID, равное 4, то все туры в Таиланд также связаны с этим значением (regionID=4).

    Таким образом, связь параметра regionID со странами относится к типу отношений "один-ко-многим". То есть, каждому региону может соответствовать несколько стран. Точно так же любая страна связана с многочисленными турами (тоже отношением "один-ко-многим"), то есть, в одной стране может проводиться несколько путешествий. Однако ни одна страна не может принадлежать к нескольким регионам, и ни одно путешествие не может соответствовать нескольким странам. Таким образом, достаточно написать запрос, который бы извлекал путешествия, если соответствующие им страны расположены в выбранном регионе. Отображаться будут только эти путешествия.

    Именно это условие определяет предложение WHERE в SQL-инструкции. Чтобы убедиться в том, что файл работает, как и ожидалось, следует протестировать его в браузере.

    1. Сохраните страницу tours_detail.asp, загрузите на сервер, и закройте. На панели Site (Сайт) выберите страницу tours.asp и нажмите клавишу (F12), чтобы протестировать ее.

    Тестировать страницу tours_detail.asp напрямую не представляется возможным, поскольку при загрузке страницы появится сообщение об ошибке. Для выполнения написанного в предыдущем шаге SQL-запроса обязательно наличие переменной URL-адреса regionID. Если просто загрузить страницу, эта переменная окажется недоступной, вследствие чего выполнение SQL-запроса окажется невозможным, и появится сообщение об ошибке.

    1. На странице tours.asp выберите в меню ссылку на любой из регионов.

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




    Но есть и не очень приятные новости: навигационная панель для перемещения между записями осталась на странице. Поскольку в данный момент ни в одном регионе не проводится больше пяти туров, страница становится одновременно и первой, и последней, – поэтому все четыре ячейки оказываются пустыми. Модель поведения Repeat Region (Повторяющаяся область), предназначенная для отображения путешествий на этой странице, ограничена отображением только пяти туров. Было бы неплохо скрывать навигационную панель в том случае, если страница является единственной, то есть когда из базы извлечено не более пяти записей. Но если количество извлеченных записей превысит пять (в частности, когда в компании Newland Tours будут проводиться новые туры по Германии, Норвегии и Испании), навигационная панель должна появиться вновь.

    Скрытие навигационной панели

    Как обычно, прежде чем приступить к созданию кода, требуется четко понять, что именно следует делать. Навигационная панель для перемещения между записями, размещенная внутри таблицы, должна отображаться, если количество извлеченных из базы данных записей больше пяти (то есть шесть, семь и т.д.). Как известно, на странице одновременно выводится по пять записей. Однако если из базы данных извлечено не более пяти записей, навигационная панель не будет работать, следовательно, в этом случае она появиться не должна.

    Как всегда, код ASP, ColdFusion и PHP отличается внешне, но он построен по одним и тем же принципам.

    1. На странице tours_detail.asp в комбинированном режиме Split (Режим разделения) при помощи селектора тегов выделите таблицу, в которой содержится навигационная панель для перемещения между записями.

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

    Чтобы выделить таблицу от остального кода, достаточно добавить несколько пустых строк выше и ниже таблицы (см. рис. вверху следующей страницы).

    1. В режиме Code (Код), непосредственно перед открывающим тегом таблицы, введите первую часть сценария, управляющего отображением таблицы в зависимости от количества записей.

    Для ASP:

    <% If (MM_atTotal = false Or Not IsEmpty(Request.QueryString("offset"))) Then %>

    Для ColdFusion:



    Для PHP:



    При создании набора записей в памяти сервера сохраняются не только сами данные, извлеченные из базы, но и некоторая необходимая информация об этих данных. К такой информации (доступной на ASP, ColdFusion и PHP) относится количество записей, извлеченных при помощи запроса. В ASP и ColdFusion переменная, в которой хранится общее число записей, называется RecordCount. Для доступа к ней применяется код rs_myQuery.recordcount. В PHP для получения этой информации применяется функция mysql_num_rows(). Используют ее в следующем виде:mysql_num_rows($rs_myQuery). В обоих примерах название rs_myQuery является вымышленным, и в реальном коде вместо него следует подставлять название используемого набора записей.




    Во время работы с циклами или при разбиении набора записей на страницы переменная RecordCount (ASP и ColdFusion) или функция mysql_num_rows() (PHP) может оказать неоценимую помощь. Но в данной ситуации возникает одна проблема. В сценариях, сгенерированных с помощью примененных серверных моделей поведения, эти переменные уже используются. Если применить их вновь, между сценариями могут возникнуть непредсказуемые конфликты. В сценариях ASP и PHP, во избежание таких проблем, применяются переменные, уже созданные серверными моделями поведения.

    Теперь обратим внимание на сами сценарии. В версии сценария для ColdFusion (кстати, самой простой из всех) сервер получает указание, что если количество записей больше пяти (количество записей, которые одновременно могут отображаться на экране), следует выполнять весь код, идущий после этой строки. Этим кодом является таблица, в которой содержится навигационная панель для перемещения между записями. Если количество записей меньше пяти (так что условие возвращает значение false [ложь]), сценарий переходит к коду, закрывающему конструкцию (он еще не написан), после чего продолжается дальнейшая обработка страницы. Другими словами, если количество записей меньше пяти, таблица, содержащая навигационную панель для перемещения между записями, не отображается. Эта гибкая структура довольно удобна, поскольку вне зависимости от того, что происходит в базе данных (имеется в виду удаление или добавление туров), навигационная панель для перемещения между записями окажется доступной только в случае, если в ней возникнет необходимость.

    версии кода для ASP вызывается пара переменных, сгенерированных объектом Recordset Navigation Bar (Навигационная панель для перемещения между записями), добавленным на страницу в предыдущем уроке. Для полного понимания назначения этой строки требуется понимать код VBScript, выводимый на страницу объектом Recordset Navigation Bar, а также около 300 строк кода, благодаря которым работает сама модель поведения. Все это не является целью этой книги. Короче говоря, сценарий определяет, умещаются ли возвращенные записи на одной странице. В первом случае таблица с навигационной панелью отображается, и, напротив, если записи не помещаются на странице, таблица будет скрыта.



    Версия сценария для PHP несколько проще. Добавленная ранее серверная модель поведения создала переменную $totalPages_rs_tourDetail, которая используется сценарием, чтобы отследить общее количество страниц с записями. Это количество рассчитывается на основе общего количества записей и количества записей, выводимых на страницу. Переменная проверяется на равенство нулю. Если существует только одна страница с записями, то значение переменной равно нулю, а если три страницы, – значение равно 2 (это может показаться странным). Таким образом, известно, что если значение переменной не равно нулю (оператор != означает "не равно"), следовательно, записи распределены по двум страницам или более, и требуется навигационная панель для перемещения между ними. Если же значение равно 0, весь код в теле условия пропускается, и навигационная панель не отображается.




    После закрывающего тега





  • 12. Урок: Создание поисковых интерфейсов:

    Рассматривается создание динамического поискового интерфейса; нескольких SQL-запросов, объединяющих данные таблицы и динамически фильтрующих данные и подчиненные запросы; отображение или скрытие навигационной панели, предназначенной для перехода между записями; применение встроенных функций для проверки наличия переменных формы и URL-адреса; использование вложенных условных блоков (if…else) для создания сложной структуры управления данными.







    Пришло время завершить создание приложения для поиска путешествий. В предыдущем уроке была создана страница tour_details.asp, которая отображает все путешествия без фильтрации. В данном уроке будет создана страница поиска, позволяющая посетителям просматривать туры тремя различными способами: просматривать все путешествия, либо туры, отфильтрованные по регионам или по странам.

    Сложность состоит в том, что требуется создать три независимых способа поиска путешествий, результаты которых будут выводиться на одной странице (tours_detail.asp). На странице поиска (tours.asp) соответственно трем способам доступа на страницу tours_detail.asp будет создано три поля. Первый способ – это простая ссылка, не содержащая параметров URL-адреса. При переходе по ней на странице tours_ detail.asp отображаются все туры без фильтрации (то есть в том виде, в каком страница отображается на данный момент). Второй способ – это применение URL-адреса с дополнительными параметрами. Третий способ заключается в пересылке на страницу tours_detail.asp переменных формы, которые создаются при нажатии кнопки Submit. Переменные формы и переменные URL-адреса будут использованы для динамической фильтрации набора записей.




    Рис. 12.1.  В этом уроке снова потребуется выйти за рамки графического интерфейса программы и поработать с кодом – особенно с SQL

    Чтобы все три способа доступа к странице tours_detail.asp заработали, требуется добавить сценарий, реакция которого меняется в зависимости от того, какие именно данные передаются при загрузке страницы: данные полностью отсутствуют (первый способ), переданы параметры URL-адреса (второй способ) или переменные формы (третий способ). С учетом типа полученных данных или их отсутствия сценарий должен определить, как именно изменить запрос, извлекающий описания путешествий, чтобы отфильтровать ненужные.

    На таком раннем этапе все это может показаться сложным, однако большинство задач, из которых состоит урок, выполнялось и раньше, но только по отдельности. Но именно способность творчески комбинировать известные приемы, а также способность в случае необходимости настраивать код вручную определяет уровень владения ASP, ColdFusion и PHP. В упражнениях урока будет выполнена отправка и получение переменных формы и URL-адреса, вручную создан SQL-код и использована условная конструкция (if…else) для определения того, какой из трех SQL-запросов следует запускать. Кроме того, будут задействованы комментарии и функции IsEmpty() (ASP), IsDefined() (ColdFusion) или sset() (PHP) для определения наличия переменных.

    Что будет изучаться:

    • создание динамического поискового интерфейса, который позволяет пользователям искать и фильтровать данные тремя различными способами;

    • создание вручную нескольких SQL-запросов, объединяющих данные таблицы по одному или нескольким полям и динамически фильтрующих данные и подчиненные запросы;

    • отображение или скрытие навигационной панели, предназначенной для перехода между записями;

    • временная блокировка участков кода при помощи комментариев в целях тестирования и отладки;

    • применение встроенных функций для проверки наличия переменных формы и URL-адреса;

    • использование вложенных условных блоков (if…else) для создания сложной структуры управления данными.

    Время выполнения

    На выполнение этого урока потребуется примерно 2 часа 30 мин.

    Файлы урока

    Исходные файлы:

    Lesson12/Start/newland/tours.asp

    Lesson12/Start/newland/tours_detail.asp

    Итоговые файлы:

    Lesson12/Complete/newland/tours.asp

    Lesson12/Complete/newland/tours_detail.asp

    Lesson12/Complete/newland/index.asp

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

    В этом упражнении приступаем к реализации подготовительного этапа по созданию страницы поиска. Для этого следует удалить устаревший контент со страницы tours.asp. На данный момент на странице tours.asp содержится статический список всех путешествий. После создания динамического списка туров (tours_details.asp) содержимое страницы tours.asp теряет свою актуальность. Однако, поскольку навигационные панели по всему сайту содержат ссылку Find Tours (Поиск туров), которая указывает на tours.asp, эта страница идеально подходит для размещения на ней поискового интерфейса.

    Неудивительно, что в первую очередь требуется удалить весь статический список путешествий. В дальнейшем будет намечена основная структура страницы. Наконец, будет создан первый из трех поисковых интерфейсов, хотя в данном случае термин "поисковый интерфейс", несомненно, является преувеличением – это простая гиперссылка, при переходе по которой на странице tours_detail.asp отображаются все путешествия.

    1. Откройте страницу tours.asp и измените заголовок "Choose Tour" ("Выберите тур") на Find Tour. Выделите все содержимое ниже заголовка (включая и таблицу). После этого нажмите клавишу (Del). Под заголовком "Find Tours" ("Поиск туров") введите следующий текст:

    Use this page to find the tour of your dreams. Once you’ve made a selection, check out the Tour Price Calculator. (На этой странице можно найти тур Вашей мечты. После выбора тура проверьте калькулятор для расчета стоимости путешествия.)

    Newland Tours offers many tours to different parts of the world. To find a tour to your desired destination, use the table below to browse by world region, by country, or view them all. (Компания Newland Tours предлагает много туров по разным странам. Для поиска нужной информации по туру, Воспользуйтесь таблицей (внизу страницы, чтобы просмотреть интересующие Вас сведения по регионам и по странам.)

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



    1. К словам "Tourprice Calculator" ("Калькулятор для расчета стоимости тура") прикрепите ссылку на страницу tourprice.asp.

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

    1. Под вторым абзацем создайте новую строку и вставьте в нее таблицу со следующими параметрами:

    2. Rows: 3 (Строк: 3)

    3. Columns: 2 (Столбцов: 2)

    4. Width: 95 Percent (Толщина: 95 процентов)

    5. Border thickness: 1 (Толщина границы: 1)

    6. Cell padding: 3 (Заполнение ячейки: 3)

    7. Cell spacing: 0 (Расстояние между ячейками:0)

    Таблица состоит из трех строк – по одной для каждого вида поиска. В левый столбец будут помещены описания для каждого способа поиска, а в правом – ссылки и форма.



    1. В три ячейки, находящиеся в левом столбце, с вверху вниз введите следующий текст: "By World Region" ("По регионам"), "By Country" ("По странам") и "View All Tours" ("Просмотр всех туров"). Перетащите разделитель между столбцами влево так, чтобы правый столбец был шире левого.

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



    1. Выделите слова "View All" в ячейке View All Tours (Просмотр всех туров), и прикрепите к нему ссылку на страницу tours_detail.asp.

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

    1. Сохраните файл, загрузите его на сервер и протестируйте в браузере.

    При щелчке на ссылке View All (Просмотр всей информации) загрузится страница tours_detail.asp, которая будет работать точно так же, как прежде. На будущее важно запомнить, что когда пользователи переходят по этой ссылке, на страницу не передается никаких дополнительных переменных.




    Поиск по регионам: создание интерфейсов

    Пора реализовать первый из двух оставшихся вариантов поиска: поиск путешествий по регионам. После завершения работы на странице появится список, состоящий из восьми регионов, к каждому из которых прикреплена ссылка на страницу tours_detail.asp, к которой прикреплена строка запроса, содержащая уникальное значение переменной regionID. На страницу tours_detail.asp будут переданы только те записи, которые были извлечены после выполнения SQL-запроса, фильтрующего данные с заданным значением для поля regionID. После этого тот же процесс будет повторен на странице index.asp, чтобы пользователи могли перейти к выбранным турам непосредственно с главной страницы. При выполнении упражнения на странице index.asp рекомендуется, не пользуясь книгой, по памяти воспроизвести указанные шаги, что позволит лучше усвоить описанные выше операции.

    1. На странице tours.asp создайте новый набор записей со следующими параметрами:

    2. Name: rs_worldregions (Название: rs_worldregions)

    3. Connection: conn_newland (Соединение: conn_newland)

    4. Table: tbl_region (Таблица: tbl_region)

    5. Columns: All (Столбцы: Все)

    6. Filter: None (Фильтр: отсутствует)

    7. Sort: regionName, Ascending (Сортировка: regionName, по возрастанию)

    этот набор записей извлекает из базы все названия регионов и соответствующие им идентификаторы. Названия регионов будут использованы для создания списка регионов, а идентификаторы – передаваться в качестве значений параметров URL-адреса. Похожая стратегия применялась при работе с профилями стран.



    1. Поместите курсор в пустой ячейке, расположенной справа от надписи "By World Region" ("По регионам"). В категории Application (Приложение) на панели Insert (Вставка) щелкните на кнопке Dynamic Text (Динамический текст). В одноименном диалоговом окне Dynamic Text выберите поле regionName (НазваниеРегиона) и нажмите OK.

    Если протестировать страницу сейчас, на ней отобразится первое в наборе записей название региона или страны (Africa). Остальные названия не будут выведены, поскольку к динамическому тексту не применялась модель поведения Repeat Region (Повторяющаяся область). Однако до этого требуется прикрепить к динамическому тексту гиперссылку.



    1. Выделите динамический текст (в псевдокоде Dreamweaver – {rs_worldregions.regionName}) . На панели Property Inspector (Инспектор свойств) щелкните на значке папки, расположенном справа от поля Link (Ссылка), чтобы открыть диалоговое окно Select File (Выбор файла). Выберите файл tours_detail.asp.

    На этом шаге создается ссылка на страницу tours_detail.asp. Безусловно, проще указать файл tours_detail.asp при помощи инструмента Point to File (Указать файл). Однако поиск файла в диалоговом окне имеет полезную особенность, – в этом случае Dreamweaver упрощает создание ссылки, к которой прикрепляются переменные запроса/URL-адреса.



    1. Не закрывая диалоговое окно Select File (Выбор файла), нажмите кнопку Parameters (Параметры) в правом нижнем углу. В столбце Name (Название) диалогового окна Parameters (Параметры) введите regionID.



    Итак, на этом шаге задается переменная regionID. Теперь Dreamweaver имеет достаточно информации, чтобы сгенерировать следующий код: . Разумеется, этого недостаточно. Переменная regionID должна иметь какое-то значение, в данном случае – текущее значение поля regionID.

    1. Щелкните на значке с изображением молнии в столбце Value (Значение). Выберите в списке поле regionID и нажмите OK, чтобы вернуться в диалоговое окно Parameters (Параметры). Нажмите OK еще два раза, чтобы вернуться в документ.



    На данном шаге указывается значение переменной запроса/URL-адреса regionID.

    В поле Link (Ссылка) на панели Property Inspector (Инспектор свойств) появится динамический адрес tours_detail.asp?regionID=<%=(rs_worldregions.Fields. Item("regionID").Value)%>, либо аналогичный код для ColdFusion или PHP.



    1. Выделите блок динамического текста. На панели Server Behaviors (Модели поведения серверов) добавьте к нему модель поведения Repeat Region (Повторяющаяся область), чтобы за один прием на страницу выводились все записи.

    Модель поведения Repeat Region (Повторяющаяся область) создает цикл, во время выполнения которого на страницу поочередно выводятся все записи, извлеченные из базы данных с помощью запроса. В таблице tbl_region содержатся восемь регионов, поэтому теперь будет отображаться не только первый, но и все восемь.



    1. Не снимая выделение с динамического текста, переключитесь в комбинированный режим Split (Режим разделения) (если необходимо). Пользователям ASP и PHP рекомендуется найти закрывающий тег , расположенный после выделенного кода. Сразу после него введите тег разрыва строки
      . Пользователям ColdFusion следует удалить весь код между тегами
    и
    , относящегося к таблице, выделенной в шаге 6, поместите код, закрывающий условный блок, созданный на предыдущем шаге.

    Для ASP:

    <% End If %>

    Для ColdFusion:



    Для PHP:



    Это внешняя граница условной конструкции. Если при обработке условия, расположенного в открывающей строке, возвращается значение false (ложь), обработчик ASP, ColdFusion или PHP сразу переходит в конец блока.



    Если теперь протестировать страницу (как говорилось ранее, проверять ее следует при переходе по ссылке региона со страниц tours.asp или index.asp), то навигационная панель для перемещения между записями отображаться не будет. Для полной уверенности в правильности работы страницы нужно закомментировать второй участок SQL-кода и удалить символы комментариев, добавленных вокруг первого, снова потом вновь проверить страницу, на этот раз без фильтрации. При этом будут показаны все путешествия, а для перемещения между ними загрузится навигационная панель. В этом случае после завершении тестирования нужно снова закомментировать первый запрос и активировать второй.

    1. Сохраните и закройте страницу tours_detail.asp.

    Поиск по стране: фильтрация по переменной формы

    Сценарий для поиска путешествий по регионам готов. Поиск по странам аналогичен поиску туров, но с некоторыми отличиями. Вместо ссылок и параметров URL-адреса будут применяться формы и переменные формы. Как и прежде, для реализации поиска используется SQL-инструкция.

    1. Откройте страницу tours.asp. В режиме Design (Дизайн) поместите курсор во второй строке правого столбца и добавьте здесь форму, состоящую из одного раскрывающегося списка и кнопки Submit.

    К этому моменту добавление элементов на страницу не должно вызывать затруднений.




    В селекторе тегов выберите тег
    , а затем на панели Property Inspector (Инспектор свойств) присвойте форме имя frm_bycountry. В качестве значения атрибута в поле со списком Action (Действие) укажите страницу tours_detail.asp. В качестве метода в поле со списком выберите POST.

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




    На панели Bindings (Привязки) создайте новый набор записей, используя следующие параметры:

    1. Name: rs_countries (Название: rs_countries)

    2. Connection: conn_newland (Соединение: conn_newland)

    3. Table: tbl_country (Таблица: tbl_country)

    4. Columns: Selected, countryName (Столбцы: выделенные, countryName)

    5. Filter: None (Фильтр: отсутствует)

    6. Sort: countryName, Ascending (Сортировка: countryName, по возрастанию)



    Если нажать кнопку Test (Проверить), станет видно, что набор записей включает список всех стран из таблицы tbl_country, упорядоченных по алфавиту в порядке возрастания. Этот список будет использован для заполнения раскрывающегося списка формы.



    1. Щелкните на поле со списком, чтобы выделить его, и на панели Property Inspector (Инспектор свойств) присвойте ему имя tourCountry. Нажмите кнопку Dynamic (Динамический), чтобы открыть диалоговое окно Dynamic List/Menu (Динамический список/меню). В меню Options from recordset (Параметры из набора записей) выберите пункт rs_countries. В списках Values (Значения) и Labels (Надписи) оставьте одинаковое значение по умолчанию (countryName), а после этого нажмите OK.

    Это диалоговое окно использовалось и раньше, так что последствия выполненных действий являются предсказуемыми. При отображении страницы в браузере список окажется заполнен названиями стран, отсортированных по алфавиту в порядке возрастания. При нажатии кнопки Submit загрузится страница tour_detail.asp (которая была указана в качестве значения атрибута Action (Действие) при настройке формы). Теперь атрибут и выбранное значение (например, tourCountry=Argentina или другая выбранная страна) будут переданы форме в качестве ее переменной (см. рис. вверху следующей страницы).

    Рекомендуется сохранить страницу и протестировать ее в браузере, просто чтобы убедиться в том, что названия стран действительно добавляются в список. Если при проверке нажать кнопку Submit, появится сообщение об ошибке, поскольку страница tours_detail.asp настроена не на получение переменной формы countryName, а на получение переменной URL-адреса regionID.



    1. Откройте страницу tours_detail.asp. Найдите два запроса (один из которых закомментирован). Скопируйте второй запрос и вставьте его в следующую строку. Закомментируйте и второй запрос.

    Это снова дает возможность внести изменения в копию и протестировать новый SQL-инструкцию, которая будет обрабатывать данные, переданные формой.




    В запросе измените только условие, задаваемое предложением WHERE, так, чтобы код выглядел следующим образом:

    Для ASP:

    WHERE tbl_country.countryName=' "& Request.Form("tourCountry") & " '

    Для ColdFusion:

    WHERE tbl_country.countryName = '#form.tourCountry#'

    Для PHP:

    WHERE tbl_country.countryName =' ". $_POST['tourCountry'] ." '

    Как и в прошлый раз, следует убедиться, что между закрывающей одинарной кавычкой (') и следующим предложением ORDER BY установлен пробел.

    В значительной степени, смысл этого выражения должен быть понятен. Здесь указано, что из базы данных должны извлекаться только те туры, которым соответствует название страны, равное значению, переданному из формы (хотя для доступа к этому названию вновь требуется задействовать связь между таблицами tbl_tours и tbl_country).

    Недоумение могут вызвать одинарные кавычки, в которые заключено все динамическое содержимое во всех трех участках кода. Это особенность языка SQL. Каждый раз, когда задается строка (в отличие от выражения или числового значения), она должна быть заключена в одинарные кавычки. В противном случае, база данных попытается обработать полученный текст как функцию или одну из специальных команд базы данных. При добавлении одинарных кавычек база данных получит указание не интерпретировать и не оценивать код, а сравнить его с текстом, хранящимся в указанном поле.




    Сохраните файл и загрузите его на сервер. На панели Site (Сайт) выберите страницу tours.asp и нажмите клавишу (F12), чтобы протестировать ее. Выберите в списке любую страну и нажмите кнопку Submit.

    В большинстве стран есть только один тур, который и отобразится после выбора страны. Если выбрать страну, в которой проводится несколько путешествий (France, Japan, United Kingdom и United States), все они будут выведены на странице (см. рис. вверху следующей страницы).




    Если выбрать Тайвань (Taiwan), то загрузится пустая страница, поскольку, несмотря на то, что эта страна содержится в таблице tbl_country, в ней не проводится ни одного путешествия. Чисто гипотетически такое несоответствие вряд ли бы имело место. Однако в реальности путешествие по Тайваню может оказаться в стадии разработки. Менеджер, ответственный за добавление информации о странах, уже занес данные по Тайваню в базу данных, но полностью ввод всей информации о туре еще не завершен. Во многих базах данных, в том числе, в Microsoft Access (но не в MySQL), для учета этой ситуации в запрос добавляется условие для отбора только тех стран, в которых проводится как минимум одно путешествие.

    1. Только пользователям ASP и ColdFusion. Откройте файл tours.asp. На панели Bindings (Привязки) дважды щелкните на наборе записей Recordset (rs_countries), чтобы отредактировать его. В диалоговом окне Recordset (Набор записей) нажмите кнопку Advanced (Расширенный). Между строками FROM tbl_country и ORDER BY countryName ASC введите приведенный ниже код. Пользователям PHP выполнять этот шаг не нужно, однако рекомендуется прочитать последующий текст.

    2. WHERE EXISTS

    3. (SELECT * FROM tbl_tours WHERE tbl_tours.country = tbl_country.countryID)

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

    Поскольку в запрос внесен ряд дополнений, следует уделить пару слов языку SQL. Во-первых, здесь применяется подчиненный запрос, то есть запрос, включающий другой вложенный запрос или, что более характерно для данного случая, запрос, используемый в качестве критерия для другого запроса. В коде подчиненный запрос заключен в скобки. Он предназначен для поиска в таблице tbl_tours идентификаторов стран, которые совпадают с идентификаторами стран в таблице tbl_country. В эту категорию попадают все страны из базы данных, кроме Тайваня.




    Предикат EXISTS применяется для проверки существования строк, полученных в результате выполнения подчиненного запроса. Поскольку для выполнения запроса достаточно просто проверить их существование, действительные значения не извлекаются. В результате выполнения подчиненного запроса оказывается, что в двух таблицах одновременно (tbl_tours и tbl_country) находится 15 стран, после чего они включаются во внешний (основной) запрос. Поскольку Тайвань содержится только в одной из таблиц (tbl_country), он не включается.

    Примечание. Несмотря на то, что синтаксическая конструкция WHERE EXISTS и подчиненные запросы в целом являются частью стандарта ANSI для SQL, в MySQL они не поддерживаются. Если ввести этот код в MySQL, появится сообщение об ошибке. Именно из-за этого пользователи PHP не могут выполнить указанную операцию и вынуждены решать эту проблему другим способом. В данном случае лучшим решением будет создание двух баз данных, одна из которых применяется на сайте для разработки, а вторая предназначена на сайте для общего доступа. Во вторую базу копируются данные из первой только в том случае, если ее создание полностью завершено. Конечно, в данном случае волноваться по этому поводу не следует, поскольку проект является виртуальным.

    Чтобы увидеть результаты выполнения измененного запроса, следует нажать кнопку Test (Проверить). На этот раз, в списке будут отображены не 16, а 15 стран – без Тайваня. Как только в базу данных tbl_tours будет добавлено путешествие по Тайваню, эта страна снова появится в списке, поскольку она будет соответствовать условию с применением предиката EXISTS.



    1. Сохраните и закройте tours.asp.

    Переключение между SQL-запросами в зависимости от переменных среды

    После проверки запросов стало очевидно, что каждый из них работает, когда два других закомментированы. Такие условия вполне подходят для тестирования, когда существует возможность в любой момент открыть документ и закомментировать тот или иной участок кода. Но при открытии сайта, предназначенного для общего доступа, в код необходимо внести дополнительные изменения. Несложно понять, что требуется реализовать автоматическое переключение между запросами, осуществляемое в зависимости от выбранного посетителем типа поиска. Во-первых, следует определить, как страница tours_detail.asp определит способ поиска, который был выбран. Затем на основе этого следует перейти к соответствующему SQL-запросу. Для создания такого перехода идеально подходит условная конструкция if… else, – вопрос только в том, как с ее помощью выявить тип поиска, выбранный посетителем?

    В одном из предыдущих уроков был создан сценарий, проверяющий корректность заполнения формы. При выполнении сценария производилась проверка того, существуют ли переменные numadults и numchildren, а также являются ли их значения числовыми. Если хотя бы одно условие не выполнялось, посетитель переводился обратно на страницу с формой для устранения проблемы. Подобная стратегия позволяет определить, какой тип поиска выбрал посетитель. Проверка наличия или отсутствия конкретных переменных должна производиться в следующем порядке:

    • если не существует переменных формы или URL-адреса, то это означает, что посетитель перешел на страницу по ссылке View All (Просмотр всей информации);

    • если в памяти присутствует переменная URL-адреса, значит посетитель перешел на страницу по одной из ссылок с названиями регионов;

    • если в памяти существует переменная формы, следовательно, посетитель выбрал страну в списке формы.

    Этой информации достаточно для определения логической структуры сценария, который требуется написать. Логика наглядно продемонстрирована в приведенном ниже псевдокоде. Фразы, отделенные косыми чертами (слэшами), поясняют причину возникновения того или иного условия. В итоговый сценарий они добавлены не будут.

    Если переменной формы не существует // посетитель щелкнул либо на ссылке View All Tours

    (Просмотр всех туров), либо на ссылке с названием региона

    Если не существует переменных URL-адреса // посетитель щелкнет на ссылке View All Tours.

    Запустить первый запрос

    Иначе переменная URL-адреса существует // пользователь щелкнул на ссылке с названием региона

    Запустить второй запрос

    Иначе переменная формы существует // пользователь выбрал страну из списка формы

    Запустить третий запрос

    При анализе этого псевдокода становится понятно, что для его реализации требуются две условные конструкции if…else, вложенные одна в другую. Это необходимо, так как одно из условий (отсутствие переменной формы) может выполняться по двум разным причинам: поскольку посетитель щелкнул на ссылке View All (Просмотр всей информации), и на странице нет переменных URL-адреса. Помимо этого, возможен вариант, при котором посетитель щелкнул на ссылке с названием региона, вследствие чего на страницу передана переменная URL-адреса.

    1. Откройте страницу tours_detail.asp. В режиме Code (Код) найдите три строки SQL-кода и удалите символы комментариев, в которые заключена часть из них. Выше и ниже этих строк добавьте несколько разрывов строки, чтобы отделить запросы от остального кода.

    На этом шаге производится подготовка к добавлению запросов в условную конструкцию if…else. При этом невозможно повредить код в соседних строках. После того, как обработчик сценария ASP или ColdFusion определит, какой запрос выполнять, остальные два будут полностью проигнорированы.




    Над верхней строкой запроса введите строку кода, проверяющую существование переменной формы.

    Для ASP:

    If IsEmpty(Request.Form("tourCountry")) Then

    Для ColdFusion:



    Для PHP:

    if (!isset($_POST['tourCountry'])) {

    Результатом обработки этого условия (как и любого другого) будет значение true (истина) или false (ложь). Если возвращается значение true (то есть переменной формы не существует), сценарий должен определить, существует ли переменная URL-адреса. Если возвращается значение false, становится ясно, что посетитель выбрал страну из списка формы, а, следовательно, нужно выполнять третий запрос.

    1. С помощью клавиши (Tab) установите отступ от края для всех трех SQL-запросов. Над строкой с третьим запросом создайте новую строку и введите в ней код, благодаря которому будет запускаться третий запрос.

    Для ASP:

    Else

    Для ColdFusion:



    Для PHP:

    } else {

    Если после проверки условия возвращается значение false, обработчик будет проводить в коде поиск операторов else if или else. Когда он их находит, они выполняются. Добавление этого кода обеспечивает запуск запроса, производящего фильтрацию на основе переменной формы, в том случае, если она существует.

    1. Добавьте приведенный ниже код после строки третьего запроса, чтобы закрыть блок if…else.

    Для ASP:

    End If

    Для ColdFusion:



    Для PHP:

    }



    Итак, половина задачи решена. Если сейчас загрузить страницу на сервер и запустить ее через форму, выбрав страну из списка и нажав кнопку Submit, она будет работать надлежащим образом. Но если попытаться перейти на страницу другими способами, то появится сообщение об ошибке, поскольку обработчик будет пытаться одновременно выполнить два остальных запроса.

    1. Еще раз установите отступ для двух верхних строк с SQL-запросами. Над строкой с первым запросом добавьте условие, которое проверяет наличие переменной URL-адреса.

    Для ASP:

    If IsEmpty(Request.QueryString("regionID")) Then

    Для ColdFusion:



    Для PHP:

    if (!isset($_GET['regionID'])) {

    Если при проверке этого условия тоже будет возвращено значение true (истина), значит, не существует ни переменных формы, ни переменных URL-адреса, и должен выполняться первый SQL-запрос – наименее строгий. Этот запрос расположен под строкой с условием, так что если условие выполняется, будет запущен запрос.

    Если возвращается значение false (ложь), то это означает, что переменная URL-адреса существует, и должен выполняться второй запрос.

    1. В строке между двумя верхними запросами введите код, необходимый для запуска второго запроса.

    Для ASP:

    Else

    Для ColdFusion:



    Для PHP:

    } else {

    Этот запрос может быть запущен только в том случае, если не существует переменной формы, но имеется переменная URL-адреса.

    1. После второго SQL-запроса добавьте новую строку, чтобы закрыть блок с вложенным условием.

    Для ASP:

    End If

    Для ColdFusion:



    Для PHP:

    }

    Этот код завершает блок с вложенным условием, урок и приложение для поиска и отображения путешествий.




    Сохраните файл и загрузите его на сервер. Откройте страницу tours.asp в браузере и опробуйте все доступные виды поиска.

    Завершенное приложение работает в любых критических ситуациях. Отображаются все (и только те) путешествия, которые соответствуют критериям поиска. Навигационная панель для перемещения между записями будет скрыта или видима в зависимости от количества записей, извлеченных из базы во время поиска. При щелчке на названии страны загрузится страница с информацией о ней. Если щелкнуть на ссылке Tour Price Calculator (Калькулятор для расчета стоимости тура), загрузится приложение для расчета стоимости, а в списке будет выбрано название соответствующего тура. Итак, посетители получают возможность работать с удобным и функциональным интерфейсом, позволяющим подробнее узнать о том, что предлагает компания Newland Tours.

    Резюме

    В этом уроке вы узнали, как:

    • готовить страницу tours.asp к добавлению трех видов поиска;

    • создавать динамический список/меню, пересылающего данные на страницу tours_detail.asp при помощи динамически сформированных переменных URL-адреса;

    • создавать такой же список/меню на другой странице;

    • использовать комментарии для временной блокировки участков кода для проведения тестирования и отладки;

    • создавать форму, содержащую список, наполняемый динамическими данными;

    • отображать или скрывать навигационную панель для перемещения между записями – в зависимости от количества извлеченных из базы записей;

    • создавать SQL-запрос, фильтрующий данные из двух объединенных таблиц на основе значения переменной URL-адреса, а также запрос, производящий фильтрацию на основе переменной формы;

    • создавать SQL-запрос, использующий предикат EXIST и содержащий подчиненный запрос;

    • динамически переключаться между запросами в зависимости от наличия или отсутствия переменных среды при помощи условных конструкций if…else и функций IsEmpty() (ASP), IsDefined() (ColdFusion) и isset() (PHP).








    Добавить документ в свой блог или на сайт

    Похожие:

    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
    Проектно-образовательная деятельность по формированию у детей навыков безопасного поведения на улицах и дорогах города
    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
    Цель: Создание условий для формирования у школьников устойчивых навыков безопасного поведения на улицах и дорогах
    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
    «Организация воспитательно- образовательного процесса по формированию и развитию у дошкольников умений и навыков безопасного поведения...
    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
    Цель: формировать у учащихся устойчивые навыки безопасного поведения на улицах и дорогах, способствующие сокращению количества дорожно-...
    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
    Конечно, главная роль в привитии навыков безопасного поведения на проезжей части отводится родителям. Но я считаю, что процесс воспитания...
    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
    Поэтому очень важно воспитывать у детей чувство дисциплинированности и организованности, чтобы соблюдение правил безопасного поведения...
    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
    Всероссийский конкур сочинений «Пусть помнит мир спасённый» (проводит газета «Добрая дорога детства»)
    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
    Поэтому очень важно воспиты­вать у детей чувство дисциплинированности, добиваться, чтобы соблюдение правил безопасного поведения...
    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

    Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...



    Школьные материалы


    При копировании материала укажите ссылку © 2013
    контакты
    100-bal.ru
    Поиск