【问题标题】:Flag content in Drupal via external HTTP request通过外部 HTTP 请求标记 Drupal 中的内容
【发布时间】:2014-04-05 16:42:19
【问题描述】:

我正在编写一个 iOS 应用程序,它显示来自 Drupal 管理的网站的内容。我想出了如何在 Drupal 中创建视图,以将内容作为 JSON 传递给应用程序。但现在我想让我的登录用户将内容标记为他们的收藏夹。用户可以在网站上创建一个帐户,也可以在应用程序内登录。收藏夹按用户存储。

在 Drupal 中,这是使用 Flag module 实现的,它呈现相应的链接以切换网站上的标志。这些链接指向一个特定的 URL,该 URL 还包含一个防止欺骗的令牌。在没有令牌的情况下调用 URL 会导致访问被拒绝。

现在很遗憾,我无法在我的应用中生成这些令牌。有没有办法在不使用网站的情况下标记内容?

我是 Drupal 的新手。我所需要的基本上是关于如何实现我自己的允许外部程序操作内容的 HTTP API 的提示。

【问题讨论】:

    标签: php drupal drupal-7 drupal-modules


    【解决方案1】:

    事实证明,我必须编写自己的模块来提供菜单回调条目。我的favorites_api.module 文件如下所示:

    /**
     * Implements hook_menu().
     */
    function favorites_api_menu() {
        $items['node/%/favorite/%'] = array(
            'title' => 'Mark as favorite',
            'page callback' => 'favorites_api_toggle_favorite',
            'page arguments' => array(1, 3),
            'access callback' => 'user_access',
            'access arguments' => array('access content'),
            'type' => MENU_CALLBACK,
        );
    
        return $items;
    }
    
    /**
     * Callback for above menu entry
     */
    function favorites_api_toggle_favorite($entity_id, $action) {
        $favorites_flag = flag_get_flag('favorites') or die('no "favorites" flag defined');
        $favorites_flag->flag($action, $entity_id);
    
        // error handling and return message
        // ...
    }
    

    现在我可以调用 http://myurl/node/3/favorite/flag 将节点 3 标记为收藏,并调用 http://myurl/node/3/favorite/unflag 取消标记。

    虽然必须编写 menu 条目来创建自定义 URL 操作有点误导...

    【讨论】:

      【解决方案2】:

      下载并启用“会话 api”模块 (https://drupal.org/project/session_api)。

      正如您在“标志访问”部分中创建/编辑标志模块时所说:

      如果会话 API 模块是匿名用户可能会标记内容 已安装。

      每个匿名用户都将拥有相同的令牌(“flag.module”文件中的第 2358 行):

      md5(drupal_get_private_key() . $entity_id)
      

      然后,如果您可以获得实体/节点 ID(私钥可以在 Drupal 配置中固定和设置),您可以在您的应用中构建此令牌。

      编辑:您必须在权限中为匿名用户的标志名称添加权限。列表

      【讨论】:

      • 感谢您的回答。不幸的是,收藏夹标志不是全局的,这意味着收藏夹是按用户存储的。因此,用户必须登录才能将内容标记为收藏。登录用户的令牌是使用会话 ID 构建的。此外,出于显而易见的原因,我认为将页面的私钥存储在应用程序中并不是一个好主意。
      • 是的,我同意私钥存储,但不是很安全......此外,您自己答案中的代码是否有效?我的意思是您必须先登录才能使用。
      • 好的。您没有在您的问题中提到您能够在 Drupal 站点中登录您的应用程序用户。我认为如果你能在你的答案(或你的问题)中解释你能够登录你的用户以及如何登录,这将是一件好事。谢谢。
      • 很公平。我在问题中添加了这个事实。
      • 我在回答中描述的方法效果很好。但我不认为它优雅。您可能知道更好的方法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多