Jak nahradit ->onClick[] = [$this, ‚sayHello‘]; za přímý odkaz?
- pavelinnuendo
- Člen | 33
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‘)?
- pavelinnuendo
- Člen | 33
Protože potřebuji použít GroupAction, tedy označit několik řádků, kliknout na to tlačítko a to má stáhnout soubor.
- pavelinnuendo
- Člen | 33
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.
- pavelinnuendo
- Člen | 33
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
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
Š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
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.
- pavelinnuendo
- Člen | 33
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.