it-swarm-eu.dev

Na stránce uživatelských úprav zakažte nastavení jazyka uživatele

Chci zrušit tuto specifickou část formuláře nastavení v šabloně php. Našel jsem nějaký příklad kódu pro Drupal 6, ale nedokážu přijít na to, jak to udělat v Drupal 7).

Zkusil jsem to bez výsledku:

if ($form_id == 'user_profile_form') {
  unset($form['language']);
}

(Existuje modul „vylepšení uživatele“, ale chci, aby to udělal v předběžném zpracování)

5
cateye

Oba uvedené projekty jsem vytvořil a chvíli je udržuji. (Přestal jsem udržovat Drupal 6 a 7 modulů.)

Kód použitý v modulu Zakázat uživatelský jazyk není správný: unset() by nikdy neměl být použit pro elementy formuláře, protože by to způsobilo problémy modulům, které se pokoušejí získat přístup k elementu formuláře.

Správný kód je následující. Bylo by vhodnější, kdyby byl kód proveden poté, co jiné moduly provedou svůj vlastní kód.

/**
 * Implements hook_form_alter().
 */
function mytheme_form_alter(&$form, $form_state, $form_id) {
  // The language selector is only displayed if there is more than one language.
  if (drupal_multilingual()) {
    if ($form_id == 'user_register_form' || ($form_id == 'user_profile_form' && $form['#user_category'] == 'account')) {
      if (count(element_children($form['locale'])) > 1) {
        $form['locale']['language']['#access'] = FALSE;
      }
      else {
        $form['locale']['#access'] = FALSE;
      }
    }
  }
}

V mém modulu jsem také použil hook_init() ke změně $user->language Na výchozí hodnotu; jinak $user->language by uložila poslední hodnotu.

/**
 * Implements hook_init().
 */
function dul_init() {
  if (!user_access('change own user language')) {
    global $user;

    $user->language = language_default('language');
  }
}

Modul Zakázat uživatelský jazyk má samozřejmě své vlastní oprávnění, které umožňuje zvolit, kteří uživatelé mají oprávnění k výběru vlastního jazyka, ale tato část není nezbytně nutná.

Použil jsem hook_init(), protože dokumentace pro hook_user_load() má následující varování:

Kvůli statické mezipaměti v user_load_multiple() byste neměli používat tento háček k úpravě vlastností uživatele vrácených samotnou tabulkou {users}, protože to může vést k nespolehlivým výsledkům při načítání z mezipaměti .

Kód také mění za chodu vlastnost aktuálně přihlášeného uživatele bez provedení jakýchkoli změn v databázi. hook_user_load() by tomuto účelu nesloužil, protože je vyvolán pokaždé, když modul volá user_load().

14
kiamlaluno

Podíval jsem se na modul „ Zakázat uživatelský jazyk “.

Tato část kódu mi opravdu stačí:

function template_form_user_profile_form_alter(&$form, $form_state) {
   unset($form['locale']);
}
5
cateye

Pro ty, kteří z jakéhokoli důvodu ne/nemohou dělat PHP, je jednoduchý způsob, jak skrýt blok nastavení jazyka v Drupal 7, 7) přidat následující CSS na stránku uživatelských úprav :

#user-profile-form fieldset#edit-locale
{
    display: none;
}

Po vyzkoušení několika metod přidání CSS na stránky je mou preferovanou metodou modul CSS Injector ( https://www.drupal.org/project/css_injector ). Připadá mi snadné používat, efektivní a vhodné místo pro údržbu všech mých injektovaných CSS.

P.S. Uvědomuji si, že se jedná o starý příspěvek, ale četl jsem ho, jak hledal odpověď, takže si myslím, že to budou i ostatní.

1
Marshall Morrise

V drupal 8) můžeme zakázat pomocí níže uvedeného kódu

function digicare_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id){ if($form_id = "user_register_form" || $form_id = "user_profile_form"){ $form['language']['#access'] = FALSE; } }

0
nehapandya