Vlastní vykreslování formuláře s pomocnou proměnnou
- trejjam
- Backer | 65
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
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
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)
- trejjam
- Backer | 65
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)