Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отображение и обработка форм. Структура WEB приложения. 
:(
    Опции темы
Чучмек
Дата 14.8.2013, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



Мне проще объяснить на примере.
Регистрация:
1 Отображение формы, для ввода личных данных
2 Проверка и обработка введенных данных, если инвалид - goto 1
3 Отображение формы, для ввода кода подтверждения(отправляется через SMS, mail,... неважно)
4 Проверка  и обработка кода подтверждения, если инвалид - goto 3
5 Главная страница.

Приложение разбито на логические блоки.

Варианты:
a) Все пункты слеплены  в один блок. Куча ифов , черт ногу сломит.
б) Проверко-обработка прилеплена к предыдущему или последующему пункту. Структура проще,но мешанина остается, дополнительное обращение к серверу при переходе вперед или назад.
в) Куры отдельно, яйца отдельно, проверко-обработки вынесены в свои отдельные блоки. Дополнительный запрос при переходе и в перед, и назад.

Я склоняюсь к последнему.
Кто как делает? Как лучше?
Спасибо.
       

Это сообщение отредактировал(а) Чучмек - 14.8.2013, 19:00


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Gold Dragon
Дата 14.8.2013, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Чучмек, что за бред? за каждое действие отвечает своя функция или метод (мне ближе ООП) плюс маленькая система управления. Хочешь наворотов, выведи управление шаблонов (т.е. тупо вывод HTML) в отдельные функции/методы

Цитата(Чучмек @  14.8.2013,  18:23 Найти цитируемый пост)
a) Все пункты слеплены  в один блок. Куча ифов , черт ногу сломит.
и всё в один файл , да ещё с расширением HTML smile 



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Чучмек
Дата 16.8.2013, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



Есть страница с формой - A
Есть страница Б
После правильного заполнения формы должна открыться страница Б, после неправильного - остаться А.
Что пишем в action формы?
1) action=A. Если форма заполнена верно - редирект на Б
2) action=Б. Если форма заполнена неверно - редирект на А
3) action=В. Если форма заполнена верно - редирект на Б, если  неверно - редирект на А.
 


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
ksnk
Дата 16.8.2013, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Чучмек, action=""
Успешная обработка формы должна закончится редиректом. неуспешная сама останется на той же странице.

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

<form action="" method="POST" ...>
<input type="hidden" name="handler" value="CForm::form1">
...

как-нибудь так.
Код

if($_SERVER['REQUEST_METHOD']=='POST'){
   if(isset($_POST['handle'])){
      list($cls,$mthd)=explode('::',_POST['handle'],2);
      if(is_callable($callable=array($cls,'handle_'.$mthd))){
         if(call_user_func($callable)){ // вызываем метод CForm::handle_form1
             header('location:'...); 
             exit;
         }
     } else {
         error('Corrupted POST data. WTF?');

    }
   }
}

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



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Чучмек
Дата 16.8.2013, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 4
Всего: 41



Цитата(ksnk @  16.8.2013,  11:23 Найти цитируемый пост)
Чучмек, action=""
Успешная обработка формы должна закончится редиректом. неуспешная сама останется на той же странице.

Сейчас так и делаю. Однако закрались сомнения. Мешанина получается. Вот и возникла идея - полностью отделить обработку формы от отображения.


--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Gold Dragon
Дата 22.8.2013, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



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

Основной файл управления
index.php
Код

<?php

// подключаем класс управления
require_once('api.php');

// подключаем класс шаблонов
require_once('template.php');

// определяем страницу
$page = ApiClass::getParam($_REQUEST, 'page', '', 'sn');

// Управление
switch ($page) {
    case 'result': // Страница формы
        ApiClass::pageResult();
        break;
    case 'save': // Страница формы
        ApiClass::pageSave();
        break;
    case 'form': // Страница формы
        ApiClass::pageForm();
        break;
    default: // Страница по умолчанию
        ApiClass::pageDefault();
}
// Вывод страницы
TemplateClass::getHtml();


Класс управления 
api.php
Код

<?php

class ApiClass {
    /**
     * Главная страница
     */
    public static function pageDefault(){
        TemplateClass::setTitle('Мой сайт');
        TemplateClass::setH1('Главная страница');
        ob_start();
        TemplateClass::pageDefault();
        TemplateClass::setContent(ob_get_contents());
        ob_end_clean();
    }

    /**
     * Страница формы
     * @param string $error: сообщение об ошибке
     */
    public static function pageForm($error = ''){
        $name = self::getParam($_POST, 'name', '', 'sn');
        $email = self::getParam($_POST, 'email', '', 'sn');

        TemplateClass::setTitle('Форма - Мой сайт');
        TemplateClass::setH1('Форма отправки сообщения');
        ob_start();
        TemplateClass::pageForm($name, $email, $error);
        TemplateClass::setContent(ob_get_contents());
        ob_end_clean();
    }

    /**
     * Страница обработки формы
     */
    public static function pageSave(){
        $error = array();

        $name = self::getParam($_POST, 'name', '', 'sn');
        // Проверяем имя
        if(empty($name)){
            $error[] = 'Имя не указано.';
        }

        // Проверяем корректность мыла
        $email = self::getParam($_POST, 'email', '', 'sn');
        if(empty($email)){
            $error[] = 'E-mail не указан.';
        }elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $error[] = "E-mail указан неверно.";
        }

