◄ Помощь ► Magento 2

Вопрос по паролю покупателя. Он создается только латиницей? Или можно настроить на другой язык? Пробовал создать покупателя с паролем на русском - не создает.
 
Приветствую,
Установил шаблон в мадженто 2.3 а там все нормально кроме одного модуля у которого есть в самом шаблоне и не возможно его удалить потому что привязки есть.
Этот модуль Mageplaza Social Login не активирован и просит One or more Mageplaza extensions are not validated. Click here to validate them как его нулить без его удаления?
Для просмотра ссылки Войди или Зарегистрируйся
 
После установки Firebear Improved Import / Export v. 3.2.3 и composer require box/spout
ошибка
To use the ODS and XLSX file format, you need to install the library Spout (composer require box/spout).
И не могу работать с форматами xlsx,ODS
В чем проблема помогите!
 
После установки Firebear Improved Import / Export v. 3.2.3 и composer require box/spout
ошибка
To use the ODS and XLSX file format, you need to install the library Spout (composer require box/spout).
И не могу работать с форматами xlsx,ODS
В чем проблема помогите!
Решил сам и поделюсь с вами.Во первых у меня composer require box/spout не устанавливается на корень мадженто 2 при наличий composer.json и я решил вручную установить его(с помощью сайта Для просмотра ссылки Войди или Зарегистрируйся).
Это версия box/spout:2.7.3 что я готовил в зип файле.
И этот код require __DIR__ . '/vendor/box/spout/src/Spout/Autoloader/autoload.php'; надо вставит в index.php главного мадженто.
И так без проблем будет работать с форматами ODS и XLSX.
 

Вложения

  • vendor.zip
    133,1 KB · Просмотры: 6
Приветствую, кто силен в php помогите разобраться в небольшой проблеме.
Нужно чуть изменить в функционале mega menu от Amasty, подробнее.
Есть мега меню, в подменю основной вывод - стандартные категории с подкатегориями magento. Т.е. некоторые элементы, сайдбары, баннеры и тд и тп добавляются, но главным образом пункты меню выводятся через {{child_categories_content}}
Вот как это выглядит:
megamenu.jpg
И вот в конец каждого списка второго уровня надо добавить последним элементом Show all. Ссылки этих элементов дублируют элементы первого уровня (не спрашивайте, зачем это надо - руководство так желает).
Я нашел код, который отвечает за это в файле vendor/amasty/mega-menu/Block/Html/Topmenu.php - файл прилагаю целиком, там функция, отвечающая за этот вывод - getTreeHtml
Вот ее код
PHP:
    public function getTreeHtml(Node $node, $level = 1)
    {
        $html = '';
        if ($node->hasChildren()) {
            $nodesCount = $node->getChildren()->count();
            $columnCount = $this->getColumnCount($node) ?: $nodesCount;
            $widthClass = ($level == 1) ? (' -col-'. $columnCount) : '';
            $html .= '<ul class="ammenu-item -child' . $widthClass . '" '
                . ($level >= 3 ? ' style="display: none;"' : '') . '>';
            if ($level == 1 && $nodesCount > $columnCount) {
                $newColumnIndexes = $this->getNewColumnIndexes($nodesCount, $columnCount);
            }

            /** @var Node $childNode */
            $counter = 1;
            foreach ($node->getChildren() as $childNode) {
                if ($level === 1
                    && $counter !== 1
                    && ($nodesCount <= $columnCount || in_array($counter - 1, $newColumnIndexes))
                ) {
                    $html .= '</ul><ul class="ammenu-item -child' . $widthClass . '">';
                }

                $parentDataAttr = $arrowIcon = '';
                if ($childNode->hasChildren() && $level > 1) {
                    $parentDataAttr = 'data-ammenu-js="parent-subitem"';
                    $arrowIcon = ' ammenu-icon -small -down';
                }

                $arrowIcon = $childNode->hasChildren()
                    ? '<span class="ammenu-arrow' . $arrowIcon . '" data-ammenu-js="submenu-toggle"></span>'
                    : '';

                $html .= sprintf(
                    '<li class="ammenu-wrapper" %s>%s<a href="%s" title="%s" class="ammenu-link -level%s %s">
                    <span class="ammenu-wrapper">%s</span>
                    </a>',
                    $parentDataAttr,
                    $arrowIcon,
                    $this->escapeUrl($childNode->getUrl() ? : '#'),
                    $this->escapeHtml($childNode->getName()),
                    $level,
                    $this->getHighLightClass($childNode),
                    $this->escapeHtml($childNode->getName())
                );

                if ($childNode->hasChildren()) {
                    $html .= $this->getTreeHtml($childNode, $level + 1);
                }

                $html .= '</li>';
                $counter++;
            }
            $html .= '</ul>';
        }

        return $html;
    }
Собственно, добавить нужную запись в нужное место не проблема - нужно в конце функции перед последним закрывающим ul тегом добавить условие, что то вроде:

PHP:
if ($level === 2) {
              $html .= '<li class="ammenu-wrapper"><a href="" title="" class="ammenu-link">
              <span class="ammenu-wrapper">Show all</span></a></li>';
            }
Но главная проблема - как прописать адрес ссылки, чтобы он был автоматически равен адресу ссылки уровня выше?
 

Вложения

  • Topmenu.zip
    3,5 KB · Просмотры: 3
С этим разобрался, точнее, помогли разобраться - теперь остался нерешенным такой вопрос.
Итак, мне необходимо внести изменения в php файл Topmenu.php расширения megamenu от Amasty.
Каким образом внести изменения в шаблон, чтобы обрабатывался php файл Topmenu.php для конкретной темы?
Что есть.
1. Файл шаблона - topmenu.phtml, его как обычно копирую в папку темы - mytheme/Amasty_MegaMenu/templates/html/desktop/topmenu.phtml.
Вот его код:
PHP:
<?php
/**
* @author Amasty Team
* @copyright Copyright (c) 2019 Amasty (https://www.amasty.com)
* @package Amasty_MegaMenu
*/
?>
<?php
/** @var \Amasty\MegaMenu\Block\Html\Topmenu $block */
?>

<section class="ammenu-menu-wrapper -desktop"
         data-ammenu-js="desktop-menu"
         data-mage-init='{"amastyMegaMenu":{"stickyStatus": <?= $block->escapeHtml($block->getStickyState())?>,
              "desktopStatus": 1 }}'>
    <nav class="ammenu-main-container">
        <ul class="ammenu-items">
            <?php foreach ($block->getMainNodes() as $mainNode) : ?>
                <?php
                if (!$block->isNeedDisplay($mainNode->getId(), $mainNode->getStatus(), $block::DESKTOP_VIEW)) {
                    continue;
                }
                $url = $mainNode->getUrl() ?: '#';
                $widthMode = $block->escapeHtml($block->getWidth($mainNode));
                $widthValue = $block->getWidthValue($mainNode);
                $mainNodeContent = $block->getContent($mainNode);
                ?>
                <li class="ammenu-item -main -<?= $block->escapeHtml($widthMode)?> <?= /* @noEscape */  $block->getHighLightClass($mainNode)?>">
                    <a href="<?= $block->escapeUrl($url) ?>"
                       class="ammenu-link -main<?= ($mainNodeContent) ?' -parent': '' ?>"
                       title="<?= $block->escapeHtml($mainNode->getName()) ?>">
                        <?= $block->escapeHtml($mainNode->getName()) ?>

                        <?php if ($label = $mainNode->getLabel()) : ?>
                            <span class="ammenu-label"
                                  style="color: <?= $block->escapeHtml($mainNode->getLabelTextColor() ?: '#000') ?> !important;
                                          background-color: <?= $block->escapeHtml($mainNode->getLabelBackgroundColor() ?: '#fff') ?> !important;">
                            <?= $block->escapeHtml($label) ?>
                        </span>
                        <?php endif; ?></a>

                    <?php if (/* @noEscape */ $mainNodeContent) : ?>
                        <div class="ammenu-submenu-container ammenu-submenu -<?= $block->escapeHtml($widthMode)?>"
                             data-ammenu-js="menu-submenu"
                                <?= ($widthValue) ? 'style="width: ' . $block->escapeHtml($widthValue) . 'px"': '' ?>>
                            <?= /* @noEscape */ $mainNodeContent ?>
                        </div>
                    <?php endif;?>
                </li>
            <?php endforeach; ?>
        </ul>
    </nav>
