今天,白龙网在用pathauto模块把drupal9环境下、用Taxonomy词汇术语分类的文章中的中文网址转换为英文网址时,遇到了很难逆转问题。由于网站开发已接近了尾声,因此修改起来比较麻烦。下面复盘下这个失误操作,引以为戒,争取下次不再犯类似错误。
大概情况是这样的,网站菜单中两个栏目公司新闻(company)、企业新闻(industry)是用“Menus->Main_navigation”布局的,然后通过内容类型的一个Taxonomy_term字段、借助Taxonomy词汇术语(公司新闻、企业新闻)分类内容,然后分别向两个栏目发布文章。这就产生了两种形式的网址,一是列表页网址:/company/、/industry/,这是符合国内用户使用习惯的,不需要转换;二是文章的网址:/node/28、/node/29,这是drupal9系统内部默认路径,与我们期望的目标网址形式/company/28.html、/industry/29.html不一致。
前面提到了,文章的分类是通过节点中Taxonomy_term类型的字段关联Taxonomy词汇术语实现的:公司新闻、企业新闻。这里要强调的是,Taxonomy中添加的术语可以指定别名,但是不能指定机器名。因此。在pathauto模块“管理->配置->别名->模式->添加模式->content”中添加一条规则(Path_pattern),让节点的中文地址“/node/28、/node/29”按照“/company/28.html、/industry/29.html”这样的格式输出即可:[node:field_news:entity]/ [node:nid].html。其中,[node:field_news:entity]表示节点中Taxonomy_term类型并关联术语“公司新闻、企业新闻”的字段,[node:nid]表示节点的id号。
到这里,我们似乎已经实现了节点下文章的中文网址向目标英文网址的转换,其实不然。更新缓存后,分别在“公司新闻、企业新闻”栏目下发布一篇文章,你会发现文章的网址会以“/gongsixinwen/28.html、/qiyexinwen/29.html”这样的拼音形式出现,而不是我们期望的导航菜单中已经定义好的、目标英文单词形式:“/company/28.html、/industry/29.html”。拼音形式的目录结构与菜单中已经定义好的英文目录结构混杂在一起,很难搞清楚文章到底属于哪个栏目下,不利于目录的管理和搜索引擎优化。由于添加术语时不能指定机器名,所以,pathauto模块通过Token读取术语“公司新闻、企业新闻”时,根据drupal9系统的默认配置,把术语“公司新闻、企业新闻”的机器名分别转生成了汉语拼音“gongsixinwen、qiyexinwen”用以识别。
既然已经找到了文章的中文网址没有成功转换成对应英文网址的原因,那么,规划目录结构开发菜单功能时,我们只需要让导航菜单中“公司新闻、企业新闻”的网址名称“company、industry”与Taxonomy下添加的术语名称“company、industry”保持一致即可。也就是说,假如你在菜单中指定了“公司新闻、企业新闻”的网址分别为“/company/、/industry/”,那么,你在Taxonomy下添加的两个分类术语就必须分别是“company、industry”,这就可以确保文章分别位于“/company/、/industry/”目录下,并且根据pathauto模块中指定的规则分别以“/company/28.html、/industry/29.html”的形式打印输出。
通过Taxonomy词汇分类并且把文章的中文地址转换成指定栏目下英文地址,上述方法已经实现。但是,也产生一个问题:在内容类型的分类字段中出现了英文的分类“company、industry”。这是因为内容类型中Taxonomy_term字段关联Taxonomy中术语时,读取了术语的名称label“company、industry”。即:我们考虑了pathauto模块把文章的中文地址转换成指定栏目下英文地址,却无法满足内容类型中分类字段显示为中文“公司新闻、企业新闻”的需求。
结合上面的案例,不难发现,pathauto模块在把文章的中文网址转换成英文网址时,读取的是Taxonomy中术语的机器名。由于在Taxonomy下添加术语时不能指定机器名,所以我们把术语的标签名称label设置成与机器名相同的英文名称。根据pathauto模块配置,Taxonomy中术语为英文时,将不转换;Taxonomy中术语为中文时,将转换成对应的汉语拼音。于是,pathauto模块读取Taxonomy中术语的机器名与的标签名都是指定的英文单词”company、industry”,确保了文章显示在指定栏目下“/company/、/industry/”。而内容类型中Taxonomy_term字段关联Taxonomy下术语时,他读取的是术语的标签名称。因此,内容类型中的分类Taxonomy_term字段就显示了“company、industry”。
综上所述,只要在指定分类实体时,分别自定义标签名称为“公司新闻、企业新闻”、机器名称或者Key值为“company、industry”,然后,pathauto模块调用机器名去实现文章的中文网址转换为英文网址;内容类型分类Taxonomy_term字段调用标签名显示到节点中以分类文章。list分类字段在这样的场景下应运而生。限于篇幅的关系,这个技术白龙网另外写一篇文章来说。