2010-02-19 10 views
1

Hé, quelqu'un peut m'aider à en faire un objet s'il vous plaît.Quelqu'un peut-il m'aider à en faire un objet. (php)

Évidemment, tout mon code n'est pas ici, mais je suis sûr que vous aurez l'essentiel.

<?php 
$product_name_1 = $_POST['product_name_1']; 
$region_1 = $_POST['region_1']; 
$start_date_1 = $_POST['start_date_1']; 
$end_date_1 = $_POST['end_date_1']; 
$sku_1 = $_POST['sku_1']; 

$product_name_2 = $_POST['product_name_2']; 
$region_2 = $_POST['region_2']; 
$start_date_2 = $_POST['start_date_2']; 
$end_date_2 = $_POST['end_date_2']; 
$sku_2 = $_POST['sku_2']; 

$product_name_3 = $_POST['product_name_3']; 
$region_3 = $_POST['region_3']; 
$start_date_3 = $_POST['start_date_3']; 
$end_date_3 = $_POST['end_date_3']; 
$sku_3 = $_POST['sku_3']; 
?> 



<form action="" method="post" accept-charset="utf-8"> 
<div id="product_information"> 
<table id="product_1"> 
    <tr> 
     <th><label for="product_name">Product Name</label></th> 
     <th><label for="region">Select A Region</label></th> 
     <th class="date"><label for="start_date">Start Date</label></th> 
     <th class="date"><label for="end_date">End Date</label></th> 
     <th><label for="sku">SKU</label></th> 
    </tr> 
    <tr> 
     <td><input type="text" name="product_name_1" value="" id="product_name_1"></td> 
     <td><input type="radio" name="region_1" value="upper_north" id="upper_north_1"><label for="upper_north_">Upper North Island</label><br /> 
       <input type="radio" name="region_1" value="lower_north" id="lower_north_1"><label for="lower_north_">Lower North Island</label><br /> 
       <input type="radio" name="region_1" value="south_island" id="south_island_1"><label for="south_island">South Island</label> </td> 
     <td class="date"><input type="text" class="date" name="start_date_1" value="" id="start_date_1"></td> 
     <td class="date"><input type="text" class="date" name="end_date_1" value="" id="end_date_1"></td> 
     <td><input type="text" name="sku_1" value="" id="sku_1"></td> 
    </tr> 
</table> 
<span class="product"></span> 
<div class="add-product">&nbsp;</div> 
</div> 

<script type="text/javascript" charset="utf-8"> 

var i = 1; 

$('.add-product').click(function(){ 
    i++; 
    $('span.product').replaceWith('<table id="product_'+i+'">' 
     +'<tr>' 
      +'<th><label for="product_name">Product Name</label></th>' 
      +'<th><label for="region">Select A Region</label></th>' 
      +'<th class="date"><label for="start_date">Start Date</label></th>' 
      +'<th class="date"><label for="end_date">End Date</label></th>' 
      +'<th><label for="sku">SKU</label></th>' 
     +'</tr>' 
     +'<tr>' 
      +'<td><input type="text" name="product_name'+i+'" value="" id="product_name'+i+'"></td>' 
      +'<td><input type="radio" name="region'+i+'" value="upper_north" id="upper_north'+i+'"><label for="upper_north'+i+'">Upper North Island</label><br />' 
        +'<input type="radio" name="region'+i+'" value="lower_north" id="lower_north'+i+'"><label for="lower_north'+i+'">Lower North Island</label><br />' 
        +'<input type="radio" name="region'+i+'" value="south_island" id="south_island"><label for="south_island">South Island</label> </td>' 
      +'<td class="date"><input type="text" class="date" name="start_date'+i+'" value="" id="start_date'+i+'"></td>' 
      +'<td class="date"><input type="text" class="date" name="end_date'+i+'" value="" id="end_date'+i+'"></td>' 
      +'<td><input type="text" name="sku'+i+'" value="" id="sku'+i+'"></td>' 
     +'</tr>' 
    +'</table>' 
    +'' 
    +'<span class="product"></span>'); 
}); 
</script> 

Répondre

0

Donc maintenant sur l'instanciation et l'utilisation du nouvel objet.

Pourrais-je créer une construction comme celle-ci?

<? 
class Product { 

    private $Name; 
    private $Region; 
    private $StartDate; 
    private $EndDate; 
    private $Sku; 
    public $i; 

    function __construct($Name="product_name_$i" $Region="region_$i" $StartDate="start_date_$i" $EndDate="end_date_$i" $Sku="sku_$i") 
    { 
     $i++ 
    } 

} 
?> 

Et comment pourrais-je instancier en fait l'objet et de l'utiliser dans mon code? .. puis-je faire avec mon JavaScript?

5

Vous pouvez utiliser cet objet pour démarrer. Après cela, définissez des méthodes pour l'enregistrer et le récupérer. Et peut-être constructeur approprié, pour créer différents produits à partir des paramètres de poste.

class Product { 

    private $Name; 
    private $Region; 
    private $StartDate; 
    private $EndDate; 
    private $Sku; 

    public function setName($value)  
    { 
      //make some validation or manipulation on data here, if needed 
     $this->Name = $value;  
    } 

    public function getName()  
    {     
     return $this->Name;  
    }  

    public function setRegion($value)  
    { 
      //make some validation or manipulation on data here, if needed 
     $this->Region = $value;  
    } 

