2013-03-20 3 views
0

я мое приложение, основанное на ZendSkeletonApplication, теперь я хочу создать для отношений между моими моделями так:Zend Framework вариант заполнения 2,0 из базы данных

user   portal 
id    id 
firstName  name 
lastName  url 
........ 
portal_Id 

Я хочу, чтобы заполнить мой Select-вариант в виде пользователя с базой данных значения

<?php 
namespace Register\Form; 

use Zend\Captcha\AdapterInterface as CaptchaAdapter; 
use Zend\Form\Form; 
use Zend\Form\Element; 


class UserForm extends Form 
{ 
    protected $portalTable; 

    public function __construct($name = null) 
    { 
     parent::__construct('user'); 
     $this->setAttribute('method', 'post'); 
     $this->setAttribute('class', 'form-horizontal'); 

     $this->add(array(
       'name' => 'id', 
       'attributes' => array(
         'type' => 'hidden', 
       ), 
     )); 

     $this->add(array(
       'type' => 'Select', 
       'name' => 'portal_id', 
       'options' => array(
         'label' => 'Portal', 
         'empty_option' => 'Seleccione un portal', 
         'value_options' => array(
           '1' => 'portal 1', 
           '2' => 'portal 2', 
           '3' => 'portal 3', 
           //i want option from database with 
         ), 

       ) 
     )); 

     $this->add(array(
       'name' => 'firstName', 
       'attributes' => array(
         'type' => 'text', 
       ), 
       'options' => array(
         'label' => 'First Name', 
       ), 
     )); 

     $this->add(array(
       'name' => 'lastName', 
       'attributes' => array(
         'type' => 'text', 
       ), 
       'options' => array(
         'label' => 'Last Name', 
       ), 
     )); 
     $this->add(array(
       'name' => 'login', 
       'attributes' => array(
         'type' => 'text', 
       ), 
       'options' => array(
         'label' => 'Login', 
       ), 
     )); 

     $this->add(array(
       'name' => 'password', 
       'attributes' => array(
         'type' => 'password', 
       ), 
       'options' => array(
         'label' => 'Password', 
       ), 
     )); 

     $this->add(array(
       'name' => 'password_repeat', 
       'attributes' => array(
         'type' => 'password', 
       ), 
       'options' => array(
         'label' => 'password (repeat)', 
       ), 
     )); 

     $this->add(array(
       'name' => 'email', 
       'attributes' => array(
         'type' => 'text', 
       ), 
       'options' => array(
         'label' => 'Email', 
       ), 
     )); 

     $this->add(array(
       'type' => 'Zend\Form\Element\Csrf', 
       'name' => 'csrf', 
       'options' => array(
         'csrf_options' => array(
           'timeout' => 600 
         ) 
       ) 
     )); 

     $this->add(array(
       'type' => 'Captcha', 
       'name' => 'captcha', 
       'options' => array(
         'label' => 'Please verify you are human.', 
         'captcha' => array('class' => 'Dumb', 
         ), 
       ), 
     )); 

     $this->add(array(
       'name' => 'submit', 
       'attributes' => array(
         'type' => 'submit', 
         'value' => 'Go', 
         'id' => 'submitbutton', 
       ), 
     )); 
    } 
} 

в этой части я хочу заполнить выбрать из базы данных

$this->add(array(
       'type' => 'Select', 
       'name' => 'portal_id', 
       'options' => array(
         'label' => 'Portal', 
         'empty_option' => 'Seleccione un portal', 
         'value_options' => array(
           '1' => 'portal 1', 
           '2' => 'portal 2', 
           '3' => 'portal 3', 
           //i want option from database with 
         ), 

       ) 
     )); 

извините за мой английский

ответ

1

Я написал подробный блог «Zend\Form\Element\Select and Database-Values» об этой теме. В принципе, это то, что вам нужно сделать:

В основном все, что вам нужно сделать, это запросить базу данных внутри вашей формы для данных. Для этого вам необходимо, чтобы DB-Adapter был доступен внутри вашей Формы, который выполняется Dependency-Injection. Поскольку DB-Adapter имеет required, чтобы ваша форма функционировала правильно, я бы предложил Setter-Injection.

Внутри вашего getServiceConfig() сделать это:

return array('factories' => array(
    'namespace-form-formname' => function($sm) { 
     $dbA = $sm->get('Zend\Db\Adapter\Adapter'); 
     $form = new \Namespace\Form\Formname($dbA); 

     return $form; 
    } 
)); 

