Como usar hook_node_presave para alterar o valor do campo

9

Basicamente, quero colocar o nome e o sobrenome juntos em $ node-> field_par_contact_name

Mas isso me dá um aviso. (Ver abaixo)

função partner_node_presave ($ node) {
  if ($ node-> type == 'parceria') {
    $ first_name = $ node-> field_par_contact_first_name ['und'] [0] ['nome'];
    $ sobrenome = $ node-> field_par_contact_surname ['und'] [0] ['name'];

    // https://drupal.org/project/field_hidden
    // Variável oculta
    $ node-> field_par_contact_name ['und'] [0] ['value'] = $ first_name. ''. $ sobrenome;

    // Aviso após salvar: array_flip (): pode apenas inverter os valores STRING e INTEGER! em DrupalDefaultEntityController-> load () (linha 173 de ... / drupal-7.23 / includes / entity.inc
  }
}

Atualizado , veja a imagem: insira a descrição da imagem aqui

Kenpeter
fonte
você está enviando o formulário programaticamente? Quero dizer, você está usando hook_form_alter? e então drupal_form_submit em algum lugar do seu código?
harshal

Respostas:

6

Para iniciantes, você provavelmente está usando a chave de matriz incorreta para o valor do campo que está salvando; 'name' deve ser 'value' lá.

$node->field_par_contact_name['und'][0]['value'];

Segundo, você está realmente usando os campos Referência de termos de taxonomia para os campos "primeiro nome" e "sobrenome". Um ponto importante sobre os campos de referência é que você nem sempre pode assumir que as entidades referenciadas foram totalmente carregadas e estão disponíveis no seu objeto. Por padrão, quando o objeto do nó é carregado, esse campo se parece apenas com isso:

$node->field_par_contact_first_name (Array)
  'und' (Array)
    0 (Array)
      'tid' => 284

Apenas a chave 'tid' está definitivamente lá. 'name' é uma propriedade do termo referenciado e geralmente não está disponível automaticamente. (O código subsequente pode realmente carregar o termo referenciado e disponibilizá-lo no objeto $ node, mas isso acontece apenas por acaso.)

Você teria muito mais facilidade se os campos "Primeiro nome" e "Sobrenome" fossem campos de texto em vez de referências. Em seguida, esses valores pertenceriam diretamente ao próprio nó, em vez de um termo de taxonomia separado sendo referenciado.

No entanto, se você estiver usando as referências a termos de taxonomia, faça um ponto no seu código para carregar o termo referenciado e obtenha os valores necessários na própria propriedade $ term-> name.

Les Lim
fonte
Veja a imagem acima. Não existe 'valor'
kenpeter
Ah, você está usando os campos Referência de termos de taxonomia para o primeiro nome e sobrenome, não os campos de texto, como eu supunha. Isso é peculiar. :) Atualizado a resposta.
Les Lim
você está certo.
Kenpeter