Zend_Form anahtar-değer çifti alanların rasgele sayı

2 Cevap php

I'm trying to create a form using Zend_Form (Zend_Framework component). The users should be able to add arbitrary number of fields. Just as you can upload files with gmail GUI. Example:

[_____] [+]

[+] Düğmesine tıkladıktan sonra:

[_____]
[_____] [+]

Karmaşık şeyler almak için, alan pairs eklemek istiyorum, bu yüzden bu gibi görünecektir:

[_____] [_____]
[_____] [_____] [+]

Nasıl kolay yerleşik doğrulama durumunu tutmak ve bu özelliği uygulama sırasında yöntemleri atayabilirsiniz? Ben bir alt form ihtiyacım var mı? Ben başka bir şey lazım mı? Formu doldurduktan sonra, kod ve diziye alanları harita gerekir.

Ben Zend_Form veya alt form alt sınıfı olmalıdır korkuyorum, ama ben kolay / güzel şekilde haberdar olmak istiyorum.

2 Cevap

Buraya çekmek için en kolay yaklaşım tüm dizi PHP şekilde otomatik aşağıdaki gerçekleştirmek mümkün görmek gibi girdi unsurları ayrıştırma basit bir özel Zend Validator, kullanmaktır.

  1. Bağımsız olarak her giriş elemanı doğrulamak ve her öğe için ilişkili hata iletilerini görüntüler.
  2. Sadece sunuldu formunu yeniden bir ayrıştırma mümkün dizisi döndürür.

Zend_Validator için

class Validate_InputArray extends Zend_Validate_Abstract
{
 const INVALID = 'invalid';
 const ERROR   = 'error';

 /**
  * Failed array elements used to regenerate same elements
  * on next form build
  *
  */
 protected $_elements = array();

    protected $_messageTemplates = array(
        self::INVALID => "Could not locate post element %value%",
  self::ERROR   => "YOUR ERROR MESSAGE|%value% is required"
    );

    public function __construct()
    {}

    public function isValid($element)
    {
        if (!$_POST[$element]) {
   $this->_error(self::INVALID);
   return false;
  }

  $elements = array();

  if (is_array($_POST[$element])) {

   $fail = false;

   foreach ($_POST[$element] as $k => $v) {
    if (!$this->_validateElement($v)) {
     $this->_error(self::ERROR);
     $elements[$k] = self::ERROR;
    }
   }

   $this->_setElements($elements);

   if ($fail) {
    return false;
   }

  } else {
   if (!$this->_validateElement($_POST[$element])) {

    $this->_error(self::ERROR);
    $elements[0] = self::ERROR;

    $this->_setElements($elements);

    return false;
   }
  }
    }

 protected function _setElements($elements)
 {
  $this->_elements = $elements;
  return $this;
 }

 public function getElements()
 {
  return $this->_elements;
 }

 private function _validateElement($value)
 {
  // do your validation here
  // return true/false
 }
}

Hemen bir değer olarak olası bir dizi ile giriş ayrıştırmak ve her öğe doğrulamak ve aynı keyfi alanları, sunulan tam formunu yeniden oluşturmak için bu kullanarak kodu.

$fail = false;

if ($this->getRequest()->isPost()) {

 require 'Validate_InputArray.php';

 $validator = new Validate_InputArray();
 $elements  = array();

 if (!$validator->isValid($validator)) {

  $fail = true;

  foreach ($validator->getElements() as $k => $v) {
   $elements[$k] = $v;
  }
 }
}

if ($fail) {

 $messages = $validator->getMessages();

 foreach ($elements as $k => $v) {
  // Add custom methods here
  $element = $form->createElement('text', 'elementName[]');
        $element->addErrorMessages($messages[$k]);
 }

} else {
 $form->addElement('elementName[]');
}

Bu alt forma ihtiyaç duymadan gerektiği gibi keyfi giriş herhangi bir sayıda öğe doğrulamak, ya da form elemanları yeniden eklemek için ihtiyaç hakkında endişe izin verirseniz ve bir keyfi elemanı doğrulama başarısız olur ve istemci üzerinde yeniden inşa edilmesi gerektiğinde tarafı.

Burada on giriş alanları, her biri Alpha doğrulama eklemek için:

$sub_test = new Zend_Form_SubForm();
$num_fields = 10;
for ( $i = 0; $i < $num_fields; $i++ ) {
  $element = $form->createElement('text', strval($i));
  $element->addValidator('Alpha'); // just to see in action
  $sub_test->addElement($element);
}
$form->addSubForm($sub_test, 'test'); // values mapped to $_POST['test'][0..9]

/ Gösterisi oluşturmak için kaç belirlemek için, daha fazla iş tabii ki, sizin açınızdan gerekli, ama basit görünüyor.

  1. Her zaman bu dahil - doldurulur Kaç değerleri görmek için $ _POST ['deneme'] bak.
  2. Boş olduğunu bile bu - göstermek için ne kadar toplam alanları bilmek başka bir gizli değişkenin bak.
  3. vb