文章列表


magento2主题继承

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>Magento的前端允许设计师在基本的空白主题的基础上创建新的主题,在不改变其结构的情况下重用主代码。</p><p>回退系统是主题的继承机制,允许开发人员仅创建自定义所需的文件。</p><p>例如,Luma主题通过继承空白主题的基本结构来使用回退系统。</p><p>Luma主题父级在其theme.xml文件中声明如下:</p><pre class="brush:bash;toolbar:false">&lt;theme&nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&nbsp;xsi:noNamespaceSchemaLocation=&quot;urn:magento:framework:Config/etc/theme.xsd&quot;&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;Magento&nbsp;Luma&lt;/title&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;parent&gt;Magento/blank&lt;/parent&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;media&gt; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;preview_image&gt;media/preview.jpg&lt;/preview_image&gt; &nbsp;&nbsp;&nbsp;&nbsp;&lt;/media&gt; &lt;/theme&gt;</pre><p>&nbsp;</p><p>继承的工作原理类似于重写系统。您可以使用现有的主题(父主题)创建新主题,也可以替换(即覆盖)具有相同名称但位于特定主题文件夹(子主题)中的现有文件。</p><p>例如,如果在app/design/frontend/&lt;Vendor&gt;/&lt;theme&gt;/文件夹中创建一个新主题,并将Magento/blank声明为父主题,则theme.xml文件registration.php</p><p>您已经准备好在新主题中使用整个空白主题结构,包括RWD布局和样式。</p><p>假设您在&lt;theme_dir&gt;/web/cssfolder中有一个特定的.css文件。</p><p>如果删除此文件,回退系统将在&lt;parent_theme_dir&gt;/web/css中搜索该文件</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;<br/></p><p><br/></p>

magento默认的Luma主题

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>Luma主题风格基于Magento用户界面(UI)库,使用CSS3媒体查询处理屏幕宽度,根据设备访问调整布局。</p><p>Magento UI是Magento 2.0中主题开发的一个很棒的工具箱,提供以下组件来自定义和重用用户界面元素:</p><p>The actions toolbar</p><p>Breadcrumbs</p><p>Buttons</p><p>Drop-down</p><p>&nbsp;menus</p><p>FormsIcons</p><p>Layout</p><p>Loaders</p><p>Messages</p><p>Pagination</p><p>Popups</p><p>RatingsSectionsTabs</p><p>accordionsTables</p><p>Luma主题使用了一些空白主题功能。</p><p>供应商/Magento/theme前端空白文件夹中提供的Magento 2.0</p><p>空白主题是Magento的基本主题,并被声明为Luma的父主题。</p><p>从逻辑上讲,Magento为每个主题都有不同的文件夹,它利用了主题继承的优势。</p><p>&nbsp;</p><p>&nbsp;</p><p><br/></p>

magento2的主题结构

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>Magento 2.0有一个新的方法来管理其主题。通常,Magento 2.0主题位于app/design/frontend/&lt;Vendor&gt;/目录中。</p><p>这个位置根据内置的主题而不同,例如Luma主题,它位于invendor/magento/theme前端Luma</p><p>不同的主题存储在不同的目录中,如以下屏幕截图所示:</p><p>&nbsp;<img src="/uploads/images/20230719/ae7b663dbdf68a9931b572c9afe7e4d9.png" title="2.png" alt=""/>&nbsp;</p><p>每个供应商都可以附加一个或多个主题。</p><p>因此,您可以在同一供应商内部开发不同的主题。</p><p>Magento主题结构的工作原理很容易理解:每个&lt;Vendor&gt;_&lt;Module&gt;目录都对应于主题的特定模块或功能。</p><p>例如,Magento_Customer有特定的css and html</p><p><span style="text-wrap: nowrap;">文件夹中查看默认主题的可用模块。</span></p><p><span style="text-wrap: nowrap;">在Magento 2.0结构中,我们有三个管理主题行为的主要文件,</span></p><p><span style="text-wrap: nowrap;">如下所示:composer.json:此文件描述依赖项和元信息</span></p><p><span style="text-wrap: nowrap;">registration.php:此文件在systemtheme.xml中注册主题</span>该文件</p><p>在systemtheme.xml中注册您的主题:</p><p>该文件在系统中声明主题,并由Magento系统用于识别主题。</p><p>前面解释的结构中的所有主题文件都可以分为静态视图文件和动态视图文件。</p><p>静态视图文件没有由服务器进行处理(图像、字体和.jsfiles),而动态视图文件在将内容(模板和布局文件)传递给用户之前由服务器处理。</p><p>静态文件通常发布在以下文件夹中:/pub/Static/frontend/</p><p>&lt;Vendor&gt;/&lt;theme&gt;/&lt;language&gt;</p><p>&lt;theme_dir&gt;/media/</p><p>&lt;theme _dir&gt;/web</p><p>&nbsp;</p><p>&nbsp;</p><p><span style="text-wrap: nowrap;"><br/></span><br/></p><p><br/></p><p><br/></p><p>&nbsp;</p><p>&nbsp;</p>

