Восстановление данных клиента на странице продукта
Я пытаюсь восстановить данные о клиентах на странице продукта, так как я не могу пройти через 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;
});
Я видел, что для проверки ядра magento используется тот же метод, поэтому я не понимаю, почему это не работает.
2 answers
Вы получаете наблюдаемое, вот почему вы видите функцию в console.log. Его нокаут JS заметен, поэтому, чтобы получить текущее значение, используйте следующий синтаксис:
customerData.get('customer')()
Вы также можете подписаться на него наблюдаемый пример:
customerData.get('customer').subscribe(function (newVal) {
console.log(newVal);
});
Таким образом, ваш код всегда работает с последним значением или делает что-то, когда оно меняется. Если вы используете шаблон KnockoutJS, вы можете легко обновлять свой шаблон
Вы можете установить блок кэшируемый="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>
Надеюсь, это будет полезно для вас.