【问题标题】:Allow anonymous users to create unpublished nodes in Drupal?允许匿名用户在 Drupal 中创建未发布的节点?
【发布时间】:2011-01-22 22:35:51
【问题描述】:

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

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

【问题讨论】:

    标签: php drupal content-management-system triggers


    【解决方案1】:

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

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

    当然你也可以反过来做:
    将内容类型定义为 unpublished,然后将其设置为 published 以供钩子中经过身份验证的用户使用。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这可以工作...除非每次经过身份验证的用户(不一定是管理员)发布节点时,他们都必须确保并选中已发布的框。这似乎有点不方便......你能想出一种方法让经过身份验证的用户自动发布节点吗?
      • 在自定义模块中,您可以编写 hook_form_alter 的实现来覆盖已验证用户的默认发布状态。
      • 您可以使用 2 种不同的节点类型,每组一个,然后在显示时将它们视为相同。或者,您应该能够在 nodeapi 的“presave”操作中根据角色发布或取消发布。
      • 谢谢 mirzu,我使用了你的第二个建议。我刚刚创建了一个带有 hook_nodeapi() 实现的快速模块。效果很好!
      【解决方案3】:

      您无需自定义编码或触发器/操作即可完成此操作。

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

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

      【讨论】:

        【解决方案4】:

        感谢@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 . '"');
            }
        }
        

        【讨论】:

          【解决方案5】:

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

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

          你不能只使用:

          $node->status = 0;
          

          【讨论】:

            【解决方案6】:

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

            然后您可以创建一个视图 - 或者只使用管理部分中的内容链接来查看具有作者匿名且未发布的页面 - 然后您可以从那里查看节点。

            【讨论】:

              【解决方案7】:

              你可以在 drupal 8 中使用这个钩子

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多