【发布时间】:2011-01-22 22:35:51
【问题描述】:
我正在为基于drupal 的客户端创建站点,并且客户端希望匿名用户(未登录)能够创建一个新节点,但只能创建一个未发布的节点。然后管理员可以在发布自己之前查看和更改节点。
我研究过使用触发器和动作,但编写自定义触发器模块似乎有点令人生畏,因为我目前对 Drupal API 不是很熟悉。任何想法都表示赞赏。
【问题讨论】:
标签: php drupal content-management-system triggers
我正在为基于drupal 的客户端创建站点,并且客户端希望匿名用户(未登录)能够创建一个新节点,但只能创建一个未发布的节点。然后管理员可以在发布自己之前查看和更改节点。
我研究过使用触发器和动作,但编写自定义触发器模块似乎有点令人生畏,因为我目前对 Drupal API 不是很熟悉。任何想法都表示赞赏。
【问题讨论】:
标签: php drupal content-management-system triggers
对于 Drupal 7,您可以通过这种方式应用 @Mirzu 解决方案:
function <your-module-name>_node_presave($node) {
if (user_is_anonymous())
$node->status = FALSE; // means unpublished
}
当然你也可以反过来做:
将内容类型定义为 unpublished,然后将其设置为 published 以供钩子中经过身份验证的用户使用。
【讨论】:
您无需自定义编码或触发器/操作即可完成此操作。只需将内容类型的默认设置为未发布并设置内容类型的权限以允许匿名用户创建该类型的内容。
【讨论】:
您无需自定义编码或触发器/操作即可完成此操作。
您可以使用 2 种不同的节点类型,每组一个,然后在显示时将它们视为相同。或者,您应该能够在 nodeapi 的“presave”操作中根据角色发布或取消发布。
只需将匿名用户内容类型的默认“状态”设置为未发布,并设置该内容类型的权限以允许匿名用户创建该类型的内容。
【讨论】:
感谢@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 . '"');
}
}
【讨论】:
在你的 hook_nodeapi() 'presave' 中,而不是:
db_query('UPDATE node SET status="0" WHERE nid="' . $node->nid . '"');
你不能只使用:
$node->status = 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);
}
}
【讨论】: