Entwicklung

PHUnit und PEAR

Während der Installation von der benötigten Pakate für das PHING-Drupal-Template1, einer XML-Build-Datei für ein Phing-Build-System für Drupal-Projekte als zentraler Bestandteil eines PHING-Drupal-Jobs2 für den Continous Integration3 Server Jenkins4 lief ich in einer längere Fehlersuche. Zwei Pakete die durch pear.phpunit.de bereitgestellt werden, phpcpd5, ein PHP Copy n Paste Detector und phploc6, ein Tool für Code-Metriken sollen laut den Anforderungen7 via PEAR installiert werden.

pear channel-discover pear.phpunit.de

Aber schon die sog. "Channel discovery", vergleichbar mit einem apt-get update nach einer Erweiterung der Repositories schlägt fehl...

Error: No version number found in <channel> tag Discovering channel pear.phpunit.de over http:// failed with message: channel-add: invalid channel.xml file
Trying to discover channel pear.phpunit.de over https:// instead Error: No version number found in <channel> tag
Discovery of channel "pear.phpunit.de" failed (channel-add: invalid channel.xml file) </channel></channel>

Zur Dokumentation von Klassenvariablen, auch Properties1 oder Member genannt
wird in Doxygen2(u.a.) und PHPDoc3 (phpDocumentor 2) das Tag @var verwendet 4 5.

In PHPDoc wird die folgende Notation verwendet, diese wird so auch in Drupals Coding-Standards beschrieben6:

 
/**
 * Passed command line options
 * @var string
 */

protected $commandLineOptions;

...welche in Doxygen leider weder mit Typ noch mit dem zusätzlichen Kommentar angezeigt wird.

PHP Member Data Documenation within Doxygen, PHPDoc Notation

In Zeile 6, registriere ich hier einen Menü-Pfad mit einer sog. Wildcard, also einem Platzhalter.

Das bedeutet in diesem Fall, dass während der Pfad-Anteil example/ fix ist, dass der zweite Pfad-Anteil %node_type_nid, wie hoffentlich schon durch seine Benennung deutlich wird, Node-ID's (nids) von Node-Typ example enthalten soll.

  1. /**
  2.  * Implements hook_menu().
  3.  */
  4. function example_menu() {
  5.   $items = array();
  6.   $items['example/%node_type_example_nid'] = array(
  7.     'title' => 'Example page title',
  8.     'description' => 'Example page description',
  9.     'page callback' => 'drupal_get_form',
  10.     'page arguments' => array('example_form', 1),
  11.     'access callback' => TRUE,
  12.   );
  13.   return $items;
  14. }
  • 404 bei Aufruf von example/123?
  • Wie bekomme ich es hin, dass der Pfad nur in Verbindung von Node-ID's vom Typ example valide ist?
  • ...vielleicht noch zusätzliche Validierungen?

Den Fallstrick und die Suche möchte ich euch ersparen...

db_like is the way to go

$result = db_query( 'SELECT * FROM person WHERE name LIKE :pattern', array(':pattern' =&gt; db_like($prefix) . '%') );

In der Regel kann man eine Drupal-Site mit einem Projekt gleichsetzen, Projekte nutzen eine Versionsverwaltung, immer häufiger ist dies Git.

Je mehr ich Git nutze, je weniger nutze ich die Möglichkeiten der klassischen Drupal-Multisite-Funkionalität, dem Teilen von Drupal-Core und Contributed-Modules über viele Drupal-Sites hinweg.

Im folgenden möchte ich diese (Verzeichnis-)Struktur innerhalb des Git-Repositories beleuchten und in diesem Zusammenhang Ansätze von spezielleren Drush-Konfigurationsdateien zeigen, welche sich in Drupal-Projekten für mich etabliert haben, ein Teil hiervon ist Drupal-7 spezifisch.