</section>
В файле изменений нет, но если сделать, видно что работает локальный файл шаблона.
2. Файл блока, именно в нем находится код, который необходимо модифицировать для моей темы - vendor/amasty/mega-menu/Block/Html/Topmenu.php. Продублировал в тему mytheme/Amasty_MegaMenu/Block/Html/Topmenu.php, но все равно работает глобальный файл.
3. Файл лейаута - vendor/amasty/mega-menu/layout/am_mega_menu_layout.xml - простое копирование тоже ничего не дает.
Его код:
Код:
<?xml version="1.0"?>
<!--
/**
* @author Amasty Team
* @copyright Copyright (c) 2019 Amasty (https://www.amasty.com)
* @package Amasty_MegaMenu
*/
-->

<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <head>
        <css src="Amasty_Base::vendor/slick/amslick.min.css"/>
    </head>
    <body>
        <referenceBlock name="head.additional">
            <block class="Amasty\MegaMenu\Block\Head" name="amasty.megamenu.head" template="Amasty_MegaMenu::head.phtml" after="-"/>

            <referenceBlock name="header-wrapper">
                <block class="Amasty\MegaMenu\Block\Toggle" name="amasty.menu.toggle" template="Amasty_MegaMenu::toggle.phtml" before="logo"/>
                <block class="Amasty\MegaMenu\Block\Html\Topmenu" name="catalog.topnav.hamburger" template="Amasty_MegaMenu::html/hamburger/topmenu.phtml"/>
            </referenceBlock>
        </referenceBlock>

        <referenceContainer name="page.top">
            <referenceBlock name="navigation.sections" >
                <action method="setTemplate">
                    <argument name="template" xsi:type="string">Amasty_MegaMenu::sections.phtml</argument>
                </action>
                <action method="setHelperBlock">
                    <argument name="helperBlock" xsi:type="object">Amasty\MegaMenu\Block\Html\Topmenu</argument>
                </action>
            </referenceBlock>
            <referenceBlock name="store.menu">
                <block class="Magento\Framework\View\Element\Template" name="catalog.topnav" template="Amasty_MegaMenu::html/topmenu.phtml" ttl="3600" before="-">
                    <block class="Amasty\MegaMenu\Block\Html\Topmenu" name="catalog.topnav.mobile" template="Amasty_MegaMenu::html/mobile/topmenu.phtml">
                        <arguments>
                            <argument name="block_type" xsi:type="string">mobile</argument>
                        </arguments>
                    </block>
                    <block class="Amasty\MegaMenu\Block\Html\Topmenu" name="catalog.topnav.desktop"
                           template="Amasty_MegaMenu::html/desktop/topmenu.phtml">
                        <arguments>
                            <argument name="block_type" xsi:type="string">desktop</argument>
                        </arguments>
                    </block>
                    <block class="Amasty\MegaMenu\Block\Html\Topmenu" name="catalog.topnav.hamburger.left" template="Amasty_MegaMenu::html/hamburger/leftmenu.phtml"/>
                </block>
            </referenceBlock>
        </referenceContainer>
    </body>
</layout>

Я так понимаю, что где то надо указать на измененный Topmenu.php, но не вижу где.
пс. Если нужно расширение целиком, готов выложить.

Upd.
Не знаю, корректное ли решение. Но работает. Если кому то еще надо.
В своей теме создаю layout am_mega_menu_layout.xml. Но меняю в нем для десктопа (поскольку я хочу изменить код только для десктопной версии) класс с Topmenu на любой другой, например TopmenuMod
Теперь в папке мегаменю создаю файл TopmenuMod.php, и в нем также точно именую измененный класс.
PHP:
class TopmenuMod extends Template implements IdentityInterface, ArgumentInterface.....
Теперь меню для выбранной темы будет работать с модифицированным классом, а для всех остальных - с дефолтным классом.
Проблема - при обновлении расширения не знаю, будет ли файл класса сохранен или удален.
 
Последнее редактирование:
Хочу спросить еще вот о чем - нужно поместить language switcher в footer, при том что:
- footer кастомный, состоит из нескольких блоков, нужно положить в низ первого блока.
- switcher должен показать только один из storview, на который можно переключиться, и показывать его иконкой(флагом). Текущий storview показывать не надо.
Вот код лейаута футера
Код:
<referenceContainer name="footer-container">
            <container name="footer" label="Page Footer" as="footer-wrapper" htmlTag="div" htmlClass="footer content">
            <block class="Magento\Cms\Block\Block" name="footer-column-1">
                  <arguments>
                       <argument name="block_id" xsi:type="string">footer-column-1</argument>
                  </arguments>
               </block>
               <block class="Magento\Cms\Block\Block" name="footer-column-2">
                  <arguments>
                       <argument name="block_id" xsi:type="string">footer-column-2</argument>
                  </arguments>
               </block>
            <block class="Magento\Cms\Block\Block" name="footer-column-3">
                  <arguments>
                       <argument name="block_id" xsi:type="string">footer-column-3</argument>
                  </arguments>
               </block>
            <block class="Magento\Cms\Block\Block" name="footer-column-4">
                  <arguments>
                       <argument name="block_id" xsi:type="string">footer-column-4</argument>
                  </arguments>
               </block>
               </container>
        </referenceContainer>

