我有一个概念性的障碍。 所以,我想制作一个自定义的Drupal模块,它有几个不同的页面,每个页面都“有用”。
我不了解如何在我的模块中创建/集成不同的页面,以及它们的URL是什么。
我确实有这个:
/* FILE : mymodule.module */
function mymodule_menu() {
$items = array();
$items['mymodule/landingpage'] = array(
'page callback' => 'mymodule_landing',
'access arguments' => array('access content'),
'type' => MENU_NORMAL_ITEM,
);
return $items;
}
function mymodule_landing() {
$title = 'Hello World';
$content ='This is a simple Hello World Proof of Concept';
return theme_box($tile, $content);
}
当我转到mysite.com/mymodule/landingpage
时,我会看到mymodule_landing()
生成的内容。
但这似乎不是我想要做的,因为landingpage
的内容是在mymodule.module
内部生成的,这让我对如何制作我的{我感到非常困惑{1}},...,mysite.com/mymodule/step2
页面
我有直觉,每个页面的代码都应该在它自己的相应文件中,我不知道怎么做,这似乎不是正确的方法。
你能解释一下我应该怎么做,文件应该去哪里(和我的其他模块文件一样,对吗?),以及它可以查看的URL?
答案 0 :(得分:10)
到目前为止,您所做的事情大多是正确的(每个项目的“标题”键必需,因此请务必加入)。由于page callback
指向mymodule_landing()
,因此该功能返回的内容将在页面上显示为您的内容。
要制作更多页面(例如step2,step99等),您可以继续在mymodule_menu()
中创建更多路径,例如:
$items['mymodule/step2'] = array(
'title' => 'Step 2', // Required
'page callback' => 'mymodule_step2',
'access arguments' => array('access content'),
'type' => MENU_NORMAL_ITEM,
);
依此类推......你可以使用相同的页面回调mymodule_landing()
并简单地传递“页面参数”,或者每个都可以拥有自己的页面回调。
要将您的函数mymodule_landing()
放在单独的文件中,您可以使用文件和文件路径键(见下文)
$items['mymodule/landingpage'] = array(
'title' => 'Landing Page', // Required
'page callback' => 'mymodule_landing',
'access arguments' => array('access content'),
'type' => MENU_NORMAL_ITEM,
'file' => 'mymodule.pages.inc',
'file path' => drupal_get_path('module', 'mymodule'),
);
您应该将这些文件放在模块目录(或模块目录中的子目录并设置正确的文件路径)中,并且可以访问mysite.com/mymodule/landingpage
处的每个页面,{{1}等等。
页面处理程序包含文件的最佳做法(详情请见http://drupal.org/node/146172):
模块开发人员可以自由地为他们选择的模块拆分页面处理程序。但是,建议遵循以下准则和标准:
- 对于页面处理函数(包括表单处理函数,如果适用)具有超过约50行代码的任何模块应将它们拆分为单独的文件。这样可以减少加载模块时PHP的开销,从而加快网站上的每一个请求。
- 页面包含文件应以modulename.key.inc的形式命名,其中“modulename”是模块的名称,“key”是它包含的页面处理程序类型的单字描述术语。
- 对于大多数模块,将页面处理程序拆分为两个文件 - example.admin.inc(仅适用于管理员页面)和example.pages.inc(适用于非管理员用户可访问的页面) - 已足够,并且推荐的做法。如果模块没有非管理员页面,它应该只有一个example.admin.inc文件。如果模块没有仅限管理员的页面,则它应该只有一个example.pages.inc文件。
- 具有大量页面处理程序的模块可以选择进一步分离页面处理程序。如果是这样,每个文件应按功能进行逻辑分组(例如,与主题相关的管理页面,与日志记录相关的管理页面,其他管理页面和用户可访问的页面)并清楚地标记。请记住,将模块的页面处理程序拆分太多会使维护变得更加困难,并且只需要加载一个页面处理程序包含文件,无论处理程序函数的细分程度如何。
仅供参考:hook_menu() documentation
page_example.module也可能对您有所帮助。