example.com/
 |-- drupal
 | `-- sites
 | |-- all
 | | |-- modules
 | | | |- features
 | | | |- contrib
 | | | `- custom
 | | `-- themes
 | |-- default
 | | |-- default.settings.php
 | | |-- files
 | | |-- themes
 | | `-- settings.php
 | |-- example.sites.php
 | `-- sites.php
 |-- dumps
 | `-- 20120615-185144.sql
 |-- etc
 | |-- apache2
 | | `-- sites-available
 | | `-- example.com
 | `-- drush
 | |--- aliases.drushrc.php
 | |--- git.drushrc.php
 | `--- example.drushrc.php
 |-- privatefiles
 | `-- IMG_6445.JPG
 `-- salt
   `-- salt.txt

  • drupal

    Die Drupal Code-Basis und DocumentRoot des Webservers.

  • dumps

    Hier liegen die Datenbankdumps

  • etc

    Projektrelevante Konfigurationsdateien, relativ zur Wurzel des Dateisystems.

  • privatefiles

    Dateien die über Drupal verwaltet werden, (Ziel beim Hochladen: Private Dateien).

  • salt

    Beinhaltet in der Datei salt.txt, den aus settings.php ausgelagerten Salt

Rudimente für ein Drupal-Deployment mit

  • Lokaler Entwicklungumgebung
  • Stage-Umgebung
  • Live / Produktionsumgebung

unter Verwendung, der in Drupal-7 neu eingeführten Multisite-Features in der Datei sites.php, Drush-Aliases und einer speziellen settings.php, die in diesem Fall versioniert wird.

sites.php -- Verzeichnis Aliase in Drupal 7.x

Die in Drupal 7.x neu eingeführte Datei sites.php stellt erstmalig Verzeichnis-Aliase für Drupal-Multisites zur Verfügung. So ist es jetzt möglich mit verschiedenen Domains bzw. VirtualHosts ein bestimmtes Verzeichnis innerhalb von sites anzusprechen, ohne über z.B. Symbolische Links zu gehen, was in vorgigen Drupal-Versionen zur Folge haben konnte, daß Datei- oder Modulpfade beim "umbiegen" von der Dev-Site example.mydomain.de auf die Live-Site example.com divergent sind.

 
// sites/sites.php
// (LOCAL) DEV SITE
$sites['example.localhost'] = 'example.com';

// STAGE SITES
$sites['stage-example.mydomain.de'] = 'example.com';
$sites['stage.example.com'] = 'example.com';

// LIVE SITE $sites['example.com'] = 'example.com';

 
@see /path/to/drupal7/sites/example.sites.php
Repeatition of my session features+ during DUB´s "Drupal-Deployment theme night" @ this years Drupalcamp, drupalcity.de, 2011-09-18, this time in english.

This session was intended as an introduction and a motivation to use Features module for deployment and re-usable patterns.

"A Presentation about Monsters, Features and The Plus" or
  • "How to create modules as a non-programmer"
  • "Features: The first step towards Apps"
  • "Share your Drupal genius the easy way: Features"
  • "YAFS: Yet another Features session"
  • "A VCS called FTP"... [1] [2]
features+ Session #dcb11 Foto: © Sven Culley, sense-design.de

Bei der Erstellung von Formularelementen,
welche eine Jquery-Datepicker-Funktionalität bereitsstellen sollen
besteht die Möglickeit auf Date Popup, ein Submodul des Date / Date API Moduls zurückzugreifen.

Der Zugriff auf diese Funktionalität erfolgt über Drupals FAPI.

Da sind sie, die langerwarteten assoziativen Arrays in der BASH!

Hinzugekommen sind assoziative Arrays, die mit declare -A name erzeugt werden. Sie unterscheiden sich von den bisherigen Arrays dadurch, dass sie als Index beliebige Strings benutzen können. Abgesehen davon ist die Verwendung beider Datentypen identisch, so werden einzelne Elemente etwa in beiden Fällen mit ${name[index]} angesprochen.
Aus heise.de: Unix/Linux-Shell Bash in Version 4

In der BASH ist es möglich mit eindimensionalen Arrays zu arbeiten:

  1. #!/bin/bash
  2.  
  3. declare -a array1
  4. array1=(zero one two three)
  5. array1[4]="and four"
  6. echo ${array1[2]}
  7. echo ${array1[@]}

In Zeile 3 wird mit declare -a explizit ein Array deklariert.