เป็นไปได้ไหมที่จะสร้างหน้า“ แก้ไขบัญชี” อันที่สองที่อนุญาตให้ผู้ใช้แก้ไขฟิลด์โปรไฟล์บางฟิลด์เท่านั้น?


14

ดังนั้นนี่คือสถานการณ์ของฉัน: ผู้ใช้ในเว็บไซต์ของฉันต้องกรอกข้อมูลเป็นจำนวนมากเมื่อลงทะเบียน อย่างไรก็ตามหลังจากที่พวกเขาลงทะเบียนเพียงสี่ (จากประมาณยี่สิบ) ของเขตข้อมูลเหล่านี้จะต้องมีการเปลี่ยนแปลงเป็นประจำ ฉันต้องการสร้างหน้า "แก้ไข" แยกต่างหากเพื่อให้ผู้ใช้แก้ไขเพียงสี่ฟิลด์เหล่านี้เพื่อให้ง่าย

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

เขตข้อมูลเหล่านี้มีอยู่ในกลุ่มเขตข้อมูลดังนั้นหน้าจะแสดงกลุ่มเขตข้อมูลนี้ช่องทำเครื่องหมายสี่ช่องที่อยู่ภายในกลุ่มนั้นจากนั้นมีปุ่มส่งและยกเลิก

ฉันต้องการทำสิ่งนี้เป็นหน้าแยกต่างหากไม่ใช่แก้ไขในสถานที่เช่นโมดูลแก้ไขด่วน

ผู้ใช้ยังคงต้องสามารถเข้าถึงหน้าแก้ไขบัญชีเดิมเพื่อเปลี่ยนเขตเวลาที่อยู่อีเมล ฯลฯ แต่ฉันสามารถใช้หน้าจอแยกต่างหากเพื่อให้พวกเขาแก้ไขตัวเลือกบัญชีที่ใช้กันทั่วไปได้

คำตอบ:


8

ฉันเคยมีสถานการณ์แบบเดียวกันมาก่อนและจัดการกับคุณสมบัติ druapl แบบเต็มกำลังhook_form_alterเรามี 2 รูปแบบสำหรับผู้ใช้การลงทะเบียนและแก้ไขผู้ใช้

  • user_profile_form (กำลังแก้ไข)
  • user_register_form (อยู่ในการลงทะเบียน)

เราเพียงต้องการซ่อนเขตข้อมูลที่คุณระบุในลักษณะการแก้ไขดังนั้นในโมดูลที่กำหนดเองของคุณ

function yourmodule_form_alter(&$form, &$form_state, $form_id)
{
    global $user;

    if ($form_id == "user_profile_form") {
       // ym($form);
       // you also can perform this action for specified roles 
        //if (!(in_array('blogger', $user->roles) || in_array('administrator', $user->roles))) {
            hide($form['field_mytest']);
            // hide other field with this method
        //}
    }

}

หลังจากฟิลด์นั้นมีการลงทะเบียนตามที่คุณเห็นด้านล่าง

ป้อนคำอธิบายรูปภาพที่นี่

และไม่มีอยู่ (ซ่อน) ในลักษณะที่แก้ไข

ป้อนคำอธิบายรูปภาพที่นี่

นอกจากนี้คุณสามารถตั้งค่าให้อ่านได้อย่างเดียวแทนที่จะซ่อนไว้$form['field']['#access'] = FALSE;

และโซลูชันอื่นกำลังใช้โมดูลการอนุญาตฟิลด์

โมดูลสิทธิ์ฟิลด์อนุญาตให้ผู้ดูแลไซต์ตั้งค่าสิทธิ์ระดับฟิลด์เพื่อแก้ไขดูและสร้างฟิลด์ในเอนทิตีใด ๆ คุณสมบัติ:

  • เปิดใช้งานการอนุญาตให้ใช้ฟิลด์ในเอนทิตีใด ๆ ไม่ใช่เฉพาะโหนด
  • การอนุญาตตามฟิลด์บทบาทช่วยให้มีรูปแบบการรับชมที่แตกต่างกันตามสิ่งที่ผู้ใช้เข้าถึง
  • สิทธิ์ระดับผู้เขียนอนุญาตให้ดูและแก้ไขฟิลด์ตามบุคคลที่เป็นเจ้าของกิจการ
  • สิทธิ์สำหรับแต่ละฟิลด์จะไม่เปิดใช้งานโดยค่าเริ่มต้น แต่ผู้ดูแลระบบสามารถเปิดใช้งานสิทธิ์เหล่านี้อย่างชัดเจนสำหรับฟิลด์ที่จำเป็นต้องใช้คุณลักษณะนี้

