Magento / Zend不允许使用符号链接

时间:2010-12-17 18:29:50

标签: zend-framework magento symlink

任何人都知道为什么Magento不允许在app / design文件夹之外的模板.phtml文件的符号链接?

如果我在该文件夹中执行符号链接,它可以正常工作,但如果它在外部链接,则不起作用。所以它似乎是一些权限/安全性的东西,但我找不到任何信息。

可能是Zend设置? http://zend-framework-community.634137.n4.nabble.com/Zend-Tool-not-working-with-symbolic-links-in-include-path-td662569.html

任何?

替代方法:感谢Alan在下面的建议,我找到了一个解决方法 - 因为我自己只是将它用于本地开发,我很开心。如果这有助于其他任何人,我会在这里添加它。所以我在core / Mage / Core / Block / Template.php中直接插入以下行 Varien_Profiler :: start($ fileName);

    $storeId = Mage::app()->getStore()->getId();
    $theme = Mage::getStoreConfig('design/package/name', $storeId);
    Mage::Log($this->_viewDir.DS.$fileName); 
    $includes = $this->_viewDir.DS.$fileName; 
    if(strpos($includes, 'frontend/'.$theme )) { 
         include $this->_viewDir.DS.$fileName;
        };

使用IF语句可以阻止所有基本模板加倍,并且只允许自定义主题模板通过。

5 个答案:

答案 0 :(得分:18)

从Magento 1.5.1.0(可能是1.5.x?)开始,系统>处有一个选项。配置>开发人员>模板设置>允许您启用的符号链接

不再需要肮脏的黑客/变通办法。 : - )

答案 1 :(得分:5)

这是由于1.4.2中的变化导致Magento不再允许符号链接文件夹。如果你看一下Template.php

        $includeFilePath = realpath($this->_viewDir . DS . $fileName);
        if (strpos($includeFilePath, realpath($this->_viewDir)) === 0) {
            include $includeFilePath;
        } else {
            Mage::log('Not valid template file:'.$fileName, Zend_Log::CRIT, null, null, true);

        }

如果模板不在“viewDir”下,您会看到它不会加载。

答案 2 :(得分:3)

找到另一个适合我的小解决方案:

sshfs 192.168.1.12:/srv/www/vhosts/dev.****.*****.de/media/catalog/product/ catalog/product/ -o allow_other

这是通过sshfs安装远程文件系统,allow_other选项是必要的,以便从远程机箱安装文件而不使用远程机箱文件权限:

  

此选项允许您在SSHFS命令中使用-o allow_other,这将允许非root用户访问您正在安装的特定资源。

希望这对你们任何人都有帮助

答案 3 :(得分:2)

我也使用符号链接到我的自定义代码,我设法通过使用mount --bind而不是创建符号链接来克服这个问题,例如: 自定义主题目录:/ home / user / workspace / magento / app / design / frontend / default / mytheme

cd <magento dir>/app/design/frontend/default
mkdir mytheme
sudo mount --bind /home/user/workspace/magento/app/design/frontend/default/mytheme mytheme

此方法将在OSX上工作。

答案 4 :(得分:0)

将一些日志记录代码添加到基本模板块

#File: app/code/core/Mage/Core/Block/Template.php
public function fetchView($fileName)
{
    ...
    Mage::Log($this->_viewDir.DS.$fileName); 
    var_dump($this->_viewDir.DS.$fileName);
    include $this->_viewDir.DS.$fileName;
    ...
}

最终,渲染模板块是使用系统路径调用include。一旦获得Magento构建模板的路径,就创建一个单行PHP文件

<?php
include('/path/that/was/logged/foo.phtml');

并尝试加载模板。这应该允许您隔离任何特定的包含调用失败的原因。我的直接猜测是PHP安全模式设置,但是我已经很长时间没有打击共享主机限制了。

祝你好运!