使您的Magento代码更加便携
使您的Magento代码更加便携

使您的Magento代码更加便携

2015年7月28日出版 in 发展
优雅的骆驼的敏捷软件开发
优雅的骆驼的敏捷软件开发
2015年2月17日
移植到Magento 2插件博客封面
Port Magento 1模块到Magento 2带插件
2015年8月13日

我们都知道我们应该写作便携式代码。可重复使用的功能肯定会在效率提升中偿还,并且便携式代码也自然更清晰,更好地组织,更容易维护。

在Magento网站的机构或内部开发中,“完全构建”周期使得落入一个模式和演示被视为一个实体的模式。特征代码在整个一个特定主题中得到了薄薄的,ad-hoc模块变得笨重,因为随着时间的推移,不相关的功能位,并且应用程序在对网站的特定用例的假设上变得过于依赖。并果然,当一个特别的光滑功能与道路​​上的另一个站点变得相关时,它是一个努力追捕所做的所有组件的核心。

 

像这样的场景来源于“匆忙并完成”心态,但保持代码更加分开,可重复使用和可维护不必意味着大约一段时间。一旦你练习它们,以下提示就会产生很大的努力。他们也很难启示。事实上,您可能在第三方扩展中一直看到它们–否则称为可移植性是强制性的场景。所需的最重要的努力只是有点进取。

“全部”方法

作为经常缠结主题和功能的熟悉模式的一个非常快速的例子,让我们设想一个假设的站点构建。纳入规定的主题是以下两个功能:支持在产品详细信息页面上显示媒体库中的YouTube或Wistia嵌入视频(使用直接从视频服务中拉动的信息,如缩略图),以及所示的定制徽章产品清单页面。

随着我们在主题和这些特征的工作中,我们的代码基础开始增长,而且我们的最终结果通常不会最终查看这样的东西:

我想象我们对我们视频和产品徽章所需的各种块,助手和观察者方法已经在一个模块(MyCompany_myStore)中被列为一起。这将是在这里和在那里添加一种方法的自然生长。还有自然是主题结构本身的添加结束了关键模板的直接覆盖,毫无疑问毫无疑问主题中的许多其他模板。所有必要的布局更改都会发生在主题的本地消息文件中,当然,当它未显示时,任何必要的样式都已被纳入主题的主样式。

这两种功能都可能依赖于产品属性。对于视频,这可能是一个或多个嵌入代码的文本属性。对于徽章,具有预定义徽章文本的多选择属性。因此,对于作品中的额外扳手,我们假设我们通过Easy Admin接口创建这些属性。

查看上面的文件列表,肯定没有关于视频功能的密钥逻辑所在的线索。如果我们想追踪那么下来,我们必须开始在代码本身看。

要达到更清晰,更便携的结构,我们需要在开发开始之前返回并询问重要问题:仅仅是我们主题的一部分,以及什么构成功能?

古老的格言:担心的分离

这个问题可能看起来很明显,但它需要练习,使其成为您的一部分心态,每次坐下都要坐下来扩展一段发展。如果我们询问我们假设的站点设计的哪些部分仅为“主题”组件,我们将快速识别我们的两个注意功能–视频和产品徽章– don’t fit the bill.

通过这一开始,从一开始,而不是将我们的工程代码一起列出,我们为这些功能创建了两个单独的模块:mycompany_videos和mycompany_badges。前者可能包含一个模型,用于从YouTube或WISTIA获取信息,并在合适的时间来保存观察者,而后者可能有一些帮助程序方法可以在适当的输出中清洁产品属性。两者都肯定包含块。

通过这一死亡的第一步,我们实际上已经为我们的代码组织工作了奇迹。即使我们不再走了,我们至少有一个出发点,用于一目了然地追踪我们的功能代码。

这里的警告是,您肯定可以为每个特征的单独模块肯定采取这种方法。我们不想最终包含30个包含单辅助方法的模块!将小型功能分组为捕获 - 所有模块都很好。 (实际上,我们示例中的简单功能,实际上乘坐了他们现在的形式,但我们假设他们的覆盖范围在现实世界中更广泛。)这是那种变得更容易和更多的判断呼叫直观您越多,您询问了功能和演示的分离问题。

主题考虑因素

它位于我们的主题文件中,橡胶在分离特征时遇到道路,在这里有更多的挑战比第一步在这里。

简单的分离

对于初学者来说,我建议专注于特色的代码根本不应该进入特定于特别的主题。如果可能,它应该放在回退方案中的通用位置:基本/默认值或RWD /默认值如果文件扩展或依赖Magento的响应主题。如果我们在产品详细信息页面上构建一个嵌入式视频,为什么要依赖于任何特定的主题?通过将我们的文件定位在更多全球范围内,我们确保在我们添加到我们的Magento安装的任何商店中提供了我们的功能,而无需将组件从主题从主题从主题复制到主题。更吝啬,它马开始询问其他问题。没有特定的主题,在哪里工作 our changes go?