ในฐานะที่เป็นคุณสมบัติที่โมดูลนี้ให้สำหรับผู้ใช้ที่ไม่ระบุชื่อเรา (ผู้ใช้ที่ไม่ลงทะเบียนสามารถแก้ไขฟิลด์เหล่านั้นและลงทะเบียนผู้ใช้เห็นได้เท่านั้น (อ่านอย่างเดียว)


6

แทนที่จะมีสองฟอร์มคุณสามารถใช้รูปแบบเริ่มต้นและเพิ่มช่องทำเครื่องหมาย "แสดงการตั้งค่าทั้งหมด" เช่นแบบฟอร์มต่อไปนี้

$form['show_all_settings'] = array(
  '#type' => 'checkbox',
  '#title' => t('Show all settings'),
);

จากนั้นคุณสามารถเปลี่ยนเขตข้อมูลฟอร์มที่คุณต้องการแสดงเมื่อเลือกช่องทำเครื่องหมายและรวมคุณสมบัติต่อไปนี้สำหรับเขตข้อมูลฟอร์ม

'#states' => array(
  'invisible' => array(
   ':input[name="show_all_settings"]' => array('checked' => FALSE),
  ),
),

ด้วยวิธีนี้ผู้ใช้จะสามารถสลับระหว่างรูปแบบที่แสดงการตั้งค่าทั้งหมดและแบบฟอร์มแสดงชุดการตั้งค่าที่น้อยที่สุดโดยไม่ต้องผ่านจากหน้าหนึ่งไปอีกรูปแบบหนึ่ง

อ้างอิง


5

คุณสามารถใช้โมดูลProfile2สำหรับสิ่งนั้น

  • สร้างประเภทโปรไฟล์หรือใช้โปรไฟล์หลักเริ่มต้น
  • เพิ่มเขตข้อมูลเหล่านั้นลงในประเภทโปรไฟล์นั้นและตั้งค่าให้แสดงในแบบฟอร์มการลงทะเบียน

เพื่อให้เขตข้อมูลเหล่านั้นจะสามารถใช้ได้ในแบบฟอร์มการลงทะเบียนในหมู่สาขาอื่น ๆ จากบัญชีผู้ใช้ แต่การที่จะแก้ไขเขตข้อมูลเหล่านั้นผู้ใช้ควรจะไปที่แก้ไขโปรไฟล์หน้าแทนการแก้ไขของผู้ใช้หน้า


ฉันต้องการแสดงช่องทำเครื่องหมายสี่ช่องบนหน้าแก้ไขผู้ใช้และหน้ากำหนดเอง ฉันไม่ต้องการลบออกจากหน้าแก้ไขผู้ใช้หลัก
Patrick Kenny

1

ลองใช้โมดูลVBOคุณสามารถสร้างหน้า VBO เพิ่มความสัมพันธ์ USER ในมุมมองเพิ่มฟิลด์เหล่านั้นที่ผู้ใช้สามารถแก้ไขตั้งค่าสิทธิ์ได้ ตรวจสอบให้แน่ใจว่าคุณเลือกเนื้อหา "เป็น" สำหรับผู้ใช้ปัจจุบันเท่านั้น (ผ่านตัวกรองตามบริบท)


ฉันจะอนุญาตให้ผู้ใช้แก้ไขฟิลด์เหล่านี้ได้อย่างไร? VBO ให้ฉันแสดงค่า แต่ฉันต้องการให้แก้ไขได้
Patrick Kenny

เพิ่มเขตข้อมูล vbo จากนั้นทำเครื่องหมายการดำเนินการของ 'แก้ไขค่าเอนทิตี' (เช่นนี้จำไม่ได้ว่ามันเรียกว่าอะไร)
gilzero

ขอบคุณก็จะเรียกว่าค่านิติบุคคลปรับเปลี่ยน น่าเสียดายที่นี่ใช้ไม่ได้กับกรณีของฉัน แต่อาจเป็นวิธีแก้ปัญหาที่เป็นประโยชน์สำหรับผู้อื่น
Patrick Kenny

1

จากคำตอบของ zhilevan สำหรับคำถามนี้และคำถามนี้และการสนทนานี้ใน drupal.orgนี่คือรหัสจริงที่เหมาะกับฉัน:

function MYMODULE_menu() {
  $items = array();
  $items['user/editpurposes'] = array(
    'title' => t('Change your purposes'),
    'page callback' => 'MYMODULE_purpose_edit_form',
    'access callback' => TRUE,
    'access arguments' => array('access content'),
    'description' => t('Purpose Edit Form'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}

function MYMODULE_purpose_edit_form() {
  // Needed to load AJAX.
  module_load_include('inc', 'user', 'user.pages');
  global $user;
  $account = user_load($user->uid); // Load a user object
  $form = drupal_get_form('user_profile_form', $account, 'account', 'purposes');
  return $form;
}

function MYMODULE_form_user_profile_form_alter(&$form, &$form_state) {
  if(isset($form_state['build_info']['args'][2]) && $form_state['build_info']['args'][2] == 'purposes') {

    // Remove name, email, password, etc.
    $form['account']['#access'] = FALSE;
    // Remove language.
    $form['locale']['#access'] = FALSE;
    $form['timezone']['#access'] = FALSE;
    // Remove various custom fields.
    $form['field_acc_displayname']['#access'] = FALSE;
    $form['field_acc_code_agree']['#access'] = FALSE;

    // Needed to load AJAX.
    form_load_include($form_state, 'inc', 'user', 'user.pages');
  }
}

ฉันจะถามได้ไหมว่าทำไมProfile2ถึงไม่ใช่ตัวเลือกอย่างที่ฉันแนะนำในคำตอบของฉัน
ЕлинЙ

0

ฉันคิดว่าคุณควรจะจัดระเบียบสิ่งต่าง ๆ ได้เล็กน้อยด้วยโมดูลกลุ่มเขตข้อมูลเช่นวางเขตข้อมูลภายใต้แท็บที่แตกต่างกัน คนทั่วไปภายใต้แท็บหนึ่งและส่วนที่เหลือภายใต้แท็บอื่น


ขอบคุณสำหรับแนวคิดนี้ แต่ฉันใช้โมดูล Field Group อยู่แล้ว เป็นเรื่องที่ดี แต่ฉันแค่ต้องการแสดงสี่ตัวเลือกแก่ผู้ใช้ไม่ใช่ทุกอย่าง
Patrick Kenny

0

ลองรหัสนี้ และซ่อนฟิลด์อื่น ๆ ที่คุณไม่ต้องการแสดง

<?php
global $user;
$user=user_load($user->uid);
module_load_include('inc', 'user', 'user.pages');
$user_form = drupal_get_form('user_profile_form', $user);
print(drupal_render($user_form));
?>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.