Zend framework 通过Zend中的前端控制器运行预制公告板

Zend framework 通过Zend中的前端控制器运行预制公告板,zend-framework,controller,render,bootstrapping,messageboard,Zend Framework,Controller,Render,Bootstrapping,Messageboard,我试着问过一次,但我认为我之前的问题太不清楚了,你们无法回答,所以我会再试一次 我正在使用Zend框架创建一个网站,并试图包含预制的留言板Phorum。到目前为止,我没有使用我的.htaccess文件在引导程序中运行它,从而使它正常工作。我想做的是通过我的引导程序运行它,这样我就可以使用我以前创建的布局和类,我只能通过Zend运行它们 例如,我有一个通过Zend_Auth工作的预制登录系统。我将此人的数据保存在Zend_会话中。我通过控制器加载用户的配置文件。我有一个模型的服务层,它代表用户连接

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

我正在使用Zend框架创建一个网站,并试图包含预制的留言板Phorum。到目前为止,我没有使用我的.htaccess文件在引导程序中运行它,从而使它正常工作。我想做的是通过我的引导程序运行它,这样我就可以使用我以前创建的布局和类,我只能通过Zend运行它们

例如,我有一个通过Zend_Auth工作的预制登录系统。我将此人的数据保存在Zend_会话中。我通过控制器加载用户的配置文件。我有一个模型的服务层,它代表用户连接到我的数据库。据我所知,还有其他几个依赖项需要引导

Phorum基本上只是一大组依赖GET参数的PHP脚本。我最初的想法是使用一个控制器来渲染脚本。该URI的一个示例是:My Site.com/messageboard/list.php?1,3,其中messageboard是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参数。有人知道我能做这件事的方法吗


任何想法都将受到极大的赞赏。谢谢你的帮助

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

首先-您的路线可能是(在ZF1.9 application.ini约定中)

现在对
messageboard/whatever.php
的所有请求都应该路由到PhorumController::wrapperAction(),并在
$this->getRequest()->getParam('page')中包含“whatever.php”

然后,它应该变成一个简单的问题,重定向您的“包装器”操作,以包括来自phorum的正确php文件。我已经从一个类似的控制器中添加了一些代码(虽然我的控制器中没有包含php文件——它只用于服务内容目录)

公共函数包装器动作(){
$phorumPath=应用程序路径“../ext/phorum/”;
$file=realpath($phorumPath.$this->getRequest()->getParam('page');
如果(!$file | |!is_file($file))抛出新异常(“未找到文件”);
//禁用默认viewRenderer-此时布局仍应渲染
$this->_helper->viewRenderer->setNoRender(true);
//确定扩展以确定mime类型
preg#u match(“#\”([^.]+)$#“,$filename,$matches);
交换机(strtolower($matches[1]))
{
案例“php”:
//将请求修补到phorum
包括($文件);
return;//从处理程序的其余部分退出,该处理程序专门处理
//使用其他类型的文件
案例“js”:
$this->getResponse()->setHeader('Content-Type','text/javascript');
ini_集('html_错误',0);
打破
案例“css”:
$this->getResponse()->setHeader('Content-Type','text/css');
ini_集('html_错误',0);
打破
案例“html”:
$this->getResponse()->setHeader('Content-Type','text/html');
打破
//你明白了…添加任何可能需要的其他内容,如gif/等
违约:
$this->getResponse()->setHeader('Content-Type','text/plain');
ini_集('html_错误',0);
打破
}
//禁用布局
$this->_helper->layout->disableLayout();
//如果文件没有更改,发送304个缓存头可以节省带宽
$mtime=filemtime($fn);
if($modsince=$this->getRequest()->getServer('HTTP\u if\u MODIFIED\u-SINCE'))
{
$modsince=新Zend_日期($modsince);
$modsince=$modsince->getTimestamp();
if($mtime getResponse()->setHttpResponseCode(304);
返回;
}
}
$this->getResponse()->setHeader('Last-Modified',gmdate(“D,dmy H:i:s)”,$mtime)。“GMT”);
readfile($fn);
}

请-确保测试此代码,以供尝试在页面中使用
等编写请求的人使用。

您已经得到了一个答案,但似乎您删除了您的问题并打开了一个新的问题。如果您认为初始版本不够清晰,可以编辑您的问题。我发现您删除了y是非常粗鲁的我们的问题,因为我的回答如果对你没有帮助,至少可以帮助其他人。这是因为你的回答是将我链接到你的旧答案,如果你阅读我的问题,没有做任何事情来回答它。我建议不要像这样包装旧代码-这将成为调试的一个噩梦-但希望提供告诉你需要做的事情。好吧,我终于让它工作了。我几乎完全按照你说的做了,gnarf。我最大的问题,也是我中途发现的一个问题,是Phorum使用了一个javascript.php和一个css.php,而不是读取javascript和css,生成它。发生了什么
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"
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);
}