Drupal - 只允许 1 个内容类型的节点是 'featured'
Drupal - allow only 1 node of a content type to be 'featured'
我有一个包含多种自定义内容类型的 Drupal 7 站点。
对于其中之一,"banners",有一个字段(复选框)将横幅标记为特色。 (使其在显示时更加突出)。
如何将“横幅”的内容类型限制为在任何时候只允许展示 1 个已发布的项目?
您是否使用标志模块进行标记?
不管你是不是,你都会想写一些自定义代码,无论是使用标志 API 来计算是否已经有一个标志,或者使用一些自定义 SQL 或实体查询为所有内容提取标志,如果已经有标志,则相应地采取行动。
你不能那样做。但是请检查显示这些横幅的部分 - 可能是一个视图,因此将其限制设置为 1。
据我所知,将需要自定义代码。
在下面的示例中,我正在检查名为 'featured_article' 的 属性,使用 Custom Publishing Options 模块可以很容易地添加它.
如果您的 'featured' 字段只是您添加到节点的标准复选框字段,则需要稍作修改,但逻辑保持不变。
首先,在 hook_node_submit 中,检查是否启用了有问题的 'featured_article' 属性(将其添加到自定义模块或您的 template.php):
function <THEME_OR_MODULE_NAME>_node_submit($node, $form, &$form_state)
{
// If featured is set, set all other nodes to not featured
if ($form_state['node']->featured_article == 1 && $form_state['node']->type == 'banners') {
<THEME_OR_MODULE_NAME>_set_as_only_featured_node($form_state['node']->nid);
}
}
然后添加您在上面调用的函数,该函数检查是否启用了任何其他功能,并根据需要禁用它们:
function <THEME_OR_MODULE_NAME>_set_as_only_featured_node($nid)
{
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'banners')
->propertyCondition('nid', $nid, '!=')
->propertyCondition('featured_article', 1);
$results = $query->execute();
if (!empty($results['node'])) {
foreach ($results as $result) {
$node = node_load(key($result));
$node->featured_article = 0;
node_save($node);
}
}
}
一种非常简单的方法是设置 Nodequeue 并将队列设置为仅允许该内容类型的一项。 Nodequeue UI 易于使用,如果这是针对客户端的,他们可以非常轻松地切换它而无需修改代码。
我有一个包含多种自定义内容类型的 Drupal 7 站点。 对于其中之一,"banners",有一个字段(复选框)将横幅标记为特色。 (使其在显示时更加突出)。
如何将“横幅”的内容类型限制为在任何时候只允许展示 1 个已发布的项目?
您是否使用标志模块进行标记?
不管你是不是,你都会想写一些自定义代码,无论是使用标志 API 来计算是否已经有一个标志,或者使用一些自定义 SQL 或实体查询为所有内容提取标志,如果已经有标志,则相应地采取行动。
你不能那样做。但是请检查显示这些横幅的部分 - 可能是一个视图,因此将其限制设置为 1。
据我所知,将需要自定义代码。
在下面的示例中,我正在检查名为 'featured_article' 的 属性,使用 Custom Publishing Options 模块可以很容易地添加它.
如果您的 'featured' 字段只是您添加到节点的标准复选框字段,则需要稍作修改,但逻辑保持不变。
首先,在 hook_node_submit 中,检查是否启用了有问题的 'featured_article' 属性(将其添加到自定义模块或您的 template.php):
function <THEME_OR_MODULE_NAME>_node_submit($node, $form, &$form_state)
{
// If featured is set, set all other nodes to not featured
if ($form_state['node']->featured_article == 1 && $form_state['node']->type == 'banners') {
<THEME_OR_MODULE_NAME>_set_as_only_featured_node($form_state['node']->nid);
}
}
然后添加您在上面调用的函数,该函数检查是否启用了任何其他功能,并根据需要禁用它们:
function <THEME_OR_MODULE_NAME>_set_as_only_featured_node($nid)
{
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'banners')
->propertyCondition('nid', $nid, '!=')
->propertyCondition('featured_article', 1);
$results = $query->execute();
if (!empty($results['node'])) {
foreach ($results as $result) {
$node = node_load(key($result));
$node->featured_article = 0;
node_save($node);
}
}
}
一种非常简单的方法是设置 Nodequeue 并将队列设置为仅允许该内容类型的一项。 Nodequeue UI 易于使用,如果这是针对客户端的,他们可以非常轻松地切换它而无需修改代码。