2009-09-22 11 views
0

J'utilise une configuration MVC et j'essaie d'injecter javascript dans mes vues (.php), tout en permettant l'accès javascript à toutes les variables auxquelles la vue a accès à. Mon but final est de pouvoir accéder aux variables PHP à partir de mon javascript (par exemple pour que je puisse alert() le nom d'un produit).Problème d'utilisation require à l'intérieur d'une fonction et d'une portée variable

Voici mon flux d'application:

  1. tampon de sortie de démarrage
  2. extrait d'appel() sur un tableau associé (celui-ci contient les données pour moi)
  3. appel besoin sur le fichier de vue
  4. renvoie le contenu du tampon de sortie et efface le tampon
  5. echo buffer

J'ai une fonction injectJS(), qui est comme suit:

function injectJS($jsFile) { 
require APP_DIR . $jsFile; 
} 

Voici un échantillon des Javascript (alert.js) Je veux injecter:

<script type="text/javascript"> 
    alert("product name: <?php echo $product['name']; ?>"); 
</script> 

Donc, dans mon fichier de vue, J'appelle le injectJS('alert.js');. Il injecte le javascript, mais je reçois un avis PHP d'avoir une variable indéfinie $product quand je rends la vue. Cependant, si j'écris la déclaration require à la main, tout fonctionne correctement. Est ce que j'essaie d'atteindre en utilisant injectJS() possible?

Modifier
J'ai oublié de mentionner que j'ai essayé passer les variables explicitement à injectJS(), et il fonctionne, mais je ne veux pas avoir à passer toujours les variables. Il peut devenir ennuyeux si la vue doit transmettre plusieurs variables au JS. Y at-il un moyen que je pourrais (dans la fonction) saisir les variables dans la portée du script chargé d'appeler le injectJS()?

Edit 2
À la réflexion, en passant à nouveau les variables est pas un vrai problème, je pense que je suis juste être avide/paresseux;). Je vais simplement passer les variables en cas de besoin à injectJS(). Merci pour les réponses

+0

ne pourriez-vous pas passer un grand tableau contenant tout, y compris $ produits? Ou est-ce encore désordonné à ton avis? –

Répondre

2

col de produits $ à votre fonction et sera visible à l'intérieur du corps de la fonction ou le définir à l'intérieur:

function globalJs($filename, $product) { 
    include $filename; 
} 

globalJs('foo.js', array('name' => 'test')); 
2

En PHP, les variables ne sont pas visibles fonctions à l'intérieur, qu'elle ne soit adoptée en tant que paramètres ou déclaré comme global.Le problème que vous semblez avoir est que la variable $ product n'existe pas dans la fonction injectJS; si elle est une variable globale qui est créée en dehors de cette fonction, vous devez soit passer comme paramètre, ou déclarer comme global au début de la fonction:

function injectJS($jsFile) { 
    global $product; 
    require APP_DIR . $jsFile; 
} 

Pour plus d'informations, vous pouvez jeter un oeil à la section Variable scope dans le manuel, et, plus précisément, la sous-section sur The global keyword

1

Cela fonctionnera très bien, mais votre problème de portée est due à la variable qui n'existe pas dans votre fonction. Essayez ceci:

function injectJS($jsFile) { 
    $product = array('name' => 'test'); 
    require APP_DIR . $jsFile; 
} 

À un certain point, vous devez définir la variable dans la portée de votre fonction. Le mot-clé PHP global vous permettra de le faire si la variable existe globalement. Essayez d'éviter d'utiliser des globals, car cela entraîne des problèmes sur la route.