Eu tenho uma situação muito complexa em que preciso de alguns conselhos. Eu tenho um tipo de conteúdo my_content
, que tem um campo de coleção de campos anexado field_mycollection
, que tem um campo de referência de entidade que faz referência ao usuário field_my_userreference
, um campo de telefone field_my_phone
, um campo de texto field_my_text
e outro campo de texto field_my_anothertext
.
My Content
|_ field_mycollection
|_ field_my_userreference
|_ field_my_phone
|_ field_my_text
|_ field_my_anothertext
A entidade de usuário também tem campos field_my_phone
, field_my_text
e field_my_yetanothertext
que este último tem um nome de máquina diferente.
O que eu quero fazer, se em um usuário my_content
editar / adicionar formulário, field_my_userreference
for selecionado, os outros campos deverão ser preenchidos automaticamente a partir dos dados do usuário selecionado. Os campos preenchidos automaticamente ainda devem ser editáveis.
Como eu poderia alcançar esse objetivo? Eu gostaria de fazê-lo, se possível, com alguma codificação, usando hook_form_FORM_ID_alter()
.
Respostas:
Se você deseja que isso aconteça ao vivo e todos os campos já estejam no formulário, a maneira mais segura seria usar
hook_form_FORM_ID_alter()
para adicionar o seguinte a um formulário:Em seguida, no
copy_field_value.js
comportamento de criação:Você também pode usar
hook_form_FORM_ID_alter()
para adicionar#ajax
parâmetro ao campo de origem, mas faria seu formulário chamar um servidor em cada cópia de campo. Se você realmente precisa consultar o banco de dados, este é o caminho a percorrer. Seria bastante amplo descrevê-lo novamente aqui. Você precisa alterar a$form_state["input"]
matriz para atualizar os valores reais vistos pelo usuário. Faça-o na função de criação de formulário, envolvendo-oisset
para evitar avisos.Se o seu elemento de formulário estiver
$form["something"]["something"]["element"]
, seu valor estará em$form_state["input"]["something"]["something"]["element"]
- e você pode configurá-lohook_form_alter
corretamente, lembre-se de usar ambos$form
e$form_state
por referência.Nota : o
.on()
método foi adicionado no jQuery 1.7; portanto, você precisará do jQuery Update para usar esta resposta diretamente ou traduzir meu código para uso.change()
ou.blur()
método.fonte
<input>
tags usando o Firebug ou uma ferramenta semelhante no seu navegador favorito. Ou use qualquer outro seletor jQuery. Isso acontecerá apenas no navegador, para que você tenha o que tem na tela. Por outro lado, se você realmente precisa consultar o banco de dados (parece que eu perdi isso),#ajax
é o caminho a percorrer. Mas seria bem amplo. Você precisa alterar a$form_state["values"]
matriz para atualizar os valores reais vistos pelo usuário. Faça-o na função de criação de formulário, envolvendo-oisset
para evitar avisos.Você pode fazer isso usando o módulo de campo computado
fonte
Quero postar como consegui isso graças às ótimas ajudas do @ Mołot.
#ajax
propriedade para o campofield_my_userreference
.Meu código se parece com:
fonte
Pode ser um pouco tarde, mas este módulo https://www.drupal.org/project/entityreference_autofill parece fazer o que você está descrevendo. Eu o usei e também pode ajudá-lo.
fonte