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
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:
<?php
function _field_filter_items($field, $items) {
(...)
if (!is_array($items)) {
dpm($items);
}
return array_values($items);
}
?>