ajax form přes komponentu
- esorimmer
- Člen | 23
Zdravím.
Snažím se rozchodit odeslání formu přes ajax v komponentě
(app/components/form.php).
Kod:
public function render() {
$template = $this->template;
$template->setFile(__DIR__ . '/sablona.latte');
$template->render();
}
public function createComponentUserForm() {
$form = new \Nette\Application\UI\Form();
$form->getElementPrototype()->class[] = "ajax";
$form->setMethod('post');
$form->addText( 'xname', 'Uživatel' )
->setRequired('Zvolte jméno nebo přijmení');
$form->addSubmit( 'xin', 'Vyhledat');
$form->onSuccess[] = callback($this, 'addUserForm_Submit');
return $form;
}
public function addUserForm_Submit(\Nette\Application\UI\Form $form) {
if (!$this->getPresenter()->isAjax()){
$this->presenter->redirect('this');
//dump($this->getPresenter()->isAjax()); - vyhodi false
}
else {
$this->invalidateControl('search');
}
Nevidí v tom někdo něco?
Děkuji předem.
- 22
- Člen | 1478
v jQuery problem určitě není, sam jsem dens jeden ajax rozcházel na formulářích..zkontroluj si, co se děje ve Firebugu.. XHR reguest, nainstaluj s Logger 1.1
Nikde není vidět, jak připojuješ komponentu v presentru, ani jak to vypadá v šabloně..
Neprve si zkus ajax na formuláři, který nemáš v komponentě, jestli vůbec postupuješ správně, stačí se držet návodu v doplňku pro jQuery ajax formuláře.. nezapomeň, že k tomu potřebuješ i jQuery Nette ajax pro update snippetů.
Editoval 22 (11. 1. 2012 1:39)
- esorimmer
- Člen | 23
Díky za radu. Do toho Firebugu už jsem koukal, ale pak jsem na něj
pozapoměl a bral jsem to jako že form nereaguje. Ted jsem tam viděl že to
data posílá (status 200 ok), ale nebyl update snippetu. Stačilo změnit
$this->invalidateControl(‚search‘); na
$this->presenter->invalidateControl(‚search‘); a je to ok.
Takže díky a já mám o zkušenost navíc :-)
- Tomáš Votruba
- Moderator | 1114
Mám stejný problém v komponentě. Zajímavé je, že ajax se odešle,
$this->isControlInvalid()
hlásí true, nicméně jeho obsah se
nezmění.
public function handleRemoveFromTP($id)
{
$this->model->removeDrillFromTp($id);
if ($this->presenter->isAjax()) {
$this->invalidateControl("changeStateTP");
}
else {
$this->redirect("this");
}
}
A v šabloně komponenty:
{snippet changeStateTP}
{if $isDrillInPracticePlan}
<a n:href="removeFromTP!, $id" class="tpAdded ajax">Odebrat</a>
{else}
<a n:href="addToTP!, $id" class="noTpAdded ajax">Přidat</a>
{/if}
{/snippet}
Snad nedělám nic blbě. Nápady?
- Vojtěch Dobeš
- Gold Partner | 1316
Změna obsahu snippetu bude odvislá jen a jen na proměnné
$isDrillInPracticePlan
. Kde ji nastavuješ? Ten handler s ní
totiž nijak nehýbá.
- duskohu
- Člen | 778
Caute, viete mi poradit, mam nieco podobne:
mam kompomentu – sablona:
{snippet}
stav:{$taskTable->status->name}
{if $taskTable->status->id==1 || $taskTable->status->id==3}
<a n:href="startTask! $taskTable->id" class="ajax">zacat</a>
{/if}
{if $taskTable->status->id==2}
<a n:href="endTask! $taskTable->id" class="ajax">skoncit</a>
{/if}
{/snippet}
$taskTable >> posielam sablone cez komponentu z presenteru cez
constructor, samozrejme mam:
parent::__construct();
v komponente mam:
// START TASK
public function handleStartTask($taskId)
{
$this->taskTable->update(array('start_date' => new DateTime(),'status_id' => 2));
$this->presenter->flashMessage('start', 'success');
if ($this->presenter->isAjax()) {
$this->presenter->invalidateControl();
} else {
$this->presenter->redirect('this');
}
}
//END TASK
public function handleEndTask($taskId)
{
$this->taskTable->update(array('end_date' => new DateTime(),'status_id' => 3));
$this->presenter->flashMessage('end', 'success');
if ($this->presenter->isAjax()) {
$this->presenter->invalidateControl();
} else {
$this->presenter->redirect('this');
}
}
presenter:
public function createComponentTaskAddForm()
{
return new TaskAddForm(
$this->context->createUsers(),
$this->context->createTasks(),
$this->context->createObserver(),
$this->context->createExecutor(),
$this->context->createNode(),
$this->context->createAttachment(),
$this->context->createProject(),
$this->context->createCustomer(),
$this->context->createPriority()
);
}
ked poslem signal tak sa aj vykona dokonca aj flash sa zobrazi, ale nebnovi
sa snippet
proste musim da refresh aby sa zobrazili aktualne udaje
neviete mi poradit co mam zle?
Editoval duskohu (18. 7. 2012 14:18)
- Vojtěch Dobeš
- Gold Partner | 1316
Pokud patří šablona komponentě, a ne aktuálnímu view, tak
v komponentě je třeba volat $this->invalidateControl();
,
nikoliv $this->presenter->invalidateControl();
. Delší
(špatná) varianta totiž refreshne nepojmenovaný snippet z šablony view,
nikoliv z šablony komponenty.
- duskohu
- Člen | 778
ano sablona patri komponente,
public function render()
{
$this->template->setFile(__DIR__ . '/taskEditForm.latte');
$this->template->taskTable = $this->taskTable;
$this->template->render();
}
a prepisal som aj $this->invalidateControl();
ale stale mi to nejde… :-(
nejake napady????