        // Определяем что делать
        if(sizeof($error)){
            self::pageForm(implode('<br>', $error));
        }else{
            @ob_end_clean();
            header('HTTP/1.1 301 Moved Permanently');
            header("Location: index.php?page=result");
            exit();
        }
    }

    /**
     * Вывод результата
     */
    public static function pageResult(){
        // Добавляем дополнительный МЕТА-тег для переадресации на главную
        TemplateClass::setMeta('<meta http-equiv="refresh" content="20;index.php" />');
        TemplateClass::setTitle('Результат - Мой сайт');
        TemplateClass::setH1('Результат отправки форма');
        ob_start();
        TemplateClass::pageResult();
        TemplateClass::setContent(ob_get_contents());
        ob_end_clean();
    }

    /**
     * Получает значение из глобальной переменной (или массива)
     *
     * @param array       $arr        - глобальный массив
     * @param string      $name       - параметр
     * @param string|null $def        - значение по умолчанию
     * @param string|null $is         - тип переменной
     *                                s  - строка
     *                                i  - число
     *                                n  - удалить пробельные символы в начале и конце
     *                                u  - декодирует URL-кодированную строку
     *                                sn - строка без пробельных символов в начале и конце
     *
     * @return null|string - значение из глобальной переменной
     */
    public static function getParam($arr, $name, $def = null, $is = null)
    {
        $result = null;
        if (isset($arr) and isset($arr[$name])) {
            $result = $arr[$name];
            if (!is_null($is)) {
                switch ($is) {
                    case 'sn':
                        $result = trim(strval($result));
                        break;
                    case 's':
                        $result = strval($result);
                        break;
                    case 'i':
                        $result = intval($result);
                        break;
                    case 'n':
                        $result = trim($result);
                        break;
                    case 'u':
                        $result = urldecode($result);
                        break;
                }
            }
            return $result;
        } else {
            return $def;
        }
    }
}


Класс шаблонов
template.php
Код

<?php

/**
 * Class TemplateClass - Управление шаблонами
 */
class TemplateClass
{
    /** @var string Заголовок сайта */
    private static $_title = '';

    /** @var string Заголовок страницы */
    private static $_h1 = '';

    /** @var array Контент */
    private static $_content = array();

    /** @var array META-теги */
    private static $_meta = array();

    /**
     * Основной шаблон страницы
     */
    public static function getHtml()
    {
        ?>
        <!DOCTYPE html>
        <html>
        <head>
            <title><?php echo self::$_title; ?></title>
            <meta charset="UTF-8">
            <?php echo implode('', self::$_meta); ?>
        </head>
        <body>

        <header style="color: #004400; font-size: 14pt; padding: 20px">
            Тестируем форму отправки сообщений
        </header>

        <section style="margin: 20px; padding: 20px; border: 1px solid #ccc;">
            <h1><?php echo self::$_h1; ?></h1>
            <article><?php echo implode('', self::$_content); ?></article>
        </section>

        <footer style="color: #999; margin: 20px; font-size: 9pt">
            Copyright &copy; 2000-2013 <a href="http://gd.joostina-cms.ru" target="_blank">Gold Dragon</a></div>
        </footer>

        </body>
        </html>
    <?php
    }

    /**
     * Контент начальной страницы
     */
    public static function pageDefault()
    {
        ?>
        <div>
            <a href="index.php?page=form">Перейти на форму</a>
        </div>
    <?php
    }

    /**
     * Контент страницы формы
     * @param $name  - имя
     * @param $email - мыло
     * @param $error - ошибки
     */
    public static function pageForm($name, $email, $error)
    {
        ?>
        <div style="color: #f00;"><?php echo $error; ?></div>
        <form action="index.php" method="post">
            <div>
                <label for="name"><span style="color: #f00">*</span>Имя</label>&nbsp;&nbsp;
                <br>
                <input type="text"
                       name="name"
                       id="name"
                       placeholder="Ваше имя"
                       pattern="^[а-яА-ЯЁё]+[-а-яА-ЯЁё ]*"
                       size="40"
                       required="required"
                       value="<?php echo $name; ?>"
                    />
            </div>

            <div>
                <label for="email"><span style="color: #f00">*</span>Email</label>
                <br>
                <input type="email"
                       name="email"
                       id="email"
                       placeholder="Адрес электронной почты"
                       required="required"
                       value="<?php echo $email; ?>"
                       size="40"
                    />
            </div>

            <div>
                <br>
                <input type="reset" value="Очистить"/>
                <input type="submit" value="Отправить" name="saveform" id="saveform"/>
            </div>
            <input type="hidden" name="page" value="save">
        </form>
    <?php
    }

    public static function pageResult(){
        ?>
        <div style="color: #090; font-weight: 700; padding: 20px; border: 1px solid #090">
            Данные в форме корректные
        </div>
        <div>
            <p></p><a href="index.php">Перейти на Главную страницу</a></p>
            <p style="color: #ccc; font-size: 80%">Вы автоматически перейдёте на Главную страницу через 20 секунд.</p>
        </div>
    <?php
    }

    /**
     * Установка заголовка сайта
     * @param string $mes : сообщение
     */
    public static function setTitle($mes = '')
    {
        self::$_title = strip_tags(trim($mes));
    }

    /**
     * Установка заголовка страницы
     * @param string $mes : сообщение
     */
    public static function setH1($mes = '')
    {
        self::$_h1 = trim($mes);
    }

    /**
     * Добавление контента
     * @param string $mes : сообщение
     */
    public static function setContent($mes = '')
    {
        self::$_content[] = $mes;
    }

    /**
     * Добавление МЕТА-тега
     * @param string $mes : сообщение
     */
    public static function setMeta($mes = '')
    {
        self::$_content[] = $mes;
    }
}


Добавлено через 6 минут и 26 секунд
ну в данном случае я всё засунул в один файл (класс) шаблонов больше для наглядности smile Реально я всё храню в отдельных файлах tpl. Ну и соответственно чуть сложнее система управления шаблолнами. 

Ну и ещё можно вынести всякие сообщения в отдельные языковые константы, чтобы можно было спокойно делать мультиязычные сайты smile 


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.