Интеграция существующих страниц в приложении Zend Framework - PullRequest
3 голосов
/ 07 августа 2010

Можно ли обойти любой контроллер на веб-сайте Zend Framework? Вместо этого я хочу, чтобы выполнялся обычный PHP-скрипт, и весь его вывод должен быть размещен в макете / представлении, полученном из ZF:

Запрос -> Выполнить скрипт PHP -> Поймать вывод -> Добавить вывод для просмотра -> Отправить ответ

Задача состоит в том, чтобы интегрировать существующие страницы / скрипты в недавно созданный сайт Zend Framework, который работает с шаблоном MVC.

Приветствия

Ответы [ 3 ]

6 голосов
/ 07 августа 2010

Я создал новую запись в моем .htaccess файле:

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

Каждый запрос к обычному файлу .php теперь обрабатывается index.php из ZF.

Далее я создал дополнительный маршрут для направления этих запросов к определенному действию контроллера:

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

И это соответствующее действие:

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

Очень полезно: http://www.chrisabernethy.com/zend-framework-legacy-scripts/

1 голос
/ 07 августа 2010

В вашем контроллере (или модели) вы можете добавить:

$output = shell_exec('php /local/path/to/file.php');

В этот момент вы можете анализировать и очищать $output по мере необходимости, а затем сохранять его в своем представлении.

Вы можете сохранить php-файл, который вы собираетесь выполнить, в своем каталоге * 1007. *.

Если файл PHP хранится на удаленном сервере, вы можете использовать:

$output = file_get_contents('http://www.example.com/path/to/file.php');
0 голосов
/ 07 августа 2010

Сделайте так, чтобы стандартный php включал / требовал, по вашему мнению, встраивать вывод ваших php-скриптов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...