【问题标题】:How to override form just on one page?如何仅在一页上覆盖表单?
【发布时间】:2010-06-14 01:22:47
【问题描述】:

好的,这是我的钩子表单更改功能。它导致网站上的所有注册表单都被覆盖,我不想要,因为我只想在这个页面上。

 
function special_registration_form_alter(&$form, $form_state, $form_id) {
  if ($form_id == 'user_register') {
    drupal_set_title(t('Custom registration'));
    $form['firstname'] = array('#type' => 'textfield', 
                               '#title' => t('First Name: *'), 
                               '#required' => TRUE, 
                               '#size' => 45, 
                               '#weight' => - 100,);
    $form['lastname'] = array('#type' => 'textfield', 
                              '#title' => t('Last Name: *'), 
                              '#required' => TRUE, 
                              '#size' => 45, 
                              '#weight' => - 99,);
  }
我只在此页面上捕获并存储在不同表中的名字和姓氏。

在其他页面上,我只想要老式的表格。我还需要改变体重吗?我知道我错过了一些基本的东西。

【问题讨论】:

  • 您的数组应该在末尾有逗号。 '#weight' => - 99,应该以 99 结尾。逗号是放置另一个您没有的键/值。此外,您的函数还需要右括号。
  • 大声笑我知道谢谢!!!我没有粘贴所有功能。感谢您查看它。
  • @Dan Heberden:最后一个数组条目之后的尾随逗号在 PHP 中完全有效,并且被许多人视为“正常”,因为它使数组声明的行代码操作更加容易,前提是右括号在新行上。这是否是一件好事是不值得深入讨论的公开辩论;)
  • @Henrik - 是的,我正在审查 zend 上的一些标准内容并注意到了这一点。我一直认为结尾的逗号创建了一个空元素,但经过测试,我发现它没有任何意义,并且可以更轻松地连续添加元素而不会弄乱。感谢您指出:)

标签: php drupal drupal-6 drupal-fapi


【解决方案1】:

您只需要使用arg 或$_GET['q'] 来检查当前页面。

例如:

function special_registration_form_alter(&$form, $form_state, $form_id) {
if ($_GET['q'] !== 'whatever/path' ) { return false; }
..rest of code..
}

【讨论】:

  • 是的,$_GET['q'] 始终是系统路径,例如,如果您的节点别名为 '/blog/2010/Jan/title-of-blog-post.html' $_GET['q'] 仍将是 'node/123'。
【解决方案2】:

如果您想将表单更改限制在特定页面,您可以简单地将页面检查添加到表单 ID 检查中,例如:

function special_registration_form_alter(&$form, $form_state, $form_id) {
  // Alter the registration form, but only on 'user/register' pages
  if ($form_id == 'user_register' && 'user' == arg(0) && 'register' == arg(1)) {
    // snipped alteration code
  }
}

【讨论】:

  • 好的,我没有及时注意到 cam8001 的类似答案 - 仍然保留此版本,因为它结合了页面和表单 id 检查(无需返回 FALSE,顺便说一句)
  • 如果你使用 Drupal 6,你可以像这样定义你的表单改变: hook_form_FORM_ID_alter(&$form, &$form_state) ,有些人觉得它更干净。 api.drupal.org/api/function/hook_form_FORM_ID_alter/6
【解决方案3】:

您也可以在核心模块列表中使用 Profile 模块。无需任何编程即可解决此问题,仅供参考。

【讨论】:

  • 是的,我与人交谈越多,他们就越建议我使用该模块或内容模块。猜猜我跳进了代码中。不过感谢您的提示:)
【解决方案4】:

实现hook_user();该功能允许在用户在网站上注册时更改呈现给用户的表单。 hook_user()由user.module使用,独立于profile模块。

将钩子定义为hook_user($op, &$edit, &$account, $category = NULL),当向用户呈现注册表单时,参数$op 将包含值'register'。在这种情况下,模块会返回它想要添加到注册表单的表单字段。

【讨论】:

    【解决方案5】:

    如果您真的不需要创建用户帐户,例如简单的活动注册。如果您只是收集名称,则可以改用 webform 模块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多