Birden fazla form Genel php fonksiyonu

6 Cevap php

Ben 9 farklı formlar var olan küçük bir uygulama var, ve her bir form kullanıcı bazı verileri girmeniz gereken bir en az 40 + alanlar var.

Ben tek bir php dosyasındaki her formu yazılı ve ben sadece sayfanın ortasında formu eklemek master PHP dosyası yaptık.

Benim soru:

Bu yüzden beni ben geçebileceği bir genel işlev yapmak yardımcı olabilecek bir yol ya da fikir var, bu çok uzun olurdu coz ben her bir form için 9 farklı fonksiyon yazmak istemiyorum ve ben bunu en iyi uygulama olduğunu sanmıyorum ve bazı değişkenleri db veri eklemek.

Can i like iterate through the $_POST array and extarct the data and reformat it somehow? but then again every field have a different name and i seems like this is impossible to do.

6 Cevap

Bu şekilde deneyin:

<?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');
}

?>

Bu çözüm iyileştirilmelidir - Ben çok hızlı yazdım. Ama ana fikri yakalamak umuyoruz. Bu yardımcı olacağını umuyoruz. Tabii, her form sınıfta vb isteği işlemek için özel yöntemler ekleyebilirsiniz

Sen Zend_Form gibi bir şey ilginizi çekebilir.

Benim projelerinden biri benzer bir şey kullandım. Temelde, bir kez gönderdi geri onlarla ne onlar (sayı, tarih, vb) ne veri türü bunları görüntülemek için nasıl dahil olmak üzere tüm alanları, tanımlamak, yanı sıra. Sonra bir HTML formu üretir bir işlevi bu bilgileri aktarmak. Bu formu teslim edildiğinde, gerekli işlemleri gerçekleştirir farklı bir işleve aynı bilgi aktarmak.

Benim özel durumda, sadece arama formları oluşturmak için kullanılan, bu yüzden işleme SELECT sql deyimi oluşturma dahil edildi. Burada alan tanımlardan birine bir örnek:

$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...

Sadece 2 küçük düşünceler ..

1) Do you show all 9 forms in one page? If yes - I reeeally don't think it's a good idea.
2) Why don't you divide your forms to different pages and give same names to fields on your forms where it is possible?

Bir foreach ile $ _POST dizisi üzerinde yineleme yapabilirsiniz.

   foreach($_POST as $name => $value) {
      echo $name, ' ', $value, '<br />';
   }

SleepyCod dediği gibi, meme bahis foreach çalışıyor, ancak cevap üzerine genişletilmiş gerekiyor:

  • Form alanları tabloya eşdeğer var mı?
  • Is each form being used to UPDATE or INSERT into more than table?

Bu benim web sayfası için yaptığım bir şey çünkü ben sormak nedenidir. Ben, şema alınır tablo söz sorgulanan dinamik bir formu yapı oluşturduk ve bir foreach + switch() alan kullanılacak NE belirlemek için kullanılır.

Ama bu ne soruyorsun değil.

Yani, yerine sana vermek:

// 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)");

Birden fazla tablo için, biraz yanıltıcıdır var. Her formun başında belirlemek hızlı kullanmayı tercih ediyorum, bu yüzden aşağıdakileri yapabilirsiniz:

// 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)");
}

Bazı takım bu doğru işe almak için gerekli olabilir, ama gitmek için gereken yere götürmeliyiz. Bu olacak sadece INSERT formu-tabanlı bilgi aslında sakıncası. Bir şeye ihtiyacın varsa ... iyi ... Ben kuvvetle gizli bir giriş türü kullanmanızı öneririz.