Spuštění PHP funkce při kliknutí na tlačítko rubrika: Programování: JavaScript

4 stirl021
položil/-a 30.10.2014

V PHP mám ve třídě Download definovanou metodu downloadFile(), která pomocí funkce file_get_contents() stáhne z webu obsah stránky a uloží ho na disk jako soubor.

class Download {
 
    static private function downloadFile() {
 
        $content = file_get_contents('http://www.adresa.cz/page.html');
        $file = file_put_contents('file.txt', $content);
    }
}

V HTML stránce mám tlačítko a chci, aby po se po kliknutí na tlačítko spustila funkce downloadFile(), tzn. aby se zaktualizoval soubor file.txt.

<button id="downloadFile">Aktualizovat</button>

Jak jsem zjistil, není možné spustit funkci v PHP JavaScriptem, to je celkem jasné. Musím použít AJAX. Tím se taky funkce PHP nespustí, ale je možné vytvořit požadavek a získat výsledek funkce downloadFile. Moje otázka je, jestli lze přímo soubor stáhnout funkcí downloadFile() bez reloadu stránky a jak toho dosáhnout?

Pročetl jsem spoustu rad na internetu, ale nemůžu to pochopit.
Díky

odkaz Vyřešeno
3 dyamon
odpověděl/-a 31.10.2014

Jestli to chápu správně tak prostě potřebuješ aby se ti spustila metoda downloadFile() při kliknutí na tlačítko #downloadFile v nějaké html šabloně.
Podle mého názoru špatně chápeš způsob jakým funguje ajaxový request, ten totiž naprosto jednoduše spustí script, ke kterému přistoupíš přes nějakou url adresu, úplně stejně jako kdyby si na ní přistoupil manuálně (nebo třeba odkazem přes <a href="">).
To znamená že nemůžeš implicitně volat přímo tuto funkci to musí udělat script na který přistoupíš pomocí ajaxu.

Když budu předpokládat že je metoda downloadFile() funkční a provádí to co potřebuješ pak akorát v php souboru, který chceš ajaxem spouštět vytvoříš instanci třídy Download a zavoláš tuto metodu. Na to jí budeš muset mít veřejnou a asi bylo dobré aby měla návratovou hodnotu pro případ, že budeš chtít klientovi poskytnout nějakou zpětnou vazbu o provedené akci :).

<?php 
 
class Download {
 
    public function downloadFile() {
 
        $content = file_get_contents('http://www.adresa.cz/page.html');
 
        if(!$content)
           return false;
 
        if(file_put_contents('file.txt', $content))
           return true;
        else
           return false;
 
    }
}
 
$obj = new Download();
if($obj->downloadFile())
   echo "true";
else
   echo "false";
?>

Potom například pomocí jquey provedeš ajax request na url, kde se náchází tento php soubor, například http://localhost/download.php

 <button id="downloadFile">Aktualizovat</button>
$(function(){
 
  $("#downloadFile").click(function(){
     $.ajax({
        type: "POST",
        dataType: "html",
        url: "download.php",
        success: function(result){
            if(result == "true")
                alert("Download complete.");
        }
      })
  })
 
})

Komentáře

  • stirl021 : Takže musím vytvořit soubor(např. downloadFileHandler.php), který vytvoří instanci třídy Download a v něm zavolám i funkci downloadFile(). Pak vytvořím funkcí jQuery.ajax AJAX request, kde bude jedním parametrem URL vytvořeného souboru. Po kliku na tlačítko request odešlu a na serveru se provede obsah souboru downloadFileHandler.php. Chápu to správně? 31.10.2014
  • dyamon : Přesně tak, $.ajax může vracet různý dataType, na který můžeš po odeslání requestu reagovat. Každopádně bych doporučil si ještě před tím než dopíšeš tu část s ajaxem, ověřit zda je downloadFileHandler.php plně funkční, když na něj přistoupíš přímo přes url. 31.10.2014
  • stirl021 : Myslím, že už to chápu. Díky za pomoc. 31.10.2014

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.