Problém s aplikáciou ConfirmationDialog
- NiNu
- Člen | 31
Zdravím,
chcel by som vyskúšať komponentu ConfirmationDialog, avšak nedarí sa mi.
Vždy mi to pri vytvorení komponenty v továrni presenteru vyhadzuje chybu Recoverable Error.
Rozumiem, že to chce jeden parameter, ale nechápem prečo, keďže
v dokumentácii sa žiadny parameter neuvádza viď. ConfirmationDialog
Postupoval som podľa návodu: stiahol som z githubu confirmation dialog a nakopíroval súbory ConfirmationDialog.php a confirmationDialog.latte do zložky app/components. Potom som v presenteri vytvoril komponentu:
/**
* Komponenta Confirmation Dialog pre delete News
*/
public function createComponentConfirmForm() {
$form = new \ConfirmationDialog();
$form->addConfirmer(
'delete', // názov signálu bude confirmDelete!
array($this, 'deleteNews'), // callback na funkciu pri kliknutí na YES
'Are you sure with delete this item?' // otázka
);
return $form;
}
a v šablóne som ju použil takto:
{block #content}
<h2>Manage News</h2>
<br />
<div class="table-responsive col-md-9">
{snippet tableNews}
<table class="table table-hover news">
<thead>
<tr>
<th>News Title</th>
<th>Body</th>
<th>Creation Time</th>
<th>Created By</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{control confirmForm}
{foreach $allNews as $news}
<tr>
<td>{$news->title}</td>
<td>{$news->body|truncate:30}</td>
<td>{$news->date|date:'j.n.Y H:i:s'}</td>
<td>{$news->users->username}</td>
<td><a n:href="News:editNews $news->id"><i class="glyphicon glyphicon-pencil"> </i>Edit</a> | <a n:href="confirmForm:confirmDelete! id => $news->id"><i class="glyphicon glyphicon-trash"> </i>Delete</a></td>
</tr>
{/foreach}
</tbody>
</table>
{/snippet}
<a n:href="News:AddNews" class="btn btn-danger"><i class="glyphicon glyphicon-plus-sign"> </i><b>Add News</b></a>
</div>
kde som spravil chybu?
- James_Scott
- Člen | 55
ConfirmationDialog nepoužívám, ale vždyť Ti to píše že při vytváření objektu new \ConfirmationDialog(); je povinný 1 parametr – instance třídy \Http\SessionSection
- NiNu
- Člen | 31
Ano, já rozumiem, že to chce parameter inštanciu triedy
Nette\Http\SessionSection, len nerozumiem prečo, keď v návode také nič nie
je a okrem toho odkiaľ zoženiem tú inštanciu?
Skúsil som to tam dať takto:
/**
/** @var \Nette\Http\Session */
private $session;
* Komponenta Confirmation Dialog pre delete News
*/
public function createComponentConfirmForm(\Nette\Http\SessionSection $session) {
$form = new \ConfirmationDialog();
$form->addConfirmer(
'delete', // názov signálu bude confirmDelete!
array($this, 'deleteNews'), // callback na funkciu pri kliknutí na YES
'Are you sure with delete this item?' // otázka
);
return $form;
}
No bohužiaľ mi to potom hádže druhý error:
Argument 1 passed to AdminModule\NewsPresenter::createComponentConfirmForm() must be an instance of Nette\Http\SessionSection, string given
neviem odkiaľ tam dať tú inštanciu, aj keď vravím, podľa návodu by tam nemalo ísť nič …
- NiNu
- Člen | 31
OK, vŕtam sa v tom už druhý deň a neviem prísť na to ako predať
komponente inštanciu triedy \Nette\Http\SessionSection. Já takúto triedu
nikde zatiaľ nepoužívam. Už zúfalo skúšam hocičo, ale nič nechce ísť.
Furt je to niečo okolo session, len netuším ako ďalej, okrem toho posledný
commit komponenty bol v auguste 2013, tak by to malo ísť.
Skúšal som aj cez inject predať inštanciu triedy, no potom mi vyhadzuje, že
service nie je zaregistrovaný a tam som zas aj skončil, lebo netuším čo
mám zaregistrovať, pri repozitároch aspoň viem čo mám robiť a ako …
Komponenta by si mala sama automaticky ukladať do session, nie?
- Oli
- Člen | 1215
Zkus do configu neco jako
services:
confirmDialog: ConfirmDialog(@session)
a v Presenteru ji potom vytvoříš:
private $confirmDialog
function __construct(ConfirmDialog $confirmDialog)
{
$this->confirmDialog = $confirmDialog
}
public function createComponentConfirmForm() {
$form = $this->confirmDialog;
$form->addConfirmer(
'delete', // názov signálu bude confirmDelete!
array($this, 'deleteNews'), // callback na funkciu pri kliknutí na YES
'Are you sure with delete this item?' // otázka
);
return $form;
}
- NiNu
- Člen | 31
Skúsil som tvoju radu a to do config.neon som zaregistroval service
confirmationDialog: ConfirmationDialog(@session)
potom som v presenteri vytvoril construktor a pridal inštanciu do továrne
private $confirmDialog;
public function __construct(\ConfirmationDialog $confirmationDialog) {
$this->confirmDialog = $confirmationDialog;
}
public function createComponentConfirmForm() {
$form = $this->confirmDialog;
$form->addConfirmer(
'delete', // názov signálu bude confirmDelete!
array($this, 'deleteNews'), // callback na funkciu pri kliknutí na YES
'Are you sure with delete this item?' // otázka
);
return $form;
}
No a teraz mi vyhodilo nasledujúcu chybu:
Recoverable Error
Argument 1 passed to ConfirmationDialog::__construct() must be an instance of Nette\Http\SessionSection, instance of Nette\Http\Session given, called in C:\xampp\htdocs\ZURO\temp\cache\_Nette.Configurator\_-73b4ced5a4b424e8b77c53f5a5d3072c.php on line 167 and defined
- Oli
- Člen | 1215
Aha, moje chyba. Jsem si špatně přečetl co to očekává. Tak jinak…
// Config smazat
// Presenter
/**
* Komponenta Confirmation Dialog pre delete News
*/
public function createComponentConfirmForm() {
$form = new \ConfirmationDialog($this->getSession('tvuj-nazev-sekce'));
$form->addConfirmer(
'delete', // názov signálu bude confirmDelete!
array($this, 'deleteNews'), // callback na funkciu pri kliknutí na YES
'Are you sure with delete this item?' // otázka
);
return $form;
}
- NiNu
- Člen | 31
Diky moc Oli už to ide a parádne, ešte to zajaxujem a bude to
dokonalé.
Tak ešte raz kompletný postup:
- Stiahnuť najnovší ConfirmationDialog, ja mám z github.com/srigi , a súbory ConfirmationDialog.php a confirmationDialog.latte uložiť do app/components
- V presenteri vytvoriť továrničku aj s otázkou napr.:
/**
* Komponenta Confirmation Dialog pre delete News
* @return Nette\Application\UI\Form
*/
public function createComponentConfirmForm() {
$form = new \ConfirmationDialog($this->getSession('news'));
$form->addConfirmer(
'delete', // názov signálu bude confirmDelete!
array($this, 'deleteNews'), // callback na funkciu pri kliknutí na YES
array($this, 'questionDelete') // otázka
);
return $form;
}
/**
* Zostavenie otázky pre ConfDialog s parametrom
* @param Nette\Utils\Html $dialog
* @param array $params
* @return string $question
*/
public function questionDelete($dialog, $params) {
$dialog->getQuestionPrototype();
return "Do You Really Delete Item: $params[title] ?";
}
- Následne komponentu použiť v šablóne latte napr.:
{block #content}
<h2>Manage News</h2>
<br />
<div class="table-responsive col-md-9">
{snippet tableNews}
{control confirmForm}
<table class="table table-hover news">
<thead>
<tr>
<th>News Title</th>
<th>Body</th>
<th>Creation Time</th>
<th>Created By</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{foreach $allNews as $news}
<tr>
<td>{$news->title}</td>
<td>{$news->body|truncate:30}</td>
<td>{$news->date|date:'j.n.Y H:i:s'}</td>
<td>{$news->users->username}</td>
<td><a n:href="News:editNews $news->id"><i class="glyphicon glyphicon-pencil"> </i>Edit</a> | <a n:href="confirmForm:confirmDelete! id => $news->id, title => $news->title"><i class="glyphicon glyphicon-trash"> </i>Delete</a></td>
</tr>
{/foreach}
</tbody>
</table>
{/snippet}
<a n:href="News:AddNews" class="btn btn-danger"><i class="glyphicon glyphicon-plus-sign"> </i><b>Add News</b></a>
</div>
- Následne to už stačí len nastylovať a je to hotové. Šablóna pre dialog je predpripravená pre Twitter Bootstrap, tam som upravil jeden riadok a to
<div class="{$class} modal">
na
<div class="{$class} modal-content">
lebo sa mi to nezobrazovalo celkom správne a ešte som doplnil nejaké Bootstrap štýly do konštruktora ConfirmationDialog.php
public function __construct(\Nette\Http\SessionSection $session, $parent = NULL, $name = NULL)
{
parent::__construct($parent, $name);
$this->session = $session;
$this->question = Html::el('p')->el('b')->addAttributes(array('class'=>"{$this->cssClass}--question text-danger"));
$this->form = new Form($this, 'form');
$this->form->getElementPrototype()->class = "{$this->cssClass}--form";
$this->form->getRenderer()->wrappers['controls']['container'] = 'div';
$this->form->addHidden('token');
$this->form->addSubmit('yes', self::$_strings['yes'])
->onClick[] = array($this, 'confirmClicked');
$this->form->addSubmit('no', self::$_strings['no'])
->onClick[] = array($this, 'cancelClicked');
$this->form['yes']->getControlPrototype()->class = 'btn btn-success col-md-2 pull-right margin-left';
$this->form['no']->getControlPrototype()->class = 'btn btn-danger col-md-2 pull-right';
}
- Výsledok vyzerá asi takto: ConfirmationDialog.png