◄ Помощь ► Magento 2

Коллеги, нужна помощь - как вывести в списке товаров атрибуты товара, которые разрешены в листинге и(или) доступны для выбора фильтра (фильтруемые)

что подразумевается под списком товаров ?

Лейаут catalog_category_view.xml , скорей всего

Код:
<block class="Magento\Catalog\Block\Product\ListProduct" name="category.products.list" as="product_list" template="Magento_Catalog::product/list.phtml">
...
</block>

Чтобы точно вычислить блок:
Store > Configuration > Advanced > Developer > Debug > Enabled Template Path Hints for Storefront > Yes
Store > Configuration > Advanced > Developer > Debug > Add Block Names to Hints > Yes

Далее ищешь по названию блока лейаут/блок/темплейт ..

Раз такая песня - задам еще вопрос

1. Находишь темплейт/лейаут, куда нужно это вставить - как рассмотрено до этого

2. Галерея на страничке товара - это виджет fotorama, который выводится в темплейте gallery.phtml модуля Catalog:

Код:
// catalog_product_view.xml

...
<block class="Magento\Catalog\Block\Product\View\Gallery" name="product.info.media.image" template="product/view/gallery.phtml"/>
...

3. Этот блок можно воткнуть точно также в свой лейаут

4. Или вывести в темплейте опять же по аналогии с этим

Код:
echo $this->getLayout()
          ->createBlock('Magento\Catalog\Block\Product\View\Gallery')
          ->setTemplate('Magento_Catalog::product/view/gallery.phtml')
          ->toHtml();

Можно также заэкстендить в своем модуле блок и темплейт и переделать, как нужно

5. Настройки фоторамы в gallery.phtml подтягиваются из view.xml темы.
Можно поменять их прямо в темплейте, если нужно.

Документация
Для просмотра ссылки Войди или Зарегистрируйся

6. Можно вообще вместо фоторамы использовать другой виджет:
достаем галерею в виде массива и перебираем картинки

Код:
// my_gallery.phtml

$product = $block->getProduct();
$images = $product->getMediaGalleryImages();
foreach ($images as $image) {
       .....
}

7. Да, и сам блок вставляем в виджет модального окна
- foundation Для просмотра ссылки Войди или Зарегистрируйся
- bootstrap Для просмотра ссылки Войди или Зарегистрируйся
- виджет мадженовского фреймворка Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование модератором:
Подскажите, не могу разобраться. Все варианты перепробовал.
Импортирую товары (bundled) и не отображаются в категории (на витрине).
Менял варианты по управлению наличием (вкл/откл), проставлял наличие в простых товарах - не отображаются.
Проверял через категории - товары в категории есть.
Проверял в магазине - есть.
indexer:reindex и cache:cleаn - не помогают.
Менял тему на Luma - не помогает.

При создании товара вручную, товар появляется на витрине.
Пытался пересохранить через комплексное изменение атрибутов - не помогает.

Подскажите куда копать???
 
Подскажите куда копать???

Копать примерно также, как несколькими постами выше.

1. Включаешь вывод блоков/темплейтов, находишь блок/темплейт
2. Дебаггишь блок и темплейт.

В данном случае, если товар созданный вручную выводится, а импортированный - нет,
скорей всего дело в каком-то флажке из-за которого он не попадает в выборку.

См. в темплейте нечто вроде
$product = $block->getProduct();

А в блоке нечто вроде
public function getProduct () {
...
}

С бандл товарами никогда не связывался - у них наверно отдельный темплейт/блок для вывода

p.s.
Но в первую очередь убедись, что импортируется правильно
Сравни какой-то 1 тестовый импортированный товар - с аналогичным, созданным вручную.
Сначала визуально в админке, потом в БД по таблицам.

pp.s.
И еще - напрашивается ...
1. Сделай 1 тестовый товар вручную
2. Экспортируй в файл.
3. Импортируй обратно.
4. Если все в порядке, сравни файл экспорта с тем, где товар не выводится

в бэкапах за последние семь дней этой таблицы уже не было

уж не спейсвеб ли какой-нибудь ? ))

ставь innobackupex в крон на ночь каждый день и туда же чистку папки с бэкапами старше нескольких месяцев
Для просмотра ссылки Войди или Зарегистрируйся

бэкапит на лету, без остановки базы.

Всё работает, но эта таблица не индексируется.

попробуй вручную

indexer:reindex design_config_grid
 
