【问题标题】:Sharing TinyMCE plugin across multiple applications跨多个应用程序共享 TinyMCE 插件
【发布时间】:2014-06-17 14:22:03
【问题描述】:

我正在使用 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 插件在错误的当前目录上工作,并且文件管理不会分开。

【问题讨论】:

    标签: javascript cakephp tinymce assets


    【解决方案1】:

    问题在于AssetDispatcher 过滤器,它包含cssjs 使用PHP 语句的文件include() 语句,导致文件通过PHP 解析器发送,在那里它会偶然发现@987654328 的出现@在 TinyMCE 脚本中。

    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 代码注入。

    【讨论】:

    • 您对 short open tags 对于新服务器 On 是正确的。我为自定义 AssetDispatcher 创建了一个插件,一切正常。谢谢。
    • 什么是 $compressionEnabled?它会引起通知,因此会出错。
    • @ArvindK。在_deliverAsset() 方法的排除部分中定义的变量。该示例仅显示与更改相关的部分,请检查链接源(分别是您正在使用的版本的源)以获取完整图片(更新答案)。
    • 与此问题相关的另一个问题。我确实按照“答案”中的描述创建了一个新过滤器,现在 css 文件存在问题。它们现在不被解释为 CSS,而是现在破坏整个网站的文本。有人在吗?我是否将其作为新问题发布?
    猜你喜欢
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    相关资源
    最近更新 更多