在多个应用程序之间共享TinyMCE插件

时间:2014-06-17 14:22:03

标签: javascript cakephp tinymce assets

我正在使用CakePHP 2.4.7和CakeDC的TinyMCE插件。

我将CakePHP核心以及插件设置在我服务器上的共享位置,以便多个应用程序可以访问它。这使我不必更新TinyMCE的多个副本。在迁移到新服务器和更新软件之前,一切运行良好。

新服务器运行Apache 2.4而不是2.2并使用mod_ruid2而不是suexec。

我在尝试加载编辑器时遇到此错误:

致命错误(4):语法错误,[/xyz/Plugin/TinyMCE/webroot/js/tiny_mce/tiny_mce.js,第1行]中的意外T_CONSTANT_ENCAPSED_STRING

我该如何开始调试?

解决方法尝试

我尝试将应用程序的webroot中的符号链接添加到TinyMCE的插件webroot。这是因为它加载了js文件和编辑器,但是TinyMCE插件正在处理错误的当前目录,文件管理也不会分开。

1 个答案:

答案 0 :(得分:3)

问题是AssetDispatcher过滤器,它包含使用PHP css语句的jsinclude()文件,导致文件通过PHP解析器发送,在那里它将会在TinyMCE脚本中发现<?。{/ p>

请参阅https://github.com/.../2.4.7/lib/Cake/Routing/Filter/AssetDispatcher.php#L159-L160

非常讨厌,如果你问我的话,因为它是无证的,非选择性的危险行为。

自定义资产调度程序

如果您想继续使用插件资产调度程序,请扩展内置资源调度程序,并重新实现AssetDispatcher::_deliverAsset()方法并删除包含功能。当然这有点烦人,维护明智,但它是一个非常快速的解决方案。

类似的东西:

// 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

不要禁用短开标签

我只是在这里猜测,但是它在你的其他服务器上工作的原因可能是short open tags(即<?)禁用了。但是,即使这是您的新服务器上的问题,这不是您应该依赖的东西,资产仍然使用include()提供,您很可能不想检查所有你的第三方CSS / JS可以在每次更新时注入可能的PHP代码。