我正在为基于drupal的客户端创建一个站点,并且客户端希望匿名用户(未登录)能够创建新节点,但只能创建一个未发布的节点。然后,管理员可以在发布之前查看节点并对其进行更改。
我已经看过使用触发器和操作,但编写自定义触发器模块似乎有点令人生畏,因为我目前对Drupal API不是很流畅。任何想法都表示赞赏。
答案 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);
}
}