主要涵盖Drupal8,9,10下面的常用模块,包括核心模块,重要的第3方模块,还有亚艾元自己开发的模块介绍。
最近几年,自然语言大模型的快速落地应用发展迅猛,呈现百花齐放的局面。作为内容管理系统里面的领头羊,Drupal社区也推出了AI的集成模块。模块地址:
https://www.drupal.org/project/ai
这个模块提供了一个框架,用于在Drupal站点集成AI功能,支持多种AI供应商。这个模块包含一些列模块,并提供了一个基础的API,用来生成文本内容,图片、内容分析,等等。
它吸取了Search API, Open AI等Drupal模块的成功经验,他提供了一个统一的抽象层,方便集成OpenAI (ChatGPT, DALL-E), Anthropic (Claude), Fireworks, Mistral 这些商用大模块,也可以集成开源的大模型,Olama, LMStudio and Hugginface,支持本地化部署。
这个模块支持开箱即用,同时也允许你定制你自己的模型。
自带多个子模块,
AI Core,AI Explorer,AI Automators,AI Search (Experimental),AI Assistants API + Chatbot,AI CKeditor,AI content,AI external moderation,AI translate等。
支持的AI大模型:
amazee.io
Anthropic
Auphonic
AWS Bedrock
Azure
Deepseek
Deepgram
DeepL Translate
ElevenLabs
Fireworks AI
Google Gemini
Google Vertex
Groq
Huggingface
LiteLLM
lmstudio
Mistral
Ollama
Openai
Perplexity
xAI
注意这里支持DeepSeek,国产大模型。
我们在做Drupal项目的时候,特别时Drupal8版本以上的项目,我们经常使用Twig Tweak模块。这个模块小巧玲珑,方便易用。
模块地址:https://www.drupal.org/project/twig_tweak
它为Drupal核心的Twig模板,增加了扩展函数,方便可以在twig模板文件中嵌入区块、视图,等等。
在模板中嵌入区块:
{{ drupal_block('plugin_id') }}
{{ drupal_entity('block', 'block_id', check_access=false) }}
嵌入实体:
{{ drupal_entity('block_content', content_block_id) }}
嵌入views:
{{ drupal_view('who_s_new', 'block_1') }}
{{ drupal_view('who_s_new', 'block_1', arg_1, arg_2, arg_3) }}
用起来很方便,如果不使用这个模块的话,需要添加预处理函数,才能在模板中增加变量。
有时候正式站点上线了以后,想要切换一下指定用户,查看一下效果,如果创建一个测试帐号,录入测试数据,在正式站点也不方便。对于Drupal用户来说,此时有一个方便的模块可以帮您实现这样的功能,这就是masquerade模块,它允许具有权限的用户,直接切换到给定用户,以给定用户浏览相关功能。除了这个模块以外,Drupal8,9下面还有userswitch模块提供了同样的功能。我们这里介绍masquerade模块。
[ˌmæskəˈreɪd]
n.伪装;化装舞会;假面舞会
v.冒充
https://www.drupal.org/project/masquerade
1,下载,解压,上传到modules目录,然后安装这个模块。
2,安装后,在区块管理界面,添加masquerade区块到管理主题的内容区域,
3,(可选)将区块的可见性设置,页面限制在/admin/people,这样在用户管理页面可以看到它。
4,这个时候可以看到这个区块,这个区块是一个表单区块:
在这里输入用户名,点击切换按钮。
protected function switchUser(UserInterface $user) { /** @var \Drupal\user\UserInterface $previous */ $previous = $this->userStorage->load($this->currentUser->id()); // Call logout hooks when switching from original user. $this->moduleHandler->invokeAll('user_logout', [$previous]); // Regenerate the session ID to prevent against session fixation attacks. $this->sessionManager->regenerate(); // Supposed "safe" user switch method https://www.drupal.org/node/218104 // @todo Use `Drupal::service('account_switcher')` but care about session. $this->currentUser->setAccount($user); $this->session->set('uid', $user->id()); // Call all login hooks when making user login. $this->moduleHandler->invokeAll('user_login', [$user]); return $previous; }
在切换用户的逻辑代码里面,先将当前用户登出,然后使用切换到的用户,重新生成会话信息,实现登录。
我们有一个客户,想在节日期间关闭网站的数据库,还想让网站能够访问。这个需求在国内很常见。我们初步选定了Tome模块。
Tome模块是Drupal站点生成静态站的利器,只需要Drupal就能生成静态站点,生成的效果和动态站点几乎一样,对于views,多媒体的支持也很友好。将站点静态化,可以极大的提高站点的性能和安全性。Tome的原理和早先的Boost模块一样,就是发起http请求,将动态生成的页面保存到指定的本地文件目录里面。
项目地址:https://www.drupal.org/project/tome
这是我们在实际使用中的总结:
首先尝试了Tome模块,总是报错,我检查了一下,网站升级不彻底,重新帮助客户升级到Dupal最新版本,再安装Tome模块。
在后台生成静态页面的时候,总是报错。我们研究一下,增加了日志输出。检查到了几个出错的页面:
namespace Drupal\tome_static\Form; StaticGeneratorForm \Drupal::logger('tome')->notice('path:'.$path); /// path:data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD… // png if(substr($path,0,11) == 'data:image/'){ return; } //可以在settings.php里面配置 $exclude_paths = [ '/wechat', '/en/wechat', ]; if(in_array($path, $exclude_paths)){ return; }
发现写的wechat模块提供的路径,匿名用户下,在tome下面报错,就把它排除出去了,还有以data:image/开头的奇怪路径也被我排除掉了。
这样批处理就可以正常运行。成功生成了静态页面。
这是后面我们的tome在settings.php里面的配置:
$settings['tome_files_directory'] = '/data/8211/static/files'; $settings['tome_content_directory'] = '/data/8211/static/content'; $settings['tome_static_directory'] = '/data/8211/static/html'; $settings['tome_static_path_exclude'] = [ '/wechat', '/en/wechat', ];
生成的静态文件存在了/data/8211/static/html目录下面。我们将端口指向到这个静态文件的目录,当前使用的apache,可以直接访问,运行良好。
将同样的目录,部署到nginx下面,使用Drupal的nginx配置,是出不来的。Tome生成静态文件夹,部署到nginx下面,采用这样的配置:
location / { try_files $uri $uri/ $uri/index.html; # For Tome static html files }
这样就可以跑起来了。
Superfish 的ID发生变化问题,由于整个整点,只用了一个,所以可以这样:
function mytheme_preprocess_superfish(array &$variables) { $variables['id'] = 'superfish-main'; }