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 易于使用,如果这是针对客户端的,他们可以非常轻松地切换它而无需修改代码。