Problém s aplikáciou ConfirmationDialog

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

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">&nbsp;</i>Edit</a> | <a n:href="confirmForm:confirmDelete! id => $news->id"><i class="glyphicon glyphicon-trash">&nbsp;</i>Delete</a></td>
			</tr>
		{/foreach}
		</tbody>
	</table>
	{/snippet}
	<a n:href="News:AddNews" class="btn btn-danger"><i class="glyphicon glyphicon-plus-sign">&nbsp;</i><b>Add News</b></a>
</div>

kde som spravil chybu?

James_Scott
Člen | 55
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

Diky moc Oli už to ide a parádne, ešte to zajaxujem a bude to dokonalé.
Tak ešte raz kompletný postup:

  1. Stiahnuť najnovší ConfirmationDialog, ja mám z github.com/srigi , a súbory ConfirmationDialog.php a confirmationDialog.latte uložiť do app/components
  2. 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] ?";
}
  1. 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">&nbsp;</i>Edit</a> | <a n:href="confirmForm:confirmDelete! id => $news->id, title => $news->title"><i class="glyphicon glyphicon-trash">&nbsp;</i>Delete</a></td>
			</tr>
		{/foreach}
		</tbody>
	</table>
	{/snippet}
	<a n:href="News:AddNews" class="btn btn-danger"><i class="glyphicon glyphicon-plus-sign">&nbsp;</i><b>Add News</b></a>
</div>
  1. 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';
	}
  1. Výsledok vyzerá asi takto: ConfirmationDialog.png