Drupal development: arg(); is evil!

29 Aug 2014

Joris Snoek
Digital Consultant
+31 (0)20 - 261 14 99

Tijdens controle door de Drupal community van onze Drupal distributie OpenLucius (een Drupal social intranet) liepen we tegen volgende issue aan:

We gebruikte de functie arg(); hier en daar om logica af te vangen. En wat blijkt: "arg() is evil". Dit hadden we kunnen weten, het lijmt argumenten en functies té absoluut aan elkaar vast.

Bericht in een Groep

Een case waar we arg(); gebruikte was: om te bepalen in welke Groep een item toegevoegd wordt. Bijvoorbeeld een Bericht 'Welkom in deze projectgroep' toevoegen in een Groep 'Project nieuwe website'.

*Warning: nerd alarm vanaf hier* :)

Hoe we dit technisch oploste (the evil way)

  • Voeg de group node id toe aan de link om een bericht toe te voegen. Dat werd dus bijvoorbeeld 'node/add/ol-message/34'.
  • We vingen in hook_form_alter() dat argument op met evil arg(); .
  • En zorgde middels code in die hook_form_alter() dat het Bericht middels een Node reference field automatisch werd gekoppeld aan de juiste Groep.

Dat is dus níet goed.

Ok, maar hoe dan?

Collega Thomas heeft hiervoor een oplossing bedacht. Deze is nog wel in alpha fase, we moeten hem dus wel goed testen én de Drupal community moet het met ons eens zijn.

In de basis draait die om het overriden van het standaard Drupal node/add formulier, zodat we het gerefereerde Group node id tot onze beschikking hebben in het formulier. Waarna het ingevoerde Bericht automatisch kan koppelen aan de Groep waar hij toegevoegd wordt.

  1. Voeg een custom hook_menu() toe met een custom callback.
  2. Voeg de custom callback functie toe.
  3. Override het standaard Drupal node/add formulier.
  4. Koppel automatisch, middels code, de Group nid in het node reference field 'Group reference' , zodat het Bericht gekoppeld wordt aan de juiste Groep.

1. Voeg een custom hook_menu() toe

/** * Implements hook_menu() */function openluciuscore_menu() {  $items = array();  $items['node/add/ol-message/%'] = array(    'title'            => t('Message'),    'title callback'   => 'check_plain',    'page callback'    => 'openluciuscore_node_add',    'page arguments'   => array('ol_message', 3),    'access callback'  => 'node_access',    'access arguments' => array(      'create',      'ol_message'    ),    'description'      => t('Facilitates OpenLucius Messages in Groups'),    'type'             => MENU_NORMAL_ITEM  );}
  • Roept de functie 'openluciuscore_node_add' aan
  • En geeft het derde argument uit de URL dynamisch door aan die functie: 'array('ol_message', 3)'

2. De custom callback functie

/** * Custom callback for node add * @param $type * @param $group * @return array */function openluciuscore_node_add($type, $group) {  global $user;  // sanitise group input  $sanatized_group = filter_xss($group);  // check if the user may add content into this group  if (_olcore_user_in_group($sanatized_group, $user -> uid)) {    // load requirements    module_load_include('inc', 'node', 'node.pages');    // fetch form    $form = openluciuscore_node_add_with_group($type, $sanatized_group);  }  return $form;}
  • Vangt de 'Groep variabele' op in het tweede argument van de functie
  • Laadt alle noodzakelijke code uit de core
  • Laad en returnt het 'node/add' formulier

3. Override het standaard Drupal node/add formulier

/** * Custom version of node_add found in the node.pages.inc * @param $type * @param $group * @return array */function openluciuscore_node_add_with_group($type, $group) {  global $user;  $types = node_type_get_types();  $node = (object) array('uid' => $user->uid, 'name' => (isset($user->name) ? $user->name : ''), 'type' => $type, 'language' => LANGUAGE_NONE);  drupal_set_title(t('Create @name', array('@name' => $types[$type]->name)), PASS_THROUGH);  $output = drupal_get_form($type . '_node_form', $node, $group);  return $output;}
  • Laat het standaard Drupal 'node/add' formulier en voegt de extra build info toe om de Groep variabele door te geven.

Wrap up

OK, that's all folks. Vragen of suggesties? Let me know.

Comments

Nóg meer
kennis nodig?

Check ons ons blog archief >