How can I set the default date for a date field in hook_form_alter().?

I tried:

$form["field_price_date"]["und"][0]['value']['#default_value'] = $curDate;
$form["field_price_date"]["und"][0]['value']['date']['#default_value'] = $curDate;
$form["field_price_date"]["und"][0]['value']['date'] = $curDate;           
$form["field_price_date"]["und"][0]['value'] = $curDate;

None of the above work.


The date field's a funny one, normally the field column name is the last in the array (like the first example you tried), and the default value is set on that.

For a date field though, the default value is an array, and it's one level further up, e.g.:

$form["field_price_date"]["und"][0]['#default_value']['value'] = $curDate;

For future reference, install the Devel module and use the dpm() function to print a breakdown of the form array to the screen (dpm($form);). It makes debugging this kind of thing so much easier.

| improve this answer | |
  • Thanks a lot. It works. I'll install devel module. thanks again for the advice.. – rongok Aug 31 '12 at 18:30

I was inspired by this response to try the Devel module to solve a similar problem. I tried it and it worked. I posted detailed instructions on how to obtain the field array structure for a field in order to modify it using hook_form_alter here: https://drupal.org/node/1243628#comment-7777329

I hope this helps someone the way the Devel module suggestion helped me.

| improve this answer | |

On Drupal 8, here's an example to set a specific date time field value in a hook form alter :

use Drupal\Core\Datetime\DrupalDateTime;
use Drupal\Core\Form\FormStateInterface;  

 * Implements hook_form_alter().
function my_module_form_alter(&$form, FormStateInterface &$form_state, $form_id) {
  $date = strtotime(date('Y-m-d 00:00:00'));
  $form['field_datetime']['widget'][0]['value']['#default_value'] = DrupalDateTime::createFromTimestamp($date);
| improve this answer | |

This is the function I use to print the structure:

// Custom print for testing purposes
function prnt($element){
  print "<pre>";
  print "</pre>";
| improve this answer | |

Please see below methods to set a value to a date field

Using hook_form_alter

$form["field_price_date"]["und"][0]['#default_value']['value'] = $new_date;

Using hook_node_submit or hook_node_presave (Saving the value to the database)

function MY_MODULE_node_presave($node) 
      $node->field_price_date['und'][0]['value'] =  '2014-09-23 00:00:00';

Or if you need to save value of one custom field(defined in hook_form_alter) to another, see below codes.

function MY_MODULE_node_submit($node, $form, &$form_state) {
  if($node->type == 'my_node_type') {
    $test_date =  $form['test_date ']['#value'];
    //Ensure that $test_date format is '2014-09-23 00:00:00'
    $node->field_price_date['und'][0]['value'] =  $test_date ;

I think it may help anyone who is searching for the solution.

| improve this answer | |
  • can call the hook_form_submit value in hook_node_presave ? – logeshvaran Sep 28 '17 at 12:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.