Совместное использование плагина TinyMCE для нескольких приложений

Я использую 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-кода при каждом обновлении.