Prática recomendada para a chave de idioma para "und" em hook_form_alter

30

Estou modificando um formulário no meu módulo personalizado. O código se parece com:

function my_module_form_alter(&$form, &$form_state, $form_id) {

    if ($form_id == "someID") {

        $form['field_charity_author']['und'][0]['value']['#value'] = arg(3);
        //$form['field_charity_author']['#type'] = 'hidden';

    }

}

No entanto, acho que a codificação undé ruim. Qual deve ser a maneira correta de modificar corretamente os campos do formulário neste caso?

Shafiul
fonte
Este comentário é provavelmente irrelevante, uma vez que foi solicitado há muito tempo. Uma maneira simples de usá-lo usando um foreachloop. Se for apenas LANGUAGE_NONE, é uma corrida única. No sentido form_alter, deve alterar tecnicamente qualquer que seja o idioma do formulário.
precisa saber é o seguinte

Respostas:

40

Infelizmente, sua resposta automática não é tão universal. Idioma de campo e idioma do nó não são as mesmas coisas.
O idioma do campo é necessário apenas se você estiver usando a API de conversão de campo (por exemplo, tradução de entidade ). Quando você começa a usá-lo, alguns campos são convertidos em traduzíveis.

Os campos traduzíveis possuem código de idioma, o que realmente faz sentido. Mas se o campo não puder ser traduzido, o código do idioma será sempre (e para todos os tipos de conteúdo, entidades, etc.) - LANGUAGE_NONE(melhor usar a constante LANGUAGE_NONEe não a string 'und').
Portanto, com sua solução, você pode obter uma situação quando um nó é russo, mas um campo do nó usa LANGUAGE_NONE.
Felizmente, os campos são anexados ao formulário com a '#language'chave, que sempre contém o código de idioma correto.

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang][0]['value']['#value'] = $value;

Se você não tiver acesso ao formulário anexado, as funções da API de linguagem de campo podem ser úteis.

kalabro
fonte
4
Esta é a única resposta correta neste tópico.
Bojan Zivanovic
Esse método também pode ser usado ao recuperar o caminho do campo de imagem de um nó / tipo de conteúdo. Graças
Jayaram R
10

Se você conhece o tipo e o pacote de entidades, use algo como o código a seguir, que chama field_language () .

$field_language = field_language('node', $node, 'field_charity_author');  
$form['field_charity_author'][$field_language][0]['value']['#value'] = arg(3);

Ele descobrirá o idioma certo e funcionará em sites multilíngues.

Veja também field_get_items () .

Attiks
fonte
Isso está correto como a API.
Nikit
E se o nó não tiver sido criado?
AgA 8/03/2014
@ Nikit Não tenho certeza, porque o idioma de exibição e o idioma do formulário não são os mesmos. O autor altera algum formulário e pode ser criado para criar um novo nó ou adicionar uma nova conversão do nó existente.
kalabro
@kalabro - exibe o idioma e o idioma do formulário - o mesmo no contexto atual.
Nikit
4

O undnegócio todo é uma das coisas mais irritantes do Drupal 7 que não funcionaram tão bem na prática quanto quando foram projetadas.

De qualquer forma, você pode obter o primeiro idioma usando array_keysassim:

function my_module_form_alter(&$form, &$form_state, $form_id) {

  if ($form_id == "someID") {
      $langs = array_keys($form['field_charity_author']);
      $form['field_charity_author'][$langs[0]][0]['value']['#value'] = arg(3);
  }
}

Isso deve funcionar o tempo todo.

googletorp
fonte
Obrigado pela sua resposta. Estou colando o que fiz para corrigir esse problema em outra resposta. :)
Shafiul 21/03/12
Também posso usar $ langs para acessar o valor do mesmo campo no form_state?
AgA
Isso é realmente seguro? Você pode ter certeza de que $ langs [0] é sempre o item correto da matriz?
ROOBY
0

(Respondendo à minha própria pergunta, caso isso ajude alguém. A resposta funcionou para mim.)

Eu posso escrever a seguinte linha para obter o idioma:

$lang = $form['language']['#value'];    //  Instead of "und"
Shafiul
fonte
5
Isto está errado. Veja a resposta do kalabro .
Bojan Zivanovic
0

re: resposta de kalabro

o código dele não funcionou para mim - meu código é um pouco diferente

$lang = $form['FIELDNAME']['#language'];
$form['FIELDNAME'][$lang]['#value'] = $value;

[$ lang] [0] retornou "u", mas o valor total de [$ lang] é "und" e também não era necessário o ['value'], porque $ form ['FIELDNAME'] ['# language' ] não era uma matriz, era uma string.

decibel.places
fonte
1
O 0º caractere de 'und' é 'u'. Você está em um labirinto de pequenas passagens sinuosas, todas arrays.
Chris Burgess