Upd
Решение, найдено на magento stackexchange
в теме создаем файл шаблона - Magento_Store/templates/switch/language.phtml со сл. кодом

PHP:
<?php
/**
* Language switcher template
*/
if (count($this->getStores())) { ?>
<div class="langs-wrapper">
    <?php foreach ($this->getStores() as $_lang) { ?>
        <a class="lang-flag" href="#" data-post='<?php echo $block->getTargetStorePostData($_lang); ?>'><img src="<?php echo $this->getViewFileUrl('images/flags/' . $_lang->getCode() . '.png');?>" alt="<?php echo $_lang->getName(); ?>" /></a>
    <?php } ?>
    </div>
<?php
}
В теме не забыть положить иконки флажков в web/images/flags
Ну а в лейауте темы - default.xml - просто перемещаем элемент в футер или куда хотим, я переместил в футер и дальше подогнал стилями как мне надо было.
Код:
<move element="store_language" destination="footer" after="-"/>
Единственное, мне надо еще, чтобы флажок текущего storeview не показывался, сделал пока на css, однако нахожу это не совсем удобным. Поскольку storeview разные, а тема - одна, и разграничить стили для одной темы и разных storeview можно только можно разве что в админке прописать...
По идее, можно как то условие в коде выше задать - что то вроде - получить код или id всех storeview и текущего, и для текущего не выводить... но я в php не очень, если кто подсткажет буду благодарен.
 
Последнее редактирование:
Снова вопрос, может кто то уже задумывался, или решал?
Есть товары со специальными ценами, в зависимости от кол-ва (не уверен, как правильно по-русски, по англ. tier prices).
Есть ли решение, чтобы при выборе количества, от которого начинает действовать скидка, показывалась бы автоматически эта специальная цена?
Перерыл все, обсуждения много, реального решения не нашел.
Например, Для просмотра ссылки Войди или Зарегистрируйся у меня работает некорректно, т.е. показывает неправильные цены (у кого есть возможность + желание проверьте плз)
Есть в принципе Для просмотра ссылки Войди или Зарегистрируйся, позволяющее с помощью радиобаттонов выбирать кол-во, при этом кол-во, отображаемое в стандартном инпуте, подтягивается за выбранным , а цена - нет.
Кроме того, обратите внимание, снизу под color-option если добавить какую то приблуду за 50 центов, то сразу показывает цену на 50 центов выше, а если выбрать кол-во нужное, то нифига...
Сижу думаю: странно, ну вроде бы такая очевидная функциональность, почему не сделает никто?
 
Вопрос попроще, может кто знает.
В М2.2.х в описании категории - Catalog-Categories - some category - category - content - description
Ниже поля ввода description есть возможность выбрать и добавить cms block, но только один.
А если надо добавить 2 или больше, то не получается. Т.е. можно тупо html содержимое блока добавить, но если его к нескольким категориям надо добавлять, то неудобно...
При этом в М2.3.х можно спокойно добавлять сколько угодно через шорт-коды, т.е. тупо в поле description пишу в любом месте где мне надо {{block class="Magento\Cms\Block\Block" block_id="6"}}
или, нажимаю на insert widget и выбираю нужный блок (на выходе получаю или можно это же руками записать)
{{widget type="Magento\Cms\Block\Widget\Block" template="widget/static_block/default.phtml" block_id="6"}}
А в М2.2.х не получается выбрать виджет, можно только картинку, и если записать шорткодами то тупо они записываются как текст.
Может, кто знает решение как туда доп. блоки вставлять?
 
Подскажите пожалуйста, как вывести атрибут, например, "производитель" в сетку категорий?

upload_2020-3-21_17-17-57.png
 

Вложения

  • upload_2020-3-21_17-16-49.png
    upload_2020-3-21_17-16-49.png
    152,3 KB · Просмотры: 1
Назад
Сверху