क्या दूसरा "एडिट अकाउंट" पेज बनाना संभव है जो केवल उपयोगकर्ताओं को कुछ प्रोफ़ाइल फ़ील्ड संपादित करने की अनुमति देता है?


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

आप उसके लिए प्रोफाइल 2 मॉड्यूल का उपयोग कर सकते हैं ।

  • एक प्रोफ़ाइल प्रकार बनाएं या डिफ़ॉल्ट मुख्य प्रोफ़ाइल का उपयोग करें।
  • उन क्षेत्रों को उस प्रोफ़ाइल प्रकार में जोड़ें और उन्हें पंजीकरण फ़ॉर्म पर दिखाए जाने के लिए सेट करें।

ताकि वे फ़ील्ड उपयोगकर्ता खाते से अन्य फ़ील्ड्स के बीच पंजीकरण फ़ॉर्म पर उपलब्ध होंगे । लेकिन संपादित करने के लिए उन क्षेत्रों, उपयोगकर्ता के पास जाना चाहिए प्रोफ़ाइल संपादित करने के बजाय पेज उपयोगकर्ता संपादित करें पेज।


मैं उपयोगकर्ता संपादित पृष्ठ और अपने स्वयं के कस्टम पृष्ठ पर चार चेकबॉक्स दिखाना चाहता हूं; मैं उन्हें मुख्य उपयोगकर्ता संपादन पृष्ठ से निकालना नहीं चाहता।
पैट्रिक केनी

1

VBO मॉड्यूल को आज़माएं , आप एक VBO पृष्ठ बना सकते हैं, USER संबंध को देखने के लिए, उन फ़ील्ड्स को जोड़ सकते हैं जो उपयोगकर्ता के लिए मॉड के लिए उपलब्ध हैं, अनुमति सेट करें। सुनिश्चित करें कि आप सामग्री का चयन केवल "उपयोगकर्ता" से करते हैं (प्रासंगिक फ़िल्टर के माध्यम से)


मैं उपयोगकर्ता को इन क्षेत्रों को संपादित करने की अनुमति कैसे दे सकता हूं? VBO मुझे मूल्यों को प्रदर्शित करने देता है, लेकिन मुझे उन्हें संपादन योग्य बनाने की आवश्यकता है।
पैट्रिक केनी

Vbo फ़ील्ड जोड़ें, फिर 'इकाई मूल्यों को संशोधित करें' के संचालन पर टिक करें (कुछ इस तरह, याद नहीं कि वास्तव में इसे क्या कहा जाता है)
गिल्ज़रियो

धन्यवाद, इसे संशोधित इकाई मूल्य कहा जाता है । दुर्भाग्य से, यह मेरे मामले के लिए काम नहीं करता है, लेकिन यह दूसरों के लिए एक उपयोगी समाधान हो सकता है।
पैट्रिक केनी

1

इस सवाल और इस सवाल और 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

मुझे लगता है कि आपको फील्ड समूह मॉड्यूल के साथ चीजों को थोड़ा-सा समेटने में सक्षम होना चाहिए , जैसे अलग-अलग टैब के तहत फ़ील्ड्स डालना। एक टैब के तहत सामान्य और दूसरे टैब के तहत बाकी।


इस विचार के लिए धन्यवाद, लेकिन मैं पहले से ही फील्ड ग्रुप मॉड्यूल का उपयोग कर रहा हूं। यह अच्छा है, लेकिन मैं वास्तव में उपयोगकर्ता को चार विकल्प दिखाना चाहता हूं, सब कुछ नहीं।
पैट्रिक केनी

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));
?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.