markdown Magento2 - UI组件:getJsLayout,CustomData

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown Magento2 - UI组件:getJsLayout,CustomData相关的知识,希望对你有一定的参考价值。

# Final Control Point

## Layout

**Important:** Do not override the vendor/magento layout. Just extend them

### Change/Create a Container/Block

Create a container

```xml
<container name="product.info.form.content" as="product_info_form_content">
    ...
</container>
```

Create a block

```xml
<block class="Magento\Framework\View\Element\Template" name="test.ui.component" template="Magento_Theme::block.phtml">
    ...
</block>
```


### Reference a Container/Block

Reference Container

```xml
<referenceContainer name="content">
    ...
</referenceContainer>
```

Reference Block

```xml
<referenceBlock name="report.bugs"/>
```


### Move a Container/Block

```xml
<move element="product.info.stock.sku" destination="product.info.price" after="product.price.final"/>
```

### Remove a Container/Block

```xml
<referenceBlock name="breadcrumbs" remove="true" />
```

### Override/Extend `layout.xml`

**Note:** In this example I will use the `Magento_Theme` module

* Under ../[VendorName]/[ThemeName]/Magento_Theme/layout create a layout named `default.xml`.
* Add your new updates in it
    ```xml
    <?xml version="1.0"?>
    <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="report.bugs" remove="true" />
    </body>
    </page>
    ```

### page_layout

The purpose of page layouts is to create a structured, common set of layout instructions to render pages. Most pages on a website can be categorized as fitting into a 1, 2, or 3-column container system. These page layouts can be selected in the admin panel to provide a specific layout per page.

We Can Create a sample file in here

../[VendorName]/[ThemeName]/Magento_Catalog/page_layout/2columns-left.xml

```xml
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_layout.xsd">
    <update handle="1column"/>
    <referenceContainer name="columns">
        <container name="div.sidebar.main" htmlTag="div" htmlClass="sidebar sidebar-main" after="main">
            <container name="sidebar.main" as="sidebar_main" label="Sidebar Main"/>
        </container>
        <container name="div.sidebar.additional" htmlTag="div" htmlClass="sidebar sidebar-additional" after="div.sidebar.main">
            <container name="sidebar.additional" as="sidebar_additional" label="Sidebar Additional"/>
        </container>
    </referenceContainer>
</layout>
```


### layout_handler / layout handles

```xml
<?xml version="1.0"?>

<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <head>
        <css src="mage/gallery/gallery.css"/>
    </head>
    <!-- Extends the layout -->
    <update handle="catalog_product_opengraph" />
    <update handle="page_calendar"/>
    <body>
    </body>
</page>
```

The specified handle is “included” and executed recursively.

**Note:**
* `page_layout` is the layout of the whole page
* `layout` is the layout of a certain section of a page

### `default.xml` and `default_head_blocks.xml`

`default.xml` hold the page containera, blocks, arguments, template, and so on
```xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <block class="Magento\Framework\View\Element\Template" name="test.ui.component" template="Magento_Theme::block.phtml">
                <arguments>
                    <argument name="jsLayout" xsi:type="array">
                        <item name="components" xsi:type="array">
                            <item name="test-ui-component" xsi:type="array">
                                <item name="component" xsi:type="string">Magento_Theme/js/view/sample-component</item>
                                <item name="config" xsi:type="array">
                                    <item name="template" xsi:type="string">Magento_Theme/sample-ui-template</item>
                                </item>
                            </item>
                        </item>
                    </argument>
                </arguments>
            </block>
        </referenceContainer>
    </body>
</page>
```

`default_head_blocks.xml` holds the dependencies

```xml
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <head>
        <!-- Add local resources -->
        <css src="css/my-styles.css"/>
        <!-- The following two ways to add local JavaScript files are equal -->
        <script src="Magento_Theme::js/sample1.js"/>
        <script src="http://127.0.0.1:35729/livereload.js" src_type="url"></script>

        <link src="js/sample.js"/>
        <!-- Add external resources -->
        <link rel="stylesheet" type="text/css" src="http://fonts.googleapis.com/css?family=Montserrat" src_type="url" />
    </head>
</page>
```

