【问题标题】:An example web service for creating content in Drupal在 Drupal 中创建内容的示例 Web 服务
【发布时间】:2015-08-31 20:49:32
【问题描述】:

我想使用 Drupal 的现有服务,通过使用 ajax 调用的独立插件在我的 drupal 站点上创建内容。谁能提供详细信息...?有没有我可以使用的网络服务。

【问题讨论】:

  • 等等,你想用 Drupal 来创建不是 Drupal 的内容吗?我不明白这个问题,但它似乎涉及将管理员访问权限移交给第三方网络服务。
  • 流程就像,我有一个本机桌面 html+Javascript UI,它将为我的 drupal 站点创建一个 oAuth 请求。一旦应用程序通过身份验证,它会创建一个 ajax 请求到休息端点Drupal 上现有的 Web 服务,用于各种 crud 操作。例如创建内容
  • 所以基本上我的要求是我可以在我的drupal站点上添加的任何现有服务以及如何安装该服务及其使用的各个细节......
  • 这是什么意思,我还是不明白?如果您的目的是更改管理界面的外观和操作,只需构建您自己的管理主题。
  • 我不想更改管理界面的外观或操作...我们正在开发一些扩展,用户可以通过该扩展使用他们的 drupal 站点进行内容管理,而无需专门登录网站等......他们将添加许多其他功能......

标签: drupal


【解决方案1】:

