Jak nahradit ->onClick[] = [$this, ‚sayHello‘]; za přímý odkaz?

pavelinnuendo
Člen | 33
+
0
-

Ahoj,
přiznávám se, že nechápu něco zásadního a neumím to dohledat.

V Ublaboo datagrid bych potřeboval mít na onclick na tlačítku přímý odkaz bez ajaxu, tedy aby to po kliknutí na tlačítko zavolalo url jako v běžném odkazu (a na presenteru tedy třeba metodu actionSayHello).

Nyní to ajaxem rovnou volá metody sayHello, viz příklad z dokumentace:

$grid->addGroupButtonAction('Say hello')->onClick[] = [$this, 'sayHello'];

public function sayHello(array $ids): void
{
    dump($ids);
}

tedy namísto [$this, ‚sayHello‘] potřebuji něco jako link(‚this:sayHello‘)?

Šaman
Člen | 2667
+
+1
-

Proč nepoužiješ rovnou column link? https://contributte.org/…columns.html#…

pavelinnuendo
Člen | 33
+
0
-

Protože potřebuji použít GroupAction, tedy označit několik řádků, kliknout na to tlačítko a to má stáhnout soubor.

CZechBoY
Člen | 3608
+
0
-

To potom nedava smysl mit odkaz, ne? Bys o celej formular prisel.

pavelinnuendo
Člen | 33
+
0
-

Potřebuji, aby to tlačítko byl odkaz, který vyvolá stažení souboru, takže o nic nepříjdu, ale klidně ať to i reloadne stránku, s tím bych neměl problém.

Problém mám s tím, že po tom ajaxovém požadavku nemohu v té metodě použít:

$response = new FileResponse(... 'application/zip');
$this->sendResponse($response);

což je přesně to, co potřebuji, aby kliknutí na to tlačítko udělalo.

MajklNajt
Člen | 502
+
0
-

ty nechceš odkaz, ale chceš odoslať formulár bez použitia ajaxu, čiže hľadaj riešenie týmto smerom

pavelinnuendo
Člen | 33
+
0
-

Přesně, nechci na tomto tlačítku ajax, ale jak to mám udělat?

V kódu mám toto:

$grid->addGroupButtonAction('Say hello')->onClick[] = [$this, 'sayHello'];

Což vygeneruje to tlačítko takto:

<input type="submit" name="group_action[1]" class="btn btn-sm btn-success" disabled="" value="Say hello" data-lfv-initialized="true" data-lfv-message-id="frm-invoiceIncomingGrid-filter-group_action[1]_message">

Jak to udělám, aby to bylo bez ajaxu?

Šaman
Člen | 2667
+
0
-

Moc nechápu. V čem ti vadí ten AJAX? Takhle jsem to řešil v jiném projektu bez Datagridu. Ale odeslání bylo ajaxové, zkusím to naroubovat na tvoji kostru z prvního příspěvku:

public function sayHello(array $ids): void
{
	// nějak jsem si vytvořil pdf dokument
	$this->redirect('downloadDocument', $file);
}

public function handleDownloadDocument($file)
{
	$fileName = basename($file);
	$fileResponse = new FileResponse($file, $fileName);
	$this->presenter->sendResponse($fileResponse);
}

Editoval Šaman (28. 12. 2020 16:44)

pavelinnuendo
Člen | 33
+
0
-

Šaman napsal(a):

Moc nechápu. V čem ti vadí ten AJAX?

Aha, takhle jsem to měl vyřešené (a myslel jsem, že se za to mám stydět). :)

Nicméně po nahrazení nette.ajax.js za Naja.js přestalo toto stahování fungovat. Už nevím přesně chybu, ale Naja se nelíbilo, že je to binárka, takže aktuálně si to stažení vyvolám takto přes payload javascriptem, ale taky se mi to nelíbí…

downloadFile(event) {
    let payload = event.detail.payload;
    if (typeof(payload) == 'undefined' || payload === null || !payload.hasOwnProperty('downloadFile')) {
        return;
    }
    top.location.href = payload.downloadFile;
}
jiri.pudil
Nette Blogger | 1032
+
+2
-

Ahoj, pokud ze serveru vracíš redirect na lokální URL, Naja jej ve výchozím nastavení odesílá taky ajaxem, s čímž se pak browser nepopasuje správně. Lze to ovlivnit přes options nebo v události redirect, viz dokumentace.

Šaman
Člen | 2667
+
0
-

Aha, tohle je kód z jednoho staršího projektu, kde je nette.ajax.js. S Najou zatím nepomohu, i když už ji používám, tak jen na základy.

pavelinnuendo
Člen | 33
+
0
-

OK, díky všem za pomoc, vyřešil jsem to tím scriptem v Naja.js.

Ale rád bych se vrátil k původnímu dotazu a to, zda na té metodě mohu zavolat i něco jiného než tento onClick[], ideálně čím bych ovlivnil, že se nepoužije ajax a zavolá to rovnou tu handle metodu.