javascript对象window.checkoutConfig几乎包含checkout页面显示的全部动态数据,例如order summary。因此当须要对checkout进行改造时不可避免须要对window.checkoutConfig进行数据扩展。javascript
若是追溯window.checkoutConfig数据来源,会依次找到如下代码:php
// 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
的结果列出,能找到如下代码:html
<!-- 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来追加数据。java