Widget Adicionar termo de taxonomia 'Adicionar mais'


8

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:

insira a descrição da imagem aqui

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 $itemter a estrutura $item = array('tid', 2). Ao usar o código acima, parece haver um delta vindo de algum lugar e a estrutura de $itemacaba 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?

Respostas:


2

Tenho certeza de que você poderia fazer isso hook_field_widget_form()(que eu acho que é onde está o seu código atual) apenas adicionando um elemento filho ao seu elemento existente, por exemplo

$element['text'] = array(
  '#type' => 'textfield',
  '#title' => 'Title',
  // etc...
);

Se isso não funcionar, eu sei que definitivamente funcionará se você usar hook_field_widget_form_alter().

Por exemplo, a seguir, é uma pequena função que ativa o altcampo para um tipo de campo Imagem usando o widget Seletor de Mídia (por algum motivo, não está ativado por padrão):

function media_image_attributes_field_widget_form_alter(&$element, &$form_state, &$context) {
  if ($context['field']['type'] == 'image') {
    $element['alt'] = array(
      '#type' => 'textfield',
      '#title' => 'Image Description',
      '#weight' => 10000,
      '#default_value' => count($element['#default_value']) ? $element['#default_value']['alt'] : ''
    );
  }
}

No que diz respeito à funcionalidade do ajax, acho que você definitivamente está seguindo as linhas certas. Eu acho que o módulo Field Example nos Examples tem algum código de exemplo que pode ajudar.


Obrigado pela resposta, eu votei para cima, pois me deu algumas informações boas para continuar, mas ainda não a respondi! Confira minha edição que fornece mais informações sobre o que eu tentei graças à sua resposta.
splatio

@splat você conseguiu implementar um widget de trabalho? Você gostaria de compartilhá-lo?
21812 Joe Beuckman

Desculpe Joe, não consegui resolver isso e acabei usando uma abordagem complexa e diferente! Se você trabalhar fora, publique aqui, pois eu estaria interessado em como para o futuro. Eu também aceitaria alegremente como a resposta.
splatio

@splatio Você pode dar algumas informações sobre sua abordagem alternativa?
usar o seguinte código

1

O Módulo Hierarchical Select, pelo menos, fica muito próximo do que você deseja alcançar. Seu widget parece um pouco diferente, mas basicamente faz o mesmo trabalho e seria um bom ponto de partida para personalização. Dê uma olhada na demonstração de taxonomia dos lugares que visitei .

Outra opção pode ser o módulo Autocomplete Deluxe .


0

Acabei de encontrar Taxonomia Outro módulo que pode atender às suas necessidades.

Este é um módulo simples para adicionar um '- Outro -' opcional às listas de seleção de taxonomia. Ele permite que os usuários com as permissões corretas criem novos termos.

Para a porta Drupal 7, verifique: Taxonomia da porta diferente de D7 ( link direto ).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.