magento2主题的基本概念

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>Magento主题是一个组件,它使用自定义模板、布局、样式或图像的组合为整个应用程序区域提供视觉设计。主题由不同的供应商(前端开发人员)实现,并打算作为Magento系统的附加包分发,类似于其他组件。</p><p>Magento以Zend框架为基础,采用MVC架构作为软件设计模式,因此有其独特之处。当Magento主题流程成为一个主题时,当您计划创建自己的主题时,您需要担心一些问题。在本章结束时,让我们专注于这些概念来创建我们自己的主题。</p><p>&nbsp;&nbsp;</p><p><br/></p>

magento2页面优化

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>Magento内容管理系统(CMS)管理器是一个非常简单但功能强大的工具,它为我们提供了对Magento页面各个方面的控制。要访问管理区域中的Magento CMS页面配置,请转到内容|页面,如以下屏幕截图所示:</p><p>&nbsp;</p><p><img src="/uploads/images/20230719/6a2c02210e879f0a390edcec40b64402.png" title="1.png" alt=""/></p><p><span style="text-wrap: nowrap;">Magento的默认安装提供了一些演示内容来测试CMS页面。通过选择编辑选项来检查主页内容。</span></p><p>为了SEO的目的,Magento的CMS页面管理有两个主要的SEO侧菜单:页面信息和元数据。</p><p>在页面信息中,您可以设置以下选项:页面标题:这应该与页面的主标题相对应URL密钥:这对于设置一个很棒的搜索引擎友好(SEF)URL标识符以增加SEO排名非常重要,您可以在页面上选择视图状态:这有简单的“启用”和“禁用”选项。</p><p>在元数据中,您可以设置以下选项:</p><p>页面标题:这应该对应页面的主标题</p><p>URL关键字:这对于设置一个很棒的搜索引擎友好(SEF)URL标识符以增加SEO排名非常重要</p><p>商店视图:在这里,你可以选择页面上的视图状态:这有简单的启用和禁用选项。</p><p>在元数据中,你可以设置以下选项:</p><p>关键词:在这里,输入与您的网站范围相对应的关键词。描述:确保以正确的方式使用此字段。一个好的描述意味着增加访问和销售的好机会。你的页面内容必须与元数据对齐,才能实现好的SEO。</p><p><span style="font-size: 16px; font-style: italic; font-weight: bold; line-height: 18px;">&nbsp;产品页面:</span></p><p>这是Magento商店中最重要的一层。除了提供许多选项来配置要销售的产品外,这也使得调整SEO配置以通过搜索引擎页面排名系统增加销售额成为可能。要访问“产品”选项,请导航到“产品|目录”</p><p>出于SEO的目的,产品详细信息有以下选项:名称:您需要对此进行说明;想想人们可能会搜索什么描述:在这里,你必须尽可能详细地介绍产品,以使你的内容独特并对用户有帮助类别:这是产品的类别。搜索引擎优化有以下选项:</p><p>名称:您需要对此进行说明;想想人们可能会搜索什么</p><p>描述:在这里,你必须尽可能详细地介绍产品,以使你的内容独特并对用户有帮助</p><p>类别:这是产品的类别。</p><p>搜索引擎优化有以下选项:</p><p>URL关键字:这是该产品将在其上可见的URL。如果该产品有版本号或某些特定的详细信息,试着把这个放在URL上。</p><p><br/></p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;<br/></p><p><br/></p>

