Defina programaticamente os campos de data no Drupal 7: Data, Data (Formato ISO) e Data (Registro de Data e Hora Unix)

11

Usando a API do formulário e hook_form_alter () , como posso definir manualmente (forçar) os valores para cada tipo de campo de data do Drupal 7 usando um carimbo de data / hora Unix válido?

Quando o formulário é finalmente enviado, os tipos field_date são sempre matrizes vazias. Abaixo está o código quebrado do qual estou trabalhando.

hook_form_alter(&$form, &$form_state, $form_id) {

    // http://drupal.org/node/1455576 - Date
    $form['field_date'][LANGUAGE_NONE][0]['value'] = time();

    // http://drupal.org/node/1455576 - Date (ISO Format)
    $form['field_date_iso_format'][LANGUAGE_NONE][0]['value'] = time();

    // http://drupal.org/node/1455576 - Date (Unix Timestamp)
    $form['field_date_unix_timestamp'][LANGUAGE_NONE][0]['value'] =time();
}

Devo mencionar que o widget de campos está definido como texto e seu formato é 'Ymd H: i: s'

Eu também tentei em date('Y-m-d H:i:s', time())vez de time().

Exemplo de saída dpm ().

Exemplo de saída dpm ()

Também devo observar que, como solução alternativa, posso definir o campo se modificá-lo em hook_node_presave (). Para fazer isso, eu $node->field_date['und'][0]['value'] = date('Y-m-d H:i:s', $my_unix_timestamp);ainda gostaria de entender como fazer isso usando hook_form_alter.

Citricguy
fonte
De que maneira esse código está quebrado?
Countzero 30/03
date ('Ym-d', strtotime ('31 de maio de 2011 ')) e time () estão sempre vazios. Estou começando a pensar que estou usando a matriz errada para datas. $ form ['date_field'] ['und'] [0] ['value'] pode não estar correto? Voltar para a documentação que é.
Citricguy
Quando o formulário é finalmente enviado, os tipos field_date são sempre matrizes vazias.
Citricguy
Você tentou definir $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']?
Countzero
Não foi possível tentar remover nenhum código personalizado e enviar o formulário da interface do usuário para verificar o formato salvo nativamente no campo?
30712 WestieUK

Respostas:

14

Aqui está um código que trata o fuso horário do site certo para mim:

 $node->field_date[LANGUAGE_NONE][0] = array(
    'value' => format_date(strtotime('now'), 'custom', 'Y-m-d H:i:s', 'UTC'),
    'timezone' => 'UTC',  
    'timezone_db' => 'UTC',
  );
Vadym Myrgorod
fonte
1
Cinco anos depois, ainda é uma boa resposta. Não faria sentido usar 'timezone' => variable_get('date_default_timezone', 'UTC'),?
marcvangend
6

Cada tipo de campo de data espera um carimbo de data / hora de formato diferente (com base em como é armazenado no DataBase):

// For datetime
$node->field_datetest[$node->language][0]['value'] = "2011-05-25 10:35:58";

// For date
$node->field_datetest[$node->language][0]['value'] = "2011-05-25T10:35:58";

// For datestamp
$node->field_datetest[$node->language][0]['value'] = strtotime("2011-05-25 10:35:58");

Observe que você não precisa especificar uma data completa; para data e hora, você pode simplesmente zeros, por exemplo, "2011-05-00 00:00:00" (data e hora), "2011-00-00T00: 00: 00" (data), etc. Para data e hora, você pode simplesmente do exemplo strtotime ("25/05/2011").

Importante: Observe também que, embora o valor exato especificado seja armazenado no banco de dados, o horário real exibido no site pode ser diferente, dependendo das configurações do fuso horário. Quando você cria um novo campo data / hora / registro de data e hora, pode escolher entre cinco métodos diferentes de tratamento de fuso horário. O padrão é "fuso horário do site":

Ao inserir dados no campo, presume-se que os dados inseridos estejam no fuso horário do site. Quando os dados são salvos no banco de dados, eles são convertidos para UTC. No entanto, se você definir um campo de data programaticamente como no exemplo acima, não ocorrerá nenhuma conversão; portanto, verifique as configurações de fuso horário do campo. Ou, em outras palavras, se você usar o "fuso horário do site", verifique se o horário está no UTC.

Essas informações foram referenciadas na seção Campo de data (data e hora, data e carimbo de data) no blog do fooninja.

Esse também é um ótimo recurso geral para criação de nós programáticos no Drupal 7.

MD3
fonte
Você precisa de aspas em torno de chaves de valor
masterchief
Obrigado mestre! Atualizado para refletir sua melhoria.
MD3
5

Isso funcionou para mim.

$node->field_date[LANGUAGE_NONE][0] = array(
      'value' => date('Y-m-d H:i:s', strtotime('now')),
      'timezone' => 'UTC',
      'timezone_db' => 'UTC',
);
Citricguy
fonte
2

O time()valor não funcionará neste nível.

Você tem que usar algo como:

$mydate = date('Y-m-d', strtotime('31 May 2011'));
Countzero
fonte
Isso funciona para mim em hook_node_presave, mas não em hook_form_alter.
Citricguy
Você tentou definir $form['field_date'][LANGUAGE_NONE][0]['#default_value']['value']como mencionado acima?
Countzero
Encontrou o nó pré-salvo em $ node-> field_date [LANGUAGE_NONE] [0]
Citricguy
Não está trabalhando com hook_form_alter ... alguma ajuda?
Rajesh Vishwakarma
2

Para o material Date, podemos escrever um js para obter a data atual ...

jQuery(document).ready(function() {

    var fullDate = new Date()
    var HR_fullDate = fullDate.toDateString().toString().substring(4,15);
    jQuery('strong.date').contents().replaceWith(HR_fullDate);

});
Nitesh Sethia
fonte
1

Se você estiver usando o tipo de campo Date (ISO format), use:

$node->field_datetest[$node->language][0][value] = "2011-05-25T10:35";
Abid Ali
fonte
1

Tente o seguinte:

$now = date_now('UTC');
$now = date_format($now, "Y-m-d H:i:s");
rodpal
fonte
1

Para quem lida com $ form_state e widget pop-up:

// The date format in this sample is dd/mm/yyyy
$form_state['values']['field_my_date_field']['und'][0]['value']['date'] = '14/05/2014';
Francisco Luz
fonte
1

Para definir um valor para um campo de data, siga os códigos abaixo.

Usando hook_form_alter

$ form ["data_do_campo"] ["und"] [0] ['# valor_ padrão'] ['valor'] = $ nova_data;

Usando hook_node_submit ou hook_node_presave (salvando o valor no banco de dados)

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

Ou se você precisar salvar o valor de um campo personalizado (definido em hook_form_alter) em outro, consulte os códigos abaixo.

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_date['und'][0]['value'] =  $test_date ;
   }
}
Aswini K
fonte
0

A resposta aceita estava me dando uma exceção DOP. Apenas uma simples chamada time () funcionou para um campo "datestamp"!

        $entity->field_upload_time["und"][0]["value"] = time();
giorgio79
fonte
-1

usei time () e funcionou bem ....

$ fc_item_wrapper-> field_data_pedido-> set (time ());

wacto
fonte