Vlastní vykreslování formuláře s pomocnou proměnnou

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

Zdravím,

řešil jsem jak předat při vytvoření komponenty v presenteru nějakou pomocnou proměnnou do latte, vyřešil jsem to takto, ale nelíbí se mi to…
Je nějaké hezčí řešení?

class HpPresenter extends BasePresenter {
	private $checkbox=[];

	function createComponentEditUser() {
		return new UI\Multiplier(function ($id) {
			$form=new UI\Form();

			/*
				vrací pole rolí:
				root
					admin
						editFoo
						editFoo2
					...

				z nich následně vygeneruji checkboxy formuláře,
				chtěl jsem je však nějak hezky vykreslit (odsadit podobně jako když dumpnu vrácené pole),
				přepravil jsem si pole, které popisovalo hloubku daného checkboxu,
				narazil jsem však na problém jak tuto proměnnou dostat do latte
			*/
			$tree=$this->FooKomponenta->getTree($id);

			$depth=[];
			$values=$form->addContainer("values");
			foreach { //procházení do hloubky v $tree
				$values->addCheckbox...
				$depth[$k] //hloubka checkboxu
			}

			$this->checkbox[$id]=$depth; //tohle se mi nelíbí, chtěl bych něco jako template->...

			return $form;
		});
	}
	function getCheckboxRoles($id) {
		return isset($this->checkbox[$id])?$this->checkbox[$id]:[];
	}
}
{form editUser-$editUser->id}
	<h3>Změna oprávnění</h3>

	{var $roles=$presenter->getCheckboxRoles($editUser->id)}
	<div class="roles" n:inner-foreach="$form['values']->components as $k=>$v">
		{continueIf !isset($roles[$k])}

		{* podle hodnoty $roles[$k] zanořuji nebo naopak ukončuji zanoření následných řádků do <div class='Foo'> *}
		{label $v: /}
		{input $v:}
	</div>

	{input send}
{/form}

pro pole $tree kód vygeneruje:

<div class="Foo">
	<label>root</label>
	<input>

	<div class="Foo">
		<label>admin</label>
		<input>

		<div class="Foo">
			<label>editFoo</label>
			<input>
		</div>
		<div class="Foo">
			<label>editFoo2</label>
			<input>
		</div>
	</div>
</div>
Azathoth
Člen | 495
+
0
-

A nešlo by úplně jednoduše udělat tohle? https://latte.nette.org/cs/tags#…

Prostě v latte měj:
{$checkBoxRoles}

a v presenteru to naplň:
public function action<sem dej název stránky, kde to je>($id) {
$this->template->checkBoxRoles = isset($this->checkbox[$id])?$this->checkbox[$id]:[];
}

Mimochodem, kde získáš tu proměnnou $id?

trejjam
Backer | 65
+
0
-

ano v latte bych měl rád přesně tento zápis

obávám se že tento způsob nebude reálný (pokud se příliš nepletu) ($id se získává až v renderu (render je až po action) a volání generování stromu je voláno až v createComponentFoo z latte tedy po renderu), mohu sice generovat strom 2× (rekurzivní akce nad databází), ale nepřišlo mi to optimální…

$id je číslo uživatele získávané v renderFoo() metodě (při zpracování se ověřuje, zda dané $id má právo editovat právě přihlášený uživatel)

Azathoth
Člen | 495
+
0
-

ukaž mi render metodu. Skoro určitě to půjde vymyslet tak, abys získal $id už v action metodě.

Editoval Azathoth (28. 9. 2014 21:34)

trejjam
Backer | 65
+
0
-
function renderUsers($id) {
		$user = $this->getUser();
		if (!$user->isAllowed("users", "view")) {
			$this->redirect("Hp:default");
		}

		$template = $this->template;

		$template->usersEdit = $user->isAllowed("users", "edit");

		$editUser = isset($id) ? $this->database->table(UserManager::TABLE_NAME)->get($id) : FALSE;
		if ($editUser) {
			$template->editUser = (object) [
				"id"   => $editUser->id,
				"name" => $editUser->username,
			];
		}
	}

(jen jsem zatím neprohlédl k čemu mi pomůže mít $id už v actionFoo)

Editoval trejjam (28. 9. 2014 21:51)

Azathoth
Člen | 495
+
0
-

Tak přidání metody

public function actionUsers($id) {
	$this->template->checkBoxRoles = isset($this->checkbox[$id])?$this->checkbox[$id]:[];
}

by mělo fungovat naprosto bez problémů, ne?

Editoval Azathoth (28. 9. 2014 21:53)

trejjam
Backer | 65
+
0
-

To sice vytvoří proměnnou, ale ta je prázdná (dle životního cyklu aplikace)

Azathoth
Člen | 495
+
0
-

A funguje ti dát
$this->template->checkBoxRoles = isset($this->checkbox[$id])?$this->checkbox[$id]:[];
do metody renderUsers?

trejjam
Backer | 65
+
0
-

to je stále stejný problém, strom se generuje až po render metodách

action … handle… render → latte template → createComponent (generování stromu) → dokončení latte … konec