Я использую CakePHP 2.4.7 и плагин TinyMCE от CakeDC.
Я создал ядро CakePHP вместе с плагином в общем месте на моем сервере, чтобы несколько приложений могли получить к нему доступ. Это не позволяет мне обновлять несколько копий TinyMCE. Все работало хорошо, пока я не перешел на новый сервер и не обновил программное обеспечение.
Новый сервер использует Apache 2.4 вместо 2.2 и использует mod_ruid2 вместо suexec.
Я получаю эту ошибку при попытке загрузить редактор:
Fatal Error (4): синтаксическая ошибка, неожиданная T_CONSTANT_ENCAPSED_STRING в [/xyz/Plugin/TinyMCE/webroot/js/tiny_mce/tiny_mce.js, строка 1]
Как начать отладку?
Я попытался добавить символическую ссылку с веб-сайта приложения на веб-сайт плагина TinyMCE. Это работает в том, что он загружает js-файл и редактор, но затем плагины TinyMCE работают с неправильным текущим каталогом, и управление файлами не будет разделено.
Проблема состоит в AssetDispatcher
фильтр AssetDispatcher
включает css
и js
с использованием инструкции PHPs include()
, в результате чего файлы отправляются через парсер PHP, где он наткнется на появление <?
в сценарии TinyMCE.
См. https://github.com/…/2.4.7/lib/Cake/Routing/Filter/AssetDispatcher.php#L159-L160
Очень раздражает, и, так как это недокументированное и необязательное, опасное поведение, если вы спросите меня.
Если вы хотите продолжить использование диспетчера ресурсов плагина, расширьте встроенный в него и переопределите метод AssetDispatcher::_deliverAsset()
с удаленной функциональностью include. Конечно, это немного раздражает, поддерживает мудрый, но это довольно быстрое решение.
Что-то вроде:
// app/Routing/Filter/MyAssetDispatcher.php App::uses('AssetDispatcher', 'Routing/Filter'); class MyAssetDispatcher extends AssetDispatcher { protected function _deliverAsset(CakeResponse $response, $assetFile, $ext) { // see the source of your CakePHP core for the // actual code that you'd need to reimpelment ob_start(); $compressionEnabled = Configure::read('Asset.compress') && $response->compress(); if ($response->type($ext) == $ext) { $contentType = 'application/octet-stream'; $agent = env('HTTP_USER_AGENT'); if (preg_match('%Opera(/| )([0-9].[0-9]{1,2})%', $agent) || preg_match('/MSIE ([0-9].[0-9]{1,2})/', $agent)) { $contentType = 'application/octetstream'; } $response->type($contentType); } if (!$compressionEnabled) { $response->header('Content-Length', filesize($assetFile)); } $response->cache(filemtime($assetFile)); $response->send(); ob_clean(); // instead of the possible `include()` in the original // methods source, use `readfile()` only readfile($assetFile); if ($compressionEnabled) { ob_end_flush(); } } }
// app/Config/bootstrap.php Configure::write('Dispatcher.filters', array( 'MyAssetDispatcher', // instead of AssetDispatcher // ... ));
См. Также http://book.cakephp.org/2.0/en/development/dispatch-filters.html
Я просто угадываю здесь, но причина, по которой он работал на вашем другом сервере, вероятно, заключается в том, что короткие открытые теги (т.е. <?
), Где отключены. Однако, даже если это проблема на вашем новом сервере, это не то, на что вы должны положиться, активы все еще обслуживаются с помощью include()
, и вы, скорее всего, не хотите проверять все свои сторонние CSS / JS для возможных инъекций PHP-кода при каждом обновлении.