3

我对 Drupal 完全陌生,正在尝试创建一个包含 2 个表单(来自自定义模块)的单个页面。我还希望这个页面成为我主题目录中的专用文件。

在名为“vocabt”的自定义模块中,我有 vocabt.module 包含 3 个所需的功能:

function vocabt_menu() {

    $items['scores/admin'] = array(
    'title' => 'Check Your Student\'s Scores',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('vocabt_admin_login_form'),
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
);

    $items['scores/student'] = array(
    'title' => 'Check My Scores',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('vocabt_student_login_form'),
    'access arguments' => array('access content'),
    'type' => MENU_NORMAL_ITEM,
);

}



function vocabt_admin_login_form($form, &$form_state) {
if(!empty($form_state['values'])) {
    $values = $form_state['values'];
} else {
    $values = array();
}

$schools = vocabt_get_school_options();
$form['school'] = array(
    '#type' => 'select',
    '#title' => 'Select Your School',
    '#required' => TRUE,
    '#options' => $schools,
    '#default_value' => !empty($values['school']) ? $values['school'] : '',
    '#empty_option' => 'Select',
);
$form['username'] = array(
    '#type' => 'textfield',
    '#title' => 'User Name',
    '#required' => TRUE,
);
$form['password'] = array(
    '#type' => 'password',
    '#title' => 'Password',
    '#required' => TRUE,
);

$form['actions'] = array();
$form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Log In',
    '#attributes' => array('class' => array('button blue')),
);
return $form;
}




 function vocabt_student_login_form($form, &$form_state) {
if(!empty($form_state['values'])) {
    $values = $form_state['values'];
} elseif(isset($_GET['id']) && $info = vocabt_decode_id($_GET['id'])) {
    $values = $info;
} else {
    $values = array();
}

$form['left'] = array(
    '#prefix' => '<div class="lookup">',
    '#suffix' => '</div>',
);

$form['right'] = array(
    '#prefix' => '<div class="results">',
    '#suffix' => '</div>',
);

$schools = vocabt_get_school_options();
$form['left']['school'] = array(
    '#type' => 'select',
    '#title' => 'Select Your School',
    '#required' => TRUE,
    '#options' => $schools,
    '#default_value' => !empty($values['school']) ? $values['school'] : '',
    '#empty_value' => 'Select',
);
$form['left']['id'] = array(
    '#type' => 'textfield',
    '#title' => 'Enter your student ID',
    '#required' => TRUE,
    '#default_value' => !empty($values['id']) ? $values['id'] : '',
);
$form['left']['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Check',
    '#attributes' => array('class' => array('button blue')),
);

if(!empty($form_state['storage']['error'])) {
    $results = '<div class="blackbox">';
    $results .= '<div style="padding: 20px 0px; text-align: center;">'.$form_state['storage']['error'].'</div>';
    $results .= '</div>';
} elseif(empty($values['id'])) {
    $results = '<div class="blackbox">';
    $results .= '<div class="instructions">Your score will appear here once you’ve entered your information on the left.</div>';
    $results .= '</div>';
} else {
    $results = vocabt_get_student_results($values['school'], $values['id']);
}

$form['right']['results'] = array('#markup' => $results);

return $form;
}

我的问题是我想点击一个 URL,例如“/scores/admin”,它不仅包含“vocabt_admin_login_form()”函数中的表单,而且还包含上述函数“vocabt_student_login_form()”中的表单...。我怎样才能做到这一点?

我还希望这两种表单都出现在使用专用 PHP 文件的页面中(我已经可以通过在 CMS 中创建新页面来使用专用 PHP 文件创建自定义页面),但我不知道如何将此专用 PHP 文件与以上2种形式。请告诉我!谢谢

4

2 回答 2

8

目前尚不清楚“专用 PHP 文件”是什么意思。在 Drupal 中,您使用 定义菜单路由项hook_menu(),然后在特定的页面回调函数中返回它们的数据。此函数可以在任何 .module 文件中,也可以在普通 PHP 范围内的任何包含文件中。

在你的 hook_menu() 实现中添加一个新项目,如下所示:

$items['scores/check'] = array(
  'title' => 'Check Scores',
  'page callback' => 'vocabt_scores_page', // Note this is the PAGE CALLBACK!
  'access arguments' => array('access content'),
  'type' => MENU_NORMAL_ITEM,
) 

现在,让我们创建页面回调函数 vocabt_scores_page,以返回一个渲染数组,这样 Drupal 将在该页面中构建两种表单——而不仅仅是指定的表单。

function vocabt_scores_page() {
  $output = array();
  $output['admin'] = drupal_get_form('vocabt_admin_login_form');
  $output['student'] = drupal_get_form('vocabt_student_login_form');
  return $output;
}

确保在测试代码之前清除站点的缓存。保存后,转到scores/check页面,您将在一页中看到两个表单!

您可以将页面回调函数移动到与文件不同的.module文件中。为此,请添加'files' => 'vocabt.pages.inc'到菜单项并将函数移动到名为vocabt.pages.inc. Drupal 将假定该文件与该文件位于同一文件夹中.module。该文件名可以是任何名称,但我们通常也使用module.pages.inc, module.admin.inc, , 。

于 2013-05-20T17:15:18.990 回答
2

您可以使用 hook_theme 函数调用模板页面。您可以将您的 html 内容放在此页面中。只需调用theme('page_name', $link);.将您新创建的主题文件放在相应的模块中。

function modulename_theme() {
    return array(
        'page_name' => array(
          'template' => 'page_name',
          'arguments' => array('link' => NULL),
        ),
      );
    }

你可以在这里找到更多信息

http://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_theme/7

希望这可以帮助你... :)

于 2013-05-25T03:06:14.037 回答