magento2使用seo和搜索

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>Magento有一个针对多个部分的特定SEO配置面板。要访问主要的Magento SEO配置,请在Magento管理区域中输入(http://localhost/packt/admin-packt),您将通过单击Marketing|SEO&amp;Search的菜单找到该面板:</p><p><img class="alignnone size-medium wp-image-1651" src="https://www.magento360.cn/wp-content/uploads/2023/07/2-284x300.png" alt="" width="284" height="300"/></p><p>Magento有一个针对多个部分的特定SEO配置面板。要访问主Magento SEO配置,请在Magento管理区域中输入(http://localhost/packt/admin-packt)点击营销|搜索引擎优化和搜索菜单,您将找到此面板:</p><p><img class="alignnone size-medium wp-image-1652" src="https://www.magento360.cn/wp-content/uploads/2023/07/3-300x153.png" alt="" width="300" height="153"/></p><p>&nbsp;</p><p>在这里,您可以简单地选择“请求路径”进行编辑,并为每个请求路径输入描述,如以下屏幕截图所示:</p><p><img class="alignnone size-medium wp-image-1653" src="https://www.magento360.cn/wp-content/uploads/2023/07/4-300x171.png" alt="" width="300" height="171"/></p><p>&nbsp;</p><p>在“搜索术语”中,您可以通过添加新的搜索术语来根据用户的搜索定义和重定向URL:</p><p><img class="alignnone size-medium wp-image-1654" src="https://www.magento360.cn/wp-content/uploads/2023/07/5-300x156.png" alt="" width="300" height="156"/></p><p>&nbsp;</p><p>&nbsp;</p><p><br/></p>

magento2店铺配置

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p>默认情况下,Magento的基本安装在标题设置中具有标题Magento Commerce。选择一个强大的主标题以在您的网站上获得合适的流量是非常重要的。例如,如果你正在进行体育商店的SEO,你可以将主标题设置为“我的体育商店”,以通过标题增加流量。当人们搜索某个东西时,他们总是首先注意到前面的单词。</p><p><br/></p><p><img src="https://www.magento360.cn/wp-content/uploads/2023/07/1-300x239.png" width="719" height="326"/></p><p><br/></p><p>为您的Magento商业选择一个好的描述性标题。可以并建议通过在“标题后缀”字段中输入网站标题来命名所有页面标题,包括类别和产品。要通过在CMS页面和产品上配置SEO来提高SEO引擎的内容密度,请将“默认描述”和“默认关键字”保持为空。对于本地和非生产环境,请通过将“默认机器人”设置为NOINDEX、NOFOLLOW来防止对网站进行索引。否则,建议将其设置为</p><p>INDEX,FOLLOW.通过使用此配置,您会发现<head>标签的主要SEO参数会自动完成,以便在Magento commerce上运行。</p><p><br/></p>

magento2主题经典案例

<h5 style="color:red;">系统学习magento二次开发,推荐小册:<a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank">《Magento中文全栈二次开发 》</a></h5> <div class="image-container"> <p> <a style="color:blue;" href="https://www.maxiaoke.com/manual/magento_cn_dev.html" target="_blank"> <img src="https://www.maxiaoke.com/uploads/images/20230218/bb9c82995c24d1105676e02f373755f5.jpg" alt="Magento中文全栈二次开发"> </a> </p> </div> <div class="text-container" style="font-size:14px; color:#888"> <p>本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。</p> </div> <hr><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;">有很多电子商务网站使用Magento,其中一些网站真正展示了Magento在主题化方面的灵活性。以下是精选的现场Magento商店,它们真正推动了平台超越了你已经看到的典型Magento主题</p><h3 style="box-sizing: border-box; margin-top: 1.75em; margin-bottom: 16px; font-weight: 300; line-height: 1.43; font-size: 1.5em; font-family: Raleway, 微軟正黑體, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.5px; position: relative; color: rgb(77, 82, 89); text-wrap: wrap;"><a class="reference-link" style="box-sizing: border-box; color: rgb(51, 202, 187); background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; transition: all 0.3s linear 0s; outline: none !important;"></a>Venroy</h3><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;">Venroy是澳大利亚的一家男装百货公司。他们的Magento 2商店(<a href="https://www.venroy.com.au/" style="box-sizing: border-box; color: rgb(51, 202, 187); text-decoration-line: none; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; transition: all 0.3s linear 0s; outline: none !important;">https://www.venroy.com.au</a>) 遵循基本的Magento 2设计原则和RWD设计:</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;"><img src="https://www.maxiaoke.com/uploads/images/20230716/dafe7a1614c78f4302e8bcaf1a19445c.png" alt=""/></p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;">与Magento 2中提供的Luma默认主题相比,该商店的主页以不同的方式构建。例如,Venroy网站的主要导航显示在屏幕的顶部中心,使其对客户高度可见。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;">当与之交互时,商店的类别视图会扩展以显示更具体的子类别:</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;"><img src="https://www.maxiaoke.com/uploads/images/20230716/c7a5c697a25c59ee1b3d0295e63aca58.png" alt=""/></p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;">产品详细视图也是高度定制的,产品、交付和尺寸指南的信息都有自己的单独块:</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;"><img src="https://www.maxiaoke.com/uploads/images/20230716/7e1625616cfd9361baa2bae6a37131b8.png" alt=""/></p><h3 style="box-sizing: border-box; margin-top: 1.75em; margin-bottom: 16px; font-weight: 300; line-height: 1.43; font-size: 1.5em; font-family: Raleway, 微軟正黑體, &quot;Helvetica Neue&quot;, Helvetica, Arial, sans-serif; letter-spacing: 0.5px; position: relative; color: rgb(77, 82, 89); text-wrap: wrap;"><a class="reference-link" style="box-sizing: border-box; color: rgb(51, 202, 187); background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; transition: all 0.3s linear 0s; outline: none !important;"></a>Alcatel Onetouch</h3><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;">阿尔卡特 Onetouch(<a href="http://www.alcatelonetouch.us/" style="box-sizing: border-box; color: rgb(51, 202, 187); text-decoration-line: none; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; transition: all 0.3s linear 0s; outline: none !important;">http://www.alcatelonetouch.us/</a>) 是一个国际移动技术品牌,采用Magento 2来销售其产品:<br/><img src="https://www.maxiaoke.com/uploads/images/20230716/1adebae9c0f6c9f1ef91f4daca36a1d4.png" alt=""/></p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;">正如你所看到的,主页是高度定制的,主页上显示的是特色产品。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;">作为Magento商店的一部分,产品详细信息页面的风格也很吸引人,有足够的屏幕空间显示产品评论、详细信息、技术规范和手册等信息:</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(77, 82, 89); font-family: &quot;Microsoft YaHei&quot;, Helvetica, &quot;Meiryo UI&quot;, &quot;Malgun Gothic&quot;, &quot;Segoe UI&quot;, &quot;Trebuchet MS&quot;, Monaco, monospace, Tahoma, STXihei, 华文细黑, STHeiti, &quot;Helvetica Neue&quot;, &quot;Droid Sans&quot;, &quot;wenquanyi micro hei&quot;, FreeSans, Arimo, Arial, SimSun, 宋体, Heiti, 黑体, sans-serif; text-wrap: wrap;"><img src="https://www.maxiaoke.com/uploads/images/20230716/bf0337240b57b46bc958d86a839c5de8.png" alt=""/></p><p><br/></p>

Kafka延迟操作-DelayedJoin

<p>DelayedJoin是协助组协调器在消费组准备平衡操作时进行相应的处理。当消费组的状态转换为PreparingRebalance时,即准备进行平衡操作,在组协调器的prepareRebalance()方法中会创建一个DelayedJoin对象,并交由DelayedOperationPurgatory负责监视管理。在消费组进行平衡操作时之所以需要DelayedJoin处理,是为了让组协调器等待当前消费组下所有的消费者都请求加入消费组,即发起了JoinGroupRequest请求。每次组协调器处理完JoinGroupRequest时都会检测DelayedJoin是否满足了完成执行的条件。</p><p>在消费组进行平衡操作时之所以需要DelayedJoin处理,是为了让组协调器等待当前消费组下所有的消费者都请求加入消费组,即发起了JoinGroupRequest请求。每次组协调器处理完JoinGroupRequest时都会检测DelayedJoin是否满足了完成执行的条件。</p><p>DelayedJoin相应方法的实现是调用GroupCoordinator相关方法来完成。DelayedJoin.tryComplete()调用的是GroupCoordinator.tryCompleteJoin()方法,该方法判断是否还有未申请加入消费组的消费者,若所有消费者均已申请加入消费组,则表示DelayedJoin满足了完成执行的条件,否则继续等待,直到满足执行条件或超时。而DelayedJoin.onComplete()方法调用的是GroupCoordinator.onCompleteJoin()方法,onCompleteJoin()方法的主要执行逻辑如下。</p><p>2)若消费组的状态不为Dead(消费组的状态会在3.3节进行相应介绍),则先初始化与协调器对应的一个轮值标识generationId,然后根据该消费组下的成员列表是否为空分别做相应处理。若该消费组没有任何成员,则需要构造消息的Value为空的消费组相关元数据消息,即该消费组对应的元数据信息为空,这里是利用Kafka消息压缩清除的原理,当某消息的Value为空时则表示将要删除同Key的消息,组协调器通过这种方式将消费组相应数据从Kafka内部主题(“__consumer_offsets”)中清除。否则,遍历消费组下的每个成员构造JoinGroupResult,不过Leader消费者比Follower消费者多一个当前消费组的元数据信息字段。最后通过回调函数将JoinGroupResult发送给消费者,并对当前和下一次的心跳检测做相应处理。</p><p>(3)将第2步消费组元数据消息写入Kafka内部主题,即在第2步若消费组下已没有任何成员时,只是构造了一条与消费组元数据信息相关的消息,该消息的Value为空,这样当经由本步操作之后,会将该消费组在Kafka内部主题保存的消息删除。DelayedJoin的功能及相应方法已介绍完毕,DelayedJoin.onExpiration()的方法也是调用GroupCoordinator.onExpireJoin()方法,不过该方法没有做任何实现。</p><p><br/></p>

