2013-07-31 1 views
0

У меня есть таблица с отношением ManyToOne к базе данных между клиентом и продавцом, и я хочу выбрать id_client в форме продажи. для этого o использовал это.Выберите элемент из другой таблицы на форме zf2

SaleForm:

public function __construct(ClientTable $table) 
    { 
     parent::__construct('vente'); 

     $this->setAttribute('method', 'post'); 
     $this->clientTable = $table;  
     $this->add(array(
      'name' => 'id', 
      'attributes' => array(
       'type' => 'hidden', 
      ), 
     )); 
     $this->add(
       array(
        'name' => 'id_client', 
        'type' => 'Select', 
        'attributes' => array(
         'id' => 'id_client' 
        ), 
        'options' => array(
         'label' => 'Catégory', 
         'value_options' => $this->getClientOptions(), 
         'empty_option' => '--- Sélectionnez une categorie---' 
        ), 
       ) 
      ); 
     public function getClientOptions() 
     { 
      $data = $this->clientTable->fetchAll()->toArray(); 
      $selectData = array(); 

      foreach ($data as $key => $selectOption) { 
       $selectData[$selectOption["id"]] = $selectOption["nom_client"]; 
      } 

      return $selectData; 
     } 
} 

SaleController:

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\View\Model\ViewModel; 
use Caisse\Model\Sale;   
use Caisse\Form\SaleForm; 

class SaleController extends AbstractActionController 
{ 
    protected $saleTable; 
    protected $clientTable; 

    public function addAction() 
    { 
     $form = new SaleForm($this->clientTable); 
     $form->get('submit')->setValue('Ajouter'); 

     $request = $this->getRequest(); 
     if ($request->isPost()) { 
      $vente = new Sale(); 
      $form->setInputFilter($sale->getInputFilter()); 
      $form->setData($request->getPost()); 

      if ($form->isValid()) { 
       $vente->exchangeArray($form->getData()); 
       $this->getSaleTable()->saveSale($sale); 


       return $this->redirect()->toRoute('sale'); 
      } 
     } 
     return array('form' => $form); 

    } 
} 

Но каждый раз, когда я имел этот вопрос:

Catchable fatal error: Argument 1 passed to Caisse\Form\SaleForm::__construct() must be an instance of Admin\Model\ClientTable, null given.

Является ли это хороший способ сделать это, любая ссылка на тот же пример будет приветствоваться.

Спасибо

ответ

1

Внутри контроллера, функция AddAction, вы никогда не установите переменную clientTable может быть, вы забыли инициализировать его.

Как это

public function addAction() 
{ 
    $this->clientTable = $this->getServiceLocator()->get('Client\Model\ClientTable'); 
    $form = new SaleForm($this->clientTable); 
    // ... 
} 

О

public function getClientOptions() 
    { 
     $data = $this->clientTable->fetchAll(); 
     $selectData = array(); 

     foreach ($data as $row) { 
      $selectData[$row->id] = $row->nom_client; 
     } 

     return $selectData; 
    } 
+0

спасибо, это глупо забывать, что, но теперь у меня есть эта ошибка, когда я пытаюсь вставить в базу данных {{Ряды как часть этого DataSource, с объектом типа нельзя передать в массив}}, и они ссылаются на эту строку $ data = $ this-> clientTable-> fetchAll() -> toArray(); – Loouu

+0

Я сделал редактирование о методе ** toArray() **, вы можете попробовать, как указано выше. –

+0

Большое спасибо Реми, я просто использую его :)) – Loouu