Последнее редактирование модератором:
Всем привет, возникла необходимость сделать короткие урлы для категорий т.е. без урлов родительских: например
как есть site.com/parent-category1/parent-category2/parent-category...N/child-category.html
как нужно site.com/child-category.html
видел решение мол законментируй нужный кусок кода, очисти урлы в таблицах и с помощью другого модуля сгенерируй заново урлы. но как показала практика когда генерирую урлы они создаются хаотичным образом такого вида site.com/child-category.html.html и тд и тп. потом приходится вносить правки в самой бд. Может кто сталкивался, как более правильно решить задачу
 
как более правильно решить задачу

1. Возможно (но вряд ли) придется экстендить маджентовский генератор урлов.
Допустим, у нас модуль Vendor/Module

Код:
//   Vendor/Module/etc/frontend/di.xml

<!--    Кастомный URL  -->
    <preference for="Magento\Framework\Url" type="Vendor\Module\Magento\Framework\Url" />

См. методы getRouteUrl, getUrl
Это для любых урлов, в том числе товаров и категорий
Можно наверно просто повесить на них плагины.

2. Генераторы урлов товаров и категорий

Код:
//   Vendor/Module/etc/frontend/di.xml
<!-- модификация getUrl категорий -->
    <preference for="Magento\Catalog\Model\Category" type="Vendor\Module\Magento\Catalog\Model\Category" />
    <!-- модификация getUrl товаров -->
    <preference for="Magento\Catalog\Model\Product\Url" type="Vendor\Module\Magento\Catalog\Model\Product\Url" />

В Magento\Catalog\Model\Category наследуешь getUrl, также придется наследовать конструктор
Допустим, у меня так

PHP:
class Category extends \Magento\Catalog\Model\Category {

/* >>>>>>>>>> Мой собственный хелпер-генератор урла */
private $_urlPrefix;


public function __construct(
  \Magento\Framework\Model\Context $context,
  \Magento\Framework\Registry $registry,
  \Magento\Framework\Api\ExtensionAttributesFactory $extensionFactory,
  AttributeValueFactory $customAttributeFactory,
  \Magento\Store\Model\StoreManagerInterface $storeManager,
  \Magento\Catalog\Api\CategoryAttributeRepositoryInterface $metadataService,
  \Magento\Catalog\Model\ResourceModel\Category\Tree $categoryTreeResource,
  \Magento\Catalog\Model\ResourceModel\Category\TreeFactory $categoryTreeFactory,
  \Magento\Store\Model\ResourceModel\Store\CollectionFactory $storeCollectionFactory,
  \Magento\Framework\UrlInterface $url,
  \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
  \Magento\Catalog\Model\Config $catalogConfig,
  \Magento\Framework\Filter\FilterManager $filter,
  \Magento\Catalog\Model\Indexer\Category\Flat\State $flatState,
  \Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator $categoryUrlPathGenerator,
  UrlFinderInterface $urlFinder,
  \Magento\Framework\Indexer\IndexerRegistry $indexerRegistry,
  CategoryRepositoryInterface $categoryRepository,

// >>>>> иньекция хелпера
  \Vendor\Module\Helper\UrlPrefix $urlPrefix,


  \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null,
  \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null,
  array $data = []
  ) {
  parent::__construct(
  $context, $registry, $extensionFactory, $customAttributeFactory,
  $storeManager, $metadataService, $categoryTreeResource,
  $categoryTreeFactory, $storeCollectionFactory, $url,
  $productCollectionFactory, $catalogConfig, $filter, $flatState,
  $categoryUrlPathGenerator, $urlFinder, $indexerRegistry,
  $categoryRepository, $resource, $resourceCollection, $data
  );

// >>>>> иньекция хелпера
  $this->_urlPrefix = $urlPrefix;
  }


    /**
     * Get category url
     *
     * @return string
     */
    public function getUrl() {
        $url = $this->_getData('url');
        if ($url === null) {
            Profiler::start('REWRITE: ' . __METHOD__,
                    ['group' => 'REWRITE', 'method' => __METHOD__]);
            if ($this->hasData('request_path') && $this->getRequestPath() != '') {
                $this->setData('url',
                        $this->getUrlInstance()->getDirectUrl($this->getRequestPath()));
                Profiler::stop('REWRITE: ' . __METHOD__);
                // !!!! >>>>>>>>> Правка >>>>>>>>>
                //return $this->getData('url');
                return $this->_urlPrefix->addPrefixCategory($this->getData('url'));
            }

            $rewrite = $this->urlFinder->findOneByData([
                UrlRewrite::ENTITY_ID => $this->getId(),
                UrlRewrite::ENTITY_TYPE => CategoryUrlRewriteGenerator::ENTITY_TYPE,
                UrlRewrite::STORE_ID => $this->getStoreId(),
            ]);
            if ($rewrite) {
                $this->setData('url',
                        $this->getUrlInstance()->getDirectUrl($rewrite->getRequestPath()));
                Profiler::stop('REWRITE: ' . __METHOD__);
                // !!!! >>>>>>>>> Правка >>>>>>>>>
                //return $this->getData('url');
                return $this->_urlPrefix->addPrefixCategory($this->getData('url'));
            }

            $this->setData('url', $this->getCategoryIdUrl());
            Profiler::stop('REWRITE: ' . __METHOD__);
            return $this->getData('url');
        }
        return $url;
    }

}


