2

我计划使用 Magento 的内置Custom Variable系统来允许用户更改样式的各个方面。很容易将其引入标题并使用以下语句使用样式选项:

Mage::getModel('core/variable')->loadByCode('backgroundColour')->getData('store_plain_value');

在自定义块中,并在块中包含 this head

<block type="page/template_links" name="customvars" as="customVars" template="page/html/customvars.phtml"/>

但是,我担心性能。自定义变量是否被缓存?如果我有,比如说,40 个这样的变量,这会不会消耗资源?

我知道我可以将它们全部包含在一个 CSS 块中,但我想保持额外的易用性收益,以免将它们分开。

4

1 回答 1

4

来自“自定义变量”功能的值

System -> Custom Variables

据我所知,不是专门缓存的。如果它可以帮助您解决客户的问题,我不会让这阻止您使用它们。其他事情会很快导致性能问题。

如果您查看 Magento 使用这些变量的主要位置

#File: app/code/core/Mage/Core/Model/Email/Template/Filter.php
public function customvarDirective($construction)
{
    $customVarValue = '';
    $params = $this->_getIncludeParameters($construction[2]);
    if (isset($params['code'])) {
        $variable = Mage::getModel('core/variable')
            ->setStoreId($this->getStoreId())
            ->loadByCode($params['code']);
        $mode = $this->getPlainTemplateMode()?Mage_Core_Model_Variable::TYPE_TEXT:Mage_Core_Model_Variable::TYPE_HTML;
        if ($value = $variable->getValue($mode)) {
            $customVarValue = $value;
        }
    }
    return $customVarValue;
}

您可以看到它们加载了以下链式方法调用

$variable = Mage::getModel('core/variable')
    ->setStoreId($this->getStoreId())
    ->loadByCode($params['code']);

所以你知道在这个代码级别没有缓存。如果跳转到core/variable模型类文件

#File: app/code/core/Mage/Core/Model/Variable.php
public function loadByCode($code)
{
    $this->getResource()->loadByCode($this, $code);
    return $this;
}

你可以看到theres没有缓存逻辑loadByCode方法中没有缓存逻辑。对整个文件的快速 grep 也没有提到字符串“缓存”。

然后,如果您查看模型资源

#File: app/code/core/Mage/Core/Model/Resource/Variable.php
public function loadByCode(Mage_Core_Model_Variable $object, $code)
{
    if ($result = $this->getVariableByCode($code, true, $object->getStoreId())) {
        $object->setData($result);
    }
    return $this;
}

再次没有特殊的缓存逻辑。此外,通过此文件对字符串“cache”进行 grep 分析,什么也没有显示。

最后,在否则为空的控制器操作中运行以下代码将转储变量值。

public function indexAction()
{   
    $values = Mage::getModel('core/variable')
    ->setStoreId(1)
    ->loadByCode('abc');
    var_dump($values->getData());
    exit;
}

如果您这样做,然后使用单独的工具更新core_variable_value表格并重新加载页面,您将看到值已更新。

所有这些都指向未缓存的值。

于 2012-05-15T18:01:56.123 回答