Custom Form Table en Drupal

logo_drupal

Il est très bien d'utiliser Views pour faire des tables de contenu/utilisateurs mais parfois nous n'avons pas de sous-modules ou d'extensions pour générer les tables de submissions de webform très complets. Par défaut nous avons des informations qui ne sont pas très pratiques, comme Sid, Date de submission, Ip de l'autor, ... Pour cet exemple je vais vous expliquer comment créer une table custom dans un formulaire custom Drupal, avec les champs d'un webform.

Pour faire ce formulaire, il va falloir créer un module custom appelé customftable, avec:

Hook_Menu:

function customftable_menu()
{
    $items = array();
    $items['admin/altival/contributions'] = array(
        'title' => 'Modération des Contributions',
        'description' => 'Modération des Contributions',
        'page callback' => 'drupal_get_form',
        'page arguments' => array('customftable_contributionmoderations'),
        'access arguments' => array('access altival settings'),
        'type' => MENU_NORMAL_ITEM,
        "weight" => 6,
    );
}

Où nous avons un $Item de menu avec un callback drupal_get_form et comme paramètre une fonction callback customftable_contributionmoderations:

Dans cette fonctionnalité, nous allons faire une requête SQL pour récuperer des champs d'une submission de formulaire webform.

function customftable_contributionmoderations($form, &$form_state)
{
    <span class="token comment">//Même Requete SQL que dans une vue @/admin/structure/views/view/form_custom_view </span><span class="token comment"> 
    //Pour generer la Requete Drupal: drupalon.fr/query-coder</span>
    $query = db_select('{webform_submissions}', 'webform_submissions');
    $query->fields('webform_views_formulaire_de_contribution', array('sid', 'nom', 'prenom', 'email', 'ville', 'pseudo', 'message', 'autorisation', 'moderation'));
    $query->fields('node', array('nid'));
    $query->leftJoin('{webform_views_formulaire_de_contribution}', 'webform_views_formulaire_de_contribution', 'webform_submissions.sid = webform_views_formulaire_de_contribution.sid');
    $query->leftJoin('{node}', 'node', 'webform_submissions.nid = node.nid');
    $result = $query->execute();

    $rows = array();
    //Mettre les resultats dans un format table
    $rows['#tree'] = TRUE;
    
    //Transformer Requete SQL dans une table
    foreach ($result as $row) {
        $rows[$row->sid]['sid']['#markup'] =  $row->sid;
        $rows[$row->sid]['nom']['#markup'] =  $row->nom;
        $rows[$row->sid]['prenom']['#markup'] = $row->prenom;
        $rows[$row->sid]['email']['#markup'] =  $row->email;
        $rows[$row->sid]['ville']['#markup'] =  $row->ville;
        $rows[$row->sid]['pseudo']['#markup'] = $row->pseudo;
        $rows[$row->sid]['message']['#markup'] =  $row->message;
        
        $rows[$row->sid]['autorisation']['#markup'] = ($row->autorisation == 1) ? 'Oui' : 'Non';
        //Champ custom example pour être modifié dans le formulaire
        $rows[$row->sid]['moderation']['#type'] = 'select';
        $rows[$row->sid]['moderation']['#title'] = t('Modération?');
        $rows[$row->sid]['moderation']['#options'] = array(
                                                        '0' => t('Pas encore modéré'),
                                                        '1' => t('Afficher'),
                                                        '2' => t('Ne pas Afficher'),
                                                    );
        $rows[$row->sid]['moderation']['#default_value'] = $row->moderation;

        $rows[$row->sid]['edit']['#markup'] = '<a href="/admin/contributions/' . $row->sid . '">Editer Submission</>';

        $rows[$row->sid]['hidden_sid']['#type'] = 'hidden';
        $rows[$row->sid]['hidden_sid']['#value'] =  $row->sid;


    }

    //GET the form as a TABLE
    $form = array();
    $form['table'] = array(
        // Theme this part of the form as a table.
        '#theme' => 'formtable_form_table',
        // Pass header information to the theme function.
        '#header' => array(t('Sid'), t('Nom'), t('Prenom'), t('Email'), t('Ville'), t('Pseudo'), t('Message'), t('Autorisation'), t('Moderation') , t('Edit'), t(''), ),
        // Rows in the form table.
        'rows' => $rows,
    );

    $form['#submit'][] = 'customftable_contributionmoderations_form_submit';
    //return $form;
    return system_settings_form($form);
}

Après il va falloir créer le hook_theme

function customftable_theme($existing, $type, $theme, $path) {
    return array(
        'customftable_form_table' => array(
            'render element' => 'form',
        ),
    );
}

Et notre fonction custom pour transformer nos résultats dans une table

custom table:

function theme_customftable_form_table(&$variables) {
  // Get the userful values.
  $form = $variables['form'];
  $rows = $form['rows'];
  $header = $form['#header'];

  // Setup the structure to be rendered and returned.
  $content = array(
    '#theme' => 'table',
    '#header' => $header,
    '#rows' => array(),
  );

  // Traverse each row.  @see element_chidren().
  foreach (element_children($rows) as $row_index) {
    $row = array();
    // Traverse each column in the row.  @see element_children().
    foreach (element_children($rows[$row_index]) as $col_index) {
      // Render the column form element.
      $row[] = drupal_render($rows[$row_index][$col_index]);
    }
    // Add the row to the table.
    $content['#rows'][] = $row;
  }

  // Redner the table and return.
  return drupal_render($content);
}

 

Finalement, pour notre cas nous avons modifié une submission du webform dans le code

hook_form_submit:

function customftable_contributionmoderations_form_submit($form, &$form_state){

    if ( isset($form_state['values']['rows']) ){
        //Importart in order to load webform.submissions
        $file_path = module_load_include('inc', 'webform', 'includes/webform.submissions');
        foreach ($form_state['values']['rows'] as $k => $sent_sub) {
            if ( isset($sent_sub['moderation'])  && isset($sent_sub['hidden_sid']) ) {
                $nid = 11;  $node = node_load ($nid);
                $submission = webform_get_submission($nid, $sent_sub['hidden_sid']);
                // change properties;
                $submission->data[8]['value'][0] = $sent_sub['moderation'];
                // kpr ($submission);
                webform_submission_update($node, $submission);
            }
        }       
    }
}

Enregistrer

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.