【问题标题】:Only getting the first character when accessing post variable访问 post 变量时仅获取第一个字符
【发布时间】:2025-12-27 08:35:10
【问题描述】:

我在 Drupal 中处理事情的一种常见方式是创建一个 CCK 类型,然后创建一个自定义提交处理程序以在提交节点时对 CCK 字段执行逻辑。但是,当 CCK 字段类型为 Date 字段时,我无法获取该值,因为数组的结构不同。

更新 - João Guilherme 有一个更简单的方法,但我仍然无法从下面发布的数组中获取日期值。

$fromDate = $form['field_bill_start'][0]['#value'];
drupal_set_message('<pre>'. print_r($fromDate, TRUE) .'</pre>');

//Which then prints this.
Array
(
    [value] => Array
        (
            [date] => Tue, 08/24/2010
        )

)

然后我尝试添加这些打印为 null 的内容。我还在日期和值之前尝试了“#”。

['value']['date']

******************************原帖************************ **************

<?php
 function billing_form_billing_node_form_alter(&$form, &$form_state) {
  //drupal_set_message('We are hooking it!');
  $form['#submit'][] = 'billing_submit_function';
}

function billing_submit_function($form, &$form_state) {
  $fromDatePRE = array();
  $fromDatePRE[] =  $form['field_bill_start'][0]['value']['date'];
  $fromDate[] = $fromDatePRE[0]['#value']['#date'];

  drupal_set_message('<pre>'. print_r($fromDatePRE[0], TRUE) .'</pre>');


  drupal_set_message("From Date = ".$fromDate[0]);
  drupal_set_message("From Date2 = ".$fromDatePRE[0]);

$fromDate 正在打印 Sat 8/21/2010 的第一个字符“S”,这是我想要的值,但我想要整个值。我知道这与我访问数组的方式有关,但我无法弄清楚。

这就是我正在使用的 - 我在我试图访问的值上添加了一条评论:

产量:

 Array
    (
        [0] => Array
            (
                [#type] => textfield
                [#default_value] => Sat, 08/21/2010
                [#id] => edit-field-bill-start-0-value-datepicker-popup-0
                [#size] => 20
                [#maxlength] => 30
                [#attributes] => Array
                    (
                    )

                [#description] =>  Format: Sat, 08/21/2010
                [#post] => Array
                    (
                        [title] => llllllllllllll
                        [menu] => Array
                            (
                                [link_title] => 
                                [parent] => Array
                                    (
                                        [hierarchical_select] => Array
                                            (
                                                [selects] => Array
                                                    (
                                                        [0] => primary-links:0
                                                        [1] => label_1
                                                    )

                                            )

                                    )

                                [weight] => 0
                            )

                        [hs_form_build_id] => hs_form_7bf97c3c59ba2a064d6e841ae405dd30
                        [changed] => 
                        [form_build_id] => form-1f928faaa990f3809da391165d51981a
                        [form_token] => 616f6e8a7bb9c4ffc2aec65174c0817d
                        [form_id] => billing_node_form
                        [log] => 
                        [pathauto_perform_alias] => 1
                        [print_display] => 1
                        [print_display_urllist] => 1
                        [print_mail_display] => 1
                        [print_mail_display_urllist] => 1
                        [print_pdf_display] => 1
                        [print_pdf_display_urllist] => 1
                        [field_bill_start] => Array
                            (
                                [0] => Array
                                    (
                                        [value] => Array
                                            (
                                                //This is the value I need
                                                [date] => Sat, 08/21/2010
                                            )

                                    )

                            )

                        [field_bill_end] => Array
                            (
                                [0] => Array
                                    (
                                        [value] => Array
                                            (
                                                [date] => 08/25/2010
                                            )

                                    )

                            )

                        [name] => administrator
                        [date] => 
                        [status] => 1
                        [promote] => 1
                        [op] => Save
                    )

                [#programmed] => 
                [#tree] => 1
                [#parents] => Array
                    (
                        [0] => field_bill_start
                        [1] => 0
                        [2] => value
                        [3] => date
                    )

                [#array_parents] => Array
                    (
                        [0] => field_bill_start
                        [1] => 0
                        [2] => value
                        [3] => date
                    )

                [#weight] => 0
                [#processed] => 1
                [#required] => 
                [#input] => 1
                [#autocomplete_path] => 
                [#process] => Array
                    (
                        [0] => form_expand_ahah
                    )

                [#name] => field_bill_start[0][value][date]
                [#value] => Sat, 08/21/2010
                [#needs_validation] => 1
                [#defaults_loaded] => 1
                [#sorted] => 1
            )

    )

【问题讨论】:

  • 你写了$fromDate = ['0']['#value']['#date'],这不会给你任何回报。包含您要访问的数组的变量是什么?
  • @kiamlaluno - 你是对的。我已经更新了代码。现在显示的是产生“S”
  • @cinqoTimo - 为了在原始帖子中获得结果,您将其价值哑化的对象是什么?
  • @iKid - 我不明白你的问题。我从 $form 数组中得到这些结果。我不确定它是否是 Drupal 中的“对象”,因为 PHP 通常使用 $object->property 作为 OOP 表示法,这是一个数组。
  • 我一直回到这个问题。我不是 drupal 专家,但是当您添加 ['value']['date'] 时,drupal_set_message 是否对值做了一些有趣的事情?您是否尝试过不使用 drupal_set_message 调用的 print_r 或 var_dump?

标签: drupal drupal-6 cck form-submit


【解决方案1】:

您应该使用$form_state上的用户提交的值;

我使用单个日期字段而不是具有 2 个值的日期字段进行测试。但这无论如何都应该可以正常工作。我的字段命名可能不正确,但您可以查看 $form_state['values'] 上的值,您应该会在其中找到您的字段。

无论如何,代码看起来像这样:

function billing_submit_function($form, &$form_state) {
  $from_date =  $form_state['values']['field_bill_start'][0]['value'];
  $from_date_string = format_date(strtotime($from_date), 'custom', 'D d/m/Y');
  $from_date_2 =  $form_state['values']['field_bill_start'][0]['value2'];
  $from_date_string_2 = format_date(strtotime($from_date_2), 'custom', 'D d/m/Y');

  drupal_set_message("From Date = ".$from_date_string);
  drupal_set_message("From Date2 = ".$from_date_string_2);
}

【讨论】:

  • @googletop - 你是对的 - 你发布的内容是正确的。
【解决方案2】:

你得到的返回是因为你访问的是一个字符串,而不是一个数组。

$string = "ABCDEFG";
// This would print "A".
print $string[0];

注意,提交处理程序从$form_state['values'] 获取提交的值,而不是从$form

【讨论】:

  • 抱歉,我尝试了很多不同的方法来尝试使其正常工作。我发布了错误的 sn-p..
  • 不确定我是否关注你。如果我在错误的数组中 - 为什么我可以得到我需要的值的第一个字母?你能告诉我你所说的 $form_state['values'] 是什么意思吗
  • user_edit_submit()book_outline_form_submit()comment_form_submit();这些提交处理程序都没有从$form 获取提交的值。根据您描述的错误,问题是使用一个字符串,认为它是一个数组;在这两种情况下,$variable[0] 都是有效的表达式,但对于字符串,它将返回第一个字符(在这种情况下,这不是您想要的)。
  • 发布的是访问正确的值 - 我可以在数组中看到它,并且我能够获得第一个字符。至于像访问数组一样访问字符串,我明白这一点,但是当我离开索引时它什么也不打印,所以它不像你的例子所暗示的那么简单。
【解决方案3】:

试试这个,当我真正查看代码并注意到我之前已经离开时,我删除了我之前的答案。在我看来,似乎创建了很多冗余数组,这只是混淆了这个问题。这行得通吗?

$fromDate = $form[0]['#post']['field_bill_start'][0]['value']['date'];
drupal_set_message("From Date = ".$fromDate);

编辑:

更新代码以再次尝试

【讨论】:

  • 谢谢,我同意不必要的数组。您提供的打印件 - From Date = ""(nothing) 和 From Date2 = Array
  • 我已经更新了代码,你介意再试一次吗?如果您在问题中的输出来自 print_r($fromDatePRE) 语句,那么我认为这个新代码应该可以工作
  • 感谢您再次查看。我知道这看起来不错,但它是空的。我正在考虑只使用一个文本框(我可以轻松捕获值!?)并使用 Jquery 日历来设置值。
【解决方案4】:

我想你只需要打印$form['field_bill_start'][0]['#value']

更新:直接打印$form['field_bill_start'][0]['#value'],不要将其添加到变量或数组中。

【讨论】:

  • 我用 print_r 的结果更新了我的帖子。我想我可以添加如图所示的数组级别。