Hi All,
To get the dynamic domain and media url.
I want to get the media url or call static block in the following path:
Theme/Magento_Checkout/web/template - xxxxxxx.html file
Is it possible..
Please suggest a better solution for this..
Thanks,
Shiva.
Sorry, I don't get what you are asking. Would you try to express differently what you want to archieve?
If I understood you correctly you would like to render image on one of your custom html template. In order to pass Media URL based on your domain you have to create ConfigProvider class and include into CompositeConfigProvider class from Magento\Checkout module.
<type name="Magento\Checkout\Model\CompositeConfigProvider"> <arguments> <argument name="configProviders" xsi:type="array"> <item name="custom_config_provider" xsi:type="object">Vendor\Custom\Ui\ConfigProvider</item> </argument> </arguments> </type>
ConfigProvider class
namespace Vendor\Custom\Ui; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem; use Magento\Checkout\Model\ConfigProviderInterface; /** * Class ConfigProvider * @package Vendor\Custom\Ui */ class ConfigProvider implements ConfigProviderInterface { /** * @var Filesystem */ private $filesystem; /** * ConfigProvider constructor. * @param Filesystem $filesystem */ public function __construct( Filesystem $filesystem ) { $this->filesystem = $filesystem; } /** * @return array */ public function getConfig() { return [ 'vendor_custom' => [ 'media_url' => $this->filesystem->getDirectoryWrite(DirectoryList::MEDIA)->getAbsolutePath('path/to/file.jpg') ] ]; } }
In your custom JavaScript file you can access Media URL like above:
define(['uiComponent'], function(Component) {
var mediaUrl = window.checkoutProvider.vendor_custom.media_url;
return Component.extend({
defaults: {
template: 'Vendor_Custom/template',
},
getMediaUrl: function() {
return mediaUrl;
}
});
});
In template.html file simply use getMediaUrl() function.
<img data-bind="attr: {'src': getMediaUrl()}" />
Hi,
I am very new to magento, can you please explain in detail way. Means where i have to place all the above code.
And is this a core file modification..?
Hi @soho_rize
This is an example of extending core functionality by following best practices in Magento 2.
All the mentioned code should be placed into the new custom module created by you inside the Magento 2 project directory: magentoRoot/app/code/Vendor/ModuleName.
Where Vendor is a name of a namespace let's say your company name or last name and ModuleName is a name of a feature where all code will exist. For further guidance on module creation please read post Magento 2 module in a separate repository.
First xml should be added into the app/code/Vendor/ModuleName/etc/di.xml file.
ConfigProvider class should be placed app/code/Vendor/ModuleName/Ui/ConfigProvider file.
JavaScript should be placed into app/code/Vendor/ModuleName/view/frontend/web/js/template.js file.
The template.html should be placed into app/code/Vendor/ModuleName/view/frontend/web/template/template.html file.
You should also add custom declaration of the Checkout "component" into the app/code/Vendor/ModuleName/view/frontend/layout/checkout_index_index.xml file. It should be something like this, of course it depends where do you want to include your Media URL
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="checkout" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="checkout.root">
<arguments>
<argument name="jsLayout" xsi:type="array">
<item name="components" xsi:type="array">
<item name="checkout" xsi:type="array">
<item name="children" xsi:type="array">
<item name="steps" xsi:type="array">
<item name="children" xsi:type="array">
<item name="shipping-step" xsi:type="array">
<item name="children" xsi:type="array">
<item name="shippingAddress" xsi:type="array">
<item name="children" xsi:type="array">
<item name="shipping-address-fieldset" xsi:type="array">
<item name="children" xsi:type="array">
<item name="media_url" xsi:type="array">
<item name="component" xsi:type="string">Vendor_Custom/js/template</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</item>
</argument>
</arguments>
</referenceBlock>
</body>
</page>
Hi Max,
Sorry for asking you, i need to do all the code only in my local host.
But while installing magento 2 in localhost iam getting the blank screen and when enabled ini_set('display_errors', 1); it shows the following error:
Parse error: syntax error, unexpected '.' in /var/www/html/lloyds_dev/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php on line 93
I have not found the correct solution for this..
Can you help me..
Open the /var/www/html/lloyds_dev/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php line 93 and check whether you have some file edits. The vendor directory should not be edited.
Hi Max,
I am getting the following error even for the Magento 2.1.3 fresh download:
Parse error: syntax error, unexpected '.' in /var/www/html/magento213/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php on line 93
What version of PHP do you have? It seems like it might be 5.5 or even less if you experience this error.
Hi Max,
PHP Version:
PHP 7.0.15-1+deb.sury.org~trusty+1 (cli) (built: Jan 20 2017 09:16:11) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.15-1+deb.sury.org~trusty+1, Copyright (c) 1999-2017, by Zend Technologies
MySQL Version:
mysql Ver 14.14 Distrib 5.6.33, for debian-linux-gnu (x86_64) using EditLine wrapper