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

Ну вот. Очередная суббота, очередной выпуск, очередная задача.

Надо сказать, что задачу из прошлого выпуска (про построение древа) блестяще решил Nick.

Оба метода решения данной задачи можете найти на forum-е. А я обязательно включу одно из решений в наш проект, тем более, то оба они почти на 100% совпали с моими вариантами решений. Простое совпадение ли это? Одно из двух: или совпадение, или мы пришли к оптимальному решению задачи. С удовольствием увидел бы другие варианты!

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

Дел в том, что есть две группы людей, которых мне надо предостеречь и направить в нужном направлении:

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

Друзья мои, говорю еще раз, — на все вопросы, связанные с компьютером и программированием я отвечаю ТОЛЬКО в форуме. Так что, задавайте ваши вопросы в форуме (http://forum.kurepin.ru), если желаете получить на них ответ.

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

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

Теперь перейдем к очередной задаче, а уж после — к продолжению создания голосования.

Учите, я стараюсь задавать задачи практические, и удачные решения обязательно войдут в этот курс и наш строящийся сайт.

Сегодня я хочу затронуть не очень сложную тему для задачи, но безусловно полезную.

Скажите, вам удобно читать большой текст, когда он загружается целиком на одну страницу? А если вам надо прерваться и продолжить чтение в другой раз?

В общем, задача состоит в том, что тексты надо делить на куски. Причем, делить надо автоматически, а не вручную, во время выкладывания на сайт. Почему? А потому, что никогда не известно, в каком виде и где этот текст может понадобиться. Поэтому, он должен лежать в оригинальном виде, а отдавать его пользователю посредством http, e-mail, ftp или еще как-то — это уже наша задача, которую мы сейчас и сформулируем.

Итак. Необходимо написать код, занимающийся разбиением выводимого текста на страницы по сколько-то килобайт в каждой. Количество килобайт — величина переменная, содержащаяся в переменной $PAGE_TEXT_SIZE.

Дополнительное условие — текст не должен разрываться посреди слова или предложения, если это не авторский перевод строки (стихи, или что-то подобное).

Ну и вывод списка всех страниц, конечно. Чтобы на каждой странице было видно — сколько прочли, текущий номер и сколько еще осталось.

Осилим?

И я, как это уже стало традицией, жду два варианта решения этой задачи:

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

2. Вариант, когда в оперативную память текст загружается кусками, не превышающими определенный размер. Например, не более $PAGE_TEXT_SIZE * 2.

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

Ну вот. Ответы, как всегда, принимаю только в форуме, жду повышенной активности.

А теперь, к долгожданному голосованию.

Что там я писал в прошлый раз? А, надо нарисовать форму для голосования.

Что ж... рисуем... в файл /inc/voting_form.inc мы ее рисуем, да?

За основу я возьму форму из добавления текста. Чем-то они похожи.

И вот, значит, какая у меня получилась форма:


Хорошенькая, правда?

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

Мы ее сохранили в файле /inc/voting_form.inc, как договаривались.

Теперь давайте ее разберем. Не такая уж она простая, как может показаться на первый взгляд.

Во-первых, прошу обратить внимание, что регистрация мнения будет у нас реализовываться в этом же файле — /text/index.php. То есть подтверждение формы приведет пользователя на эту же страницу, только с информацией: было его мнение засчитано, или не было (и по какой причине).

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

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

Если мне не изменяет память, мы еще ни разу не пользовались замечательной функций цикла foreach. К сожалению, до четвертой версии этой функции в PHP не было. И очень это было неудобно.

Смысл foreach состоит в том, что это функция цикла как и for, только количество повторений напрямую зависит от количества перебираемых значений.

Это очень удобно, когда заранее не известно: сколько заполненных элементов в массиве, сколько файлов в директории и так далее.

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

Я пока сделал такой вариант (в этом же виде сия переменная добавлена в /req/vars.class:


Заодно вспомнили (а кто и впервые узнал) как инициируется ассоциативный массив со значениями.

Так вот, в форме есть небольшой фрагмент php-кода — выпадающее меню оценок, которое выстраивается на лету, на основе переменной $VOTING_MENU с использованием цикла foreach.

foreach последовательно перебирает массив, передавая переменной $k (от key) ключ, т.е. оценку-слово, а переменной $v (от value) — значение ячейки массива. Разумеется, вы тут можете использовать любые другие имена переменных, а от переменной "ключ" можно вообще отказаться, перебирая только значения массива.

Второй строкой цикла foreach мы сравниваем полученную переменную $v cо значением, которое, может быть, ввел пользователь ранее. И если совпадение найдено — присваиваем переменной $selected слово "selected", которую, в свою очередь, подставляем в следующей строке в формирование очередной optinons.

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

Почему так происходит? А потому, что несуществующая в данный момент переменная $vote при участии в конструкции if равна нулю. А ноль — это одно из наших значений переменной $VOTING_MENU, за это значит, что условие выполнится и значение будет выбрано.

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

Если надо отступить от этого правила, можно перед циклом добавить нечто вроде:

if(!isset($vote)) $vote=какое-то значение;

Но нам, в данном случае подобная проверка не требуется.

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

Но этим мы займемся на следующем уроке.

До завтра!

P.S. Форма голосования уже вставлена в файл /text/index.php, можете открыть любой текст на сайте php.kurepin.ru, заполнить форму голосования и нажать на кнопку, дабы убедиться в том, что форма правильно сохраняет все введенные вами данные.

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



copyright ©2000-2017 Ruslan Kurepin