javascript对象window.checkoutConfig几乎包含checkout页面显示的所有动态数据,例如order summary。所以当需要对checkout进行改造时不可避免需要对window.checkoutConfig进行数据扩展。

如果追溯window.checkoutConfig数据来源,会依次找到以下代码:

// vendor/magento/module-checkout/view/frontend/templates/onepage.phtml
window.checkoutConfig = <?php /* @escapeNotVerified */ echo \Zend_Json::encode($block->getCheckoutConfig()); ?>;
// vendor/magento/module-checkout/Block/Onepage.php
public function __construct(
    \Magento\Checkout\Model\CompositeConfigProvider $configProvider
) {
    $this->configProvider = $configProvider;
    // ...
}

public function getCheckoutConfig()
{
    return $this->configProvider->getConfig();
}
// vendor/magento/module-checkout/Model/CompositeConfigProvider.php
public function __construct(
    array $configProviders
) {
    $this->configProviders = $configProviders;
}

public function getConfig()
{
    $config = [];
    foreach ($this->configProviders as $configProvider) {
        $config = array_merge_recursive($config, $configProvider->getConfig());
    }
    return $config;
}

可见它来源于configProviders,而configProviders在构造器上却是array类型。构造器都是依赖注入的入口,而array则意味着它可以由di.xml进行无限扩展。而window.checkoutConfig有数据,说明了它必定有一个默认的configProvider提供数据,搜索所有di.xml,把含有 Magento\Checkout\Model\CompositeConfigProvider的结果列出,能找到以下代码:

<!-- vendor/magento/module-checkout/etc/frontend/di.xml -->
<type name="Magento\Checkout\Model\CompositeConfigProvider">
    <arguments>
        <argument name="configProviders" xsi:type="array">
            <item name="checkout_default_config_provider" xsi:type="object">Magento\Checkout\Model\DefaultConfigProvider</item>
        </argument>
    </arguments>
</type>

默认的ConfigProvider已找到,可以修改默认的ConfigProvider或者添加新的ConfigProvider来追加数据。


猫之良品
2.5k 声望139 粉丝

资深Drupal, magento与Joomla


引用和评论

1 篇内容引用
0 条评论