Восстановление данных клиента на странице продукта


Я пытаюсь восстановить данные о клиентах на странице продукта, так как я не могу пройти через php из-за полного кэша страниц, я хочу сделать это в js.

Я добавил блок phtml на свою страницу в нижнем колонтитуле, catalog_product_view.xml

<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <referenceContainer name="footer-container">
        <block class="My\Module\Block\VisitRecorder" template="My_Module::visit_recorder.phtml" name="visit_recorder" after="-"/>
    </referenceContainer>
</page>

В этом блоке я создаю экземпляр виджета, управляющего процессом

<div id="visit-recording">
    <?= $this->getBlockHtml('formkey');?>
</div>

<script>
    require(
    [
        'jquery',
        'visitRecorder',
        'domReady!'
    ], function ($, visitRecorder) {

        var url = window.location.href;
        var formKey = $("#visit-recording [name='form_key']").val();


        $('#visit-recording').visitRecorder({
            "url": url,
            "formKey": formKey,
        });
    });
</script>

В моем requirejs-config.js Я зарегистрировал свой виджет:

var config = {
    map: {
        '*': {
            visitRecorder: 'My_Module/js/visitRecorder',
        }
    }
};

В виджете я попытался восстановить данные о клиентах:

define(
    [
        'jquery',
        'Magento_Customer/js/customer-data',
        'domReady!'
    ],
    function (
        $, customerData
    ) {

        $.widget('namespace.visitRecorder', {

            options: {
                url : "",
                formKey : "",
            },

            _create: function () {
                var self = this;
                this._super();
            },

            /**
             * @private
             */
            _init: function () {
                this._super();

                var customer = customerData.get('customer');
                console.log(customer);
                console.log(customer().firstname);

            },

        });

    return $.namespace.visitRecorder;
});

В консоли я получаю :
enter image description here

Я видел, что для проверки ядра magento используется тот же метод, поэтому я не понимаю, почему это не работает.

Author: Océane, 2021-03-29

2 answers

Вы получаете наблюдаемое, вот почему вы видите функцию в console.log. Его нокаут JS заметен, поэтому, чтобы получить текущее значение, используйте следующий синтаксис:

customerData.get('customer')()

Вы также можете подписаться на него наблюдаемый пример:

customerData.get('customer').subscribe(function (newVal) {
     console.log(newVal);
});

Таким образом, ваш код всегда работает с последним значением или делает что-то, когда оно меняется. Если вы используете шаблон KnockoutJS, вы можете легко обновлять свой шаблон

  2
Author: jefferson, 2021-03-29 16:36:42

Вы можете установить блок кэшируемый="false"

<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <referenceContainer name="footer-container">
        <block class="My\Module\Block\VisitRecorder" template="My_Module::visit_recorder.phtml" name="visit_recorder" after="-" cacheable="false"/>
    </referenceContainer>
</page>

Надеюсь, это будет полезно для вас.

  -1
Author: Sweety Masmiya, 2021-03-30 04:17:51