2009-11-04 18 views
-1

J'ai essayé de poser cette fois, mais je pense que ma première question était trop claire pour vous les gars de répondre, donc je vais essayer à nouveauExécution d'un babillard premade par mon Front Controller dans Zend

Je suis faire un site Web en utilisant le Zend Framework, et j'essaie d'inclure le forum préfabriqué Phorum. Jusqu'à présent, je l'ai fait fonctionner en ne l'exécutant pas à travers mon bootstrap en utilisant mon fichier .htaccess. Ce que j'aimerais faire, c'est de pouvoir le faire passer par mon bootstrap afin de pouvoir utiliser mes Layouts et Classes que je ne peux utiliser que par le biais de Zend. Par exemple, j'ai un système de connexion prédéfini qui fonctionne avec Zend_Auth. J'ai les données de la personne enregistrées dans Zend_Session. Je charge le profil de l'utilisateur via un contrôleur. J'ai une couche de service pour le modèle qui se connecte à ma base de données au nom de l'utilisateur. Il y a plusieurs autres dépendances que, pour autant que je sache, j'ai besoin du bootstrap. Phorum est essentiellement un grand ensemble de scripts PHP qui dépendent des paramètres GET. Mon idée originale avait été d'utiliser un contrôleur pour rendre les scripts. Voici un exemple de ce à quoi ressemblerait cet URI: My-Site.com/messageboard/list.php?1,3 avec le messageboard étant le messageboardController. Bien que cela fonctionne pour la liste de chargement, il ne peut pas capturer les paramètres GET dont dépend Phorum. En raison de la nature complexe de Phorum, il serait presque impossible pour moi d'être en mesure d'entrer et de faire quelque chose comme My-Site.com/messageboard/list/1/3 ou quoi que ce soit le long de ces lignes. L'URI doit être la première, car elle est intégrée à Phorum.

J'ai essayé d'utiliser des cadres. Je devais garder mon panneau de connexion en haut, et le corps de la page devait être un cadre, mais il était indisponible, et le bouton arrière rendait tout extravagément difficile. Je ne pouvais pas non plus obtenir le cadre pour parler à la page parente dans Zend, donc les cadres ne sont pas une option.

Est-ce que quelqu'un a un moyen de le faire? Ce dont j'ai besoin, en substance, c'est de prendre le script (ex: list.php? 1,3) et de placer tout ce qu'il rendrait, après avoir utilisé les paramètres 1,3, dans un div dans le div "body" de mon disposition. Pour autant que je sache, le rendu ne semble pas capable de capturer les paramètres GET. Est-ce que quelqu'un sait d'une manière que je peux faire ceci.

Toutes les idées seraient incommensurablement appréciées. Merci de votre aide!

+0

Vous avez déjà obtenu une réponse mais il semble que vous ayez supprimé votre question et en avez ouvert une nouvelle. Vous pouvez éditer vos questions si vous pensez que la version initiale n'est pas assez claire. Je trouve assez impoli que vous ayez supprimé votre question, car ma réponse aurait pu aider quelqu'un d'autre si cela ne vous était d'aucune aide. –

+0

C'est parce que votre réponse était de me lier à votre vieille réponse que, si vous avez lu ma question, n'a rien fait pour y répondre. – Ethan

+0

Je suggérerais de ne pas utiliser l'ancien code comme ceci - cela deviendra un peu un cauchemar à déboguer - mais j'espère vous avoir fourni les choses dont vous avez besoin pour le faire. – gnarf

Répondre

1

Ce n'est pas une chose triviale à traiter, cependant, il est possible d'écrire un itinéraire personnalisé, ainsi que la magie du contrôleur pour gérer ce genre de chose et inclure le fichier php approprié:

d'abord - Votre itinéraire devrait probablement être (dans ZF1.9 conventions application.ini)

resources.router.routes.phorum.type = "Zend_Controller_Router_Route_Regex" 
resources.router.routes.phorum.route = "messageboard(?:/(.*))?" 
resources.router.routes.phorum.defaults.controller = "phorum" 
resources.router.routes.phorum.defaults.action = "wrapper" 
resources.router.routes.phorum.defaults.module = "default" 
resources.router.routes.phorum.defaults.page = "index.php" 
resources.router.routes.phorum.map.1 = "page" 

maintenant, toutes les demandes de messageboard/whatever.php doivent être acheminés à PhorumController :: wrapperAction() et ont 'whatever.php' dans $this->getRequest()->getParam('page')

Alors il devrait devenir une simple question de rediriger votre action "wrapper" pour inclure le bon fichier php de phorum. J'ai ajouté un code à partir d'un contrôleur similaire je (même si la mienne ne comprennent pas les fichiers php - il a été conçu uniquement pour servir un répertoire de contenu)

public function wrapperAction() { 
    $phorumPath = APPLICATION_PATH."../ext/phorum/"; 

    $file = realpath($phorumPath . $this->getRequest()->getParam('page'); 
    if (!$file || !is_file($file)) throw new Exception("File not found"); 

    // disable default viewRenderer - layout should still render at this point 
    $this->_helper->viewRenderer->setNoRender(true);  

    // determine extension to determine mime-type 
    preg_match("#\.([^.]+)$#", $filename, $matches); 
    switch (strtolower($matches[1])) 
    { 
    case "php": 

     // patch the request over to phorum 
     include($file); 
     return; // exit from the rest of the handler, which deals specifically 
     // with other types of files 

    case "js": 
     $this->getResponse()->setHeader('Content-Type', 'text/javascript'); 
     ini_set('html_errors', 0); 
     break; 
    case "css": 
     $this->getResponse()->setHeader('Content-Type', 'text/css'); 
     ini_set('html_errors', 0); 
     break; 
    case "html": 
     $this->getResponse()->setHeader('Content-Type', 'text/html'); 
     break; 
    // you get the idea... add any others like gif/etc that may be needed 
    default: 
     $this->getResponse()->setHeader('Content-Type', 'text/plain'); 
     ini_set('html_errors', 0); 
     break; 
    } 

    // Disable Layout 
    $this->_helper->layout->disableLayout(); 

    // Sending 304 cache headers if the file hasn't changed can be a bandwidth saver 
    $mtime = filemtime($fn); 
    if ($modsince = $this->getRequest()->getServer('HTTP_IF_MODIFIED_SINCE')) 
    { 
    $modsince = new Zend_Date($modsince); 
    $modsince = $modsince->getTimestamp(); 

    if ($mtime <= $modsince) { 
     $this->getResponse()->setHttpResponseCode(304); 
     return; 
    } 
    } 

    $this->getResponse()->setHeader('Last-Modified', gmdate("D, d M Y H:i:s",$mtime). " GMT"); 
    readfile($fn); 
} 

S'il vous plaît - Assurez-vous de tester ce code pour les personnes essayant d'élaborer des demandes avec .., etc dans la page.

+0

D'accord, j'ai finalement réussi à le faire fonctionner. J'ai fait presque exactement ce que tu as dit, gnarf. Mon plus gros problème, et celui que j'ai découvert à mi-chemin, c'est que Phorum utilise un javascript.php et un css.php, qui, au lieu de lire javascript et css, le génère. Ce qui se passait, c'était que ma mise en page était également imprimée autour du javascript et du css, qui mettaient essentiellement non javascript dans un fichier javascript, le rendant illisible. Votre idée principale était géniale, merci. – Ethan

+0

@Ethan - Vous pouvez facilement ajouter un 'if ($ this-> getRequest() -> getParam ('page') == 'javascript.php') $ ceci -> _ helper-> layout-> disableLayout();' ou des choses similaires pour des cas spéciaux – gnarf