将 HTML5 应用程序作为 Drupal 模块提供服务

发布于 2024-12-18 01:02:11 字数 361 浏览 0 评论 0原文

我为我学院的学生会管理一个基于 Drupal 7 的网站。其中大部分是标准静态页面。每年我们都会进行一次房间投票,让人们选择他们的房间,这个过程需要一个应用程序来显示当前的房间分配(实时)以及有关不同房间的维基风格信息。

我需要能够提供 HTML、javascript 和 css 的静态页面;绕过主题模块。我需要 html 页面中的相对寻址作为应用程序的根才能正常工作(例如“javascript/app.js”应该从模块内获取该文件)。然后,我需要使用所有用于权限和数据库访问等的 drupal API 来从 php 提供 json 数据。

我在 HTML、Javascript 等方面有相当多的经验,在 PHP 方面也有一些经验,但我对 Drupal 模块开发相当陌生。

I manage a Drupal 7 based website for my College's Student's Association. Most of it is standard static pages. Each year we run a room ballot for people to choose their rooms and this process will need an application to display current room allocations (in real time) and wiki style information about what the different rooms are like.

I need to be able to serve up static pages of HTML, javascript and css; bypassing the theming module. I need the relative addressing in the html page which serves as the root of the application to work properly (e.g. "javascript/app.js" should pick up that file from within the module). I then need to serve up json data from php using all the drupal APIs for permissions and database access etc.

I have a fair bit of experience in HTML, Javascript etc. and some in PHP, but I'm fairly new to Drupal module development.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

公布 2024-12-25 01:02:11

您应该按照您的建议创建一个自定义模块,并将您的 HTML5 应用程序单独放入该模块的子文件夹中。当它被访问时,它将使用与您通常期望的相同的相对路径,因此如果该文件存在于您的 HTML5 应用文件夹下的路径中,javascript/app.js 将起作用。

对于 JSON 数据,您的自定义模块将如下所示:

function mymodule_menu() {
  $items['my/app/data'] = array(
    'page callback' => 'mymodule_ajax_callback',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK
  );

  return $items;
}

function mymodule_ajax_callback() {
  $type = $_POST['type'];

  $nodes = db_query("SELECT nid, title FROM {node} WHERE type = :type", array(':type' => $type))->fetchAllKeyed();

  drupal_json_output($nodes);

  drupal_exit();
}

该代码定义了一个菜单路径(使用 hook_menu()) 在 mp/app/data 使用mymodule_ajax_callback() 因为它是页面回调。

mymodule_ajax_callback() 只是从数据库中获取与 AJAX $_POST 中传递的 type 参数相匹配的所有节点,并将它们的 id 和 title 输出到一个发送到页面的 JSON 字符串(当您请求 /my/app/path 时,该字符串将作为 AJAX 响应返回)。

希望有帮助

You should create a custom module as you suggest, and separately put your HTML5 application in a sub-folder of the module. When it's accessed it will use the same relative paths as you'd normally expect so javascript/app.js will work if the file exists in the path under your HTML5 app's folder.

For the JSON data your custom module will look something like this:

function mymodule_menu() {
  $items['my/app/data'] = array(
    'page callback' => 'mymodule_ajax_callback',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK
  );

  return $items;
}

function mymodule_ajax_callback() {
  $type = $_POST['type'];

  $nodes = db_query("SELECT nid, title FROM {node} WHERE type = :type", array(':type' => $type))->fetchAllKeyed();

  drupal_json_output($nodes);

  drupal_exit();
}

That code defines a menu path (using hook_menu()) at mp/app/data which uses mymodule_ajax_callback() as it's page callback.

mymodule_ajax_callback() simply grabs all nodes from the database that match the type parameter passed in the AJAX $_POST and outputs their id and title in a JSON string to the page (which will then be returned as your AJAX response when you request /my/app/path).

Hope that helps

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文