Skriva bättre drupalmoduler

11Sep08

Nu är jag klar med version 1.0 av min ölmodul till drupal, och jag har tagit åt mig en del lärdommar på vägen. Man lär sig mest av problemen efter som man då är tvingad att lära sig att förstå det man gör.

Problemet:

Mitt stora problem var att data inte pressenterades så som jag förväntade mig, all data visades kursiv (html-taggen < em >). Google gav inga ledtrådar om hur man skulle lösa det. I följande exempel förenklar jag min kod så det blir lättare att se hur jag löste problemet

FEL:

<?php
/*KOD 1*/
function theme_beer_order_info($node) {
  $output = '<div class="beer_order_info">';
  $output .= t('<strong>Tillverkare:</strong><a href="%brandurl">%brand</a><br/>', array('%brand' => check_plain($node->brand), '%brandurl' => check_plain($node->brandurl) ) );
  $output .= t('<strong>Sort: </strong> %sort <br/>', array('%sort' => check_plain($node->sort)));
  $output .= '</div>';
  return $output;
}
?>

Resultatet av denna felaktiga kod blir att sökvägen omges av html-taggen em och drupal genererar en sökväg som är helt uppått väggen (tex http://localhost/demo<em>http://www.drupal.org/</em&gt;).

Lösningen:
Jag blev hänvisad till drupals t() där man kan läsa följande:

  • %VARIABEL tilldelas en theme_placeholder() som är kursiv (html-tagg em).
  • @VARIABEL texten körs genom check_plain(), använd detta för all “output” på drupalsidan.
  • !VARIABEL texten sätts in på sidan som den är.

Den enkla lösningen var att byta ut alla %-tecken mot @-tecken och tabort check_plain, eftersom check_plain ändå körs när man använder @VARIABEL

RÄTT

<?php
/*KOD 2 - RÄTT*/
function theme_beer_order_info($node) {
  $output = '<div class="beer_order_info">';
  $output .= t('<strong>Tillverkare:</strong><a href="@brandurl">@brand</a><br/>', array('@brand' => $node->brand, '@brandurl' => $node->brandurl ) );
  $output .= t('<strong>Sort: </strong> @sort <br/>', array('@sort' => $node->sort));
  $output .= '</div>';
  return $output;
}
?>

Funktionen t() används för att underlätta översättningar av moduler till andra språk och förväntas vara skriven på engelska. I detta fallet är det mindre intressant att släppa modulen på en internationell marknad, men vill man göra rätt ska koden så bör man göra rätt från början.

Mer diskussion om problemet finns på Groups.Drupal.Sweden.
Källkoden finns att ladda ner från min projektsida.

//Fredrik



No Responses Yet to “Skriva bättre drupalmoduler”

  1. Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s


%d bloggers like this: