在 Drupal 中实现标题唯一性检查,主要有现成模块和自定义代码两种方式。对于大多数情况,推荐使用现成模块,简单高效。
🎯 方案对比
推荐方案 实现方式 优点 缺点
方案一:使用模块 安装并配置专门的贡献模块。 无需编码,配置灵活,功能完善,有社区支持。 需要额外安装模块,对站点性能有极小影响。
方案二:自定义代码 编写自定义模块,通过 hook_form_alter() 实现验证。 不依赖第三方模块,完全掌控业务逻辑,代码轻量。 需要Drupal开发知识,维护成本高,容易出错。
✅ 推荐方案:使用现成模块 (No-Code)
搜索结果显示,有多个模块可以很好地解决你的问题。其中最符合“自动提示并阻止保存”需求的模块是 Duplicate Title Check 。
1. Duplicate Title Check 模块(精准匹配需求)
这个模块非常轻量,功能直接匹配你的描述:
核心功能:当作者输入一个已发布内容的重复标题时,系统会:
在标题下方显示一个醒目的警告。
显示一个“仍然使用此标题”的复选框,将决定权交给作者。
如果作者不勾选复选框,则无法保存内容。
配置灵活:可以针对特定的内容类型开启此功能。
用户体验:只会检查已发布的内容,避免草稿造成干扰,很人性化。
配置步骤:
下载并安装模块:composer require 'drupal/duplicate_title_check'。
在后台启用模块。
导航至 配置 → 内容创作 → 重复标题检查 (admin/config/content/duplicate_title_check)。
选择需要开启此功能的内容类型,保存即可。
2. 其他备选模块
如果你的需求有细微差别,也可以考虑以下模块:
Unique Content Field Validation:功能更全面,不仅能校验标题,还能校验任何字段的唯一性。
Node Title Validation:这是一个轻量级模块,除了唯一性,还能限制标题的长度和禁用词。
Suggest Similar Titles:如果你不希望强制禁止,而是想推荐作者使用其他标题,这个模块很合适。它会在输入标题时,按相似度列出已存在的标题供参考。
🛠️ 备选方案:自定义代码实现
如果你偏好更底层的控制,或者希望减少模块依赖,也可以通过编写少量代码实现。
核心思路:使用 hook_form_alter 挂载到节点表单,添加一个自定义的验证器。
代码示例(在自定义模块的 .module 文件中):
php
/**
* Implements hook_form_alter().
*/
function mymodule_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
// 针对 article 内容类型的编辑表单
if ($form_id == 'node_article_edit_form' || $form_id == 'node_article_form') {
// 添加自定义验证函数
$form['#validate'][] = 'mymodule_validate_unique_title';
}
}
/**
* 自定义验证函数:检查标题是否唯一。
*/
function mymodule_validate_unique_title(&$form, \Drupal\Core\Form\FormStateInterface $form_state) {
// 获取用户输入的标题
$title = $form_state->getValue('title')[0]['value'];
$node = $form_state->getFormObject()->getEntity();
$nid = $node->id();
// 查询数据库,检查是否存在相同标题的已发布节点
$query = \Drupal::entityQuery('node')
->condition('title', $title)
->condition('status', 1) // 只检查已发布的
->accessCheck(TRUE);
if ($nid) {
$query->condition('nid', $nid, '!=');
}
$result = $query->execute();
if (!empty($result)) {
// 若存在,则设置表单错误,阻止保存
$form_state->setErrorByName('title', t('标题“@title”已被使用,请使用另一个新标题。', ['@title' => $title]));
}
}
代码说明:
hook_form_alter:定位到特定内容类型(如 article)的编辑表单。
mymodule_validate_unique_title:自定义验证逻辑。
\Drupal::entityQuery:高效查询数据库,检查标题是否存在。
$form_state->setErrorByName:如果存在重复,则在此处报错,这会阻止 Drupal 保存内容,并向前端返回错误信息。
💎 总结与建议
首选方案:直接使用 Duplicate Title Check 模块。它是实现此需求最专业、体验最好的方式,能满足你“自动提示、不可保存”的所有要求。
灵活方案:如果未来你需要更复杂的校验规则(如跨字段校验),Unique Content Field Validation 模块会是更好的选择。
极简/定制方案:如果不想安装额外模块,或者需要和现有业务逻辑深度集成,可以参照上面的代码示例进行二次开发。
评论