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?

Jayesh Jose
fonte

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.

Clive
fonte
+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.

AyeshK
fonte
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!

larrydahooster
fonte
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

A maneira mais segura de fazer isso é alterar o tipo do campo para ser um 'item'. http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#item

Alfred Armstrong
fonte
Usando o atributo #disabled, resolvo o problema. No meu caso, apenas alguns usuários podem editar o campo, enquanto outros apenas podem ver o campo. Escrevi uma lógica baseada na função do usuário e resolvi o problema. Obrigado a todos
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).

anrikun
fonte
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);
    }
}
Yusef
fonte