3 votes

Est-il possible de renvoyer une fonction javascript via ajax à partir de php ?

Est-il possible de retourner une fonction javascript via Ajax à partir de php ? Normalement, je renvoie simplement une valeur puis je décide de ce qu'il faut en faire en javascript, mais maintenant que je gère une application mobile Apache Cordova, je veux faire les choses différemment.

account = localStorage.getItem("account");
account = JSON.parse(account);

$.ajax({
 type: "POST",
 url: example.php,
 data: { account = account.rule }
});

.php

$isAdmin = $conn->prepare("SELECT role FROM users WHERE username = :username");
$isAdmin->bindParam(":username", $username);
$isAdmin->execute();
$result = $isAdmin->fetch(PDO::FETCH_ASSOC);
if($result){
 $result = "<script>
 $("header nav").append(
  $("<a />").attr("href", "admin.html").text("Admin panel")
 )
</script>";
}
return $result;

Et ensuite le faire fonctionner. Je ferai une autre vérification quand l'utilisateur sera redirigé vers le site.

3voto

Anthony Chiboucas Points 21

Envisagez plutôt une réponse structurée

Bien que ce que vous demandez soit possible, il existe de bien meilleures façons de procéder. Envisagez plutôt de renvoyer un tableau contenant les données nécessaires pour créer les liens à l'aide d'un script côté client. Construisez l'Ajax pour appeler et ajouter ces liens en conséquence. Vous pourriez étendre ce concept pour inclure plus d'objets configurables, ou construire le html à ajouter et le renvoyer, plutôt que d'essayer d'exécuter le javascript. eval .

function updateNav(links) {
    links.forEach(function(link){
        $li = $('<li></li>');
        $a = $('<a></a>');
        $a.prop('href',link['uri']);
        $a.html(link['text']);
        $li.append($a);

        $('#nav').append($li);
    });
}

var dummyData = {
    navLinks: [
        {
            uri: 'http://stackoverflow.com',
            text: 'StackOverflow'
        },
        {
            uri: 'http://google.com',
            text: 'Google'
        }
    ]
};

var dummyHtml = {
    navHtml: '<ol><li><a href="http://meta.stackoverflow.com">Meta StackOverflow</a></li></ol>'
};

function ajaxSimData() {
    var someAjaxObject = {};
        someAjaxObject.success = function(data) {
        updateNav(data['navLinks']);
    };

    someAjaxObject.success(dummyData);
}

function ajaxSimHtml() {
    var someAjaxObject = {};
    someAjaxObject.success = function(data) {
        $('#nav').after(data['navHtml']);
    };

    someAjaxObject.success(dummyHtml);
}

$('.ajaxTriggerData').click(ajaxSimData);
$('.ajaxTriggerHtml').click(ajaxSimHtml);

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.js"></script>

<div id="message">
    Simple Examples:<br>
    <button class="ajaxTriggerData">Populate Nav from Data</button><br>
    <button class="ajaxTriggerHtml">Load HTML string after Nav</button><br>
</div>
<div id="body">
    <h3>Some navigation elements: </h3>
    <ul id="nav">
        <li><a href="#">Nav1</a></li>
        <li><a href="#">Nav2</a></li>
        <li><a href="#">Nav3</a></li>
    </ul>
</div>

Côté PHP pour générer la réponse

$isAdmin = $conn->prepare("SELECT role FROM users WHERE username = :username");
$isAdmin->bindParam(":username", $username);
$isAdmin->execute();

$navLinks = [];
if($isAdmin->fetch(PDO::FETCH_ASSOC)) {
    $navLinks = [
        ['uri' => 'admin.html', 'text' => 'Admin panel'],
    ];
}

return json_encode([
    'navLinks' => $navLinks
]);

2voto

benny Points 453

Oui, vous pouvez - les textes de réponse ne sont que des chaînes de caractères - mais cela peut ne pas être considéré comme une bonne pratique, surtout si vous en faites une habitude. En regardant votre code, il semble que ce que vous voulez faire est d'ajouter un lien au nav qui va vers le panneau d'administration de votre application si l'utilisateur est un administrateur. Il serait peut-être préférable de prendre le code suivant côté client et de l'intégrer dans une fonction côté client :

function appendAdminLink() {
  $("header nav").append(
    $("<a />").attr("href", "admin.html").text("Admin panel")
  )
}

...et au lieu de retourner cette fonction, en PHP, il suffit de retourner quelque chose comme :

{ isAdmin: true }

Ensuite, côté client, vous pouvez valider si l'utilisateur est un administrateur, et s'il l'est, vous pouvez appeler appendAdminLink .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X