2010-02-19 3 views
1

Эй, может кто-нибудь поможет мне сделать этот объект, пожалуйста.Может ли кто-нибудь помочь мне сделать это объектом. (php)

Очевидно, что не все мои коды здесь, но я уверен, что вы получите суть.

<?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> 

ответ

0

Итак, теперь вы создаете экземпляр и используете новый объект.

Могу ли я сделать такую ​​конструкцию?

<? 
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++ 
    } 

} 
?> 

А потом как бы я на самом деле экземпляр объекта и использовать его в моем коде? .. Могу ли я сделать это с моим JavaScript?

5

Вы можете использовать этот объект для начала. После этого определите методы сохранения и извлечения. И, возможно, правильный конструктор для создания разных продуктов из post params.

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;  
    }  
} 

Надеюсь, что это поможет!

+0

ОК, круто, поэтому это модель объекта для продукта. Спасибо, это помогает в этом. – mdskinner

+0

@mdskinner Удачи! :) – anthares

1

Вам необязательно использовать объект - при работе с формами ассоциативные массивы проще (поскольку это то, что HTML передает PHP). В вашей форме было бы более выгодно использовать имена полей, как это:

  • product[1][name]
  • product[1][region]
  • product[1][start_date]
  • product[1][end_date]
  • product[1][sku]
  • product[2][name] ... и т.д.

При получении данных в PHP он будет находиться в $_POST['product'], который сам будет массивом каждого продукта. Ваш новый PHP-код будет зависеть от того, что вы хотите делать с данными, но вы могли бы петли, хотя это нравится:

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

Если вам требуется объект, вы можете использовать $prod_obj = (object) $prod затем $prod_obj->name и так далее.

+0

Хорошо, это здорово .. спасибо, но я хочу иметь возможность создавать бесконечное количество «продуктов», не будет ли этот метод по-прежнему требовать повторения кода бесконечно? Я не хочу ограничивать, сколько продуктов пользователь может добавить. – mdskinner

+0

@mdskinner: Нет, нет предела. Я имел в виду использование имен с '[1]' в качестве ваших начальных полей, но когда пользователь добавляет другой продукт, javascript будет писать тот же код, но с '[2]' или '[3]' и т. Д. – DisgruntledGoat

+0

Кстати , должен быть более простой способ сделать часть javascript. Я думаю, вы должны иметь возможность клонировать уже существующий код и заменять '[1]' на '[2]' имена форм. На данный момент, если вы измените любой HTML-код, вам нужно сделать это дважды. – DisgruntledGoat

0

anthares предоставил вам объект; DisgruntledGoat показал вам, как использовать foreach для запуска через вход. У конструктора, который у вас есть, есть небольшая работа. Если вы собираетесь передавать параметры по отдельности, вам нужно разделить их запятой; ваши значения по умолчанию - это те вещи, которые используются, если значения не переданы. Я бы сделал что-то вроде этого (это то, что я делаю в моем OO PHP при заполнении моих объектов строкой из базы данных).

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

В HTML коде, вы бы определить свои поля как ...

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

Затем в PHP, вы могли бы сделать что-то вроде

$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(); 
} 

Наконец, я «Не знаю, что вам дает« $ i ». Я обычно создаю такие поля, как ...

<input type="text" name="name[]" /> 
<input type="text" name="sku[]" /> 
<!-- This next one is if I need a database ID once it's posted back. --> 
<input type="hidden" name="id[]" value="something"/> 
... 
<input type="text" name="name[]" /> 
<input type="text" name="sku[]" /> 
...etc... 

Затем на сервере у меня есть множество массивов, но все их ключи совпадают. Итак, я могу сделать что-то вроде ...

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

6 из 1, 1/2 десятка другого. Мои конструкторы обычно используют объекты PDORow для своих параметров, поэтому я делаю это так на странице, когда я работаю с ассоциативными массивами.

Смежные вопросы