好的,我觉得我足够了解您,可以尝试回答;不幸的是,这可能不是您要寻找的答案,因为您似乎想使用 oAuth 验证管理员身份,而不是使用标准 Admin API 登录。您会注意到几乎没有 oAuth 登录模块支持这种类型的管理员身份验证(我一直在使用:https://www.drupal.org/project/gauth)——事实上,这将是对 Drupal 核心 API 的巨大修改,而不是对其的扩展,所以我会担心关于使用任何尝试过的东西。

在我们开始之前,我强烈建议完全禁用用户 #1 并使用具有管理员访问权限的其他用户来执行您的管理员操作。更多关于为什么你应该这样做的信息here

你说:

用户可以通过扩展使用他们的 drupal 站点进行内容管理,而无需专门登录该站点

但是,无论如何,您需要对用户进行身份验证,否则您怎么能相信他们应该以管理员身份发布?您会注意到 Drupal 使用会话数据来保持用户会话处于活动状态。让我们看一个为您提供管理员访问权限的 cookie 示例:

cookie                                  value                                           domain                  path    expires                     HTTP
SESS92fe1e89dd2d30d5c7ef053b44d061s5    bJzbNlFKnbwvoTOH8A1XBWHipcRPnC32wOBdAJiEmJg     example_domain.com      /       2015-07-09T21:46:07.841Z    true

我在一秒钟前创建了该 cookie,因此您可以看到,默认情况下,Drupal 管理员 cookie 在用户计算机上保持有效不到一个月。有多种方法可以将此会话数据导入您的应用程序,最简单的方法是使用 <iframe> 包装器。 iframe 登录可以与 Drupal 一起使用,并在此处进行了测试:http://jsfiddle.net/z1rrj4ky/

只需制作您自己的自定义登录页面和模块,使其样式与您的扩展程序的其余部分一样。一旦您将管理 cookie 返回到您的应用程序,您甚至不需要 Drupal 管理主题页面来发布内容。您只需要通过包含它们来访问 Drupal API 函数。快速实现此目的的一种方法是将 Drupal 安装在本地安装到具有目标服务器数据库的应用程序中。您可以通过修改位于:<drupal_root>/sites/default/settings.php 或在某些情况下:<drupal_root>/sites/default/default.settings.php 的设置文件将扩展的数据库设置为与目标数据库链接如果您需要访问多个数据库,则不需要多个安装 Drupal,只需更改 environment var 或根据来自 constantsvar 重新定义设置。

完成所有设置后,您就可以随心所欲地提供内容发布页面。如果您不想使用自定义主题来使用 Drupal 管理界面,只需以编程方式创建内容并随心所欲地提供它们 - 即使是从 Drupal 根文件夹之外。

例如:

// get access to Drupal API functions from outside of Drupal
// This example assumes a sibling directory to the Drupal directories
// it can be easily modified to instantiate from directories much 
// further away or deeply nested
$path = $_SERVER['DOCUMENT_ROOT'];
$base_url = 'http://'.$_SERVER['HTTP_HOST'];
chdir($path);
define( 'DRUPAL_ROOT', getcwd() );
require_once './includes/bootstrap.inc';
require_once DRUPAL_ROOT . '/includes/common.inc';
require_once DRUPAL_ROOT . '/includes/module.inc';
require_once DRUPAL_ROOT . '/includes/unicode.inc';
require_once DRUPAL_ROOT . '/includes/file.inc';
require_once DRUPAL_ROOT . '/includes/session.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
// now you can use all drupal functions:
// For example, let's check if current user is admin:
global $user;
$user_array = (array) $user;

if ( array_key_exists ( 3, $user->roles ) ) {
    $user_type = "admin"; // admin to save the day!
} else {
    $user_type = "user"; // not an admin, can't post or edit content doh!
}

验证用户拥有发布和编辑权限后,如果您反对将本机管理员包装器与自定义主题一起使用,您会发现有很多教程向您展示如何以编程方式创建或编辑内容;例如 - https://www.drupal.org/node/1388922 向您展示如何以编程方式创建节点。

回顾:

  • 禁用用户 #1 并使用其他管理员帐户
  • 使用 iframe 进行身份验证,如果您真的反对,您可以在扩展程序中使用 oAuth 进行身份验证,使用令牌成功回调发布到另一个页面,该页面将 environment variablesconstants 从散列 SQL 表条目发布到身份验证 Drupal 管理员看到它的用户。如果你这样做肯定散列 contants 或环境变量或其他什么。
  • 通过修改<drupal root>/sites/default/ 文件夹中的settings.php,确保您的Drupal 本地扩展版本已连接到目标站点的数据库
  • 一旦您通过身份验证和验证,您就可以连接到正确的数据库,您可以使用自定义主题使用本机 Drupal 界面来处理发布或编辑内容,或者使用上述代码的调整来引导 Drupal 以实例化 D6或您项目中任何位置的 D7 API。

祝你好运!

【讨论】:

  • 请记住,您真正需要访问的是目标数据库。但是,强烈建议不要在发布或编辑内容时尝试从等式中删除 Drupal,因为它肯定会在未来发布不可预见的问题。
  • 谢谢德鲁!关于“没有登录网站”这句话并不意味着用户不需要进行身份验证。这意味着用户将使用我们扩展程序的自定义登录页面通过使用 OAuth ...1 进行身份验证
  • 谢谢德鲁!关于“没有登录网站”这句话并不意味着用户不需要进行身份验证。这意味着用户将使用我们扩展程序的自定义登录页面通过 OAuth 进行身份验证。所以方法是:1)用户首先授权扩展代表他/她在drupal上发布内容。2)扩展应该从drupal获得称为客户端ID和秘密的东西。
  • 3) 用户通过扩展通过 grant_type=password 或 grant_type= 扩展的客户端凭据(即 id 和 secret)对自己进行身份验证。获取具有一定到期时间的访问令牌,该令牌将保存在本地......然后扩展程序可以使用相同的令牌来进一步请求相应的 CRUD 操作......
  • 另外,我没有使用 php 进行请求调用,而是使用 javascript 或 jquery 和 ajax 进行其余的 api 请求。另外,如果我已经为此实现了任何示例 Web 服务,那会很棒,因为我不知道 php。所以创建一个新的 webservice 会很困难。如果我得到任何已经为 crud 操作实现的 rest webservice 模块那就太好了!
猜你喜欢
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多