### How to pass argument in `layout.xml` files

```xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
            <block class="Magento\Framework\View\Element\Template" name="test.ui.component" template="Magento_Theme::block.phtml">
                <arguments>
                    <argument name="jsLayout" xsi:type="array">
                        <item name="components" xsi:type="array">
                            <item name="test-ui-component" xsi:type="array">
                                <item name="component" xsi:type="string">Magento_Theme/js/view/sample-component</item>
                                <item name="config" xsi:type="array">
                                    <item name="template" xsi:type="string">Magento_Theme/sample-ui-template</item>
                                </item>
                            </item>
                        </item>
                    </argument>
                </arguments>
            </block>
        </referenceContainer>
    </body>
</page>
```

---

## template

### Create template

Under ../[VendorName]/[ThemeName]/Magento_Catalog/templates create a file called `test-block.phtml`

```phtml
<?php
/**
 * @var \Ewave\MagentoCatalog\Block\TestBlock $block
 */

?>

<div class="block custom-block">
    <h4 class="block-title">Good day!</h4>
</div>

<div class="block custom-block">
    <h4 class="block-title">Test JS translation</h4>
    <p id="translate-js"></p>
</div>

<h4 class="block-title"><?= /* @escapeNotVerified */ __('translated_title') ?></h4>

<h6>(1)object</h6>
<p data-mage-init='{"mystyle": {"color": "yellow"}}'>I am color Yellow <code>data-mage-init</code></p>

<h6>(2)function</h6>
<p data-mage-init='{"mystyle2": {"background": "blue"}}'>I have a blue background <code>data-mage-init</code></p>

<p><?= $block->getData('display_text') ?></p>

<p><?= $block->getDisplayText() ?></p>
```

### Override template

Under ../[VendorName]/[ThemeName]/Magento_Checkout/web/template/minicart create a file similar to the vendor file named `content.html` and move parts.

```html
<!-- I just moved this part somewhere in this file -->
<!-- ... -->
<if args="getCartParam('summary_count')">
    <strong class="subtitle" translate="'Recently added item(s)'"/>
    <div data-action="scroll" class="minicart-items-wrapper">
        <ol id="mini-cart" class="minicart-items" data-bind="foreach: { data: getCartItems(), as: 'item' }">
            <each args="$parent.getRegion($parent.getItemRenderer(item.product_type))"
                    render="{name: getTemplate(), data: item, afterRender: function() {$parents[1].initSidebar()}}"
            />
        </ol>
    </div>
</if>
<!-- ... -->
```

---

## Style

### Extend less file

Under ../[VendorName]/[ThemeName]/web/css/source we can create a file called `_extend.less`

And we can also create another directory in ../source like /extend and create the file you wish to extend like `_block.less` and import it to the `_extend.less file`

```scss
@import 'extend/_block.less';

```

**Note:** You can also add specific `_extend.less` files in specific modules

---

## JS Widget

### Create a widget based on jqueryUI (AMD Module)

```html
<h2>accordion</h2>
<div id="accordion" data-mage-init='{ "accordion": {} }'>
    <div data-role="collapsible">
        <div data-role="trigger">
            <span>Title 1</span>
        </div>
    </div>
    <div data-role="content">Content 1</div>

    <div data-role="collapsible">
        <div data-role="trigger">
            <span>Title 2</span>
        </div>
    </div>
    <div data-role="content">Content 2</div>

    <div data-role="collapsible">
        <div data-role="trigger">
            <span>Title 3</span>
        </div>
    </div>
    <div data-role="content">Content 3</div>
</div>

<!-- init method 1 : data-mage-init='{ "accordion": {} }' -->

<!-- init method 2  -->
<script>
    require([
        'jquery',
        'accordion'], function ($) {
        $("#accordion").accordion();
    });
</script>

<!-- <script type="text/x-magento-init">
{
    "#accordion": {
        "accordion": {}
    }
}
</script> -->
```

