А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/back1/
Rambler's Top100
Пишем на PHP: BackOffice (продолжение-1)

----
Файлы этого выпуска: /step/146/
----

Странно, но никто не спросил, почему я везде ставлю относительные пути (URL): которые начинаются с корня сайта /, как обычно и делают, а в меню администратора добавил еще и переменную с абсолютным путем $PATH_HTTP. Может у кого-то возникнут на этот счет предположения? Если возникнут -- милости просим их озвучить на форуме: http://forum.kurepin.ru.

Продолжаем разговор... Давайте создадим страницу добавления новой рубрики.

Нам для этого потребуется:

1. Страница с формой добавления.
2. Функция вывода всех имеющихся рубрик
3. Страница вывода существующих рубрик (чтобы мы могли увидеть результат нашей деятельности)

Начнем со второго пункта, если позволите. Напишем короткую функцию для класса out:


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

    echo $this->list_all_users; -- печатать содержимое переменной

    echo $this->list_all_users(); -- печатать результат работы функции


Теперь перейдем к пункту 3 нашего плана.

Страницу вывода результата функции $out_cat_list нам делать не надо. Достаточно небольшого файла. Этот будет .inc-файл, который мы сможем вызывать в любом месте нашего проекта.

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

А пока файл cat_list.inc в директории inc, разумеется, будет выглядеть следующим образом:


Вот так. Расшифровываю на всякий случай.

Вызываем функцию формирования списка рубрик.

Если функция возвратила номер ошибки отличный от нуля, высвечиваем сообщение об ошибке в html-формате.

Если возвращен код ошибки 0, значит в переменной $out_cat_list содержится то, что нас интересовало. Его и распечатываем...

Теперь можно воткнуть эту функцию куда-нибудь, чтобы увидеть результат ее работы.

Предлагаю пока прицепить ее к файлу menu_main.inc, все равно главное меню у нас пока пустое. А рубрики -- важная часть навигации по сайту.

Итак, файл menu_main.inc теперь выглядит так:


и хранится в папке inc.

Теперь и его надо в свою очередь подключить уже к html-файлам вывода.

Замените фразу "главное меню" во всех наших php-файлах на строку "<? include($my->PATH_INC."/menu_main.inc"); ?>" и посмотрите как они теперь смотрятся в браузере.

Что, ничего интересного не увидели? Просто пропала надпись "главное меню"... а что вы ждали, у нас же ничего в базе рубрик нет! На этом этапе главное -- увидеть ничего на том месте, где должен быть список рубрик. Если вы все же что-то там увидели, значит произошла какая-то ошибка.

Вам кажется, что у нас получается слишком большая вложенность подключения файлов? Ведь сложилось такое мнение, не так ли? Так вот, ничего подобного! Вы это поймете выпусков через 10-20, когда наш проект обрастет большим количеством всяческих наворотов и фитюлек. Более того, нам придется еще дробить и дробить наши файлы на составляющие, дабы чувствовать себя комфортно среди огромного количества кода php и html.

Вот теперь можно приступать к реализации пункта 1 нашего плана на сегодня.

Создадим файл add.php в директории /admin/cat/ с формой добавления новой рубрики.


Чего интересного в этом файле. Прежде всего, мы подключаемся не к классу out, а к классу in, т.к. именно в нем расположены интересующие нас функции.

Но, при этом мы пользуемся и вызовом списка существующих рубрик -- функцией, расположившейся в классе out. Как быть?

Можно пойти тремя разными путями:

1. Скопировать функцию в класс in. Но зачем нам две идентичные функции?

2. Можно перенести функцию в родительский класс utils, от которого порождаются классы in и out, но зачем нам функция в классе, который не отвечает за визуализацию.

3. Можно породить класс in не от класса утилит, а от класса out, унаследовав все его возможности. Вот так мы и поступим. Учитывая, что функции класса in не могут выполняться со скоростью 10 запросов в секунду, учитывая специфику класса, мы можем в нем унаследовать хоть слона. Понятно, о чем я говорю? Не бойтесь наследовать административные классы от любых других.

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

Тут все просто. Если скрытая переменная $post имеет значение "Y", значит в форме была нажата кнопка submit -- надо обработать запрос.

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

Смотрим на возвращенную ошибку. Если ошибка есть, то переменной $my->error мы присваиваем текст ошибки, если же ошибки нет, то той же переменной присваиваем текст положительного ответа системы.

Заметили? У нас прибавилась новая функция ok_to_html() и новая переменная $html_error. Функция выглядит вот так:


и располагается в классе utils рядом с функцией вывода ошибки err_to_html. Тут же объявлена и переменная.

А вывод содержимого переменной мы вставим в файл top.inc, сразу под заголовком.


Это позволит нам более не думать о том, куда выводить сообщения об ошибках: присвоив переменной $html_error текст сообщения в любом месте наших файлов, мы всегда будем уверены, что увидим его там, где положено. А вызов функции ok_to_html можно будет снабдить рассылкой почтовых сообщений или журналом регистрации событий, если мы захотим фиксировать все удачные операции на сайте.

Уф... пишу, пишу, а функция добавления рубрик уже работает, друзья мои. Я и не заметил, что подобрался к концу очередной главы повествования о современном языке PHP и его друзьях.

Завтра будет _очень_ важный выпуск, особенно для тех, кто пытается делать свой сайт параллельно со мной.

До завтра!

[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin