Я пытаюсь сделать в ZF2 простое действие контроллера, которое возвращает файл javascript. Просто, что я хочу сделать, это то, что с PHP вы можете сделать следующим образом:Zend Framework 2 действие контроллера возвращает файл javascript: ошибка 500
<?php header('Content-Type: text/javascript'); ?>
var foo = '<?php echo $bar; ?>';
Теперь, в ZF2 Я функция действием ActionController так:
public function environmentAction()
{
$headers = new Headers();
$headers->addHeaderLine('Content-Type', 'text/javascript');
$this->getResponse()->setHeaders($headers);
$this->layout()->setTemplate('js/environment');
$view = new ViewModel();
return $view;
}
Затем маршрут настроен следующим образом:
'environment' => array(
'type' => 'Literal',
'options' => array(
'route' => '/js/environment.js',
'defaults' => array(
'controller' => 'Application\Controller\Index',
'action' => 'environment',
),
),
)
в конце концов, вид является .phtml файл (тот, который определен в разделе template_map
подключ), как в простом PHP случае:
var foo = '<?php echo $bar; ?>'
Таким образом, все должно быть сделано. Я просто добавить <script>
элемент в головной части моего layout.phtml:
<script type="text/javascript" src="/js/environment.js"></script>
Проблема заключается в том, что в моем браузере консоли я получаю следующее сообщение об ошибке при загрузке страницы:
GET ***/js/environment.js 500 (Internal Server Error)
но если Я пытаюсь открыть ту же ссылку на новой странице, мне удалось получить скрипт.
В чем разница? В сетевом разделе инструментов разработчика моего браузера я вижу, что запрос HTTP-запроса для этого скрипта и его заголовков одинаковый из всех других запросов, так почему же он действует по-другому? Почему я получаю эту ошибку? И в моем журнале php ничего об этом событии нет. Есть идеи?
решаемые модификации функции действия вроде:
public function environmentAction()
{
$headers = new Headers();
$headers->addHeaderLine('Content-Type', 'text/javascript');
$this->getResponse()->setHeaders($headers);
$view = new ViewModel();
$view->setTemplate('js/environment');
$view->setTerminal(true);
return $view;
}
Вы не должны устанавливать другой макет, а вместо этого вызывать '$ viewModel-> setTerminal (true);' на модели представления, которую вы создаете. Этот _disables_ макет полностью (это то, что вам, вероятно, понадобится в этом случае. – Ocramius
Что именно вы пытаетесь достичь? Если вы можете привести пример того, что вам нужно сделать, возможно, мы можем предложить вам лучший совет. – Andrew
SOLVED! @Ocramius, мне пришлось установить шаблон только потому, что файл представления не находится в пути по умолчанию 'application/index/environment.phtml', но в другом. В любом случае я удалил строку '$ this-> layout() -> setTemplate ('js/environment');' и добавил '$ view-> setTemplate ('js/environment'); $ view-> setTerminal (true); 'перед возвратом представления и он работает! Это так или иначе странно, потому что я думаю, что он должен работать и с плагином контроллера плагина, который должен установить корневой шаблон (если я не ошибаюсь). – Alessio