Como criar um campo somente leitura usando hook_form_alter


12

Estou tentando criar alguns dos campos de formulário do perfil Drupal como somente leitura no modo de edição. Estou usando o seguinte código em hook_alter

$form[field_organisation_company_name][und][0]['#after_build'][]='_build_element_readonly';

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    return $element;
}

Na interface do usuário arquivada é exibida como somente leitura, mas ainda assim, posso alterar o valor usando o firebug e salvando. Existe alguma maneira de impedir esse comportamento?

Respostas:


6

Parece que você pode realizar o que precisa com as Permissões de campo . Em uma base campo a campo, você pode definir permissões para:

  • Crie valor próprio para o campo
  • Editar valor próprio para o campo
  • Edite o valor de qualquer pessoa para o campo
  • Exibir valor próprio para o campo
  • Visualizar o valor de qualquer pessoa para o campo

Assim, você poderá facilmente permitir que seus usuários criem o valor para o campo inicialmente, mas assim que eles o tiverem, ele só se tornará editável por um administrador.


+1. Como o OP deseja permitir que os administradores editem o valor, field_permissionsseria mais fácil do que fazer o trabalho de maneira suja.
precisa saber é o seguinte

Sim, esta é uma resposta muito melhor do que a minha :)
Alfred Armstrong

6

Quando você define um campo como readonly, o navegador bloqueia o campo e envia os dados de volta ao servidor após o envio. Outro atributo é disabledque bloqueia o campo e não envia dados de volta ao servidor.

Nos dois casos, você pode definir com força o valor para ser o mesmo após o envio. Portanto, mesmo quando o campo estiver definido como readonlyou disabled, e o usuário modificou o HTML e enviou dados diferentes, $form_state['values']permanecerá inalterado.

function _build_element_readonly($element, &$form_state) {  
    $element['value']['#attributes']['readonly'] = 'readonly';
    $element['value']['#value'] = isset($element['value']['#default_value']) 
       ?  $element['value']['#default_value']
       :  ''; 
    return $element;
}

Observe que definimos a #value partir de #default_value. #default_value é a maneira usual de definir o valor padrão que é carregado quando o formulário é criado e $form_state['values']conterá o default_value ou a entrada do usuário. Quando você define #valueexplicitamente, a entrada do usuário é ignorada e #valueserá usada.

De qualquer forma, eu recomendaria usar '#access' => FALSE,ao ocultar elementos do formulário. Ele removerá o elemento completamente, permitindo que você use seus valores.


1

Você não pode impedir que o Firebug altere os campos somente leitura. Mas se o campo de texto for somente leitura, o único objetivo é exibir dados. Então, por que não alterar o elemento de entrada em relação a um elemento de texto?

Você pode usar o atributo "disabled", porque os campos de entrada desativados não estão sendo enviados ao servidor.

Você também pode remover o atributo "disabled" com o firebug, mas o núcleo do drupal não reage às alterações dos campos de entrada desativados!


Obrigado larrydahooster pela ajuda. Minha exigência é como bloquear alguns dos campos preenchidos pelo usuário no momento do registro. Enquanto estiver no modo de edição de perfil, você deseja exibir essas informações ao usuário, mas deseja impedir que o usuário atualize esses campos. Apenas super-usuário pode editar estes campos
Jayesh Jose


1

Você pode usar Permissões de campo + Campo somente leitura .

Permissões de campo permitirão que alguns de seus campos não sejam acessíveis a determinados usuários.

O campo Somente leitura permitirá exibir os campos não acessíveis como itens somente leitura nos formulários de edição (em vez de ocultá-los).


1

Eu acho que usar #disabled = true;é a maneira mais fácil de conseguir isso, em vez de adicionar algum módulo pesado ao seu núcleo, como exemplo, desabilito a edição do campo de imagem personalizada no user_profile_form quando ele é preenchido pelo usuário antes.

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

        if($form_id == 'user_profile_form'){
            if($form['field_national_front']['und'][0]['#default_value']['fid']){
                $form['field_national_front']['und']['#disabled'] = true;
             }
          //ym($form);
        }
}

Além disso, você pode verificar o papel do usuário e apenas desativar (campo somente leitura) para não usuários administrativos.

    function MY_CUSTOM_MODULE_form_alter(&$form, $form_state, $form_id){
       global $user;
       if($form_id == 'user_profile_form'){
           if($form['field_national_front']['und'][0]['#default_value']['fid'] && !in_array('webadmin', $user->roles)){
              $form['field_national_front']['und']['#disabled'] = true;
         }
//ym($form);
    }
}
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.