Это будет впрыскивать Zend\Db\Adapter\Adapter в вашу форму, которая должна уже быть действительным, хотя другой конфигурации. Затем вам нужно немного изменить код формы:

public function __construct(\Zend\Db\Adapter\Adapter $dbA) { 
    parent::__construct('form-name'); 

    // Do the DB-Query here. You got the DB-Adapter 
    // http://zf2.readthedocs.org/en/latest/modules/zend.db.adapter.html 
    $selectArray = array(
     'key' => 'value', 
     'key' => 'value', 
     'key' => 'value', 
    ); // obviously, this is just a fake-$selectArray demonstrating 
     // what the output of your Queries should be 

    // Add your Form Elements here 
    // use $selectArray as value_options of your desired select element 
} 

И это в основном. К сожалению, я не могу дать вам конкретный пример, поскольку я никогда не работал с Zend\Db, но я предполагаю, что это поможет вам начать.

PS: В контроллере, вызовите форму, как это:

$form = $this->getServiceLocator()->get('namespace-form-formname'); 
+0

нормально, я не понимаю, как реализовать в моем примере ... – kalelc

+0

Какую часть вы не понимаете? – Sam

+0

как включить в таблицу другую таблицу классов, заполненную в моей форме. В этом примере мне нужно включить выбранные заполненные порталы в пользовательскую форму, но я не могу включить:/ – kalelc

0
Try: 
// add code on controller 
$arrPortalId = array(); 
$results = array('1' => 'portal 1', '2' => 'portal 2', '3' => 'portal 3',); // this part change your database value 
foreach ($results as $key => $val) { 
$arrPortalId[$key] = $va; 
} 
$dataParams['portalId'] = $arrPortalId; 
$form = new UserForm($dataParams); 

<?php 
namespace Register\Form; 

use Zend\Captcha\AdapterInterface as CaptchaAdapter; 
use Zend\Form\Form; 
use Zend\Form\Element; 


class UserForm extends Form 
{ 
    protected $portalTable; 

    public function __construct($params = array()) 
    { $name = isset($params['name'])?$params['name']:''; 
     parent::__construct('user'); 
     $this->setAttribute('method', 'post'); 
     $this->setAttribute('class', 'form-horizontal'); 

     $this->add(array(
       'name' => 'id', 
       'attributes' => array(
         'type' => 'hidden', 
       ), 
     )); 
    $portalId = (isset($params['portalId']) && count($params['portalId']) > 0)?$params['portalId']:array(); 
     $this->add(array(
       'type' => 'Select', 
       'name' => 'portal_id', 
       'options' => array(
         'label' => 'Portal', 
         'empty_option' => 'Seleccione un portal', 
         'value_options' => $portalId, 

       ) 
     )); 

     $this->add(array(
       'name' => 'firstName', 
       'attributes' => array(
         'type' => 'text', 
       ), 
       'options' => array(
         'label' => 'First Name', 
       ), 
     )); 

     $this->add(array(
       'name' => 'lastName', 
       'attributes' => array(
         'type' => 'text', 
       ), 
       'options' => array(
         'label' => 'Last Name', 
       ), 
     )); 
     $this->add(array(
       'name' => 'login', 
       'attributes' => array(
         'type' => 'text', 
       ), 
       'options' => array(
         'label' => 'Login', 
       ), 
     )); 

     $this->add(array(
       'name' => 'password', 
       'attributes' => array(
         'type' => 'password', 
       ), 
       'options' => array(
         'label' => 'Password', 
       ), 
     )); 

     $this->add(array(
       'name' => 'password_repeat', 
       'attributes' => array(
         'type' => 'password', 
       ), 
       'options' => array(
         'label' => 'password (repeat)', 
       ), 
     )); 

     $this->add(array(
       'name' => 'email', 
       'attributes' => array(
         'type' => 'text', 
       ), 
       'options' => array(
         'label' => 'Email', 
       ), 
     )); 

     $this->add(array(
       'type' => 'Zend\Form\Element\Csrf', 
       'name' => 'csrf', 
       'options' => array(
         'csrf_options' => array(
           'timeout' => 600 
         ) 
       ) 
     )); 

     $this->add(array(
       'type' => 'Captcha', 
       'name' => 'captcha', 
       'options' => array(
         'label' => 'Please verify you are human.', 
         'captcha' => array('class' => 'Dumb', 
         ), 
       ), 
     )); 

     $this->add(array(
       'name' => 'submit', 
       'attributes' => array(
         'type' => 'submit', 
         'value' => 'Go', 
         'id' => 'submitbutton', 
       ), 
     )); 
    } 
} 
Смежные вопросы