addSelect a Nette\ArrayHash Object

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xand
Člen | 15
+
0
-

Zdravim,
vytahujem z db do pola udaje a vystup print_r() vyzera v pohode:

Array ( [1] => a [2] => b [3] => c )

vlozim ho do addSelect a po odoslani formulara a getValues() je ale premenna z toho selectu prazdna, hoci ked vo formulary <option value=„1“> je.

Ked si vypisem teraz print_r(). mam tam divne –

Nette\ArrayHash Object ( [product] =>

Dakujem za pomoc! :)

jiri.pudil
Nette Blogger | 1032
+
0
-

Nette\ArrayHash je v podstatě stdClass rozšířená o několik šikovných rozhraní. Pokud chceš, aby ti formulář vrátil hodnoty v obyčejném poli, volej getValues(TRUE).

Prázdnou hodnotu tam máš proto, že jsi v selectu nic nevybral. V tom případě ti vrátí hodnotu NULL (kterou print_r() vypíše jako prázdno).

xand
Člen | 15
+
0
-

uz to vracia normalne pole :), ale stale tam je NULL, ako je to mozne? jasne ze vzdy mam vzdy nieco vybrate v selecte

ak pole napisem natvrdo, tak to funguje.

$products = array(
	'1' => 'a',
	'2' => 'b',
	'3' => 'c',
	);

ale vystup z databazy mam idetenticky aj takto, no toto vracia NULL

$products = array();
foreach($this->categories->getProducts($category['id']) as $row) {
	$products[$row['id']] = $row['name'];
}
voda
Člen | 561
+
0
-

Kde nastavuješ položky pro select ($select->setItems())? Musíš je nastavovat ještě před zpracováním formuláře, nejlépe tedy v továrničce nebo action metodě.

xand
Člen | 15
+
0
-

$form->addSelect(‚product‘, ‚Product‘, $products)->setItems($products);

voda
Člen | 561
+
0
-

To vypadá správně, ukaž celý presenter.

xand
Člen | 15
+
0
-
	public function renderView($url = "")
	{
		$this->template->category = $this->categories->findByUrl($url);
		$category = $this->categories->findByUrl($url);
		$this->template->products = $this->categories->getProducts($category['id']);
	}

protected function createComponentOrderForm()
	{
		$url = $this->getHttpRequest()->getUrl();
		$split = explode("/", $url);
		$url = $split[count($split)-1];

		$category = $this->categories->findByUrl($url);

		$form = new Form;

		$products = array();
		foreach($this->categories->getProducts($category['id']) as $row) {
			$products[$row['id']] = $row['name'];
		}

		$form->addSelect('product', 'Product', $products)->setItems($products);

		//print_r($products);

		$form->addTextArea('note', 'Note:')
			->setOption('description', Html::el('p')
				->setHtml('some note')
			);

		$form->addSubmit('save', 'Save')
			->setAttribute('class', 'default')
			->onClick[] = $this->orderFormSucceeded;

		$form->addProtection();
		return $form;
	}

	public function orderFormSucceeded($button)
	{
		$values = $button->getForm()->getValues(TRUE);
		print_r($values); //Array ( ) Array ( [product] => [note] => blabla)
	}

a z modelu:

	public function findAll()
	{
		return $this->database->table('categories');
	}

	public function findById($id)
	{
		return $this->findAll()->get($id);
	}

	public function findByUrl($url)
	{
		return $this->findAll()->where('url', $url)->fetch();
	}

	public function getProducts($id)
	{
		return $this->database->table('products')->where('category_id', $id);
	}
voda
Člen | 561
+
0
-

Problém bude v této části:

$url = $this->getHttpRequest()->getUrl();
$split = explode("/", $url);
$url = $split[count($split)-1];

Uprav si router aby to generoval hezké url a v presenteru pak už pracuj jen s id kategorie.

xand
Člen | 15
+
0
-

nebude to tym, lebo predtym som tam mal id a nefungovalo to rovnako.
ale mozes mi pls rovno poradit ako urobit ten router, nenasiel som to ani na fore ani dokumentacii

xand
Člen | 15
+
0
-

tak uz sa mi to nejako podarilo rozchodit cez id.
zisla by sa este help s tym routrom: category/view?id=1 ⇒ kategoria/pekne-url

mam toto, ale nic to nerobi

$frontRouter[] = new Route('kategoria/<id>', array(
		'presenter' => 'Category',
		'action' => 'view',
		'id' => array(
			Route::VALUE => 0, // default value
			Route::FILTER_OUT => callback('Category::getCategoryURLByID'),
		),
	));
public static function getCategoryURLByID($id)
	{
		$db = new Nette\Database\Connection('mysql:host=localhost;dbname=cd', 'root', 'heslo', NULL);
		return $db->table('categories')->select('url')->where('id', $id)->fetch();
	}