Ajuda com ajax callback

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
mogadix's picture

Viva Pessoal,

estou aqui com um problema com a atualização de campos em formulários.
O problema é o seguinte.

Estou a criara um sistema de reserva/requisição de viaturas para transporte. O sistema já está 90% funcional. A ideia é os utilizadores poderem efectuar requisição de viaturas para determinadas datas, o sistema validar a disponibilidade e mais tarde ser entregue as viaturas e registo de eventuais ocorrências.

O problema que estou a ter é na recepção das viaturas após o transporte.

Criei um conteúdo do tipo reserva de viaturas com todos os campos que necessito de guardar. Depois utilizando o hook_form_alter, estou a alterar o campo das requisições para apenas me ir buscar as reservar que foram aprovadas. Ao seleccionar a o campo com este numero de requisição, a ideia é fazer uma consulta à ao conteúdo da requisição e atualizar automaticamente dois campos, o custo da viatura por km e o custo do condutor por hora.

É aqui que me surge o problema, já estive a ver vários exemplos e a partida tudo estaria correto... mas aparentemente não.

Esta é a função para o hook_form_alter

<?php
function viatura_form_alter(&$form, &$form_state, $form_id) {

  switch (
$form_id)  {

    /<
em>
     *
Quando se recebe uma viatura, altera o estado da requisicao para entregue
    
*/
        case
'viaturas_entrega_de_viatura_node_form':

     
// Vai buscar as apenas as reservas que já estão APROVADAS (n_requisicao)
     
$query = new EntityFieldQuery();
     
$query->entityCondition('entity_type', 'node')
                  ->
entityCondition('bundle', 'viatura_requisicao')
        ->
fieldCondition('field_estado_requisicao', 'tid', array(variable_get('tax_term_estado_requisicao_aguarda'), variable_get('tax_term_estado_requisicao_aprovada')), 'IN');
     
$result = $query->execute();
      if (isset(
$result['node'])) {
       
$nodes_reserva = array_keys($result['node']);

        foreach(
$nodes_reserva as $nid) {
         
$node = node_load($nid);
         
$array_nid1[] = $node->field_reserva_id[$node->language][0]['value'];
        }
      }

     
$form['field_n_requisicao'] = array(
       
'#type' => 'select',
       
'#title' => 'N.º Requisição',
       
'#empty_option' => t('- Seleccione a Requisição -'),
       
'#options' => $array_nid1,
       
'#ajax' => array(
         
'callback' => 'ajax_load_field_custos',
         
'wrapper' => 'div_custos',
        ),
      );

     
// Campo a atualizar com o custo por km da viatura
     
$form['field_custo_viatura_km_'] = array(
       
'#type' => 'textfield',
       
'#title' => 'Custo Viatura (Km)',
       
'#size' => 14,
       
'#required' => TRUE,
       
'#prefix' => '<div id="div_custos">',
       
'#suffix' => '</div>',
      );



      if (!empty(
$form_state['values']['field_n_requisicao'])) {

       
// Vai buscar dados da requisicao selecionada
       
$query = new EntityFieldQuery();
       
$query->entityCondition('entity_type', 'node')
                    ->
entityCondition('bundle', 'viatura_requisicao')
          ->
fieldCondition('field_reserva_id', 'value', $form['field_n_requisicao']['#options'][$form_state['values']['field_n_requisicao']], '=');
       
$result = $query->execute();

        if (isset(
$result['node'])) {
         
$nodes_reserva = array_keys($result['node']);
          foreach(
$nodes_reserva as $nid) {
           
$node_reserva = node_load($nid);
           
$id_reserva = $node_reserva->field_reserva_id['und'][0]['value'];

           
// DADOS DA VIATURA
           
$node_viatura = node_load($node_reserva->field_viatura_nid['und'][0]['target_id']);
           
$custo_viatura = $node_viatura->field_viatura_custo_km['und'][0]['value'];

           
// DADOS DA CONDUTOR
           
$node_condutor = node_load($node_reserva->field_condutor['und'][0]['target_id']);
           
$custo_condutor = $node_condutor->field_funcionario_custo_hora['und'][0]['value'];
          }
        }

       
$form['field_custo_viatura_km_']['#value'] = $custo_viatura;
       
$form['field_custo_condutor_hora_']['#value'] = $custo_condutor;
       
//$form['title']['#value'] = $id_reserva;
     
}

    break;
  }


  return(
$form);
}


/</
em>
* Implements
ajax_load_field_custos()
*/
function
ajax_load_field_custos($form, $form_state) {
  return(
$form['field_custo_viatura_km_']);
}
?>

O erro/aviso que me aparece, é que quando selecciono o campo que tem o número das requisições, de facto o campo com o custo da viatura por km é atualizado, mas surge-me este aviso:

Warning: array_values() expects parameter 1 to be array, string given em _field_filter_items() (linha 513 de /var/www/001-cm_viaturas/modules/field/field.module).
Warning: Invalid argument supplied for foreach() em list_field_validate() (linha 392 de /var/www/001-cm_viaturas/modules/field/modules/list/list.module).

Já andei às voltas e voltas com isto e ainda não consegui perceber onde pode estar o erro, eu penso que depois de ser atualizado o campo field_custo_viatura_km_ com o valor de custo da viatura, ele está a ser mal criado no $form ou no $form_state...

Obrigado desde já pela ajuda que me poderem dar.

Comments

Tenta ver o que esta a ser

pauloamgomes's picture

Tenta ver o que esta a ser passado para o array_values na funcao _field_filter_items(), pode ser algo errado no form original.

Se nao tiveres a usar um debugger faz manualmente:

  • activa o modulo devel
  • edita /var/www/001-cm_viaturas/modules/field/field.module

<?php
function _field_filter_items($field, $items) {
(...)
  if (!
is_array($items)) {
   
dpm($items);
  }
  return
array_values($items);
}
?>