在Zend Framework应用程序中集成现有页面

slh*_*lhm 3 php zend-framework

是否可以绕过Zend Framework网站中的任何控制器?相反,我希望执行一个普通的PHP脚本,并将其所有输出放在来自ZF的布局/视图中:

请求 - >执行PHP脚本 - >捕获输出 - >添加输出到视图 - >发送响应

挑战在于将现有页面/脚本集成到新创建的Zend Framework站点中,该站点使用MVC模式.

干杯

小智 6

我在我的.htaccess文件中创建了一个新条目:

RewriteRule (.*).php(.*)$ index.php [NC,L]

通常的.php文件上的每个请求都由ZF的index.php处理.

接下来,我创建了一个额外的路由来将这些请求路由到某个控制器操作:

$router->addRoute(
  'legacy',
  new Zend_Controller_Router_Route_Regex(
    '(.+)\.php$',
    array(
      'module' => 'default',
      'controller' => 'legacy',
      'action' => 'index'
    )
  )
);
Run Code Online (Sandbox Code Playgroud)

这是适当的行动:

public function indexAction() {
  $this->_helper->viewRenderer->setNoRender();
  $this->_helper->layout->setLayout('full');

  // Execute the script and catch its output
  ob_start();
  require($this->_request->get('DOCUMENT_ROOT') . $this->_request->getPathInfo());
  $output = ob_get_contents();
  ob_end_clean();

  $doc = new DOMDocument();
  // Load HTML document and suppress parser warnings
  @$doc->loadHTML($output);

  // Add keywords and description of the page to the view
  $meta_elements = $doc->getElementsByTagName('meta');
  foreach($meta_elements as $element) {
    $name = $element->getAttribute('name');
    if($name == 'keywords') {
      $this->view->headMeta()->appendName('keywords', $element->getAttribute('content'));
    }
    elseif($name == 'description') {
      $this->view->headMeta()->appendName('description', $element->getAttribute('content'));
    }
  }

  // Set page title
  $title_elements = $doc->getElementsByTagName('title');
  foreach($title_elements as $element) {
    $this->view->headTitle($element->textContent);
  }

  // Extract the content area of the old page
  $element = $doc->getElementById('content');
  // Render XML as string
  $body = $doc->saveXML($element);

  $response = $this->getResponse();
  $response->setBody($body);
}
Run Code Online (Sandbox Code Playgroud)

非常有用:http://www.chrisabernethy.com/zend-framework-legacy-scripts/