PHP - Лучшая практика для сохранения значений форм при обратной передаче - PullRequest
6 голосов
/ 30 декабря 2010

Полный PHP новичок здесь, почти все мои предыдущие работы были в ASP.NET. Сейчас я работаю над проектом PHP, и первый камень, на который я наткнулся, - это сохранение значений при обратной передаче.

Для самого простого, но все же реалистичного примера у меня есть 10 выпадающих списков. Они еще даже не привязаны к данным, так как это мой следующий шаг. Это простые выпадающие списки.

Вся моя страница заключена в тег. Событие onclick () для каждого раскрывающегося списка вызывает функцию javascript, которая заполняет соответствующий элемент скрытого раскрывающегося списка выбранным значением раскрывающегося списка. Затем, после перезагрузки страницы, если это скрытое значение не пустое, я устанавливаю выбранный параметр = параметр моего скрытого.

Это прекрасно работает для одного постбэка. Однако при изменении другого раскрывающегося списка исходный 1-й раскрывающийся список теряет свое значение, поскольку соответствующее ему скрытое значение также теряет свое значение!

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

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

Спасибо!

----- ----- редактировать

Еще немного уточнений по моему вопросу:)

Когда я говорю «PostBack», я имею в виду отправляемую страницу / форму. Управление передается обратно на сервер, и код HTML / PHP выполняется снова.

Что касается выпадающих и скрытых страниц, причина, по которой я использовал скрытые переменные для сохранения «выбранного значения» или «выбранного индекса», заключается в том, что при отправке страницы я могу перерисовать раскрывающийся список с предыдущим выбором, вместо того, чтобы вернуться к первому индексу по умолчанию. Когда я использую команду $ _POST [], я не могу получить раскрывающийся список по имени, но я могу получить скрытое значение по имени. Вот почему после выпадающего события я вызываю javascript, который устанавливает выбранное значение из выпадающего меню в соответствующее скрытое.

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

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

--------- редактировать ---------- Я не могу предоставить внешний доступ к своему примеру, однако вот сценарий с объяснением. На изображении ниже пользователь развернет раскрывающийся список «Отдел», чтобы выбрать отдел. На данный момент данные о продажах ниже будут обновлены в соответствии с этим отделом. Затем пользователь выбирает параметр «Группировать по», например «Магазин», и страница / данные обновляются, чтобы отобразить данные, сгруппированные по хранилищу. Затем они могли выбрать такой цвет, как черный, в моем примере, и данные показали бы продажи для выбранного отдела и цвета, сгруппированные по магазинам.

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

alt text

Ответы [ 3 ]

4 голосов
/ 30 декабря 2010

Нет встроенного способа автоматической обратной передачи, вам нужно отобразить данные из массива $ _POST следующим образом:

<input name="id" value="<?php isset($_POST['id']) ? (int)$_POST['id'] : "" ?>" />

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

class FormHelper
{
    public function input($name,$type = "text",$default_value = "",$postback = false)
    {
        return '<input name="' . $name  . '" type="' . $type . 'value="' . $this->_postback($name,$default_value ) . '" />';
    }

    //More Methods


    private function _postback($key,$default = "")
    {
        return isset($_REQUEST[$key]) ? htmlentities($_REQUEST[$key]) : $default;
    }
}

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

вы могли бы создавать формы следующим образом:

<form>
    <?php echo FormHelper::getInstance()->input("id","text","Enter Id",true); ?>
</form>

Явное создание метода синглтона getInstance()

Некоторые ссылки, которые могут вам помочь.

  1. Проверка формы с использованием PHP
  2. Проверка формы PHP / CSS
  3. Проверка формы PHP

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

Если я прав, вы хотите сделать следующее:

  • Показать формуна вашей странице
  • Позвольте пользователю заполнить форму
  • Когда пользовательicks submit
    • Отправка данных на сервер через Ajax
    • Обработка информации, предоставленной пользователем
    • Создание новой формы или восстановление старой формы с ошибками
    • Отправьте форму обратно по трубе на страницу
    • Удалите старую форму, заменив старую форму на новую, сгенерированную

Если вышеэто правильно, тогда это не особая функция для PHP, а в основном основанная на javascript

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

<html>
    <!-- Head, Meta, Etc-->
    <body>
        <?php $this->template->load("templates/forms/specific_form.php"); ?>
    </body>
</html>

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

форма будетбудет примерно так:

<form rel="__postback" ... >
</form>

И тогда в jQuery вы будете делать следующее:

$(document).ready(function(){
    $("form[rel*=__postback]").each(function(){
        var Form = $(this);

        //Send the form with ajax, bin the __PostbackComplete()
        function __PostbackComplete(server_data)
        {
            //Overwite the form using jQuery LIVE!!!!
        }
    });
});

В PHP вы будете анализировать данные и повторять обработку формы из шаблонов secti

надеюсь, это поможет.

0 голосов
/ 31 декабря 2010

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

Например, скажем, вы хотите раскрывающийся список, подобный этому:

<select name="department">
  <option value="s">Sales</option>
  <option value="m">Marketing</option>
</select>

Когда вы отправляете форму, значение будет доступно PHP как $ _POST ["отдел"].Теперь вы хотите снова вывести форму, выбрав правильный отдел.

Вам понадобится такая функция (это просто быстрый набросок):

function outputSelect($name, $values, $currentValue) {
  echo '<select name="'.htmlspecialchars($name).'">';
  foreach ($values as $value => $text) {
    if ($value === $currentValue) {
      echo '<option value="'.htmlspecialchars($value).'" selected>'.htmlspecialchars($text).'</option>';
    } else {
      echo '<option value="'.htmlspecialchars($value).'">'.htmlspecialchars($text).'</option>';
    }
  }
  echo '</select>';
}

Вы быпозвоните, когда хотите отобразить меню.Обычно это из шаблона HTML:

<?php outputSelect("department", array("s" => "Sales", "m" => "Marketing"), $_POST["department"]) ?>

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

Не забудьте использовать htmlspecialchars вокруг атрибутов или содержимого любого тега HTML, как я делал выше.Это особенно важно при отображении введенных пользователем данных, чтобы предотвратить атаки XSS, но это следует делать независимо от источника данных.

0 голосов
/ 30 декабря 2010

Если я правильно понял ваш вопрос, я думаю, что проблема на самом деле связана с вашим решением javascript.

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

...