    public function getRegion()  
    {     
     return $this->Region;  
    }  
    public function setStartDate($value)  
    { 
      //make some validation or manipulation on data here, if needed 
     $this->StartDate = $value;  
    } 

    public function getStartDate()  
    {     
     return $this->StartDate;  
    }  

    public function setEndDate($value)  
    { 
      //make some validation or manipulation on data here, if needed 
     $this->EndDate = $value;  
    } 

    public function getEndDate()  
    {     
     return $this->EndDate;  
    }  

    public function setSku($value)  
    { 
      //make some validation or manipulation on data here, if needed 
     $this->Sku= $value;  
    } 

    public function getSku()  
    {     
     return $this->Sku;  
    }  
} 

Espérons que ça aide!

+0

Ok, cool, donc c'est le modèle d'objet pour le produit. Merci, ça aide de ce côté-là. – mdskinner

+0

@mdskinner Bonne chance! :) – anthares

1

Vous n'avez pas nécessairement besoin d'utiliser un objet - lorsque vous manipulez des formulaires, les tableaux associatifs sont plus faciles (puisque c'est ce que HTML transmet à PHP). Dans votre formulaire, il serait plus avantageux d'utiliser les noms de champs comme ceci:

  • product[1][name]
  • product[1][region]
  • product[1][start_date]
  • product[1][end_date]
  • product[1][sku]
  • product[2][name] ... etc

Lors de la réception des données en PHP, il sera en $_POST['product'], qui sera lui-même un tableau de chaque produit. Votre nouveau code PHP dépendra de ce que vous voulez faire avec les données, mais vous pourriez bien en boucle comme ceci:

<?php 
foreach($_POST['product'] as $prod) 
{ 
    echo $prod['name']; // outputs each product name in turn 
} 

Si vous avez besoin d'un objet, vous pouvez utiliser $prod_obj = (object) $prod puis $prod_obj->name et ainsi de suite.

+0

Ok, c'est cool .. merci, mais je veux être en mesure de créer une quantité infinie de "produits" ne serait pas cette méthode nécessite encore de répéter le code sans cesse? Je ne veux pas limiter le nombre de produits qu'un utilisateur peut ajouter. – mdskinner

+0

@mdskinner: Non, il n'y a pas de limite. Je voulais dire utiliser les noms avec '[1]' comme champs initiaux, mais quand l'utilisateur ajoute un autre produit, le javascript écrirait le même code mais avec [2] 'ou' [3] 'etc. – DisgruntledGoat

+0

, il doit y avoir un moyen plus facile de faire la partie javascript. Je pense que vous devriez pouvoir cloner le code qui est déjà là et remplacer '[1]' par '[2]' les noms de formulaire. En ce moment si vous changez n'importe quel HTML vous devez le faire deux fois. – DisgruntledGoat

0

anthares vous a donné l'objet; DisgruntledGoat vous a montré comment utiliser foreach pour parcourir l'entrée. :) Le constructeur que vous avez a besoin d'un peu de travail, cependant. Si vous allez passer des paramètres individuellement, vous devrez les séparer par une virgule; vos valeurs par défaut sont des choses qui sont utilisées si les valeurs ne sont pas transmises. Je ferais quelque chose comme ceci (qui est ce que je fais dans mon OO PHP en remplissant mes objets avec une rangée de la base de données).

/** 
* Constructor for the product. 
* 
* @param string=>string[] An associative array used to create the object. 
*/ 
public function __construct($aData = null) { 
    if (!is_null($aData)) { 
     $this->setName  ($aData["name"]); 
     $this->setRegion ($aData["region"]); 
     $this->setStartDate($aData["start_date"]); 
     $this->setEndDate ($aData["end_date"]); 
     $this->setSku  ($aData["sku"]); 
    } 
} 

Dans le code HTML, vous devriez définir vos champs comme ...

<input type="text" name="product[1][name]" /> 
<input type="text" name="product[1][sku]" /> 
... 

Ensuite, en PHP, vous feriez quelque chose comme

$aProducts = array(); 
foreach ($_POST["product"] as $aProduct) { 
    $aProducts[] = new Product($aProduct); 
    // NOTE - here you could also make an empty object and fill it. 
    $oProduct = new Product(); 
    $oProduct->setName($aProduct["name"]); 
    // etc. - then add it to the array when you're done. 
} 

// Display the name of product 2 (if it exists). 
if (2 <= count($aProducts)) { 
    echo $aProducts[1]->getName(); 
} 

Enfin, je Je ne suis pas sûr de ce que le "$ i" vous donne. D'habitude, je crée juste des champs comme ...Puis, sur le serveur, j'ai un tas de tableaux, mais leurs clés correspondent toutes. Donc, je peux faire quelque chose comme ...

$aProducts = array(); 
foreach($_POST["id"] as $iKey => $aValue) { 
    $oProduct = new Product(); 
    $oProduct->setName($_POST["name"][$iKey]); 
    $oProduct->setSku ($_POST["sku" ][$iKey]); 
    $aProducts[] = $oProduct; 
} 

6 de 1, 1/2 douzaine de l'autre. Mes constructeurs prennent généralement des objets PDORow pour leurs paramètres, donc je le fais de cette façon à la page, quand je travaille avec des tableaux associatifs.

Questions connexes