对于遇到我同样问题的任何人,需要限制特定内容类型的已发布节点的数量,我的一个朋友更改了上面链接的 Badzilla 模块,并将其调整为以下内容。感谢 Badzilla 提供了模块的基础,感谢我的好友对其进行了调整,以检查用户而不是站点范围内的已发布节点数。
<?php
/*
* File : node_limit_publish.module
* Title : Limits the number of concurrently published node types dependent upon admin configurable limits
* Sponsor : Hangar Seven Digital
* Author : Badzilla www.badzilla.co.uk @badzillacouk
*
* This work is copyright Badzilla under the GPL licence terms and conditions
*
*/
/**
* Implementation of hook_menu().
*
*/
function node_limit_publish_menu() {
$items = array();
$items['admin/config/content/node_limit_publish'] = array(
'title' => 'Limit Number of Published Nodes per Node Type',
'description' => t('Zero represents an unlimited amount of published nodes'),
'page callback' => 'drupal_get_form',
'page arguments' => array('node_limit_publish_admin_settings'),
'access arguments' => array('administer node_limit_publish'),
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
function node_limit_publish_admin_settings() {
$form = array();
if (is_array($types = node_type_get_types())) {
$form['title'] = array(
'#markup' => t('Zero represents an unlimited amount of published nodes'),
);
foreach($types as $key => $value)
$form['node_limit_publish_'.$key] = array(
'#type' => 'textfield',
'#description' => $key,
'#size' => 4,
'#maxlength' => 10,
'#element_validate' => array('node_limit_publish_is_numeric'),
'#default_value' => variable_get('node_limit_publish_'.$key, 0),
);
}
return system_settings_form($form);
}
function node_limit_publish_is_numeric($element, &$form_state, $form) {
if (!is_numeric($element['#value']))
form_error($element, t('This field must be numeric'));
}
/**
* Implementation of hook_presave().
*
*/
function node_limit_publish_node_presave($node) {
global $user;
// Get the limit on this type
if (($limit = variable_get('node_limit_publish_'.$node->type, 0)) and $node->status == 1) {
// now check whether we have reached our maximum
$query = db_select('node')
->condition('type', $node->type)
->condition('status', 1)
->condition('uid', $user->uid);
if (isset($node->nid))
$query->condition('nid', $node->nid, '!=');
$count = $query->countQuery()
->execute()
->fetchField();
if ($count >= $limit) {
$node->status = 0;
// use %type for dynamic node type
drupal_set_message(t('Sorry, the maximum of this node are active already. You must first disable another!', array('%type' => $node->type)), 'warning');
}
}
}