最简单的答案是用于布局文件。我们已经为我们的不同功能定义了不同的模块;这些模块也可以定义自己的布局文件。所以现在,而不是功能相关的布局添加空间与local.xml中的一般主题更改共享空间,我们有videos.xml和badges.xml。

模板

对于模板文件,事情会变得棘手。我们应该首先将我们的逻辑转移到分开的全新模板中。核心主题提供了一个体数的文本列表块(在布局中定义了“核心/ text_list”),它将有助于此操作;这些块类型的儿童将自动输出。然而,在我们的情况下,我们几乎肯定会必须覆盖两个核心模板的标记:产品列表模板(用于输出我们的徽章)和媒体模板(用于输出我们的视频)。

一个策略是使用布局XML来更改右侧块的模板路径。 ( <动作方法=“沉淀件”><path>file.phtml</path></action>)这是较小,触摸模板的精细解决方案。然而,对于许多人来说,这是有问题的。如果我们更改产品列表模板的路径,我们肯定会完成使其清除功能代码所在的目标,而是以主题的可维护性成本。如果另一个开发人员继承了我们的代码,并寻找正确的地方来调整产品列表模板,他或她可能会陷入困惑。

值得注意的是,如果我们扩展了Magento的响应主题,则添加了更多的文本列表块,可以帮助解决我们的问题。例如,我们可能会发现响应的特定的“product_list.name.Amter”块可能是正确的,可以正确地将我们的产品徽章放置而不触摸产品列表模板。事实上,我们可以将其与JavaScript中的一些DOM操控配对,以便在我们想要的位置移动内容–说,在产品名称之前而不是之后。 (用这个最后的技术不要疯狂。在我刚才提到的例子中,它只是因为内容已经放置了 几乎 正好在哪里需要,页面的语义或代码的可维护性不会受到大量影响。)

如果所有其他人失败,请继续,并使用主题中的模板覆盖以包含适当的功能逻辑。或者尝试此方法的大小:鼠标在主题中需要它们需要它们的内容,然后使用它们使用特定于模块的模板文件添加内容。是的,此策略仍然取决于特定主题,以便工作的功能。但是,占地面积尽可能小(和通用),而主事件仍包含在特定于该功能的主题文件中。

依赖资产

对于JavaScript和CSS,将与主题分开的功能相关的代码相当简单。唯一的粘性问题是,特定功能的大小是真正足以保证单独的JS或CSS文件,因为这些文件将增加页面加载所需的HTTP请求的数量,除非您为这些类型的文件启用文件合并。

但是,值得注意的是,Magento的响应主题及其与Sass / Compass的CSS编译采用代码组织在不需要单独的最终CSS文件的情况下更轻松。在这个新的范例中,STYLES.CSS由关注的几个“部分”文件的内容编译。由于这种结构,保持与特定功能相关的样式干净分离如添加新的部分(例如,Skene / Frontend / MyStore / MyStore / Default / SCS / Module / _Badges.scs)并在样式中导入。了解有关使SASS的一部分成为您的工具集 玛托托的知识库.

作为最终说明,一个特征的真正独立的CSS文件确实携带能够驻留在上面规定的后退主题中的益处,从而没有对特定主题的依赖性。这显然对结构CSS显然比美容患者更重要,并且它再次归结为判断特征的复杂性的判断。

将其保留在代码中

我们的示例功能依赖于几个不同的产品属性,我在管理员中轻松添加了一个要点的点。 admin属性管理是商家的强大工具,用于添加到他们的目录 内容 不需要触摸代码。为分层导航,产品比较或产品详细信息页面上的规格列表创建属性是此接口的很大用途。

但是,当一条站点功能依赖于特定属性时(如我们的视频嵌入代码和徽章文本属性的情况),求助于管理员输入的内容是一个糟糕的解决方案。如果在从暂存环境中迁移到生产时会错过任何特定属性,则何时遗漏?如果它的定义在两者之间不一致怎么办?我们的特征代码的清晰度和可重用性也会显着遭受巨大的遭受痛苦,因为只能通过查找使用位置来辨别必要的属性。 (甚至那么,只能猜到它们的确切定义。)

这种属性属于具有特征的其余部分的代码中,并且适当的位置是模块安装/升级脚本。您可以在Magento核心代码中找到一个大量的例子。升级脚本位于模块的SQL目录中,并使用与其目录名称匹配的设置资源,必须在etc / config.xml中的节点中定义为“全局/资源/ * / setup”。 Class Mage_catalog_model_resource_setup是创建产品属性所必需的,在升级脚本中使用AddAttribute方法完成。