kafka延迟操作

<p>关联小册:</p><p><img src="/uploads/images/20230710/abfeea8b3fa115a76a11593ab8f2072a.jpg" title="1.jpg" alt=""/></p><p><br/></p><p>链接:</p><p><a href="https://www.maxiaoke.com/manual/kafka_base.html" target="_blank" title="kafka入门到实战">https://www.maxiaoke.com/manual/kafka_base.html</a></p><p><br/></p><p>本节先简要介绍Kafka延迟操作的组件,该组件可以辅助Kafka其他组件完成相应的功能,如协助客户端处理创建主题操作、协助组协调器(GroupCoordinator)处理JoinGroupRequest和HeartbeatRequest请求、协助副本管理器(ReplicaManager)处理ProduceRequest和FetchRequest请求。因此在讲解Kafka其他组件之前,先介绍Kafka的延迟操作组。</p><p><br/></p><p><br/>&nbsp;DelayedOperationKafka将一些不立即执行而要等待满足一定条件之后才触发完成的操作称为延迟操作,并将这类操作定义为一个抽象类DelayedOperation, DelayedOperation是一个基于事件启动有失效时间的TimerTask。TimerTask实现了Runnable接口,维护了一个TimerTaskEntry对象,TimerTaskEntry绑定了一个TimerTask,TimerTaskEntry被添加到TimerTaskList中,TimerTaskList是一个环形双向链表,按失效时间排序。DelayedOperation是一个抽象类,具体的延迟操作类继承于该抽象类,分别用来协助相应组件对不同的请求完成延迟处理操作,类图如图3-1所示。</p><p><br/></p><p><img src="/uploads/images/20230713/29541f0e893bd107c69e632fc156409c.png" title="1.png" alt="" width="886" height="458"/></p><p><br/></p><p>DelayedOperation只有一个AtomicBoolean类型的completed属性,用来控制某个延迟操作。在延迟时间(delayMs)内,onComplete()方法只被调用一次。DelayedOperation主要方法如下。● tryComplete()方法:一个抽象方法,由子类来实现,负责检测执行条件是否满足。若满足执行条件,则调用forceComplete()方法完成延迟操作。● forceCompete()方法:该方法在条件满足时,检测延迟任务是否未被执行。若未被执行,则先调用TimerTask.cancel()方法解除该延迟操作与TimerTaskEntry的绑定,将该延迟操作从TimerTaskList链表中移除,然后调用onComplete()方法让延迟操作执行完成。</p><p><br/></p><p>通过completed的CAS原子操作(completed.compareAndSet),可以保证并发操作时只有第一个调用该方法的线程能够顺利调用onComplete()完成延迟操作,其他线程获取的completed属性为false,即不会调用onComplete()方法,这就保证了onComplete()只会被调用一次。</p><p><br/></p><p>● onComplete()方法:是一个抽象方法,由子类来实现,执行延迟操作满足执行条件后需要执行的实际业务逻辑。例如,DelayedProduce和DelayedFetch都是在该方法内调用responseCallback向客户端做出响应。</p><p><br/></p><p>● safeTryComplete()方法:以synchronized同步锁调用onComplete()方法,供外部调用。</p><p><br/></p><p>● onExpiration()方法:也是一个抽象方法,由子类来实现当延迟操作已达失效时间的相应逻辑处理。Kafka通过SystemTimer来定期检测请求是否超时。SystemTimer是Kafka实现的底层基于层级时间轮和DelayQueue定时器,维护了一个newFixedThreadPool线程池,用于提交相应的线程执行。</p><p><br/></p><p>例如,当检测到延迟操作已失效时则将延迟操作提交到该线程池,即执行线程的run()方法的逻辑。DelayedOperation覆盖了TimerTask的run()方法,在该方法中先调用forceCompete()方法,当该方法返回true后再调用onExpiration()方法。</p><p><br/></p><p>Kafka当前的设计onComplete()方法是向客户端做出响应的唯一出口,当延迟操作达到失效时间时也是先执行forceCompete()方法,让onComplete()方法执行之后再调用onExpiration()方法,在onExpiration()方法中仅是进行相应的过期信息收集之类的操作。</p><p><br/></p><p>DelayedOperationPurgatory是一个对DelayedOperation管理的辅助类,为了书写简便,我们将其简称为Purgatory。Purgatory以泛型的形式将一个DelayedOperation添加到其内部维护的Pool[Any, Watchers]类型watchersForKey对象中,同时将DelayedOperation添加到SystemTimer中。</p><p><br/></p><p>其中,Watchers是Purgatory的内部类,底层是一个ConcurrentLinkedQueue,该类定义了一个ConcurrentLinkedQueue类型的operations属性,用于保存DelayedOperation。从Watchers类名可以看出,该类的作用就是对DelayedOperation进行监视。Watchers提供了以下3个对DelayedOperation操作的方法。</p><p><br/></p><p>● watch()方法:用于将DelayedOperation添加到operations集合中。</p><p><br/></p><p>● tryCompleteWatched()方法:用于迭代operations集合中的DelayedOperation,通过DelayedOperation.isCompleted检测该DelayedOperation是否已执行完成。若已执行完成,则从operations集合中移除该DelayedOperation。否则调用DelayedOperation.safeTryComplete()方法尝试让该DelayedOperation执行完成,若执行完成,即safeTryComplete()方法返回true,则将该DelayedOperation从operations集合中移除。最后检测operations集合是否为空,如果operations为空,则表示该operations所关联的DelayedOperation已全部执行完成,因此将该Watchers从Purgatory的Pool中移除。</p><p><br/></p><p>● purgeCompleted()方法:与tryCompleteWatched()方法基本功能类似,区别在于purgeCompleted()方法只单纯地将该operations集合中已完成的DelayedOperation移除,对未完成的DelayedOperation并不尝试将其执行完成。</p><p><br/></p><p>我们可以简单地将Purgatory与Spring Quartz类比,这样对Purgatory的作用就不难理解了。Purgatory相当于Quartz的SchedulerFactoryBean,而DelayedOperation相当于ScheduleFactoryBean所管理的具体Schedule,由Purgatory负责调度。只不过Purgatory除了管理调度DelayedOperation之外,还负责DelayedOperation超时的管理。下面简要介绍Purgatory的两个主要方法。</p><p><br/></p><p>● tryCompleteElseWatch()方法:该方法首先调用待检测的DelayedOperation.safeTryComplete()方法,检测是否能执行完成,若未执行完成,则迭代watchersForKey对应的DelayedOperation检测DelayedOperation是否已完成,若未完成,则将其添加到Watchers中。添加完成后,再调用safeTryComplete()方法再次尝试让DelayedOpeartion执行完成,若还是未完成,再将其添加到SystemTimer中。添加完后再次检测是否执行完成,若已执行完成则将其从SystemTimer中移除可以看到,在整个操作逻辑中多次执行safeTryComplete()方法以及多次检测是否已完成,是以防在操作过程中可能已被其他线程触发执行完成。同时在将DelayedOperation添加到Watchers操作时并没有将原来的Key清理掉,这是因为Purgatory在启动时会同时启动一个ExpiredOperationReaper线程,该线程除了推进时间轮的指针外还会定期清理watchersForKey已完成的DelayedOperation。</p><p><br/></p><p>checkAndComplete()方法:根据所传入的Key,检测该Key对应的Watchers是否执行完成,若未完成,再调用Watchers.tryCompleteWatched()方法进行处理。</p><p><br/></p><p>由此可见,Purgatory对DelayedOperation的管理是通过Watchers来完成的,通过Watchers调用DelayedOperation相应的方法,让DelayedOperation要么在delayMs时间内完成,要么超时。在对Purgatory有了基本了解之后,下面将逐一介绍DelayedOperation实现类的具体作用及实现细节。</p><p><br/></p>