Общая функция PHP для нескольких форм - PullRequest
3 голосов
/ 24 мая 2009

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

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

Мой вопрос:

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

Могу ли я перебрать массив $ _POST, извлечь данные и как-то переформатировать их? но опять же каждое поле имеет другое имя, и мне кажется, что это невозможно сделать.

Ответы [ 6 ]

2 голосов
/ 24 мая 2009

Попробуйте так:

<?php

abstract class FormData
{
    const BOOLEAN = 'bool';
    const INTEGER = 'int';
    const FLOAT = 'float';
    const STRING = 'string';
    protected $_types = array();

    public static function create($data)
    {
        $action = isset($data['action']) ? $data['action'] : '';
        switch ($action)
        {
            case 'form1': return new MyForm1($data);
            default: return null;
        }
        return null;
    }

    protected function loadPostVars($data)
    {
        foreach ($data AS $var=>$value)
        {
            $value = $this->convertVar($var, $value);
            if (!is_null($value) && property_exists($this, $var))
            {
                $this->$var = $value;
            }
        }
    }
    protected function convertVar($var, $value)
    {
        if (array_key_exists($var, $this->_types))
        {
            $type = $this->_types[$var];
            switch ($type)
            {
                case FormData::BOOLEAN: return (bool)(int)$value;
                case FormData::INTEGER: return (int)$value;
                case FormData::FLOAT: return (float)$value;
                case FormData::STRING: // drop down
                default:
                    return myEscapeString($value);
            }
        }
        return null;
    }
}

class MyForm1 extends FormData 
{
    public $fld1;
    public $fld2;
    public $fld3;
    // etc...

    public function __construct($data)
    {
        $this->_types = array(
            'fld1' => FormData::INTEGER,
            'fld2' => FormData::STRING,
            'fld3' => FormData::BOOLEAN,
        );
        $this->loadPostVars($data);
    }
}

// And finally process your form data
// You should add hidden input 'action' to each form to identify the form
if ($form = FormData::create($_POST))
{
    echo $form->fld1, $form->fld2, $form->fld3;
}
else 
{
    exit('error: unknown action provided');
}

?>

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

1 голос
/ 24 мая 2009

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

В моем конкретном случае он просто использовался для создания форм поиска, поэтому обработка включала создание оператора SELECT sql. Вот пример одного из определений полей:

$criteria = array(
    array("label" => "Search clients",
          "type"  => "radio",
          "values"=> array("1" => "Just " . $client->getName(),
                           "2" => "All clients"),
          "where" => array("1" => "c.`clientId` = " . $client->getId(),
                           "2" => "1"), // always true
          "default" => "1"),
    array("label" => "Last Name",
          "type"  => "text",
          "where" => "s.`lastName` LIKE '%s'"),
    array("label" => "First Name",
          "type"  => "text",
          "where" => "s.`firstName` LIKE '%s'")
    // etc...
1 голос
/ 24 мая 2009

Вас может заинтересовать что-то вроде Zend_Form .

0 голосов
/ 25 мая 2009

Как сказал SleepyCod, ваша ставка на грудь составляет foreach, но ответ должен быть расширен:

  • Поля формы эквивалентны таблице?
  • Используется ли каждая форма для UPDATE или INSERT в более чем таблице?

Причина, по которой я спрашиваю, заключается в том, что это то, что я сделал для моей веб-страницы. Я создал динамическую структуру формы, в которой запрашиваемая таблица запрашивается, схема извлекается, и foreach + switch() используется для определения ЧТО должно использоваться поле.

Но это не то, что вы спрашиваете.

Итак, вместо этого я даю вам:

// Assuming one table:one form, and each input-name = column name.

//strip array $_POST into its key and value.
foreach($_POST as $key => $val) {
 $vals .= "'$val', ";
 $keys .= "`$key`, ";
}

// Lest we want to generate errors, shave off the trailing comma and whitespace.
$keys_strip = substr($keys, 0, -2);
$vals_strip = substr($vals, 0, -2);
$sql = mysql_query("INSERT INTO t1 ($keys_strip) VALUES ($vals_strip)");

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

// Assuming two+ table:one form, for each input, name='t1:column_name'; assume tables are defined in an array per form for easy reference.

//strip array $_POST into key and value, then separate the key into two separate fields. This will ONLY work for t1:column-name set up; an if statement can be put in to deal with the remaining information.
foreach ($_POST as $key as val) {
// This will result in keys_t1 = key and vals_t1 = val.
 if (preg_match('/^(\w.+):(\w.+)$/', $key, $t_key)) {
  ${"keys_".$t_key[1]} = "$t_key[2], ";
  ${"vals_".$t_key[1]} = "$var, ";
 }
}

// Assume $tables array, containing tables for THIS insert.
foreach ($tables AS $table) {
 $keys_strip = substr(${"keys_".$table}, 0, -2);
 $vals_strip = substr(${"vals_".$table}, 0, -2);
 $sql = mysql_query("INSERT INTO table ($keys_strip) VALUES ($vals_strip)");
}

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

0 голосов
/ 24 мая 2009

Вы можете перебирать массив $ _POST с помощью foreach.

   foreach($_POST as $name => $value) {
      echo $name, ' ', $value, '<br />';
   }
0 голосов
/ 24 мая 2009

Всего 2 маленькие мысли ..

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...