Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Przesłanie tablicy asocjacyjnej do formularza
Forum PHP.pl > Forum > PHP > Frameworki
CzarnyGsm
Witam,

Napotkałem problem z dodaniem do formularza typu select wartości z bazy danych i nie bardzo chcą się one wyświetlać.
W kontrolerze w akcji daję:
  1. <?php
  2. class ArtykulyController extends Zend_Controller_Action
  3. {
  4. [..]
  5. public function dodajAction(){
  6. $modelArtykulyKategorie = new Application_Model_ArtykulyKategorie();
  7. $categories = $modelArtykulyKategorie->pobierzKategorie();
  8. // print_r($categories) zwraca Array ( [1] => Aktualnosci [2] => Konkursy ) , czyli ok
  9. $form = new Application_Form_Artykul($categories);
  10. [..]
  11. }

Do formularza przekazuję tablice asocjacyjną o nazwie $categories.
Mam problem jednak w użyciu tej zmiennej w opcji addMultiOptions. Przyjmuje ona właśnie tablicę asocjacyjną, ale nijak nie wiem jak jej tam użyć. Jeden Pan podpowiadał mi coś z konstruktorem, ale nie wiem jak tego użyć.
Mój formularz:
  1. <?php
  2. class Application_Form_Artykul extends Zend_Form {
  3. // Jak użyć do tego celu konstruktora?
  4. // private $_categories;
  5. //
  6. // public function __construct($options = null) {
  7. // $this->_categories = isset($options['categories']) && is_array($options['categories']) ? $options['categories'] : array();
  8. // unset($options['categories']);
  9. // parent::__construct($options);
  10. // }
  11.  
  12. public function init() {
  13. $content = $this->createElement('textarea', 'content');
  14. $content->setLabel('Title:')
  15. ->addValidators(array(
  16. new Zend_Validate_NotEmpty()
  17. ));
  18. $category = $this->createElement('select', 'category');
  19. $category->setLabel('Kategoria:')
  20. ->addMultiOptions(array( // jak umieścić tutaj wartości ze zmiennej $categories ?
  21. '1' => 'Aktualności',
  22. '2' => 'Konkursy'
  23. ));
  24. $this->addElements(array(
  25. $content,
  26. $category,
  27. 'submit', 'submit', array(
  28. 'label' => 'dodaj'
  29. )
  30. )
  31. ));
  32. }
  33. }
  34.  



Byłbym bardzo wdzięczny za jakąkolwiek pomoc.

IceManSpy
Uważam, że powinieneś w klasie formularza zrobić pole prywatne $tablica, a potem za pomocą konstruktora przekazać tą tablicę do zmiennej prywatnej i wtedy w klasie możesz do niej się odwołać.

A konstruktor wtedy:

  1. private $array = array();
  2. public __construct($array_from_controller) {
  3. $this->array = $array_from_controller;
  4. }

Albo spróbuj napisać funkcję init jako: init($categories) i wtedy się odwołać do $categories w formularzu.
CzarnyGsm
Dzięki za odpowiedź. Drugie rozwiązanie, które przedstawiłeś próbowałem wcześniej, wyświetla błąd o nieprawidłowym argumencie.
Odnośnie pierwszego sposobu to nie wywołuje w widoku echo $this->form. Wynika z tego , że nie wywołuje funkcji init(), gdzie znajduje się cały spis formularzy, próbowałem dodać parent::init() w konstruktorze; , ale to samo. Sprawdziłem pod koniec konstruktora, czy w ogóle pobrało wartość z kontrolera, pobrało:) Teraz zostało tylko wywołać funkcję init(), ale pytanie brzmi w jaki sposób? Dlaczego nie wywołuje tej funkcji po dodaniu konstruktora?

Będę wdzięczny za rozwiązanie problemu. Bardzo potrzebne jest mi połączenie bazy danych z formularzem do zarządzania treścią w panelu administracyjnym. Czy przypadkiem nie robi się też tego w dekoratorach?
Janusz1200
Ja używam własnych klas które rozszerzają Zend_Form_Element_Multiselect
i tam:

$this->setMultiOptions(jakaś_tablica);

tak, że niepotrzebnie chyba dajesz to array() w argumencie.


A konstruktora do form używaśz normalnie - piszesz swojego z 2 argumentami,
coś na kształt
public function __construct($options = null, $tablica=null) {
parent::__construct($options);

$this->tablica=$tablica;

}
CzarnyGsm
Wielkie podziękowanie dla Batmana .
Rozwiązanie problemu:
- w konstruktorze
  1. [..]
  2. public function dodajAction(){
  3. $modelArtykulyKategorie = new Application_Model_ArtykulyKategorie();
  4. $categories = $modelArtykulyKategorie->pobierzKategorie();
  5. $form = new Application_Form_Artykul(array('categories' => $categories));
  6. [..]

- w formularzu
  1. [..]
  2. private $_categories;
  3.  
  4. public function __construct($options = null) {
  5. $this->_categories = isset($options['categories']) && is_array($options['categories']) ? $options['categories'] : array();
  6. unset($options['categories']);
  7. parent::__construct($options);
  8. }
  9.  
  10. public function init() {
  11. [..]
  12. $category = $this->createElement('select', 'category');
  13. $category->setLabel('Kategoria:')
  14. ->setRequired(TRUE)
  15. ->addMultiOptions($this->_categories);
  16. [..]
5k7
Możesz również zrobić coś takiego :
<?php
class Form_Form extends Zend_Form
{
public $zmienna1, $zmienna2;

public function cos tam($zmienna1, $zmienna2)
{
$this->zmienna1 = $zmienna2;
$this->zmienna2 = $zmienna2;
}

public function createForm()
{

$this->setName('nazwa');
itd...


Na początku prześlesz sobie cokolwiek tam chcesz w jakiejkolwiek formie do funkcji cos , następnie jak już wszystko powrzucasz wywołasz funkcje createForm. Z tym sposobem z konstruktorem miałem wiele problemów, w tym również zapychanie całkowitej ilości pamięci (memory_limit).

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.