Drupal http://indrupal.com/ zh-hans Drupal 9 升级到 Drupal 10 干货详解 http://indrupal.com/node/408 <span>Drupal 9 升级到 Drupal 10 干货详解</span> <span><span>yunke</span></span> <span><time datetime="2023-08-23T19:15:04+08:00" title="2023-08-23 19:15 星期三">周三, 08/23/2023 - 19:15</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>首先,升级到Drupal 10前,需要先升级到Drupal 9.5 ,升级到Drupal 9.5比较容易,属于大版本内升级,具体过程这里略过</p> <p>升级到Drupal 9.5后,安装CKEditor 5模块,并在“管理-配置-内容写作-文本格式和编辑器”中,在用到富文本编辑器的条目中,手动更新CKEditor 4 到 CKEditor 5</p> <p>然后,如果安装了以下这些被弃用的模块,那么卸载它们:</p> <ul> <li>CKEditor (CKEditor 4)</li> <li>Color</li> <li>RDF</li> <li>Quick Edit</li> <li>HAL</li> </ul> <p>安装启用新的默认主题并重新设置主题,卸载弃用的主题</p> <p>接着升级所有模块到兼容D10,然后运行下方命令升级核心到Drupal 10:</p> <pre> <code class="language-bash">composer require drupal/core-recommended:10.0.0 drupal/core-composer-scaffold:10.0.0 drupal/core-project-message:10.0.0 --update-with-all-dependencies</code></pre> <p>现在代码库已经升级到D10了,接着升级数据库:<br /> 先修改配置文件(settings.php)中的:$settings['update_free_access'] 项的值为TRUE,这样将允许你在不登录维护账号的情况下也能执行升级脚本,后续完成升级后记得改回: false<br /> 运行升级脚本:update.php</p> <p>顺利的话,现在你已经升级到Drupal 10了,可以继续升级到最新版本的Drupal 10</p> <p>现在做一些升级完成的善后工作:<br /> 1、使用Apache的用户注意:.htaccess 文件有改变,需要在新的文件上手动添加自定义的部分内容<br /> 2、默认的robots.txt文件已更新为不允许索引oEmbed媒体链接,替换该文件,有自定义部分则手动合并<br /> 3、站点services.yml文件有更新,需要手动合并<br /> 4、修改前述$settings['update_free_access'] 项的值为false<br /> 5、进入系统后台,查看状态报告页面以及日志页面,看是否有其他问题,一并修复</p> <p><strong>Drupal 10 运行环境要求:</strong><br /> php版本需要:PHP 8.1或者更高<br /> 由于 8.1.0 到 8.1.5有一个OPcache方面的bug,所以推荐8.1.6以上版本</p> <p>数据库:<br /> MySQL 或 Percona 5.7.8.<br /> MariaDB 10.3.7</p> <p>浏览器支持:<br /> Internet Explorer 11不再被支持</p> <p>Composer要求:<br /> Drupal 10推荐Composer版本在2.3.6或更高</p> <p>&nbsp;</p> <p><strong>补充说明:</strong><br /> 1、在不卸载模块的情况下,如果你需要移动模块位置,可以直接移动,然后运行一次升级脚本即可<br /> 注:如果是卸载方式移动会导致模块配置丢失,在有复杂依赖时,情况更糟,此知识点可以帮你避免这一点</p> <p>2、官方升级指导页:<br /> https://www.drupal.org/project/drupal/releases/10.0.0</p> <p>&nbsp;</p> <p>&nbsp;</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=408&amp;2=comment&amp;3=comment" token="1FLCSGVj7xXhPvRbOQmZwOODH-n4t0MiFgzaleT8XXk"></drupal-render-placeholder> </div> </div> </section> Wed, 23 Aug 2023 11:15:04 +0000 yunke 408 at http://indrupal.com http://indrupal.com/node/408#comments 在不卸载Drupal模块的情况下,如何移动更改模块所在的目录? http://indrupal.com/node/407 <span>在不卸载Drupal模块的情况下,如何移动更改模块所在的目录?</span> <span><span>yunke</span></span> <span><time datetime="2023-08-22T16:21:50+08:00" title="2023-08-22 16:21 星期二">周二, 08/22/2023 - 16:21</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>在有些情况下,我们需要移动Drupal模块所在的目录,比如开始使用Composer管理系统代码,或者将某个单站的模块用于多站时</p> <p>如果你直接移动模块文件夹,那么系统会提示错误,日志里面会记录XX文件不存在,导致进不了后台</p> <p>如果你卸载模块重新安装,那么模块的配置或数据就会丢失,在有很多模块依赖本模块时,更加复杂,需要修改太多内容</p> <p>那怎么办呢?</p> <p>其实很简单,你只需要移动模块后,运行一次“/update.php”升级程序即可</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=407&amp;2=comment&amp;3=comment" token="Co8H6fqyn-6fBn70WxqmB1nO_JQA3iQA4qujWtQzLjk"></drupal-render-placeholder> </div> </div> </section> Tue, 22 Aug 2023 08:21:50 +0000 yunke 407 at http://indrupal.com http://indrupal.com/node/407#comments 中国首个Drupal电商发行版系统发布 http://indrupal.com/node/361 <span>中国首个Drupal电商发行版系统发布</span> <span><span>yunke</span></span> <span><time datetime="2022-10-20T16:31:29+08:00" title="2022-10-20 16:31 星期四">周四, 10/20/2022 - 16:31</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>十余年的技术储备,一步一步,一点一点,反复打磨,研究,终于捧出了这一开箱即用的电子商城系统,不论国内电商还是跨境电商,不论简单与复杂,统统拿下,庆祝中国首个Drupal电商发行版系统发布</p> <p class="text-align-center"><iframe height=600 width=100% src='https://player.youku.com/embed/XNTg4MjIyNTk3Mg==' frameborder=0 'allowfullscreen'></iframe></p> <p>优酷演示视频地址:<a href="https://v.youku.com/v_show/id_XNTg4MjIyNTk3Mg==.html?spm=a2h0c.8166622.PhoneSokuUgc_1.dscreenshot" rel="noopener" target="_blank" title="Drupal电商发行版视频演示">https://v.youku.com/v_show/id_XNTg4MjIyNTk3Mg==.html?spm=a2h0c.8166622.PhoneSokuUgc_1.dscreenshot</a><br /> Drupal官方介绍(含下载地址):<a href="https://www.drupal.org/project/will_nice_shop" rel="noopener" target="_blank" title="Drupal电商发行版">https://www.drupal.org/project/will_nice_shop</a></p> <h1 class="js-quickedit-page-title text-align-center" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 0px; font-weight: 600; line-height: 1.2; font-size: 20px; color: rgb(51, 51, 51); display: block; font-family: Muli, sans-serif; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span class="quickedit-field" data-once="quickedit" data-quickedit-field-id="node/1/title/zh-hans/full" property="schema:name" style="box-sizing: border-box;">关于Drupal电商系统</span></h1> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span style="box-sizing: border-box;">Drupal电商系统是构建于Drupal系统之上的,不管是使用还是开发,在此之前你都需要先知道一些关于Drupal的信息,如果你是第一次接触Drupal,那么恭喜你遇到了目前人类世界中最强大的Web应用基础系统,没有之一,她拥有全球最大的开源社区,是耗时多年沉淀再沉淀的智慧结晶,两百余国家开发者参与,支持所有语言,遵循GPL协议,属于全人类共有。</span></p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span style="box-sizing: border-box;">一些大学专门设立了Drupal开发课程,生态极其繁荣;在世界五百强企业中的使用比例超过80%,有特斯拉、高通、谷歌、推特、迪士尼等,中国有华为、腾讯、阿里、百度、京东、中国人寿、周大福、真功夫等等;在大学中更加受欢迎,中国有清华、北大、浙大、重庆大学、中山大学等,国外有哈佛、麻省理工、牛津等;许多政府、事业单位在使用她,比如联合国、欧盟、澳大利亚、法国,美国商务部、美宇航局,我国的中科院、国家计量院、政府数据开放平台、深圳教育局等;开源界的</span>Ubuntu、Docker、redhat等知名大厂均采用Drupal。</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span style="box-sizing: border-box;">Drupal既是CMS,也是开发框架,“强大”和“灵活”最被人熟知,她能让你随心所欲的开发自己想要的业务,并且时间极快,成本极低,这是因为常用的组件或功能都已经有了,大多数时候,你只需要像搭积木一样构建自己的系统即可,甚至你无需懂代码,这就是开源生态“强大”带来的好处,人们总是遇到相同的问题,只要有人站出来解决好了,其他人便不再为此伤神费力,除非解决的不够好,然而通常在群策群力之下,总是能带来超出预期的解决方案,同时这些方案会被巨大的使用量所验证。</span></p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span style="box-sizing: border-box;">然而任何事物都会有两面性,站在世界之巅的Drupal,她的对立面是:相对于那些简单系统而言,你需要付出稍高的学习成本,就像驾驶战机和使用手枪,学习成本显然不同,这是自然界的铁律,欲戴皇冠必承其重,让人羡慕的事物永远都只属于少数人,Drupal就像一位极客,她追求极致,在航母和众多的渔船之间,她选择做航母,更远更强的同时,也更庞大,许多开发者感言Drupal就是一个WEB操作系统。</span></p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span style="box-sizing: border-box;">但你也无需被学习成本吓到,这里给出一个时间成本做参考,是否适合你自己,请斟酌之,在专注学习的情况下,从新人成为一个熟练使用者大约需要一个月,成为一个资深使用者(能无代码开发应用)大约需要3-5个月,如果是开发者的话,在熟练掌握PHP的前提下,1-2个月能上手开发,4-6个月便能完成很多应用,一年后可</span>一剑在手笑舞乾坤,<span style="box-sizing: border-box;">无往而不利,那时便不会再想用其他框架和工具了;有个巨大好消息是随着越来越多的中文教程涌现,前述时间会越来越短,学习体验会越来越好。</span></p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><span style="box-sizing: border-box;">在系统结构上,Drupal采用</span>了Symfony的一些组件,网上有流传说Drupal是基于Symfony的,但这并不准确,SF只是Drupal中很小部分,用了一些组件而已,因此你无需先学习Symfony,这里提供一些学习资料帮助你快速上手:</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">Drupal后端开发可参见:《<a href="http://www.indrupal.com/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">云客Drupal源码分析</a>》,前端开发可参见《<a href="http://www.nowicode.com/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">听晴空讲Drupal主题</a>》,此二者都是花费数年的原创中文教程。</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong style="box-sizing: border-box; font-weight: bolder;">Drupal电商系统:</strong></p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">在掌握Drupal的情况下,便能很快上手Drupal电商系统,她完全采用Drupal的实体结构,一致的使用风格,几乎不需要增加太多学习成本,却继承了Drupal全部的能力,这一点相比其他专门的电商系统而言,Drupal电商拥有无比强大的能力,可以这样理解:电商只是Drupal平台上面的一个应用,你可以在同一个系统中,建立各种各样的应用,比如CRM、ERP、论坛、官网等等,直至打造出你需要的全套业务解决方案,全部都在一个系统中!无缝集成!因此是非常值得学习的,在此过程中你也会感受到Drupal电商震撼人心的强大,还有那无所羁绊的自由。</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">在开发本电商发行版时,“Drupal电商中文社区”官网正在筹建中,域名:“<a href="http://www.drupal-shop.com/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">www.drupal-shop.com</a>”,计划中你将在那里得到有关Drupal电商系统的所有支持,包括教程、服务、模块、下载、互动、聚会等等,该项目由“<a href="http://www.will-nice.com/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">未来很美科技</a>”牵头主导,以广大Drupal中国社区成员为主力建设,请留意建设进程,如有余力期待以各种方式支持,包括原创文档、翻译、社区义工、资金赞助等等。</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">在Drupal电商中文社区建设完毕前,我们也尽可能的为你提供支持,下面列出一些对你有帮助的资料:</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">英文Drupal电商官方文档:<a href="https://docs.drupalcommerce.org/commerce2" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">https://docs.drupalcommerce.org/commerce2</a><br style="box-sizing: border-box;" /> Drupal官网:<a href="https://www.drupal.org/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">https://www.drupal.org</a></p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong style="box-sizing: border-box; font-weight: bolder;">初次安装后接下来该做什么?</strong></p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">为了让你快速了解并学习Drupal电商系统,本发行版已经集成了常用模块,其中不少模块由未来很美科技原创开发,进行了系统性配置,提供了一套主题,并建立了几个有示范性的产品类型,你可以直接体验如何购买,当你熟悉后,这些示例数据是可以全部删除的,删除后继续建立你自己的产品模型、主题界面等等即可。</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">在上线运行前有两件事需要你自己处理:申请支付账号并填入相关接口参数(<a href="http://www.fxb.com/admin/commerce/config/payment-gateways" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">见这里</a>),填入发送邮件的SMTP账号参数以使得邮件功能正常(<a href="http://www.fxb.com/admin/config/system/smtp" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">见这里</a>)。</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">关于系统的多语言翻译,你可能会发现界面中有部分英文未被翻译,这很正常,因为Drupal模块众多,且不断发展,原始开发者很少能为所有语言都提供翻译,主要是靠各语言的使用者去<a href="https://localize.drupal.org/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">官方翻译平台</a>义务翻译,但你不用担心,Drupal拥有最为成熟和完善的多语言机制,你可以在后台直接翻译(<a href="http://www.fxb.com/admin/config/regional" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">配置/地区和语言/</a>)。</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">为了给你提供一个尽可能干净的起点,本发行版并没有提供太多示例数据,但这也让你看不出系统的强大,因此在“<a href="http://www.will-nice.com/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">未来很美科技</a>”的官网(<a href="http://www.will-nice.com/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">www.will-nice.com</a>)上,提供了一个完整的Drupal电商演示版系统,你可以看到其丰富的页面内容。</p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong style="box-sizing: border-box; font-weight: bolder;">资深用户:</strong></p> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">对于资深用户而言,你可以尝试以一个Drupal默认安装为起点,结合社区提供的模块等资源,逐步构建一个完整的电商系统,但这将非常耗费时间,这也是“发行版系统”诞生的原因,构建本发行版的基础模块如下:</p> <blockquote style="box-sizing: border-box; margin: 30px 20px; font-style: italic; font-family: times; border-left: 3px solid rgb(43, 169, 224); position: relative; padding: 0px 20px; color: rgb(68, 68, 68); font-size: 14px; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"> <p style="box-sizing: border-box; margin: 0px 0px 15px;">安装Drupal:<br style="box-sizing: border-box;" /> composer create-project drupal/recommended-project Drupal-Shop</p> <p style="box-sizing: border-box; margin: 0px 0px 15px;">安装常规模块:<br style="box-sizing: border-box;" /> 安装云客调式模块:composer require drupal/yunke_help<br style="box-sizing: border-box;" /> 管理菜单:composer require drupal/admin_toolbar<br style="box-sizing: border-box;" /> 数据库备份:composer require drupal/backup_migrate<br style="box-sizing: border-box;" /> 地址模块:composer require drupal/address<br style="box-sizing: border-box;" /> 更好的视图过滤控件模块:composer require drupal/better_exposed_filters<br style="box-sizing: border-box;" /> 块可见组模块:composer require drupal/block_visibility_groups<br style="box-sizing: border-box;" /> 颜色字段模块:composer require drupal/color_field<br style="box-sizing: border-box;" /> colorbox模块:composer require drupal/colorbox<br style="box-sizing: border-box;" /> 电商核心模块:composer require drupal/commerce<br style="box-sizing: border-box;" /> 货币解析器模块:composer require drupal/commerce_currency_resolver<br style="box-sizing: border-box;" /> 货运模块:composer require drupal/commerce_shipping<br style="box-sizing: border-box;" /> 库存模块:composer require drupal/commerce_stock<br style="box-sizing: border-box;" /> 联系表单模块:composer require drupal/contact_block<br style="box-sizing: border-box;" /> 分面搜索链接模块:composer require drupal/entity_reference_facet_link<br style="box-sizing: border-box;" /> 分面模块:composer require drupal/facets<br style="box-sizing: border-box;" /> 计时器模块:composer require drupal/field_timer<br style="box-sizing: border-box;" /> 标记模块:composer require drupal/flag<br style="box-sizing: border-box;" /> 图片集显示格式化器模块:composer require drupal/image_delta_formatter<br style="box-sizing: border-box;" /> 选择语言下拉模块:composer require drupal/lang_dropdown<br style="box-sizing: border-box;" /> 重定向模块:composer require drupal/redirect<br style="box-sizing: border-box;" /> 搜索api模块:composer require drupal/search_api<br style="box-sizing: border-box;" /> 投票模块:composer require drupal/votingapi<br style="box-sizing: border-box;" /> 投票控件模块:composer require drupal/votingapi_widgets<br style="box-sizing: border-box;" /> SEO模块:composer require drupal/metatag<br style="box-sizing: border-box;" /> 文件管理:composer require drupal/imce<br style="box-sizing: border-box;" /> 邮件发送:composer require drupal/smtp<br style="box-sizing: border-box;" /> 自定义css和js片段:composer require drupal/asset_injector<br style="box-sizing: border-box;" /> 终端判断:composer require drupal/mobile_detect<br style="box-sizing: border-box;" /> 方便管理模块:composer require drupal/module_filter<br style="box-sizing: border-box;" /> ctools模块:composer require drupal/ctools<br style="box-sizing: border-box;" /> 储存联系消息 composer require drupal/contact_storage<br style="box-sizing: border-box;" /> 默认安装微信支付:composer require drupal/commerce_wechat</p> </blockquote> <p style="box-sizing: border-box; margin: 0px 0px 15px; color: rgb(68, 68, 68); font-family: Muli, sans-serif; font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><strong style="box-sizing: border-box; font-weight: bolder;">最后:</strong><br style="box-sizing: border-box;" /> Drupal电商这个全球共建共享的强大成果,等待你挖掘,中国Drupal社区与你分享最美好的时光,等待你加入,<a href="http://www.indrupal.com/" style="box-sizing: border-box; color: rgb(51, 51, 51); text-decoration: none; background-color: transparent; outline: none;">云客</a>在此祝你学有所成,未来很美,一起向前。</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=361&amp;2=comment&amp;3=comment" token="cWor7J5xsa-B3MYFB09-XNk3fNXzmlWhLEMYjMhjOc8"></drupal-render-placeholder> </div> </div> </section> Thu, 20 Oct 2022 08:31:29 +0000 yunke 361 at http://indrupal.com http://indrupal.com/node/361#comments Drupal电商复杂价格解析关键代码 http://indrupal.com/node/356 <span>Drupal电商复杂价格解析关键代码</span> <span><span>yunke</span></span> <span><time datetime="2022-10-08T15:07:24+08:00" title="2022-10-08 15:07 星期六">周六, 10/08/2022 - 15:07</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>在Drupal电商中,有时候需要依据用户输入的信息来计算价格,比如文字数量等,这些输入信息因为其有巨大的可能性而不方便或根本无法预设成为选项,只能提供表单由用户录入,后台再用专门的函数去解析价格,用户录入的表单其实就是订单条目对象的创建表单,计算价格的关键在于在价格解析器中如何获取到订单条目对象实体,以下代码展示了其方法:</p> <pre> <code class="language-php">&lt;?php /** * 未来很美(深圳)科技有限公司 * by:yunke * */ namespace Drupal\neon\Resolver; use Drupal\commerce\Context; use Drupal\commerce\PurchasableEntityInterface; use Drupal\commerce_price\Resolver\PriceResolverInterface; use Drupal\Core\Form\FormState; /** * 定制产品价格解析器 * 将自定义价格的解析委派给自定义函数,向其传递订单条目实体对象,其中包含了用户提交的自定义数据信息 */ class CustomNeonPriceResolver implements PriceResolverInterface { /** * {@inheritdoc} */ public function resolve(PurchasableEntityInterface $purchased_entity, $quantity, Context $context) { //return new \Drupal\commerce_price\Price(90,'USD'); static $price = NULL; /** * 设置此静态变量是因为性能原因 一个请求过程中会多次调用本解析器 * 每一次传递的可购买实体可能不同,因此定制产品不宜设置多个变体,通常会进行以下调用 * 第一次是渲染产品页面时,在注入变体字段过程中,此时传递的是URL中通过V参数指定的变体 * 第二次是订单条目实体表单处理过程中的buildEntity方法 * 第三次是被选中变体的渲染,在AJAX回调中调用,或者在添加到购物车提交后,在订单刷新处理器中 * */ $request = \Drupal::request(); if ($request-&gt;getMethod() !== 'POST') { return NULL; } ///前端价格不会从后端取 custom-neon-sign?ajax_form=1&amp;_wrapper_format=drupal_ajax $wrapper_format = $request-&gt;query-&gt;get("_wrapper_format"); if ($wrapper_format) { return NULL; } //仅在商品页有效 $route_match = \Drupal::routeMatch(); if ($route_match-&gt;getRouteName() != 'entity.commerce_product.canonical') { return NULL; } //仅作用于定制产品 if ('custom_neon_sign' != $purchased_entity-&gt;bundle()) { return NULL; } //仅解析实价 不处理挂牌价 $field_name = $context-&gt;getData('field_name', 'price'); if ($field_name !== 'price') { return NULL; } //提高性能 if ($price) { return $price; } $product_id = $purchased_entity-&gt;getProductId(); $entityTypeManager = \Drupal::entityTypeManager(); $product = $entityTypeManager-&gt;getStorage('commerce_product')-&gt;load($product_id); $order_item_storage = $entityTypeManager-&gt;getStorage('commerce_order_item'); $order_item = $order_item_storage-&gt;createFromPurchasableEntity($purchased_entity); $order_item-&gt;set('overridden_unit_price', TRUE);//防止循环解析价格 $form_object = $entityTypeManager-&gt;getFormObject('commerce_order_item', 'add_to_cart'); $form_object-&gt;setEntity($order_item); $form_object-&gt;setFormId($form_object-&gt;getBaseFormId() . '_commerce_product_' . $product_id); $form_state = (new FormState())-&gt;setFormState([ 'product' =&gt; $product, 'view_mode' =&gt; 'add_to_cart', 'settings' =&gt; [ 'combine' =&gt; FALSE, ], ]); $formBuilder = \Drupal::formBuilder(); $form_id = $formBuilder-&gt;getFormId($form_object, $form_state); $input = $request-&gt;request-&gt;all(); $form_state-&gt;setUserInput($input); $form = $formBuilder-&gt;retrieveForm($form_id, $form_state); $formBuilder-&gt;prepareForm($form_id, $form, $form_state); //表单值转化为实体字段值 $form = $formBuilder-&gt;doBuildForm($form_id, $form, $form_state); /** * 进行验证处理 因为部分控件的表单值在验证器中设置 比如:options_buttons 因此必须调用验证器 * 但不要有任何表单验证错误显示,你可能会想到在触发元素上面采用错误抑制属性 就像这样: * $triggering_element['#limit_validation_errors']=[]; * 但这将在验证器中清除表单值 见:\Drupal\Core\Form\FormValidator::handleErrorsWithLimitedValidation * 因此我们将表单改为以非提交元素进行的提交,这样既可以避免错误显示也能保留提交值 */ $buttons = $form_state-&gt;getButtons(); if (!$form_state-&gt;getTriggeringElement()) { $form_state-&gt;setTriggeringElement(reset($buttons)); } $form_state-&gt;setFormState(['submitted' =&gt; FALSE]); $formBuilder-&gt;validateForm($form_id, $form, $form_state); $order_item = $form_object-&gt;buildEntity($form, $form_state); $order_item-&gt;set('overridden_unit_price', FALSE); $price = neon_getCustomPrice($order_item, $purchased_entity, $quantity, $context);//自定义价格解析函数 return $price; } } </code></pre> <p>该代码即是价格解析器的实现。</p> <p>为了应对这种复杂情况,在价格解析器中本应该直接由系统传入订单条目对象实体的,但目前的架构暂不支持,故通过以上关键代码来实现。</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=356&amp;2=comment&amp;3=comment" token="6_PbomsEedtPmvmj-fIIduj2dB-m-fhNmfXw1Ga9rZI"></drupal-render-placeholder> </div> </div> </section> Sat, 08 Oct 2022 07:07:24 +0000 yunke 356 at http://indrupal.com http://indrupal.com/node/356#comments 建立Drupal电商系统所需常用模块 http://indrupal.com/node/276 <span>建立Drupal电商系统所需常用模块</span> <span><span>yunke</span></span> <span><time datetime="2021-12-27T10:23:17+08:00" title="2021-12-27 10:23 星期一">周一, 12/27/2021 - 10:23</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>假设你要建一个Drupal电子商城,本篇预览并整理了Drupal电商生态现存所有可用的模块(截止2021年12月27日,不含D7),现整理列出,以备查阅,对开发者而言这避免重复开发,或寻找一个开发起点,推荐在实现特定功能前先查阅,对使用者而言,向你介绍了当前Drupal电商系统有哪些功能</p> <p><strong>电商主题:</strong><br /> 一般你需要安装或制作专门的电商主题,Drupal Commerce模块官方提供 了一套默认主题叫做:belgrade,该主题基于bootstrap开发,可以作为自定义主题的一个基础,关于这个官方主题,云客对它的评价很普通,还是推荐您买一套商用主题吧</p> <p><strong>常规模块:</strong><br /> 你大概率需要一些常规模块,这里为你列出:</p> <pre> <code>云客辅助模块帮助你快速开发: composer require drupal/yunke_help 管理菜单,过滤无权访问的菜单,体验更好: composer require drupal/admin_toolbar 数据库备份,提供线上数据库同步、迁移: composer require drupal/backup_migrate 文件管理: composer require drupal/imce 从分类术语建立菜单: composer require drupal/taxonomy_menu 邮件发送: composer require drupal/smtp 为多图字段提供显示格式化器: composer require drupal/image_delta_formatter SEO模块,对电商推广很重要: composer require drupal/metatag</code></pre> <p><strong>电商主要模块:</strong><br /> 这里列出和电商息息相关,最常用的模块:</p> <pre> <code>电商系统核心模块: composer require drupal/commerce 管理发货、物流: composer require drupal/commerce_shipping 管理库存: composer require drupal/commerce_stock 处理产品搜索: composer require drupal/search_api 实现分面搜索(即多属性过滤搜索): composer require drupal/facets 为分面搜索提供优雅的URL路径: composer require drupal/facets_pretty_paths 处理产品的颜色属性: composer require drupal/color_field 国内电商必备(微信支付模块): composer require drupal/commerce_wechat</code></pre> <p><strong>电商相关模块:</strong><br /> 这里云客为你整理了社区中已经开发的一些模块,截止2021年12月27日,她们可以帮你完成一些特定的功能,在进行开发前推荐先查看以避免重复劳动,有一些功能已经很完整,有一些可以作为你自定义开发的起点,Drupal电商几乎提供了世界上所有主流的支付方式,因此这里并没有列出支付网关模块:</p> <pre> <code>实现立即购买,跳过购物车步骤: composer require drupal/commerce_cart_redirection 为按条件预定系统提供基础实现,比如住房预定,汽车租赁等: composer require drupal/bat 收藏夹功能,可从收藏夹中直接购买: https://www.drupal.org/project/commerce_wishlist 官方产品限购框架,默认可以设置最小或最大购买数量,可扩展开发: https://www.drupal.org/project/commerce_product_limits 提供淘宝那样多商户入驻功能的基础设施: https://www.drupal.org/project/commerce_marketplace 多货币价格自动计算: https://www.drupal.org/project/commerce_currency_resolver 按条件设置价格: https://www.drupal.org/project/commerce_pricelist 提供复杂的税务计算: https://www.drupal.org/project/commerce_product_tax 发票管理: https://www.drupal.org/project/commerce_invoice 按周期循环计费,常用于订阅某些服务: https://www.drupal.org/project/commerce_recurring 为循环计费的项目提供发货支持: https://www.drupal.org/project/commerce_recurring_shipping 将多个购物车组合为一个: https://www.drupal.org/project/commerce_combine_carts 向注册页添加使用条款和同意按钮: https://www.drupal.org/project/terms_of_use 提供可配置的购物车块: https://www.drupal.org/project/commerce_cart_blocks 其他电商系统向drupal电商的数据迁移: https://www.drupal.org/project/commerce_migrate 为电商系统实现JSON API接口: https://www.drupal.org/project/commerce_api 为电商提供批量操作的诸多功能: https://www.drupal.org/project/commerce_bulk 为检出流程提供“我同意”表单控件: https://www.drupal.org/project/commerce_agree_terms 为店铺绑定域名: https://www.drupal.org/project/commerce_store_domain 另一个为店铺绑定域名的模块: https://www.drupal.org/project/commerce_domain 将webform和电商系统结合: https://www.drupal.org/project/commerce_webform_order 用webform提交来产生订单并付款: https://www.drupal.org/project/webform_product 为视图提供电商产品的分类术语过滤器: https://www.drupal.org/project/commerce_product_taxonomy_filter 图表统计: https://www.drupal.org/project/commerce_dashboard 给一个包含产品信息的URL将用户直接重定向到结账页: https://www.drupal.org/project/direct_checkout_by_url 通过一个链接来完成预创建的订单: https://www.drupal.org/project/commerce_checkout_link 输出或保存PDF格式: https://www.drupal.org/project/fillpdf 通过电商销售可下载的文件: https://www.drupal.org/project/commerce_file 添加产品到购物车时附带其他产品: https://www.drupal.org/project/commerce_pado 另一个模块添加产品到购物车时附带其他产品: https://www.drupal.org/project/commerce_vado 将多个产品打包成一个进行新价格售卖: https://www.drupal.org/project/commerce_product_bundle 票务销售: https://www.drupal.org/project/commerce_ticketing 票务销售模块的检票模块(扫描二维码): https://www.drupal.org/project/commerce_ticketing_scanner 另一个检票模块(扫描二维码): https://www.drupal.org/project/commerce_ticketing_checkin 当无库存时显示一个邮件提交表单以便有货时通知用户: https://www.drupal.org/project/commerce_stock_notifications 拍卖处理: https://www.drupal.org/project/auctions 类似积分系统,提供充值、提现、转赠资金功能: https://www.drupal.org/project/commerce_funds 内建一个虚拟钱包,实现站点商业逻辑: https://www.drupal.org/project/user_coins 简易积分系统,注册、购物、赠送积分,购物用积分扣: https://www.drupal.org/project/commerceuserpoints 为产品及变体增加Bundle : https://www.drupal.org/project/commerce_product_bundles 当有大量产品属性时进行辅助管理: https://www.drupal.org/project/commerce_xattributes 如果订单完整付款,则自动验证订单: https://www.drupal.org/project/commerce_order_autovalidate 当用户要离开站点时弹框挽留: https://www.drupal.org/project/exitpopup 提供日期条件控制块的可见性: https://www.drupal.org/project/block_date 汇率转换,将基础货币通过汇率转换成对应货币价格 https://www.drupal.org/project/exchange_rates 评估订单欺诈: https://www.drupal.org/project/commerce_fraud 构建热销产品块: https://www.drupal.org/project/best_selling_products 对实体类型的访问授权控制: https://www.drupal.org/project/licensing 提供优惠类型(买送商品): https://www.drupal.org/project/commerce_extra_items 提供一个块,快速键入SKU进行购买: https://www.drupal.org/project/commerce_quick_purchase 基于各种条件设置产品原本的价格,和优惠不一样: https://www.drupal.org/project/commerce_price_rule 为电商提供事件触发(收集满足条件的实体为其派发响应事件): https://www.drupal.org/project/commerce_eta 允许对订单中部分商品付款: https://www.drupal.org/project/commerce_partial_payments 为drupal电商提供复式记账法: https://www.drupal.org/project/bookkeeping 网页聊天沟通,可用于实时客服等: https://www.drupal.org/project/livechat 网站在线聊天模块,可作为客服沟通: https://www.drupal.org/project/revechat_livechat_solution 对条件组件的增强: https://www.drupal.org/project/commerce_conditions_plus 要求对所购商品再次确认检查: https://www.drupal.org/project/commerce_approve 为促销优惠添加协议、说明提示等: https://www.drupal.org/project/commerce_promo_tc 对产品限购,如按日期、数量、角色等: https://www.drupal.org/project/commerce_product_restriction 让管理员可以依据电商事件有条件的执行一些动作: https://www.drupal.org/project/commerce_reactions 客房预定系统: https://www.drupal.org/project/abookings 对购物车功能进行增强: https://www.drupal.org/project/commerce_cart_advanced 无刷新AJAX添加到购物车: https://www.drupal.org/project/dc_ajax_add_cart 众筹捐赠功能: https://www.drupal.org/project/campaign_kit 简单的捐赠功能: https://www.drupal.org/project/give 根据重量来设置运费等: https://www.drupal.org/project/commerce_custom_shipping_by_weight 购买这个产品的用户还买了哪些产品?促销模块: https://www.drupal.org/project/commerce_customers_also_bought 在一个字段中保存所有货币的价格: https://www.drupal.org/project/commerce_currencies_price 加密货币字段,支持比特币: https://www.drupal.org/project/cryptocurrency_field 允许facets通过产品属性的权重字段进行排序: https://www.drupal.org/project/facets_product_attributes_sorting 电商专用统计分析模块: https://www.drupal.org/project/commerce_statistic 向订单实体的显示添加“余额”伪字段: https://www.drupal.org/project/commerce_balance 限购一次: https://www.drupal.org/project/commerce_sell_once 地址键入提示(自动完成): https://www.drupal.org/project/address_autocomplete_photon 针对某些类型产品跳过购物车步骤: https://www.drupal.org/project/commerce_cart_skip 为实体店铺提供预定商品服务: https://www.drupal.org/project/commerce_product_reservation 社交账号登录: https://www.drupal.org/project/vipps_login 进度条格式化显示控件: https://www.drupal.org/project/progress_bar 连接POS系统和Drupal电商系统: https://www.drupal.org/project/poster_integration 对已存订单提供再次购买功能: https://www.drupal.org/project/commerce_repeat_order 营销模块,帮助推广的人在产品被售出后有奖励: https://www.drupal.org/project/commerce_recruiting 扩展库存模块,为添加到购物车的产品保留库存: https://www.drupal.org/project/commerce_stock_reserve 如果订单出现退款,可将退款产品分离为单独的订单条目: https://www.drupal.org/project/commerce_refund_order_item 用CSV导入导出产品变体: https://www.drupal.org/project/commerce_product_variation_csv 导入亚马逊产品: https://www.drupal.org/project/amazon_product_widget 将支付分成多个,可用礼品卡或积分支付,剩余的再走支付网关: https://www.drupal.org/project/commerce_multi_payment 将发票生成PDF后发送给客户: https://www.drupal.org/project/uc_pdf_invoice_mail 根据SKU的特征来应用优惠: https://www.drupal.org/project/sku_prefix_promotion_condition 聊天机器人: https://www.drupal.org/project/drupal_chatbot 可以赊账或分期付款的方式购物: https://www.drupal.org/project/commerce_byjuno 提供B2B商业基础设施: https://www.drupal.org/project/commerceg_b2b 让管理员使用结账流去创建订单,而不是后台方法: https://www.drupal.org/project/commerce_admin_checkout 短信发送框架: https://www.drupal.org/project/smsc 为定制产品提供表单并提供预览,常用于印刷行业: https://www.drupal.org/project/product_builder 实现拍卖功能的基础模块: https://www.drupal.org/project/auctioneer 该模块可将视图上下文过滤器过滤分类术语用于产品: https://www.drupal.org/project/product_taxonomy_filter </code></pre> <p><br /> &nbsp;</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=276&amp;2=comment&amp;3=comment" token="nAADQ8ixeyZnHqkBiPI1IjBgknj5s0ksfUzPqHOr45A"></drupal-render-placeholder> </div> </div> </section> Mon, 27 Dec 2021 02:23:17 +0000 yunke 276 at http://indrupal.com http://indrupal.com/node/276#comments Drupal相关Composer用法与命令汇总 http://indrupal.com/node/225 <span>Drupal相关Composer用法与命令汇总</span> <span><span>yunke</span></span> <span><time datetime="2021-05-02T10:28:33+08:00" title="2021-05-02 10:28 星期日">周日, 05/02/2021 - 10:28</time> </span> <div class="text-content clearfix field field--name-body field--type-text-with-summary field--label-hidden field__item"><p>曾几何时我们安装一个Drupal模块只需要到官网下载模块压缩包文件,然后放入模块目录,进入后台开启安装即可,但有些模块由于依赖了第三方库,事情就没有那么简单了,比如经常会用到的邮件发送模块“<a href="https://www.drupal.org/project/smtp">smtp</a>”就需要第三方库“PHPMailer”的支持 ,此时前述安装方法只能得到模块文件,而没有第三方库,模块即便能够安装也无法运行,即便我们自己下载了第三方库手动放入vendor目录也是不行的(这是因为类自动加载器没有添加该库,运行时会提示类不存在),像这样的列子还有很多,比如我开发的微信支付模块、支付宝模块等都需要第三方的支持,为了应对这种情况就需要用到Composer了,而且越来越有必要,Drupal官方已推荐使用Composer来安装、升级相关代码。你可能会想:模块开发者为什么不把依赖库放在模块文件夹里面呢?这样就能像前文所述那样安装了,试想一下:多个模块依赖于同一个依赖库该怎么处理?这在代码冗余和名字空间映射等方面都是不好的。</p> <p>本文面向drupaler进行一个全面的Composer讲解。</p> <p><strong>Composer自身的安装:</strong></p> <p>关于Composer的安装和使用请见(本篇不赘述):<a href="https://getcomposer.org/" rel="noopener" target="_blank">https://getcomposer.org/</a></p> <p>注意:安装完成后,使用中如果遇到众所周知的墙问题导致包下载失败,可以使用阿里云的镜像,使用命令:</p> <pre> <code class="language-bash">composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/</code></pre> <p>取消阿里云镜像:</p> <pre> <code>composer config -g --unset repos.packagist</code></pre> <p><strong>通用常用命令:</strong></p> <p><span style="background-color:#dddddd;">安装依赖:</span></p> <pre> <code class="language-bash">composer install</code></pre> <p>这将依据composer.json文件或lock文件下载依赖并生成自动加载器</p> <p><span style="background-color:#dddddd;">更新依赖:</span></p> <pre> <code class="language-bash">全部更新: composer update 个别更新: composer update vendor/package vendor/package2 通配符更新: composer update vendor/*</code></pre> <p>这个将更新依赖并重新生产lock文件</p> <p><span style="background-color:#dddddd;">添加依赖:</span></p> <pre> <code class="language-bash">composer require vendor/package:2.* vendor/package2:dev-master</code></pre> <p>这将下载依赖并更新composer.json和lock文件</p> <p><span style="background-color:#dddddd;">查看某个依赖包的详情:</span></p> <pre> <code class="language-bash">composer show monolog/monolog</code></pre> <p><span style="background-color:#dddddd;">状态检查:</span></p> <pre> <code class="language-bash">composer status -vv</code></pre> <p>如果你修改了某依赖包的内容,这条命令会帮你检查出修改了哪些地方</p> <p><span style="background-color:#dddddd;">升级composer本身:</span></p> <pre> <code class="language-bash">升级到最高版本: composer self-update 升级到某个版本: composer self-update 1.0.0-alpha7 回滚到最后一个可用版本: composer self-update -r</code></pre> <p>&nbsp;</p> <p><strong>用Composer安装Drupal系统:</strong><br /> 使用如下命令:</p> <pre> <code class="language-bash">composer create-project drupal/recommended-project yunke</code></pre> <p>这将在当前目录下建立一个叫“yunke”的目录(你可自行更改名字),并在其中安装Drupal,安装后你会在其中看到一个“web”目录,这就是Drupal系统的站点根目录了,然而vendor目录、composer.json等并不在其中,这和手动下载的安装包文件布局不同,不过这是推荐方法,主要是由于安全原因(这种方法可以方便设置服务器只允许访问web目录之内的文件),如果你还是喜欢传统的文件布局方式(vendor目录等在站点根目录内),可以将vendor目录删除,将composer.json、composer.lock移入web模块,并在composer.json文件中的所有地方把“web”这个路径去掉,然后在命令行中将当前目录切换到web目录,执行以下命令:</p> <pre> <code class="language-bash">composer install</code></pre> <p>这样就会产生新的vendor目录和加载文件了。不过这种更改方式你还不如直接到官方下载安装包即可,这里只是提供一种方法。</p> <p>如果你不喜欢默认安装方式的“web”目录,或者需要在安装前定制一下composer.json文件,可以运行如下命令:</p> <pre> <code class="language-bash">composer create-project --no-install drupal/recommended-project my_site_name_dir</code></pre> <p>这将仅下载composer.json、composer.lock文件而不进行真的安装,待你修改后可以继续运行“composer install”安装命令</p> <p>如果需要安装不同版本的Drupal系统可用如下命令:</p> <pre> <code class="language-bash">composer create-project drupal/recommended-project:8.8.0 yunke</code></pre> <p>注意:本节所述的“安装”仅是指composer将Drupal文件下载到所需的目录,真正的系统安装(建立数据库等)还需在浏览器或命令行中进行。</p> <p><strong>用Composer安装Drupal模块:</strong></p> <p>这里以smtp模块为例,看看如何通过Composer安装:<br /> 首先用“cd”命令进入Drupal系统的安装根目录,即composer.json文件所在目录,然后执行以下命令:</p> <pre> <code class="language-bash">composer require drupal/smtp</code></pre> <p>此时Composer将自动下载smtp模块到“modules\contrib”目录下,并下载该模块composer.json中声明的依赖到系统vendor目录<br /> 最后更新系统根目录的composer.json文件(在"require"中添加了模块依赖),重写composer.lock文件,最后重新生成类加载器</p> <p>如你所见,你只需要一行命令,Composer就完成了这些事情,你只需要到后台启用该模块即可</p> <p>如果你没有条件用Composer,怎么手动处理呢?步骤如下:<br /> 1、下载模块到模块目录<br /> 2、下载合适版本的第三方库到vendor目录<br /> 3、删除composer.lock文件,并在composer.json文件的"require"中添加本模块依赖<br /> 4、进入vendor/composer/autoload_psr4.php添加类映射关系,如果是不遵从PSR4的库需要修改其他映射文件</p> <p>Composer可以安装任意已上传到Drupal官网的模块,比如你可以安装云客验证码模块试试:</p> <pre> <code>composer require drupal/yunke_captcha</code></pre> <p>这是因为Drupal自己搭建了仓库,安装特定版本的模块可以加冒号指定,就像下面这样:</p> <pre> <code class="language-bash">composer require 'drupal/token:^1.5' composer require 'drupal/simple_fb_connect:~3.0' composer require 'drupal/ctools:3.0.0-alpha26' composer require 'drupal/token:1.x-dev'</code></pre> <p><strong>Composer卸载Drupal模块:</strong></p> <p>命令如下:</p> <pre> <code class="language-bash">composer remove 'drupal/yunke_help'</code></pre> <p><strong>Composer更新Drupal系统:</strong></p> <p>参考官网https://www.drupal.org/docs/updating-drupal/updating-drupal-core-via-composer</p> <p>关于Composer更多的Drupal用法可以见:<br /> https://www.drupal.org/docs/develop/using-composer</p> <p><strong>开发依赖第三方库的模块:</strong><br /> 作为开发者的我们应该如何开发依赖第三方库的模块呢?有两种方式:</p> <p><em>方式一:</em><br /> 通常我们需要在模块根目录建立composer.json并声明依赖,假设要开发一个云客支付模块(现已开发完成)composer.json可以这样:</p> <pre> <code class="language-json">{ "name": "drupal/yunke_pay", "description": "drupal yunke pay module", "type": "drupal-module", "license": "GPL-2.0-or-later", "homepage": "http://www.indrupal.com", "require": { "wechatpay/wechatpay-guzzle-middleware": "^0.2.0" } } </code></pre> <p>里面就声明了对微信支付中间件的依赖,但是这种开发方法须要求用户使用Composer去安装该模块,不过该开发方法是首选方法<br /> 能不能让模块自带第三方库呢?也是可以的,这就是方式二,但不推荐</p> <p><em>方式二:</em><br /> 我们需要在用到第三方库前,在系统的类加载器中添加类映射关系<br /> 这里假设下载的微信支付中间件被放置在模块的以下目录中:<br /> yunke_pay\vendor\wechatpay\wechatpay-guzzle-middleware\src<br /> 那么在使用前可以对类加载器进行如下处理(通常放置在yunke_pay.module中处理或制作订阅事件程序):</p> <pre> <code class="language-php"> $class_loader = \Drupal::service('class_loader'); $path=\Drupal::moduleHandler()-&gt;getModule("yunke_pay")-&gt;getPath() . '/vendor/wechatpay/wechatpay-guzzle-middleware/src'; $class_loader-&gt;addPsr4('WechatPay\GuzzleMiddleware\\', $path);</code></pre> <p>以上两种方式各有利弊,方式一是推荐做法,也是将来的发展趋势,方式二用户不需要composer安装,但是当有其他模块也用到相同的第三方库时,可能产生版本冲突</p> <p><strong>传统安装到Composer安装的过渡:</strong><br /> 请思考:如果你的站点已运营很久,之前许多模块不是Composer安装方式,已手动安装的这些模块的路径,并不是composer指定的路径,之后站点开始采用composer方式,这对前述那些手动安装的模块升级有何影响?应该怎么处理呢?<br /> 首先模块可能涉及到很重要的数据,这就排除了通过卸载重新安装的升级方式,你可能想那就对这些模块继续采用手动升级维持,这不是长久办法,且有些模块可能开始没有第三方依赖,后面却加入了导致必须使用composer维护,比如“smtp”模块就是这样,此时就可以这样:为这些具体的模块指定安装路径,操作如下:</p> <p>首先在composer.json文件的"require"项中添加对模块的依赖,然后在安装路径中指定模块原来的安装路径,指定路径可以基于供应商:</p> <pre> <code class="language-json">"extra": { "installer-paths": { "web/libraries/ckeditor/plugins/{$name}": ["vendor:ckeditor-plugin"] } }</code></pre> <p>也可以基于包名:</p> <pre> <code>"extra": { "installer-paths": { "web/libraries/{$name}": [ "enyo/dropzone" ] } }</code></pre> <p>修改后执行升级命令即可</p> <p>或者你可以直接使用以下工具去切换到composer方式:<br /> 模块:<a href="https://www.drupal.org/project/composerize" rel="noopener" target="_blank">https://www.drupal.org/project/composerize</a><br /> composer插件:<a href="https://github.com/grasmash/composerize-drupal" rel="noopener" target="_blank">https://github.com/grasmash/composerize-drupal</a><br /> 关于过渡相关可以参考以下文档:<br /> <a href="https://www.drupal.org/docs/installing-drupal/add-composer-to-an-existing-site" rel="noopener" target="_blank">https://www.drupal.org/docs/installing-drupal/add-composer-to-an-existing-site</a></p> <p><strong>补充:</strong><br /> 1、官网文档:<a href="https://www.drupal.org/docs/develop/using-composer" rel="noopener" target="_blank">https://www.drupal.org/docs/develop/using-composer</a></p> <p>&nbsp;</p> <p>&nbsp;</p> </div> <section data-drupal-selector="comments" class="comments"> <h2 class="comments__title">交流互动</h2> <div class="add-comment"> <div class="add-comment__form"> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=225&amp;2=comment&amp;3=comment" token="HPDFzG4-h-wX24DjfMFof0PqJ5pxbAaeYilZ-jFAA_g"></drupal-render-placeholder> </div> </div> </section> Sun, 02 May 2021 02:28:33 +0000 yunke 225 at http://indrupal.com http://indrupal.com/node/225#comments