Drupal 8中如何限制认证用户每周最多发布3篇文章?
嘿,我来给你几个靠谱的解决思路!毕竟Drupal 8里有些老模块确实兼容性拉胯,自定义轻量模块反而更稳,而且逻辑也不复杂:
自定义模块实现方案(推荐)
依赖第三方模块容易踩兼容坑,自己写个小模块反而可控,核心要实现两个逻辑:统计用户本周发文数,以及限制页面访问和表单提交。
1. 先写个辅助函数统计本周发文量
这个函数用来计算当前用户本周(默认以周一为一周起始,可按需调整)已发布的article类型节点数:
/** * 获取用户本周已发布的文章数量。 * * @param int $uid * 用户ID,默认当前登录用户。 * * @return int * 文章数量。 */ function mymodule_get_user_weekly_article_count($uid = NULL) { if (!$uid) { $uid = \Drupal::currentUser()->id(); } // 定义本周的时间范围(周一零点到周日23:59:59) $start_of_week = strtotime('last Monday midnight'); $end_of_week = strtotime('next Sunday 23:59:59'); $query = \Drupal::entityQuery('node') ->condition('type', 'article') ->condition('uid', $uid) ->condition('status', 1) // 只统计已发布的文章 ->condition('created', [$start_of_week, $end_of_week], 'BETWEEN'); return $query->count()->execute(); }
2. 拦截文章添加页面的访问请求
用hook_menu_access()限制用户访问node/add/article页面,当发文量达限时直接拒绝并提示:
/** * Implements hook_menu_access(). */ function mymodule_menu_access(\Drupal\Core\Menu\MenuLinkInterface $link, \Drupal\Core\Session\AccountInterface $account) { // 只针对文章添加页面生效 if ($link->getRouteName() === 'node.add' && $link->getRouteParameters()['node_type'] === 'article') { // 给管理员开个后门,可根据角色调整权限 if ($account->hasPermission('bypass node limit')) { return NULL; // 不干涉管理员的访问权限 } $count = mymodule_get_user_weekly_article_count($account->id()); if ($count >= 3) { \Drupal::messenger()->addError(t('本周您最多只能发布3篇文章,请下周再试。')); return FALSE; // 拒绝访问该页面 } } return NULL; // 对其他页面不做限制 }
3. 表单提交时二次验证(防绕过)
有些用户可能通过直接提交表单绕过页面限制,所以要在节点表单提交前再做一次校验:
/** * Implements hook_form_alter(). */ function mymodule_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) { // 只针对文章添加表单生效 if ($form_id === 'node_article_form') { $account = \Drupal::currentUser(); if (!$account->hasPermission('bypass node limit')) { $count = mymodule_get_user_weekly_article_count(); if ($count >= 3) { $form_state->setErrorByName('', t('本周您最多只能发布3篇文章,请下周再试。')); $form['actions']['submit']['#disabled'] = TRUE; // 直接禁用提交按钮 } } } }
4. 添加入门权限(可选)
给管理员或者特定角色加个绕过限制的权限,在模块的mymodule.permissions.yml里添加:
bypass node limit: title: 'Bypass weekly article limit' description: 'Allows users to bypass the 3 articles per week limit.' restrict access: true
其他备选方案(不想写代码的话)
如果实在不想碰代码,可以试试这些方向:
- 检查Node Limit模块的版本,是不是下载了非Drupal 8.x的兼容版本?去模块官方页面找对应8.x的版本重新安装,有时候崩溃可能是版本不匹配或者和其他模块冲突,可以先禁用其他模块排查;
- 看看Content Access这类权限管理模块,有没有间接实现数量限制的配置,但灵活性可能不如自定义模块。
不过还是自定义模块最靠谱,代码量不大,逻辑清晰,不会受第三方模块的兼容问题影响。
内容的提问来源于stack exchange,提问作者tpliakas
相关产品推荐
相关产品推荐