如果您不熟悉它,这种技术可能会令您恐吓,但这是编写可靠和可维护的功能代码的重要步骤。通过一点练习和一些核心代码布使用indAttribute的检查,它将迅速成为旧​​帽子。 (检查mage_catalog_model_resource_setup的_preparevalues方法及其祖先mage_eav_model_entity_setup您可以在任何产品属性上设置的配置值的即时摘要。)

相同的原则可以应用于您的功能的任何内容所期望存在,包括CMS静态块或自定义变量。 (并不敢于硬编码产品或类别ID。创建系统配置值以捕获此类信息。更多关于下面的系统配置。)可以在升级脚本中创建任何类型的内容,以及代码依赖于它,代码是它所所属的。

注意:如果要创建功能依赖的CMS内容,则相应类型的升级脚本实际上是数据升级脚本,它在CONFIG.xml中共享相同的安装资源定义,但驻留在数据目录中而不是SQL中。主要区别在于,通过运行时间数据升级脚本完全启动Magento应用程序,因此您可以使用标准型号逻辑来创建和保存您的内容。

你能把它关掉吗?

对于最后一节,考虑以下问题:如果我们需要删除网站功能,该怎么办?是否可以轻松完成,或者将尝试删除几行代码导致狩猎,了解现在使一切爆炸的所有小引用和依赖项?

我想这个问题的答案本身就是一个证明如何编写代码的便携式。无论如何,为什么不允许在我们网站上启用/禁用功能而无需触摸代码?我们已经走得很远,使我们的特征代码尽可能自包含;为什么不加倍额外的英里并添加开/关开关?这几乎荒谬容易。

毫无疑问,熟悉Magento管理员的系统配置区域,其中一系列站点设置直播。我们的视频和产品徽章模块需要的是此管理员部分中的几个是/否值,以控制是否启用了这些功能。如果你不熟悉创造这样的价值,那么就没有任何恐惧。任何模块的etc / system.xml中的一个简单的XML结构定义它们,打开核心代码库中的一些这样的文件将迅速冻结过程。如果您想创建自己的系统配置部分而不是添加到现有部分,因此需要更多的努力,因为这些部分携带特定的管理员用户权限。但即使这也只需要检查一系列模块配置文件– etc/adminhtml.xml – to get a handle on.

一旦定义了这些值,它是一个简单的问题,即在我们的模块的适当入口点中调用MAGE :: getStoreConfig以检查功能是否已启用。 (任何用于阻止在布局XML中的方法的调用,例如驻留件,也可以使用“ifconfig”属性在此值上执行其执行条件。)

便携式代码的隐藏福利

我们假设的代码库的最终快照可能看起来像这样:

在此示例中,我们选择在我们的布局文件中使用沉积件,以更改产品媒体模板的位置,以“视频”命名空间下的新介绍。我们已经设法避免使用产品徽章的任何模板覆盖,并且使用此功能使用完全新的模板。自然而然,我们的新模块包含适当的安装/升级脚本来设置所需的产品属性,以及定义系统配置值以实现这些功能。

完全改善的新结构使它清楚地清楚地找到与某些功能相关的代码,并拔出这些功能的代码在其他地方使用将更容易。即使我们从未有机会将我们的代码侵入其他网站,即使备受较大的可维护性也肯定会支付股息。

这些是发展水平的好处,但它们甚至不是唯一的福利。在本文中,我一再提到了从功能分离主题所需的心态,这是一个周期性的过程。以这种方式思考您的项目将导致更好组织的代码,并且始终写入更好的代码将立即回来并提高您的思考方式。在敏捷方法中,我在开始时概述的CodeBase结构可能会通过简单的“产品列表页面”和“产品详细信息页”任务来源出来的项目积压。从功能分离形式实践的开发人员将迅速认识到视频和产品徽章功能应该得到升高;他们应该从主题谈论,优先考虑并开发。使用这样的日常心态,您将提供更快的工作代码,您将推动与客户或项目所有者更好的对话,并且您将实现更好的基础,以便以有机方式扩展您的功能。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

本网站使用AkisMet减少垃圾邮件。 了解如何处理评论数据.

最近的帖子查看全部
3月1日,2021年

Covid的巨大加速要求再次欺诈和消费者虐待警惕

2月3日,2021年

社交媒体在科迪德自然时期的增长’s One

1月5日,2021年

替代社交媒体

您是否注意到您的Facebook和Instagram内容似乎越来越少,并且每次通过都会越来越少?用于达到的帖子 […]