允许匿名用户在Drupal中创建未发布的节点?

时间:2011-01-22 22:35:52

标签: php drupal content-management-system triggers

我正在为基于drupal的客户端创建一个站点,并且客户端希望匿名用户(未登录)能够创建新节点,但只能创建一个未发布的节点。然后,管理员可以在发布之前查看节点并对其进行更改。

我已经看过使用触发器和操作,但编写自定义触发器模块似乎有点令人生畏,因为我目前对Drupal API不是很流畅。任何想法都表示赞赏。

7 个答案:

答案 0 :(得分:3)

对于Drupal 7,您可以通过以下方式应用@Mirzu解决方案:

function <your-module-name>_node_presave($node) {
    if (user_is_anonymous())
        $node->status = FALSE; // means unpublished
}

当然,你可以反过来这样做:
将内容类型定义为未发布,然后将其已发布设置为挂钩中经过身份验证的用户。

答案 1 :(得分:2)

您可以在没有自定义编码或触发/操作的情况下完成此操作。只需将内容类型的默认设置为未发布,并设置内容类型的权限,以允许匿名用户创建该类型的内容。

答案 2 :(得分:1)

谢谢@mirzu。对于任何感兴趣的人,我使用以下代码:

function hook_nodeapi($node, $op, $a3 = NULL, $a4 = NULL)
{
    global $user;
    if( $op == 'presave' && !$user->uid)
    {
        db_query('UPDATE node SET status="0" WHERE nid="' . $node->nid . '"');
    }
}

答案 3 :(得分:1)

您可以在没有自定义编码或触发/操作的情况下完成此操作。

您可以使用2种不同的节点类型,每组一个,然后在显示时将它们视为相同。或者,您应该能够在nodeapi的“presave”操作中根据角色发布或取消发布。

只需将匿名用户内容类型的默认“状态”设置为取消发布,并设置内容类型的权限,以允许匿名用户创建该类型的内容。

答案 4 :(得分:1)

在你的hook_nodeapi()'presave'而不是:

db_query('UPDATE node SET status="0" WHERE nid="' . $node->nid . '"');

你能不能只使用:

$node->status = 0;

答案 5 :(得分:0)

您可以将默认发布状态设置为取消发布 - 并从匿名用户隐藏该字段。

然后你可以创建一个视图 - 或者只是使用admin部分中的Content链接来查看对作者有匿名并且未发布的页面 - 然后你可以从那里查看节点。

答案 6 :(得分:0)

您可以在drupal 8中使用此钩子

function MODULENAME_entity_presave(Drupal\Core\Entity\EntityInterface $entity) {

  if( $entity->bundle() == 'BUNDLENAME' && in_array('anonymous', \Drupal::currentUser()->getRoles() ) ) {
    $entity->setPublished(FALSE);
  }

}