В самом хелпере urlPrefix ты собственно и делаешь преобразование урла
В моем случае это несколько другая задача - он подтягивает из кастомных настроек мадженто префиксы урла для категорий/товаров и добавляет их в урл.

Пример:

PHP:
class UrlPrefix extends \Magento\Framework\App\Helper\AbstractHelper {

  public $prefixes = [];

  public function __construct(
  \Magento\Framework\App\Helper\Context $context
  ) {
  parent::__construct($context);

  $this->prefixes['category'] = trim($this->scopeConfig->getValue('url_prefixes/catalog/category'));
  $this->prefixes['product'] = $this->scopeConfig->getValue('url_prefixes/catalog/product');
  }

  /** Добавить префикс к полному урлу с http */
  public function addPrefixCategory($url) {
       if ($this->prefixes['category']) {
           return $this->_addPrefix($url, $this->prefixes['category']);
       }
           return $url;
  }

  private function _addPrefix($url, $prefix) {
      $parse = parse_url($url);
      $url_with_prefix = '/' . $prefix . '/' . ltrim($parse['path'], '/');

      if (isset($parse['scheme']) && isset($parse['host'])) {
          $url_with_prefix = $parse['scheme'] . '://' . $parse['host'] . $url_with_prefix;
      }
      return $url_with_prefix;
  }

}

В товарах тот же принцип

3. Если меняешь урл, то нужно менять и роутер, иначе урл не будет открываться.
Для начала желательно почитать, как работает роутер - Для просмотра ссылки Войди или Зарегистрируйся
И также полезно продебаггить загрузку любой страницы Magento\Framework\App\RouterList - станет понятно, как обрабатываются роутеры.

Далее, добавляешь свой роутер, который будет обрабатывать твои модифицированные урлы
Важен порядок роутера в массиве роутеров, т.е., чтобы он запускался ранее стандартного роутера, который обрабатывает урлы товаров и категорий
Здесь порядок сортировки - 39

Код:
//   Vendor/Module/etc/frontend/di.xml

    <type name="Magento\Framework\App\RouterList">
        <arguments>
            <argument name="routerList" xsi:type="array">
                <item name="custom_urlrewright" xsi:type="array">
                    <item name="class" xsi:type="string">Vendor\Module\Magento\UrlRewrite\Controller\CustomRouter</item>
                    <item name="disable" xsi:type="boolean">false</item>
                    <!--У родного urlrewrite sortOrder = 40-->
                    <item name="sortOrder" xsi:type="string">39</item>
                </item>
            </argument>
        </arguments>
    </type>

В CustomRouter можно взять за образец роутер, который нужно заменить и подправить функцию match(),
которая вычисляет и возвращает акшн по урлу
здесь также делаем иньекцию того-же хелпера

PHP:
class CustomRouter extends \Magento\UrlRewrite\Controller\Router {

    // >>>>> иньекция хелпера
    private $_urlPrefix;
    private $_noRouteHandler;

