Estou tentando criar um widget de campo semelhante ao widget de referência de termo normal, com uma diferença importante. O usuário precisa poder adicionar vários novos termos de taxonomia ao mesmo tempo, isso pode demonstrar melhor:
Cheguei a um ponto em que a funcionalidade é semelhante à fornecida pelos módulos de taxonomia / opções / lista (ou seja, as caixas de seleção / rádios são mostradas, economizando etc.)
Aqui está um pedaço importante do código que estou usando hook_field_widget_form()
:
$element += array(
'#type' => $multiple ? 'checkboxes' : 'radios',
'#default_value' => $multiple ? $default_value : reset($default_value),
'#options' => $options,
'#value_key' => $value_key,
'#element_validate' => array('options_field_widget_validate'),
'#properties' => $properties,
);
O que está me impressionando aqui é que o elemento $ não é sua matriz de formulários usual, então não tenho certeza de como adicionar o campo de texto e o botão e - especialmente porque seus valores não devem ser salvos. Qual é a melhor maneira de adicionar esses campos ao meu widget?
Quanto à adição do Javascript necessário, estou certo ao pensar em usar o #ajax que chama uma função que reconstrói as # opções das caixas de seleção?
Desde já, obrigado!
Edição - Minha pergunta inicial era bastante vaga, aqui estão mais alguns detalhes sobre o que eu tentei:
$element += array(
'#type' => 'fieldset',
'#delta' => $delta,
);
$element['value'] = array(
'#type' => $multiple ? 'checkboxes' : 'radios',
'#default_value' => $multiple ? $default_value : reset($default_value),
'#options' => $options,
'#value_key' => $value_key,
'#element_validate' => array('options_field_widget_validate'),
'#properties' => $properties,
);
$element['text'] = array(
'#type' => 'textfield',
'#title' => t('Add another'),
'#weight' => 5,
);
Esta é uma amálgama de vários exemplos que já vi e parece me aproximar. O problema é que, quando envio o formulário da entidade, recebo o seguinte erro:
Aviso: Índice indefinido: tid em taxonomy_field_is_empty () (linha 1402 dos módulos \ taxonomy \ taxonomy.module).
Examinei mais de perto essa função e ela espera $item
ter a estrutura $item = array('tid', 2)
. Ao usar o código acima, parece haver um delta vindo de algum lugar e a estrutura de $item
acaba sendo $item = array(0, array('tid', 2)
. Não consigo descobrir de onde vem o '0'?
OUTRA EDIÇÃO
Consegui corrigir o erro acima com o código a seguir, alterando o elemento $ da seguinte maneira:
$element += array(
'#type' => 'fieldset',
'#process' => array('taxonomy_free_entry_ignore_parent'),
);
e adicionando a função:
function taxonomy_free_entry_ignore_parent(&$form, &$form_state, $complete) {
array_pop($form['#parents']);
return $form;
}
Quando salvo a entidade, recebo uma mensagem informando que ela foi salva. Quando verifico o campo na tabela, ele não está sendo salvo. O que estou fazendo errado?