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またはユーザー入力が含まれます。#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ホセ

1

Field Permissions + Field Readonlyを使用できます。

フィールド権限を使用すると、特定のユーザーが一部のフィールドにアクセスできないようにすることができます。

Field Readonlyを使用すると、アクセスできないフィールドを、非表示ではなく、編集フォーム上の読み取り専用アイテムとして表示できます。


1

私は使用しては考える#disabled = true;代わりに、それは前にユーザーによって満たされていますときuser_profile_formのカスタムイメージフィールドのI無効に編集例として、あなたの心にいくつかの重いモジュールを追加することでこれを実現する最も簡単な方法です。

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.