Formulář jako UI\Control komponenta

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

S Nette začínám a trochu v tom plavu, poprosil bych o postrčení správným směrem:
Podle best practise
mám vytvořenou komponentu OrderForm.php

<?php
namespace AdminModule\Forms;

use Nette\Application\UI,
	Nette\Forms\Form;

class OrderForm extends UI\Control
{
	private $database;
    public function __construct(\Nette\Database\Context $database)
    {
        $this->database = $database;
    }
	public function render()
	{
		$template = $this->template;
		$template->setFile(__DIR__ . '/OrderForm.latte');
		$template->render();
	}
    protected function createComponentForm()
    {
		$form = new UI\Form;
			$form->addGroup('Osobní údaje');
			$form->addText('jmeno', 'Jméno:')
				->setRequired('Zadejte jméno');
			$form->addText('prijmeni', 'Příjmení:')
				->setRequired('Zadejte příjmení');
			$form->addSelect('doklady_1_id', '1. doklad:',$this->database->table('doklady')->fetchPairs('id', 'nazev'));
			$form->addSubmit('send', 'Uložit');

			return $form;
	}
	public function fillData($order) {
		$this['form']->setDefaults($order->toArray());
//		\Nette\Diagnostics\Debugger::dump($this['form']);
	}

	}


interface IOrderFormFactory
{
    /** @return OrderForm */
    function create();
}
?>

v config.neon

services:
	- AdminModule\Forms\IOrderFormFactory

a v presenteru OrderPresenter

<?php
namespace AdminModule;
use Nette,
	Model;



final class OrderPresenter extends BasePresenter
{
    /** @var Nette\Database\Context */
    public $database;

    public function __construct(Nette\Database\Context $database)
		{
			$this->database = $database;
		}

	/** @var \AdminModule\Forms\IOrderFormFactory @inject */
    public $orderFormFactory;

	protected function createComponentOrderForm()
		{
        $control = $this->orderFormFactory->create();
        return $control;
		}

	public function actionEdit($orderId)
		{
		$order = $this->database->table('rozvoz')->get($orderId);
		if (!$order) {
			$this->error('Objednávka nenalezena');
		}
	    $control = $this->orderFormFactory->create();
		$control->fillData($order);

		}
}
?>

admin/order/create vykreslí prázdný formulář v pořádku
pokud zavolám admin/order/edit?orderId=104 tak se mi stejně vykreslí prázdný formulář, přitom ten dump ve fillData vypíše správné hodnoty.
šablona Order.edit.latte obsahuje:

<h1>Editace objednávky</h1>
{control orderForm}
David Matějka
Moderator | 6445
+
0
-

mas chybu v actionEdit

$control = $this->orderFormFactory->create();
$control->fillData($order);

ten kod vytvori novou komponentu, kterou naplni daty, ale ne tu, kterou vytvaris v createComponentOrderForm metode.
uprav na

$this['orderForm']->fillData($order);
Honza_S
Člen | 12
+
0
-

výtečné, zafungovalo to, díky moc

pepakriz
Člen | 246
+
0
-

Ještě bys měl ve třídě orderForm zavolat předka konstruktoru.

David Matějka
Moderator | 6445
+
0
-

@pepakriz: v PresenterComponent nemusis, je to potreba jen u Form