Kullanıcıların yalnızca bazı profil alanlarını düzenlemesine izin veren ikinci bir “hesabı düzenle” sayfası oluşturmak mümkün müdür?


14

İşte benim durumum: Sitemdeki kullanıcıların kayıt sırasında oldukça fazla alan doldurması gerekiyor. Ancak, kayıt olduktan sonra, bu alanlardan sadece dördü (yaklaşık yirmi kişiden) düzenli olarak değiştirilmelidir. Kullanıcıların işleri basitleştirmek için bu dört alanı değiştirmelerine izin vermek için ayrı bir "düzenle" sayfası oluşturmak istiyorum.

  • field_checkbox_a
  • field_checkbox_b
  • field_checkbox_c
  • field_checkbox_d

Bu alanların tümü bir alan grubunda yer alır, bu nedenle ideal olarak sayfa bu alan grubunu, içindeki dört onay kutusunu gösterir ve ardından bir gönderme ve iptal düğmesi vardır, hepsi bu.

Bunu, Hızlı Düzenleme modülü gibi yerinde düzenleme değil, ayrı bir sayfa olarak yapmak istiyorum .

Kullanıcıların saat dilimlerini, e-posta adreslerini vb. Değiştirmek için orijinal düzenleme hesabı sayfasına erişebilmeleri gerekir, ancak en yaygın hesap seçeneklerini düzenlemelerine izin vermek için gerçekten ayrı bir ekran kullanabilirim.

Yanıtlar:


8

Daha önce aynı durum vardı ve güç tam druapl özelliği hook_form_alter ile ele , kullanıcı, kayıt ve kullanıcı düzenleme için 2 formları var

  • user_profile_form (düzenlemede)
  • user_register_form (kayıtta)

Belirttiğiniz alanları düzenleme biçiminde gizlememiz gerekiyor. Yani özel modülünüzde

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

}

Aşağıda gördüğünüz gibi bu alan kayıt olduktan sonra

resim açıklamasını buraya girin

ve düzenleme biçiminde mevcut değil (gizle)

resim açıklamasını buraya girin

Ayrıca, onları yalnızca$form['field']['#access'] = FALSE;

Başka bir çözüm de saha izin modülünü kullanmaktır

Alan İzinleri modülü, site yöneticilerinin herhangi bir varlık üzerinde alanları düzenlemek, görüntülemek ve oluşturmak için alan düzeyinde izinler ayarlamasına olanak tanır. Özellikleri:

  • Yalnızca düğümlerde değil, herhangi bir varlıkta alan izinlerini etkinleştirin.
  • Kullanıcının sahip olduğu erişime bağlı olarak farklı görüntülemelere izin veren rol tabanlı alan izinleri.
  • Yazar düzeyinde izinler, alan sahibinin kim olduğuna göre alanların görüntülenmesine ve düzenlenmesine izin verir.
  • Her alan için izinler varsayılan olarak etkin değildir. Bunun yerine, yöneticiler bu özelliğin gerekli olduğu alanlar için bu izinleri açıkça etkinleştirebilir.

Bu modülün bize anonim kullanıcı sağladığı özellikler (kayıt dışı kullanıcı bu alanı düzenleyebilir ve yalnızca kullanıcı kaydı yapabilir) (salt okunur şekilde).


6

İki forma sahip olmak yerine, varsayılanı kullanabilir ve aşağıdakine benzer bir "Tüm ayarları göster" onay kutusu ekleyebilirsiniz.

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

Ardından, onay kutusu seçildiğinde göstermek istediğiniz form alanlarını değiştirebilir ve bu form alanları için aşağıdaki özelliği ekleyebilirsiniz.

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

Bu şekilde kullanıcılar, bir sayfadan diğerine geçmeden tüm ayarı gösteren bir form ile minimum ayar grubunu gösteren bir form arasında geçiş yapabilir.

Referanslar


5

Bunun için Profile2 modülünü kullanabilirsiniz .

  • Bir profil türü oluşturun veya varsayılan ana profili kullanın.
  • Bu alanları o profil türüne ekleyin ve kayıt formunda gösterilmek üzere ayarlayın.

Böylece bu alanlar, kullanıcı hesabındaki diğer alanlar arasında kayıt formunda yer alacaktır . Ancak bu alanlar düzenlemek için, kullanıcı gitmeli profil düzenleme yerine sayfa kullanıcı düzenlemesi sayfa.


Kullanıcı onay sayfasında dört onay kutusunu ve kendi özel sayfasında göstermek istiyorum; Bunları ana kullanıcı düzenleme sayfasından kaldırmak istemiyorum.
Patrick Kenny

1

VBO modülünü deneyin , bir VBO sayfası oluşturabilir, görünümde KULLANICI ilişkisi ekleyebilir, kullanıcının değiştirebileceği alanları ekleyebilir, İzni ayarlayabilirsiniz. Yalnızca CURRENT kullanıcısına "ait" içeriği seçtiğinizden emin olun (Bağlamsal Filtre ile)


Kullanıcının bu alanları düzenlemesine nasıl izin verebilirim? VBO değerleri göstermeme izin veriyor, ancak bunların düzenlenebilir olmalarını istiyorum.
Patrick Kenny

Vbo alanı ekleyin ve sonra 'varlık değerlerini değiştir' işlemini işaretleyin (böyle bir şey, tam olarak ne olduğunu hatırlayamıyorum)
gilzero

Teşekkürler, buna varlık değerlerini değiştirme denir . Ne yazık ki, bu benim durumum için işe yaramaz, ancak diğerleri için yararlı bir çözüm olabilir.
Patrick Kenny

1

Zhilevan'ın bu soruya ve bu soruya ve drupal.org'daki bu tartışmaya verdiği cevaba dayanarak, benim için çalışan gerçek kod:

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

cevabımda önerdiğim gibi Profile2'nin neden bir seçenek olmadığını sorabilir miyim?
Елин Й.

0

Alan grubu modülüyle işleri biraz düzenleyebilmeniz gerektiğini düşünüyorum , örneğin alanları farklı sekmeler altına yerleştirin. Bir sekmenin altındaki ortak olanlar ve diğer bir sekmenin altındaki diğerleri


Bu fikir için teşekkürler, ama zaten Field Group modülünü kullanıyorum. İyi ama gerçekten sadece kullanıcıya dört seçenek göstermek istiyorum, her şeyi değil.
Patrick Kenny

0

bu kodu deneyin. ve göstermek istemediğiniz diğer alanları gizleyin.

<?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));
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.