### Add a widget mixin

**note:** A common method to extend a widget is adding a mixin

```js
var config = {
    config: {
        mixins: {
            "Magento_Catalog/js/mystyle": {
                "Magento_Catalog/js/mystyle-mixins": true
            }
        }
    }
}
```

### Add a widget into `requirejs-config.js`

```js
var config = {
    map: {
        "*": {
            mystyle: "Magento_Catalog/js/mystyle",
            mystyle2: "Magento_Catalog/js/mystyle2",
        }
    }
}

```

### 2 methods to call JS-widget in html/phtml template

By using a object

```html
<h6>(1)object</h6>
<p data-mage-init='{"mystyle": {"color": "yellow"}}'>I am color Yellow <code>data-mage-init</code></p>
```

```js
define(['jquery'], function ($) {
    'use strict';

    return {
        'mystyle': function (config, element) {
            $(element).css('color', config.color);
        }
    };
});

```

---

By using a function

```html
<h6>(2)function</h6>
<p data-mage-init='{"mystyle2": {"background": "blue"}}'>I have a blue background <code>data-mage-init</code></p>
```

```js
define(['jquery'], function ($){
    'use strict';

    return function(config, element) {
        $(element).css('background', config.background);
    }
});
```

---

## Translation

### In php template

By using this `__('translated_title')`

```html
<h4 class="block-title"><?= /* @escapeNotVerified */ __('translated_title') ?></h4>
```

`en_US.csv` file under ../[VendorName]/[ThemeName]/i18n

```csv
"translated_title","I am translated title"
```

### In an argument in `layout` files

By adding `translate="true"`

```xml
<referenceBlock name="ThemeTest.test-block">
    <arguments>
        <argument name="display_text" xsi:type="string" translate="true">Hello</argument>
    </arguments>
</referenceBlock>
```

`en_US.csv` file under ../[VendorName]/[ThemeName]/i18n

```csv
"Hello", "kamusta"
```

### in JS

Create a file under ../<Module_Name>/web/js

In this example I create a file named `mytranslation.js`

```js
require([
    'jquery',
    'mage/translate'
    ], function ($, __) {
    setTimeout(() => {
        $('#translate-js').text('script-translate: ' + $.mage.__('translate_js'));
    }, 1000);
});
```

```csv
"translate_js","Translated through javascript"
```

---

## UI Component

### How to create

Create a file under ../[VendorName]/[ThemeName]/<Module_Name>/web/js/view

In this example, I create a file named `plain-view-model.js`

```js
define([], function() {
    'use strict';

    return function (config) {
        return {
            title: 'This text is from plain-view-model.js',
            config: config
        }
    }
});
```

## How to extend

We can extend our UI Component by using `<script type="text/x-magento-init">`

```html
<h2>Plain View Model</h2>

<div class="example" data-bind="scope: 'plainViewModel'">
    <h5 data-bind="text: title"></h5>
    <h5 data-bind="text: config.label"></h5>
    <pre data-bind="text: JSON.stringify(config, null, 2)"></pre>
</div>

<script type="text/x-magento-init">
    {
        "*": {
            "Magento_Ui/js/core/app": {
                "components": {
                    "plainViewModel": {
                        "component": "Magento_Theme/js/view/plain-view-model",
                        "label": "This is the label"
                    }
                }
            }
        }
    }
</script>
```

以上是关于markdown Magento2 - UI组件:getJsLayout,CustomData的主要内容,如果未能解决你的问题,请参考以下文章

markdown Magento2 - UI组件:getJsLayout,CustomData

markdown Magento2 - UI组件:displayArea / getRegion /

markdown Magento2 - UI组件:进口/出口/链接/ statefull

markdown Magento2 - UI组件:可观察的视图模型

Magento2 UI components概述

markdown UI设计;活版印刷