分类
安装使用

Magento2.4.1 后台分类编辑里显示前台对应分类商品展示总数方法

在后台分类编辑里,左侧的分类树中,每个分类ID后面的商品总数始终是该分类下所有商品的总数,和前台已展示的商品总数不一致。通过深入挖掘,发现一个核心文件的代码存在低级逻辑错误,怀疑是开源版本的一个被阉割后的人工BUG。原文件为

\vendor\magento\module-catalog\Model\ResourceModel\Category\Collection.php

先翻看到以下方法的位置:

public function loadProductCount($items, $countRegular = true, $countAnchor = true)

{

……
        if ($countAnchor) {
            // Retrieve Anchor categories product counts
            $categoryIds = array_keys($anchor);
            $countSelect = $this->getProductsCountQuery($categoryIds, (bool)$websiteId);
            $categoryProductsCount = $this->_conn->fetchPairs($countSelect);
            foreach ($anchor as $item) {
                $productsCount = isset($categoriesProductsCount[$item->getId()])
                    ? (int)$categoryProductsCount[$item->getId()]
                    : $this->getProductsCountFromCategoryTable($item, $websiteId);
                $item->setProductCount($productsCount);
            }
……
}
 
其中 $categoriesProductsCount 这个变量是错误的,前后文响应看应该是变量 $categoryProductsCount 才能前后匹配 。这处修改好后,我们再来到以下方法的位置:
 
private function getProductsCountQuery(array $categoryIds, $addVisibilityFilter = true): Select
{
       $categoryTable = $this->getTable(‘catalog_category_product_index’);
……
 
这个表名 catalog_category_product_index 也是不正确的,因为这个表名是默认STORE ID=0 的表,正常情况下这个表里不会有数据的, 所有分类商品索引只有在STORE级别才有数据,我们可以修改为:
 
        $tableName = ‘catalog_category_product_index’;
        $storeId = $this->getProductStoreId();
        if (!empty($storeId)){
            $tableName .= ‘_store’.$storeId;
        }
        $categoryTable = $this->getTable($tableName);
     
具体应用的时候,可以查看自己数据库里分类商品索引对应的表名是否匹配。 在修改过这两处后,后台效果如下:

以上图示的效果,默认全局店铺下会显示分类下所有商品总数,而选择好店铺后,仅显示可展示的总数,对于有需要如此修改的需求,可以考虑复写这个核心文件,改动上文提到的两处对应代码即可。

分类
安装使用

Magento 2 + Elasticsearch 产品列表排序修改

本文来自社区成员 土豆 的投稿

在Magento2.4.x 版本之前也有人介绍过商品列表默认产品排序为新产品在前面的方法,但是在Magento2.4.X 强制使用Elasticserach后就不生效了。

例如:

https://forum.magentochina.org/t/magento2%E5%A6%82%E4%BD%95%E4%BF%AE%E6%94%B9%E9%BB%98%E8%AE%A4%E7%9A%84%E4%BA%A7%E5%93%81%E6%8E%92%E5%BA%8F%E6%96%B9%E5%BC%8F/130

if ($this->getCurrentOrder()) {
     if(($this->getCurrentOrder())=='position'){
             $this->_collection->setOrder('entity_id','desc');
     }
     else {
             $this->_collection->setOrder($this->getCurrentOrder(),$this->getCurrentDirection());
     }
 }

但是在 Magento2.4 开始强制使用 elasticsearch (简称ES) 后,以上方法已经不能生效。简单的说是因为FULLTEXT全文索引的缘故。由于使用了ES 后, 列表的相关商品数据都会通过索引进入ES 缓存里, 而使用类似 entity_id desc 这样的无法生效,因为 entity_id 并没有进入到ES 缓存数据的字段中。通过观察, Magento2.4.x 的 ES 里缓存的数据都是由属性为单位进入到ES 缓存中, 但是商品的 created_at 字段未进入到ES。 我在这里介绍只需要2个步骤,就可以让 created_at 属性进入到ES并作用于商品列表页默认叠加排序 (也包括搜索页)。

首先, 商品 created_at 属性在后台商品属性编辑里都无法查询到(因为它是Magento2里的隐藏属性),可以通过直接修改数据库或者更新脚本等方法, 更新以下SQL:

UPDATE catalog_eav_attribute AS cea
     INNER JOIN eav_attribute AS ea
         ON ea.attribute_id = cea.attribute_id AND ea.entity_type_id = 4
 SET cea.used_in_product_listing = 1, cea.used_for_sort_by = 1
 WHERE ea.attribute_code IN ('created_at');

以上更新会让 created_at 属性进入到商品列表字段和SORT BY的应用, 然后执行

php bin/magento index:reindex

刷新索引,等刷新完毕后, 再次查看ES 的商品缓存数据就包含了 created_at 数据。第一步完成。

然后,需要修改商品列表的 Toolbar 类, 原生文件是:

vendor/magento/module-catalog/Block/Product/ProductList/Toolbar.php

我们需要利用plugin修改它其中2个方法。 先在你已有的自定义模块 etc/di.xml 文件中添加以下代码:

<type name="Magento\Catalog\Block\Product\ProductList\Toolbar">
	<plugin name="yourpackage_yourmodel_block_productlist_toolbar"
		type="Yourpackage\Yourmodel\Plugin\Block\Product\ProductList\Toolbar"
		sortOrder="10000" />
</type>

其中 sortOrder 设置为10000的缘故是让这条修改权重尽可能的最后执行, 考虑到可能其他某些插件会优先执行其他算法。然后添加

Yourpackage\Yourmodel\Plugin\Block\Product\ProductList\Toolbar.php

该文件代码如下:

<?php
namespace Yourpackage\Yourmodel\Plugin\Block\Product\ProductList;

use Magento\Catalog\Block\Product\ProductList\Toolbar as VendorProductToolbar;

class Toolbar extends MagentoToolbar
{
    public function afterSetCollection( VendorProductToolbar $toolbar, $result) {
        $collection = $result->getCollection();
        if (!$collection->isLoaded()){
            $collection->setOrder('created_at','DESC');
            $result->_collection = $collection;
        }
        return $result;
    }
    
    public function afterGetAvailableOrders(VendorProductToolbar $toolbar, $result) {
        if(isset($result['created_at']) || is_null($result['created_at']) ){
            unset($result['created_at']);
        }
        return $result;
    }
}

其中 afterSetCollection 是最终增加 created_at 属性的 SORT 排序, 在使用ES的情况下, 每个应用于 SORT的属性字段都要事先单独插入到ES缓存中(就是第一步所作的内容),并设置 used_for_sort_by 为真,否则无法自动查询到匹配的排序字段。正是因为我们设置了 used_for_sort_by 为真,在商品列表 sort by 下拉窗口默认就会展示出来created_at,所以我们需要用 afterGetAvailableOrders 方法去隐藏该选项。

完成以上操作后,刷新缓存后就可以看到效果了。

分类
安装使用

Magento2.4实战百万商品之二:商品篇

前言:前一篇谈到的程序安装并不是Magento2.4的开始,我们有N种办法去获得一套安装完整的最新版Magento2.4。而在进入后台开启产品管理的那一刹那,才是Magento2.4真正的开始。

这篇准备了很长时间,一方面觉得需要知无不言言无不尽,另一方面又觉得很多并非是实用的技巧,过于理论化的东西并非大多数读者喜欢。毕竟题为百万商品,还是尽可能的把大致框架描述清晰。

目录:

  • 1. 商品和页面(Products & Pagas)
  • 2. 商品的内容(PGC & UGC from Products)
  • 3. 页面和用户(Pagas & User)
  • 4. Magento2.4后台分类以及商品编辑
  • 5. 商品批量处理(采集、上传)
  • 6. 多站点商品管理
分类
安装使用

Magento2.4实战百万商品之一:安装篇

  • Magento2.4.0已经发布,为了重新认识这个越来越复杂的系统,决定从安装开始,边摸索边进行。
  • 硬件: 母鸡为Windows的R5-3600,64G, 512*2 NVME,通过hyper-v虚拟出3台内网互通的虚拟机,且全新安装Centos7.8.2003 Minimal
  • 架构: 1台机器配置Web、Mysql、Redis,作为主服务器),第2台机器配置ElasticSearch,第3台机器配置Varnish

            这三台机器的配置、内网IP和hostname分别为

            6核/16G,192.168.1.1,server1

            1核/4G,192.168.1.2,server2

            1核/4G,192.168.1.3,server3

分类
安装使用 视频

[视频]Magento2.4.0 安装与卸载过程 基于Ubuntu的LAMP+ElasticSearch(docker)最简方式

视频如果不清晰或太小,请全屏观看或去B站观看。

本文文字内容:

Magento2.4.0 尝鲜安装记录 Ubuntu 20.04 LTS

分类
安装使用

wsl2安装magento2+vscode远程开发

今天尝试在本地win10环境中安装Magento2.3.5-p1,之前蟋蟀哥哥告知我Magento2在win上安装确实有不少问题,苦于没办法将win10系统格式化换成Linux,无奈之下,只能使用win10自带的WSL2安装Ubuntu18.04用作Magento2的本地开发运行环境。下面一步步讲解如何进行安装:

1,首先需要开启windows子系统

开始->设置 -> 应用->程序和功能 -> 启用或关闭Windows功能 -> 勾选 适用于Linux的Windows子系统

确定后重启机器。

2.安装子系统(以ubuntu为例)

打开应用商店,搜索ubuntu,找到ubuntu18.04(不要安装20.04,因为20.04默认php为7.4,magento2.3.5不支持php7.4),点击获取安装

3. 升级wsl1至wsl2

由于本机系统版本是1909,升级后才可以使用wsl2,通过预览版体验升级到2004后查看

当前ubuntu运行在wsl1上,需要转换至wsl2

升级内核组件地址:
https://docs.microsoft.com/zh-cn/windows/wsl/wsl2-kernel

点击下载  一路next即可 安装完成后即可继续转换了

启动子系统中的ubuntu18.04

4. 安装运行环境(nginx+php+mysql)详细过程不赘述了

  • 安装nginx
    • Sudo apt-get install nginx
    • Sudo service nginx start
    • 安装php
      • Sudo apt-get install php7.2 php7.2-bcmath php7.2-curl php7.2-gd php7.2-mbstring php7.2-mysql php7.2-xml php7.2-fpm
      • Sudo service php7.2-fpm start
    • 安装mysql/mariadb
      • Sudo apt-get install mariadb-server mariadb-client
      • Sudo service mariadb start
    • 安装composer
      • Sudo apt-get install composer
  • 配置nginx
    • 创建目录/var/www/html/m2/
    • 进入/etc/nginx/sites-available目录
    • 创建文件magento2内容如下
upstream fastcgi_backend {
  server  unix:/run/php/php7.2-fpm.sock;
}
server {
  listen 80;
  server_name m2.local.com;
  set $MAGE_ROOT /var/www/html/m2;
  include /var/www/html/m2/nginx.conf.sample;
}

注:由于nginx.conf.sample中已包含官方预设的nginx配置,所以直接使用即可

此处文件保存完后执行以下命令启用已配置的magento虚拟主机:

ln -s /etc/nginx/sites-available/magento /etc/nginx/sites-enabled

暂时不要重启nginx

6. 安装magento 2.3.5

(1)源码获取
①安装可以使用git克隆代码
②可以使用官网下载的zip包
(2)安装系统(假设你已经拿到源码包)
①将下载的代码存放在/var/www/html/m2文件夹中
②执行composer update
③在mysql数据库中
④进入该目录执行命令
⑤php -f bin/magento setup:install –base-url=http://m2.local.com/ –backend-frontname=admin –db-host=127.0.0.1 –db-name=m2 –db-user=root –db-password=12345678 –admin-firstname=liu –admin-lastname=x –admin-email=306511433@qq.com –admin-user=admin –admin-password=admin123 –language=en_US –currency=USD –timezone=Asia/Shanghai –use-rewrites=1

(3)执行以下命令直到完成

php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy -f
(4)开发过程中,将系统运行模式改为开发者模式:
php bin/magento deploy:mode:set developer

获取子系统的IP(wsl2中系统网络是由一个虚拟的以太网适配器提供),可执行ifconfig查找eth0的inet值

(6)在win10的host文件中配置 172.31.31.34 m2.local.com,将该域名指向这个地址
(7)重启nginx和php7.2-fpm即可访问已安装的magento2.3.5系统了

7. 配置Vscode远程开发(假设已安装vscode)

(1)在插件管理中搜索 Remote – WSL

(3)点击安装即可
(4)此时,点击左侧菜单栏中远程资源管理器,即可看到已经安装的ubuntu18.04

(5) 点击连接即可将vscode的工作区切换到子系统中

(6) 切换至资源管理器会显示已连接到远程。

(7) 点击打开文件夹,输入子系统中magento2.3.5代码所在文件夹

(7)点击确定即可打开远程目录进行开发工作。
(8)验证:
为确保Magento系统功能不受干扰,在根目录建立一个PHP文件test.php

修改nginx.conf.sample

访问http://m2.local.com/test.php

magento电商网站开发托管 微信小程序开发托管 企业网站开发托管 大中小企业技术支持服务,SEO/SEM服务。有需求的加 本文作者,联系方式见上图

本文版权为Magentochina.org独有,不允许转载.

分类
安装使用 视频

[视频]Magento2.3.5从安装到卸载

这是社区成员急云录制的一款Magento2.3.5的安装卸载视频教程。

请全屏播放

# 文字内容:

原文地址:https://forum.magentochina.org/t/magento-235-%E5%9C%A8ubuntu-2004-%E5%AE%89%E8%A3%85%E8%AE%B0%E5%BD%95-lamp/696

乌班图 20.04 lts 发布了 默认是php7.4 Magento2.3.x貌似不支持 就有了这个安装记录

首先解决php的问题 安装php7.3 采用ppa的源

sudo add-apt-repository ppa:ondrej/php

安装LAMP必要组件mariadb apache2 php7.3

sudo apt install apache2 mariadb-server php7.3 php7.3-bcmath php7.3-curl php7.3-gd php7.3-intl php7.3-mbstring php7.3-soap php7.3-zip php7.3-xml php7.3-mysql php7.3-xsl

开始设置

sudo mysql_secure_installation

mariadb初始化 常规选项 自己看不解释
然后sudo mysql 设置root登录模式(可选)

use mysql
\g update mysql.user set plugin='mysql_native_password' where User='root';
\g flush privileges;
\q

登录mysql -u root -p
创建新数据库新用户

create database magento;
grant all on *.* to magento2@'%' identified by 'Magento' with grant option;

数据库名: magento
用户名:magento2 用户密码:Magento

设置apache2 开启重写

sudo a2enmod rewrite

修改配置

sudo vi /etc/apache2/sites-available/000-default.conf

行末添加下列内容

<Directory "/var/www/html">
AllowOverride all
</Directory>

保存退出
重启apache2

systemctl restart apache2

环境完毕可以去安装magneto2.3.5了

分类
安装使用

Magento2下载安装

安装Magento2的先决条件

  1. 拥有一台可以访问外网的Linux服务器.(Windows下安装太麻烦,并且速度慢,所以并不建议使用,如果您执意使用windows,如果您使用windows,请参考windows下使用WSL2安装Magento2)
  2. 有过LNMP环境搭建经验.

Magento2系统环境需求

  1. Php大于7.2版本
  2. MySQL大于5.6
  3. Nginx1.x+或者Apache2.4+
  4. Php OPCache
  5. 可选组件:Redis,Varnish,Elasticsearch,RabbitMQ.

下载Magento(多种方式)

安装Composer之后在网站根目录运行下面命令,创建composer项目:
composer create-project --repository=https://repo.magento.com/ magento/project-community-edition .
运行后,命令行会提示您输入验证信息 该信息需要去Magento官方获得,首先打开Magento Marketplace,并注册登陆。 然后点击屏幕右上方你的头像附近的下拉菜单里的My Profile,再点击Access Keys。 后然点击Create A New Access Key,创建你自己的Access Key。 创建成功后页面会显示你的access key: Public Key就是composer命令行中询问的Username. Private key就是Password. 输入完命令之后按回车键,终端会回显大量下载数据,如果在国内因为网络原因速度会比较慢,请大家耐心等待.

git克隆Magento2到当前目录:

该方式适合:

1.服务器在国外

2.有git经验

3.适合开发者,因为直接克隆的是开发版,不是发行版


如果在墙内,推荐HTTP或者Composer下载安装.

进入github下载自己需要的版本:

https://github.com/magento/magento2/releases

如果速度慢,可以考虑使用本站镜像:

https://download.magentochina.org/magento/2/

 

如果你选择对了服务器主机商,可能会提供Magento2的一键安装服务。

目前提供Magento2一键安装的服务商有:

  1. 本站专业提供Magento2主机服务,提供手工定制安装.
  2. digitalocean,提供镜像安装服务
  3.  
该方式只适用于专业开发者,小白不要尝试:
git clone --recursive git@github.com:magento/magento2-kubernetes-devbox.git magento2-devbox

开始安装

不管您是使用的什么方式下载Magento,下载完成后首先需要修改Magento文件的文件权限。

如果您是开发环境,可以直接在Magento2的根目录下运行:

chmod -R 777 . && chown -R www:www .

www:www是我服务器webserver的用户及用户组,请修改成自己服务器的。

运行完成后,直接访问您的域名。如果没有问题,url会跳转到/setup/,如何你和我显示的一样,就证明可以开始安装了:

然后点击同意并安装Magento(Agree and Setup Magento)

第二步是首先检查你的服务器环境是否符合当前Magento版本的需求

 

如果服务器环境没有问题,就会像下图所示,如果服务器环境不符合Magento的环境需求,建议根据提示修改自己的 Magento环境。遇到困难可以来我们的问答板块进行交流

剩下的就不多说了,就是根据web提示填写响应的内容并下一步就行。安装成功之后,会提示:

Magento2命令行安装适合老炮使用,新手不建议使用。

因为该步骤跳过了环境自检模块,可能安装好后可以使用。但是某些模块会有莫名其妙的问题。

一定要熟手才能使用,一般是用来进行自动化安装。


php bin/magento setup:install 
--base-url="http://yoururl.com/" 
--db-host="localhost" 
--db-name="dbname" 
--db-user="dbuser" 
--db-password="dbpass" 
--admin-firstname="admin" 
--admin-lastname="admin" 
--admin-email="user@example.com" 
--admin-user="admin" 
--admin-password="admin123" 
--language="en_US" 
--currency="USD" 
--timezone="America/Chicago" 
--use-rewrites="1" 
--backend-frontname="admin"

命令参数可以根据字段名理解,想要了解网站的安装命令请查看官方文档.

恭喜你完成安装!

如果你在安装过程中遇到了问题,请去我们的问答板块交流一下吧,别忘了提供你完整的安装步骤和信息。