it-swarm.it

Theming user_profile_form (il modulo di modifica dell'utente)

Sto cercando modi semplici per creare un tema del modulo del profilo utente che mi consentirà di impostare un layout a due colonne per il modulo ed escludere determinati elementi.

Come posso raggiungerlo?

7
areynolds

Oltre all'utilizzo del modulo Display Suite, la maggior parte dei metodi per i moduli tematici richiede la scrittura di un po 'di codice. Nel seguente metodo definisco variabili dal modulo che possono essere emesse in un file modello per adattarsi a qualsiasi struttura HTML desideri. Ho inserito tutto il mio codice in template.php, ma puoi fare altrettanto facilmente un modulo personalizzato per farlo.

  1. Aggiungi un'implementazione hook_theme ()

    function YOURTHEME_theme($existing, $type, $theme, $path){
      return array(
        'user_profile_form' => array(
          'render element' => 'form',
          'template' => 'user-profile-form',
          'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates', 
          //add '/templates' only if you store template files in an additional folder
        ),
    
      );
    }
    

    Questo dice al Drupal sistema tematico che c'è un file modello che lo aspetta in YOURTHEME/template.

  2. Successivamente definiremo alcune variabili da passare in quel modello in una funzione hook_preprocess_HOOK. Possiamo trovare l'array strutturato del modulo in $ variabili ['form'] e assegnare gli elementi del modulo alle variabili che vorremmo gettare intorno al nostro file tpl.php.

    function YOURTHEME_preprocess_user_profile_form(&$variables) {
      $form_inputs = array(
        'account' => $variables['form']['account'],
        'picture' => $variables['form']['picture'],
        'actions' => $variables['form']['actions'],
      );
      $variables['rendered'] = _YOURTHEME_form_variables_render_all($form_inputs);
    }
    
    function _YOURTHEME_form_variables_render_all($elements) {
        //Create array to return, with element name as key and element as value
        $elements_array = array();
        //For each element, render it and add it to the array
        foreach ($elements as $key => $element) {
            $elements_array[$key] = render($element);
        }
        //Return array
        return $elements_array;
    }
    

    Questo esempio inserirà i campi di informazioni generali sull'account, il campo di caricamento delle immagini dell'utente (se le immagini sono abilitate) e le azioni di invio in una variabile chiamata "rendering".

  3. Ora che abbiamo definito queste variabili, possiamo produrle in un file modello. Crea un file modello chiamato user-profile-form.tpl.php in "YOURTHEME/templates". Questo è un esempio dimostrativo:

    <div id="new-form">
      <?php echo $rendered['picture']; ?>
      <?php echo $rendered['account']; ?>
      <?php echo $rendered['actions']; ?>
      <input type="hidden" name="form_id" value="<?php print $form['#form_id']; ?>" />
      <input type="hidden" name="form_build_id" value="<?php print $form['#build_id']; ?>" />
      <input type="hidden" name="form_token" value="<?php print $form['form_token']['#default_value']; ?>" />
    </div>
    

Notare i campi del modulo nascosto alla fine; questi includono vital Drupal che aiutano a proteggere i moduli dagli attacchi. Il tuo modulo non funzionerà senza di essi.

Quando visiti la pagina di modifica dell'utente, ora dovresti vedere solo alcuni campi di informazioni generali sull'account e i campi immagine. Crea diverse variabili nella funzione di preelaborazione per separare gli elementi del modulo e posizionarli dove desideri nel file user-profile-form.tpl.php, aggiungendo qualsiasi markup desiderato.

7
areynolds

Le suite display possono essere utilizzate solo per il display, non per la modifica. Sarebbe stato fantastico, se fosse stato in grado di gestirli entrambi.

1
rpataca

Alcune correzioni per areynolds codice:

Correzione del trattino basso nell'elemento di rendering

function YOURTHEME_theme($existing, $type, $theme, $path){
  return array(
    'user_profile_form' => array(
      'render element' => 'form',
      'template' => 'user-profile-form',
      'path' => drupal_get_path('theme', 'YOURTHEME') . '/templates', 
      //add '/templates' only if you store template files in an additional folder
    ),

  );
}

Correzione della funzione di preelaborazione dalla sostituzione dei dati (account-> immagine) e dall'aggiunta di elementi di azione (pulsante modulo).

function YOURTHEME_preprocess_user_profile_form(&$variables) {
  $required_elements[]=$variables['form']['account'];
  $required_elements[]=$variables['form']['picture'];
  $required_elements[]=$variables['form']['actions'];
  $variables['rendered'] = drupal_render($required_elements);
}

Ma tutte queste manipolazioni danno solo l'apparenza della forma. Ma il modulo non funzionerà correttamente in quanto richiede altri elementi come validare, inviare gestori, ecc. Quindi penso che il modo migliore per nascondere gli elementi non richiesti nell'array $ variabili ['form'] lasciando tutti i metadati del modulo necessari.

0
ACD

I pannelli possono assumere completamente il modulo di modifica del profilo e con una manciata di patch (al momento) puoi inserire le informazioni di Profile2 come relazione dei pannelli.

0
ergophobe