node.module (content_types.inc) hur gör dom (D7)?

Events happening in the community are now at Drupal community events on www.drupal.org.
overtune's picture

Tjena!

Sitter och uppdaterar mig lite med Drupal 7:s API. Jag är väl inte direkt kung på att bygga moduler, men har gjort en del iallafall och håller på att lära mig.
Men nu är det en sak, där jag måste missa något, för jag förstår inte hur detta är gjort.

Kollar man på node.module (Drupal 7), så har dom en hook_menu funktion som bl.a. tillhandahåller länkar för att administrera innehållstyper.

Om man kollar på sökvägen för att radera innehållstyper:

$items['admin/structure/types/manage/%node_type/delete'] = array(
'title' => 'Delete',
'page arguments' => array('node_type_delete_confirm', 4),
'access arguments' => array('administer content types'),
'file' => 'content_types.inc',
);

Här är ju %node_type en placeholder, där innehållstypens namn sätts. Så som jag tidigare byggt moduler så kanske jag skickar med ett id där. Som jag sedan i delete-funktionen kan hämta från databasen.
Men kollar man på funktionen som anropas "node_type_delete_confirm":

function node_type_delete_confirm($form, &$form_state, $type) {
$form['type'] = array('#type' => 'value', '#value' => $type->type);
$form['name'] = array('#type' => 'value', '#value' => $type->name);

Här är ju variabeln $type, redan ett objekt som innehåller den content_type som ska raderas.

Likaså i funktionen för att skapa/redigera innehållstyper. Där är variablen $type ett färdigt bojekt som innehåller all information om den innehållstyp som ska redigeras. Dom hämtar aldrig någon sådan info från databasen i dessa funktioner.

Hur är detta gjort? Var är funktionen som plockar node-typen från url:en och gör om den till ett objekt?

Missar jag något? Eller är jag helt ute och cyklar? :)

M.V.H. Johan

Comments

Auto loader

zoo33's picture

Du är inte alls ute och cyklar. Det finns ett auto loader-api kopplat till hook_menu() som är lite svårt att hänga med på bara genom att läsa koden. På dokumentationssidan för hook_menu() kan man läsa:

Registered paths may also contain special "auto-loader" wildcard components in the form of '%mymodule_abc', where the '%' part means that this path component is a wildcard, and the 'mymodule_abc' part defines the prefix for a load function, which here would be named mymodule_abc_load().

Det är alltså den där "%node_type" som är nyckeln. I och med att det inte bara står "%" så letar Drupal automatiskt upp en funktion som heter node_type_load() och låter den ladda objektet med det ID man skickar in. Resultatet skickas sedan till sidans callback-funktion. Det här är tänkt att förenkla modulbyggandet genom att objekt alltid laddas via en central funktion, men det är som sagt lite svårt att fatta vad det är som händer om man inte är välbekant med APIt.

/ Hannes Lilljequist – SthlmConnection

Ah!! Då är jag med :) Tack

overtune's picture

Ah!! Då är jag med :)
Tack för infon!