Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZendFramework] Przesłanie tablicy asocjacyjnej do formularza
CzarnyGsm
post 27.09.2011, 16:02:32
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 2
Dołączył: 16.04.2007

Ostrzeżenie: (0%)
-----


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.

Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
IceManSpy
post 27.09.2011, 17:44:34
Post #2





Grupa: Zarejestrowani
Postów: 1 006
Pomógł: 111
Dołączył: 23.07.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.

Ten post edytował IceManSpy 27.09.2011, 17:47:21


--------------------
Go to the top of the page
+Quote Post
CzarnyGsm
post 27.09.2011, 19:43:44
Post #3





Grupa: Zarejestrowani
Postów: 84
Pomógł: 2
Dołączył: 16.04.2007

Ostrzeżenie: (0%)
-----


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?

Ten post edytował CzarnyGsm 27.09.2011, 19:47:08
Go to the top of the page
+Quote Post
Janusz1200
post 27.09.2011, 20:28:40
Post #4





Grupa: Zarejestrowani
Postów: 110
Pomógł: 6
Dołączył: 19.12.2010
Skąd: Krzyżanowice

Ostrzeżenie: (0%)
-----


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;

}

Ten post edytował Janusz1200 27.09.2011, 20:34:51
Go to the top of the page
+Quote Post
CzarnyGsm
post 28.09.2011, 11:46:01
Post #5





Grupa: Zarejestrowani
Postów: 84
Pomógł: 2
Dołączył: 16.04.2007

Ostrzeżenie: (0%)
-----


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. [..]
Go to the top of the page
+Quote Post
5k7
post 14.10.2011, 12:08:29
Post #6





Grupa: Zarejestrowani
Postów: 65
Pomógł: 2
Dołączył: 5.12.2006

Ostrzeżenie: (0%)
-----


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).

Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 23.06.2025 - 13:37