Content Type für Panels als CTools Plugin erstellen

Es gibt tolle API's, welche einem die diversen Module zur Verfügung stellen. Hier möchte ich ein Beispiel aufzeigen wie ein einfacher Content Type erstellt werden kann, welche dann als Panel Inhalt zur Verfügung steht.

Das Beispiel zeigt auf, wie eine alphabetische Liste mit Anker-Links erzeugt werden kann. Das ganze habe ich dann in ein Feature gepackt:

Zuerst registriere ich im Modul das Plugin Verzeichnis (in diesem Fall mitglied.module):

/**
* Implementation of hook_ctools_plugin_directory().
*/
function mitglied_ctools_plugin_directory($module, $plugin) {
  if ($module == 'ctools') {
    return 'plugins/' . $plugin;
  }
}

Nun wird im Plugin-Verzeichnis nach .inc Dateien gesucht und diese entsprechend eingebunden. Die Modul-Struktur sieht dann in etwa wie folgt aus:

In der .inc Datei (Beispiel mitglied_alpha_view_pane.inc) werden nun die nötigen Hooks implementiert. Als erstes die Definition des Content Types, welcher beim Einfügen von Inhalten in einem Panel angezeigt wird (für weitere Informationen lohnt sich ein Blick in das Beispiel-Modul 'ctools_plugin_example' welches im Paket des ctools dabei ist).

/**
 * Callback function to supply a list of content types.
 * 
 * Hook to define the content type. The hook is: <modulename>_<content_type>_ctools_content_types()
*/
function mitglied_mitglied_alpha_view_pane_ctools_content_types() {
  return array(
    'single' => TRUE,
    'title' => t('Alpha caracter link-list for members'),
    'description' => t('An alpha caracter link-list for members.'),
    'category' => t('MEMBERS'),
  );
}

Danach ist beim Einfügen eines Inhaltes in ein Panel die Auswahl des Plugins vorhanden:

Nun muss eigentlich nur noch die gewünschte Ausgabe gerendert werden:

/**
 * Output function for the 'mitglied_alpha_view_pane' content type.
 * 
 * The function name is MODULE_NAME_CT_NAME_content_type_render
 */
function mitglied_mitglied_alpha_view_pane_content_type_render($subtype, $conf, $panel_args, $context) {

  global $language; 
  
  // Make a new empty "block" which will be a Pane you can add to your Panel.
  $block = new stdClass();
  // Emty title 
  $block->title = '';

  // Get possible member titel char
  $result = db_query("SELECT DISTINCT UPPER(LEFT(title, 1)) AS 'char'
  					FROM {node} WHERE type = 'membercompany'
                                        AND (language = '' OR language = '%s') 
  					ORDER BY title", $language->language);
  
  // Populate array with used char's 
  $used_chars = array();
  while ($row = db_fetch_array($result)) {
    $used_chars[$row['char']] = TRUE;
  }
  
  $content = '<div id="abc"><div class="letters">';
  
  foreach (range('A', 'Z') as $i) {
    // Is char used for a member name
    if (array_key_exists($i, $used_chars)) {
      $content .= '<a href="#' . $i . '"><span>' . $i . '</span></a>';
    }
    else {
       $content .= '<span>' . $i . '</span>';
    }
  }
  
  $content .= '<div class="clear"></div></div></div>';
  
  $block->content = $content;

  return $block;
}

Natürlich könnte man die HTML Generierung noch schön in Theme-Funktionen packen, aber das fand ich im aktuellen Beispiel als unnötig. Folgend nun das Bild wenn die Liste in einem Panel eingefügt wurde.

Ich hoffe dieses Beispiel animiert Euch, selber solche Plugins zu schreiben! :-) Es ist wirklich nicht schwer!

Kommentare

Seit schon ziemlich lange muss man nicht mehr den hook verwenden um das plugin zu "registrieren"


$plugin = array(
'single' => TRUE,
'title' => t('Contact form'),
'icon' => 'icon_contact.png',
'description' => t('The site contact form that allows users to send a message to site administrators.'),
'category' => t('Widgets'),
);

Als Beispiel aus ctools. Das erleichtert das ganze schon ziemlich.

Wie waere es mit einem patch fuer das example packet :)

Ich werde das Beispiel bei Gelegenheit anpassen. Es war mir definitiv nicht bewusst, dass man das nicht mehr registrieren muss.

Mir ging es wie Weri, hatte keine Ahnung von wegen Registrierung, etc! DANKE

Ja,muss schon sagen ein gutes Info,super und reihenmaessig erklaert,na da kann ja nix schief gehen
War sehr beindruckt von dieser Webseite,versuchte ohne jede beitretende Probleme runterzuladen.
Danke!

Neuen Kommentar schreiben