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

Мне просто любопытно, и мне было интересно, как вы, ребята, справитесь с этим, если вы хотите использовать ту же HTML-форму и, насколько это возможно, один и тот же php-код для создания и обновления элемента.

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

У меня есть способы сделать это, используя почти такой же код, но я надеюсь кое-что узнать здесь. Так как бы вы справились с этой задачей?

Спасибо и ура, растяжение связок

Ответы [ 5 ]

6 голосов
/ 13 августа 2010

Довольно просто - если в строке запроса указан идентификатор существующего элемента (который пользователь имеет право редактировать), то это операция редактирования.

Если в строке запроса не указан идентификатор, это операция создания.

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

3 голосов
/ 13 августа 2010

Я вижу это так: повторное использование идентичной разметки для формы между созданием / редактированием работает в некоторых случаях, но не во всех.Я считаю, что формы - хотя они могут отображаться в одну и ту же таблицу базы данных - действительно определяются их контекстом.Например, если у вас есть таблица «пользователи», у вас может быть форма «создать» с именем пользователя, адресом электронной почты, паролем, но после того, как этот пользователь существует, вы хотите, чтобы они сохранили свою идентичность на своем сайте, чтобы поле имени пользователя не отображалось.в контексте редактирования.Я классически PHP-разработчик, но я оценил подход, который использует Django, когда вы создаете модель (таблицу), которая определяет базовую валидацию для каждого поля, и вы можете создать столько форм, сколько создаете,или изменить / расширить это определение.Если вы пишете с нуля, вы, вероятно, сочтете целесообразным сделать ваши методы проверки очень переносимыми и / или найти способы сделать ваши поля формы контекстно-зависимыми.

1 голос
/ 13 августа 2010

Я всегда так делаю сейчас. Вы используете систему MVC вообще? Я использую один контроллер с двумя различными действиями (urls = person / new + person / edit / xxxx_id).

код - это что-то вроде:

function new()
    errors = []
    if (get)
        data = blank_record()
    elseif (post)
        data = posted_data
        if (create(data))
            redirect_to_listing()
        else
            errors = describe_errors
    show_form(data, errors)

function edit()
    errors = []

    if (get)
        data = get_from_db(id)
    elseif (post)
        data = posted_data
        if (save())
            redirect_to_listing()
        else
            errors = describe_errors
    show_form(data, errors)

Обратите внимание, что как только он попадает в форму, всегда есть объект с именем data, который может отображать форма, он может быть пустым из базы данных или опубликованных данных. В любом случае это всегда должен быть один и тот же формат.

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

0 голосов
/ 13 августа 2010

Полагаю, это неправильный ответ, но в любом случае он может быть вам интересен.

Существует проект orm, называемый доктрина: http://www.doctrine -project.org / проекты / ОРМ / 1,2 / Docs / ан

// User Id might be an existing id, an wrong id, or even empty:
$user_id = 4;
$user_id = null;

// Fetch the user from the database if possible
$user = Doctrine::getTable('Model_User')->find($user_id);

// If there was no record create a new one
if ( $user === false )
    $user = new Model_User();

// Change some data
$user->title = $newValue;

// Perform an update or an insert:
$user->save();

Как видите, вам не нужно заботиться о sql. Doctrine делает это для вас, и ваш код становится легче читать и отлаживать.

0 голосов
/ 13 августа 2010

Да, это единственное приемлемое решение.

Вот небольшой пример приложения CRUD, в котором форма ввода хранится в шаблоне:

<?  
mysql_connect(); 
mysql_select_db("new"); 
$table = "test"; 
if($_SERVER['REQUEST_METHOD']=='POST') { //form handler part: 
  $name = mysql_real_escape_string($_POST['name']); 
  if ($id = intval($_POST['id'])) { 
    $query="UPDATE $table SET name='$name' WHERE id=$id"; 
  } else { 
    $query="INSERT INTO $table SET name='$name'"; 
  } 
  mysql_query($query) or trigger_error(mysql_error()." in ".$query); 
  header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);  
  exit;  
}  
if (!isset($_GET['id'])) { //listing part: 
  $LIST=array(); 
  $query="SELECT * FROM $table";  
  $res=mysql_query($query); 
  while($row=mysql_fetch_assoc($res)) $LIST[]=$row; 
  include 'list.php'; 
} else { // form displaying part: 
  if ($id=intval($_GET['id'])) { 
    $query="SELECT * FROM $table WHERE id=$id";  
    $res=mysql_query($query); 
    $row=mysql_fetch_assoc($res); 
    foreach ($row as $k => $v) $row[$k]=htmlspecialchars($v); 
  } else { 
    $row['name']=''; 
    $row['id']=0; 
  } 
  include 'form.php'; 
}  
?>

form.php
<form method="POST">
<input type="text" name="name" value="<?=$row['name']?>"><br>
<input type="hidden" name="id" value="<?=$row['id']?>">
<input type="submit"><br>
<a href="?">Return to the list</a>
</form>

list.php
<a href="?id=0">Add item</a>
<? foreach ($LIST as $row): ?>
<li><a href="?id=<?=$row['id']?>"><?=$row['name']?></a>
<? endforeach ?>

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

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