-1

我想问一次,但我认为我之前的问题太不清楚,你们无法回答,所以我再试一次

我正在使用 Zend 框架创建一个网站,并尝试包含预制的留言板 Phorum。到目前为止,我已经通过不使用我的 .htaccess 文件通过引导程序运行它来使其工作。我想做的是能够通过我的引导程序运行它,以便我可以使用我以前创建的只能通过 Zend 运行的布局和类。

例如,我有一个通过 Zend_Auth 工作的预制登录系统。我将这个人的数据保存在 Zend_Session 中。我通过控制器加载用户的个人资料。我有一个代表用户连接到我的数据库的模型的服务层。据我所知,还有其他几个依赖项,我需要引导程序。

Phorum 基本上只是一组依赖于 GET 参数的 PHP 脚本。我最初的想法是使用控制器来渲染脚本。该 URI 的示例如下:My-Site.com/messageboard/list.php?1,3,其中留言板是 messageboardController。虽然这适用于加载列表,但它无法捕获 Phorum 所依赖的 GET 参数。由于 Phorum 的复杂性,我几乎不可能进入并使其成为像My-Site.com/messageboard/list/1/3或类似的任何东西。URI 必须是前者,因为它内置于 Phorum。

我尝试过使用框架。我必须将我的登录面板保持在顶部,并让页面的主体成为一个框架,但它无法添加书签,并且后退按钮让一切变得异常困难。我也无法让框架很好地与 Zend 中的父页面对话,因此框架不是一个选项。

有没有人有办法让我做到这一点?本质上,我需要的是获取脚本(例如list.php?1,3)并将在使用1,3参数后它将呈现的任何内容放入我的“body” div中的div中布局。据我所知,render 似乎无法捕获 GET 参数。有谁知道我可以做到这一点的方法。

任何想法都将不胜感激。感谢您的帮助!

4

1 回答 1

1

这不是一件容易处理的事情,但是,可以编写自定义路由,以及一些控制器魔术来处理此类事情并包含正确的 php 文件:

首先 - 您的路线应该是(在 ZF1.9 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"

现在所有的请求都messageboard/whatever.php应该被路由到 PhorumController::wrapperAction() 并且有 'whatever.php' 在$this->getRequest()->getParam('page')

然后它应该成为一个简单的问题,将您的“包装器”操作重定向到包含来自 phorum 的正确 php 文件。我从我拥有的类似控制器中添加了一些代码(尽管我的不包括 php 文件 - 它仅用于提供内容目录)

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);
}

请 -确保为试图..在页面中使用 等创建请求的人测试此代码。

于 2009-11-07T22:22:17.897 回答