  public function __construct(
       \Magento\Framework\App\ActionFactory $actionFactory,
       \Magento\Framework\UrlInterface $url,
       \Magento\Store\Model\StoreManagerInterface $storeManager,
       \Magento\Framework\App\ResponseInterface $response,
       UrlFinderInterface $urlFinder,
 
      // >>>>> иньекция хелпера
      \Vendor\Module\Helper\UrlPrefix $urlPrefix,

      \Magento\Framework\App\Router\NoRouteHandler $noRouteHandler
  ) {
      parent::__construct($actionFactory, $url, $storeManager, $response, $urlFinder);
          $this->_urlPrefix = $urlPrefix;
          $this->_noRouteHandler = $noRouteHandler;
  }


public function match(\Magento\Framework\App\RequestInterface $request) {

......

   // выдержка из кода

  // Вычисляем оригинальный урл без префикса
  $path_arr = $this->_urlPrefix->getPathWithoutPrefix($request->getPathInfo());
  $pathInfo = $path_arr['path'];

  // Загружаем таблицу рерайтов
  $rewrite = $this->getRewrite($pathInfo,
  $this->storeManager->getStore()->getId());
  if ($rewrite === null) {
      return null;
  }

  // Перезависываем path с префиксом
  if ($path_arr['prefix']) {
     $rewrite->setRequestPath($request->getPathInfo());
  }

  // Если запрошена категория продукта без префикса, возвращаем 404 
  if ($rewrite->getEntityType() == 'category' && !$path_arr['prefix']) {
      $this->_noRouteHandler->process($request);
      return $this->actionFactory->create('Magento\Framework\App\Action\Forward');
  }

  if ($rewrite->getRedirectType()) {
      // Если выполняется редирект, добавляем префикс к пути редиректа
      if ($path_arr['prefix']) {
         $target = $rewrite->getTargetPath();
         $rewrite->setTargetPath($path_arr['prefix'] . '/' . $target);
      }

      return $this->processRedirect($request, $rewrite);
  }

/// --- оригинальный код ----
  $request->setAlias(\Magento\Framework\UrlInterface::REWRITE_REQUEST_PATH_ALIAS, $rewrite->getRequestPath());
  $request->setPathInfo('/' . $rewrite->getTargetPath());
  return $this->actionFactory->create(\Magento\Framework\App\Action\Forward::class);

}

Как-то так.

Т.е., резюмирую
1. Поменять генератор урлов.
2. Добавить роутер, который будет понимать новые урлы
 
Последнее редактирование модератором:
Всем привет,

Как включить пользовательские css и js только на странице CMS или cms-блоке, а не на весь сайт?

Я искал всюду, но не могу включить пользовательские css или js в cms-страницах на основе предоставленных ответов. Я провел исследование, которое должно быть включено в XML-файл обновления макета:

2018-04-01_220459.jpg

Я думаю, вам нужно добавить «контейнер refrence» и вызвать пользовательский файл css из настраиваемой темы.

Например, моя специальная тема css находится здесь: app/design/frontend/theme_vendor/мойвеб-сайт/web/css/_custom.less или custom.css

И мой ccustom js здесь: app/design/frontend/theme_vendor/мойвеб-сайт/web/js/somejshere.js

Что я добавлю в xml-макет обновления xms для вызова пользовательских CSS-файлов и пользовательских js-файлов для страницы или блока?

Любой другой подходящий способ добавления тоже будет отличным. Используется Magento 2.2.x.

Некоторое простое руководство о том, как достичь вышеуказанного, будет очень оценено.

Благодарю.

Try this

Код:
<head>
     <css src="mycss.css" />
</head>

as described here Для просмотра ссылки Войди или Зарегистрируйся
make sure, that css file exists after you deployed static content

if your js depends on jquery or other libraries, read this Для просмотра ссылки Войди или Зарегистрируйся


Спасибо за ответ Алекс, это его упреки. Я уже пробовал это, и это дает мне эту ошибку: ожидается, что один из (referenceContainer, контейнер, обновление, перемещение). Линия 1
 
Последнее редактирование модератором:
Try this

Код:
<head>
     <css src="mycss.css" />
</head>

as described here Для просмотра ссылки Войди или Зарегистрируйся
make sure, that css file exists after you deployed static content

if your js depends on jquery or other libraries, read this Для просмотра ссылки Войди или Зарегистрируйся


Я уже пробовал это, и это дает мне эту ошибку: ожидается, что один из (referenceContainer, контейнер, обновление, перемещение). Линия 1

sorry, it's unreadable )
but i think it's about this bug
Для просмотра ссылки Войди или Зарегистрируйся

they say they fix it in 2.3
 
Последнее редактирование модератором:
Привет всем. Нашел модуль интеграции vtiger-magento тут
Скрытое содержимое доступно для зарегистрированных пользователей!
Но к сожалению он под magento1 заточен, а другие модули довольно дорогие
Скрытое содержимое доступно для зарегистрированных пользователей!
Подскажите, как его переделать под вторую версию
 

Вложения

  • MagentoConnector.zip
    13,7 KB · Просмотры: 4
В EE Magento 2 после нажатия кнопки "В корзину" появляется текст "Мы не можем добавить эту позицию в вашу корзину покупок в данный момент."
Кто сталкивался с этой проблемой, поделитесь решением?

И не могу сохранить в конфигурации магазина адрес электронной почты.
После сохранения конфигурации пишет:
Что-то пошло не так во время сохранения конфигурации: Validate class not found from basename 'Magento\Framework\Validator\EmailAddress'

Проблему решил. Кому интересно- описание по решение с сохранением почты описана здесь- Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование модератором:
При подключении модулей появляется белый экран, в админ иконка модуля активна, при нажатии выбрасывает на dashbord. Конкретно для модулей powr (popup и photogallery) - если хотим подключить модуль в разделе widgets то получаем вот такое сообщение:

Widget
 
Назад
Сверху