hook_form_alter를 사용하여 필드를 읽기 전용으로 만드는 방법


12

Drupal 프로파일 양식 필드 중 일부를 편집 모드에서 읽기 전용으로 만들려고합니다. 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;
}

제출 된 UI에서 읽기 전용으로 표시되지만 여전히 firebug 및 save를 사용하여 값을 변경할 수 있습니다. 이 동작을 막을 방법이 있습니까?

답변:


6

Field Permissions로 필요한 것을 달성 할 수있을 것 같습니다 . 필드별로 권한을 다음과 같이 설정할 수 있습니다.

  • 필드에 대한 고유 한 가치 창출
  • 필드의 자체 값 편집
  • 필드의 모든 사람의 값을 편집
  • 필드에 대한 자체 값보기
  • 필드에 대한 모든 사람의 가치보기

따라서 사용자는 처음에 사용자가 필드의 값을 쉽게 만들 수 있지만 관리자가 필드를 편집하는 즉시 편집 할 수있게됩니다.


+1. OP는 관리자가 값을 편집하도록 허용 field_permissions하기 때문에 작업을 더러운 방식으로 수행하는 것보다 쉽습니다.
AyeshK

예,이 : 나보다 훨씬 더 나은 대답은
알프레드 암스트롱

6

필드를로 설정하면 readonly브라우저는 필드를 잠그고 제출시 서버 데이터를 다시 보냅니다 . 다른 속성은 disabled필드를 잠그고 서버 데이터를 다시 보내지 않습니다 .

두 경우 모두 제출 후 값을 동일하게 강제 설정할 수 있습니다. 따라서 필드가 readonly또는 로 설정되어 disabled있고 사용자가 HTML을 수정하고 다른 데이터를 보낸 경우에도 $form_state['values']변경되지 않습니다.

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;
}

#value #default_value에서 설정 합니다. #default_value는 양식을 만들 때로드되는 기본값을 설정하는 일반적인 방법이며 $form_state['values']default_value 또는 user-input을 포함합니다. #value명시 적으로 설정하면 사용자 입력이 무시되고 #value사용됩니다.

어쨌든 '#access' => FALSE,양식 요소를 숨길 때 사용하는 것이 좋습니다 . 요소를 완전히 제거하면서 값을 사용할 수 있습니다.


1

Firebug가 읽기 전용 필드를 변경하지 못하게 할 수 없습니다. 그러나 텍스트 필드가 읽기 전용 인 경우 데이터를 표시하는 것이 유일한 목적입니다. 그렇다면 입력 요소를 텍스트 요소와 바꾸지 않겠습니까?

비활성화 된 입력 필드가 서버로 전송되지 않으므로 "disabled"특성을 대신 사용할 수 있습니다.

Firebug로 "disabled"속성을 제거 할 수도 있지만 drupal 코어는 비활성화 된 입력 필드의 변경에 반응하지 않습니다!


도움을 준 larrydahooster에게 감사합니다. 내 요구 사항은 등록시 사용자가 채운 일부 필드를 잠그는 것과 같습니다. 프로필 편집 모드에서이 정보를 사용자에게 표시하려고하지만 사용자가이 필드를 업데이트하지 못하게하려고합니다. 수퍼 유저 만이 필드를 편집 할 수 있습니다
Jayesh Jose

1

이를 수행하는 가장 안전한 방법은 필드 유형을 '항목'으로 변경하는 것입니다. http://api.drupal.org/api/drupal/developer!topics!forms_api_reference.html/7#item


#disabled 속성을 사용하면 문제가 해결됩니다. 필자의 경우 일부 사용자 만 필드를 편집 할 수 있으며 다른 사용자 만 필드를 볼 수 있습니다. 사용자 역할을 기반으로 논리를 작성하고 문제를 해결했습니다. 모두 감사합니다
Jayesh Jose

1

필드 권한 + 필드 읽기 전용을 사용할 수 있습니다 .

필드 권한 을 사용하면 일부 필드를 특정 사용자가 액세스 할 수 없도록 만들 수 있습니다.

필드 읽기 전용 을 사용하면 액세스 할 수없는 필드를 편집 양식에서 숨기지 않고 읽기 전용 항목으로 표시 할 수 있습니다.


1

사용하는 #disabled = true;것이 코어에 무거운 모듈을 추가하는 대신 이것을 달성하는 가장 쉬운 방법 이라고 생각 합니다. 예를 들어 user_profile_form의 사용자 정의 이미지 필드를 사용자가 채울 때 사용자 정의 이미지 필드의 편집을 비활성화합니다.

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);
        }
}

또한 사용자 역할을 확인하고 관리자가 아닌 사용자를 비활성화 (읽기 전용 필드) 할 수 있습니다.

    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);
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.