Drupal 6.x modul fejlesztése - Új tartalom típus

Ha új tartalomtípust (content type) szeretnénk létrehozni a modulunkban, az alábbi angol nyelvű oldalt érdemes elolvasni.
Create new content-type for Drupal 6.x

Egyéb hasznos linkek a témához:

Forms API Reference
Form Generation
Egy modulban több új tartalomtípus

És alább következik a .module fájl kódja (erősen lecsupaszítva, néhány magyarázattal)

A saját névre behelyettesítendő részek magyarázata:

  • a TECHNICAL-NAME for your node type - don't use the name of an existing module - no spaces, numbers or punctuation unless you know what you're doing
  • a USER-FRIENDLY-NAME for your node type (and a plural version of this name) (this is how your node type will appear in most places on your site) - spaces and numbers are ok but again no punctuation unless you know what you're doing, note: you can use the same name as your TECHNICAL-NAME above
  • a MODULE-DESCRIPTION - a short description of your node type that will appear on the admin->modules page - don't use quotes or apostrophes unless you know what you are doing
  • a CREATE-CONTENT-DESCRIPTION - a short description of your node type that will appear on the create content page - don't use quotes or apostrophes unless you know what you are doing
  • a HELP-DESCRIPTION - a short description of your node type that will appear on the help page - don't use quotes or apostrophes unless you know what you are doing

 Például:

  • TECHNICAL-NAME = "press_release" (note the underscore)
  • USER-FRIENDLY-NAME = "Press Release"
  • USER-FRIENDLY-PLURAL = "Press Releases"
  • MODULE-DESCRIPTION = "Enables the creation of press releases."
  • CREATE-CONTENT-DESCRIPTION = "Create a press release."
  • ADMIN-HELP-TEXT = "This module was created by [your name here]."

<?php
/**
* Implementation of hook_node_info().
* Az új tartalom típusról lehet itt megadni információkat. A minimálisan szükséges infók: name, module, description.
* Egyéb, opcionálisan megadható infók:
* - help: (szöveg - alapból '') Súgó szöveg, amely az új tartalmi elem létrehozásakor a lap tetején jelenik majd meg
* - has_title: (logikai - alapból TRUE) Legyen-e 'tite' mező
* - title_label: (szöveg - alapból 'Title') Mi legyen a 'title' mező felirata
* - has_body: (logikai - alapból TRUE) Legyen-e 'body' mező
* - body_label: (szöveg - alapból 'Body') Mi legyen a 'body' mező felirata
* - min_word_count: (egész szám - alapból 0) A 'body' mező minimlis szóhossza
* - locked: (logikai - alapból TRUE) Módosíthassa-e a tartalomtípus gép-nevét az adminisztrátor
*/
function TECHNICAL-NAME_node_info() {
  return array(
   
'TECHNICAL-NAME' => array(
     
'name' => t('USER-FRIENDLY-NAME'),
     
'module' => 'TECHNICAL-NAME',
     
'description' => "CREATE-CONTENT-DESCRIPTION",
    )
  );
}


/**
* Implementation of hook_perm().
* Itt soroljuk fel milyen jogosultságokat akarunk megkülönböztetni a modul használói körében.
*/
function TECHNICAL-NAME_perm() {
  return array(
'create TECHNICAL-NAME', 'edit own TECHNICAL-NAME');
}


/**
* Implementation of hook_access().
* Itt szabályozzuk, hogy mely műveleteket ki hajthatja végre.
* Az $op lehetséges értékei alapértelmezésben: create, delete, update, view
*/
function TECHNICAL-NAME_access($op, $node) {
  global
$user;

  if (
$op == 'create') {
   
// Only users with permission to do so may create this node type.
   
return user_access('create TECHNICAL-NAME');
  }

 
// Users who create a node may edit or delete it later, assuming they have the
  // necessary permissions.
 
if ($op == 'update' || $op == 'delete') {
    if (
user_access('edit own TECHNICAL-NAME') && ($user->uid == $node->uid)) {
      return
TRUE;
    }
  }
}


/**
* Implementation of hook_form().
* A formot leíró hook-ban a különböző adatbeviteli mezőket definiáljuk.
* A használható mezők típusainak leírása itt olvasható: forms_api_reference
*/
function TECHNICAL-NAME_form(&$node) {
 
$type = node_get_types('type', $node);

 
// We need to define form elements for the node's title and body.
 
$form['title'] = array(
   
'#type' => 'textfield',
   
'#title' => check_plain($type->title_label),
   
'#required' => TRUE,
   
'#default_value' => $node->title,
   
'#weight' => -5
 
);
 
// We want the body and filter elements to be adjacent. We could try doing
  // this by setting their weights, but another module might add elements to the
  // form with the same weights and end up between ours. By putting them into a
  // sub-array together, we're able force them to be rendered together.
 
$form['body_filter']['body'] = array(
   
'#type' => 'textarea',
   
'#title' => check_plain($type->body_label),
   
'#default_value' => $node->body,
   
'#required' => FALSE
 
);
 
$form['body_filter']['filter'] = filter_form($node->format);

 
// NOTE in node_example there is some addition code here not needed for this simple node-type

 
return $form;
}


/**
* Implementation of hook_help().
*/
function TECHNICAL-NAME_help($path, $arg) {
  switch (
$path) {
    case
'admin/help#TECHNICAL-NAME':
      return
'<p>' . t('ADMIN-HELP-TEXT') . '</p>';
      break;
  }
}

?>


Egy modulban több új tartalomtípus

Ha egy modulban több új tartalomtípust szeretnénk létrehozni akkor a hook_node_info függvényben kell a 'module' bejegyzéseiken módosítani, és a két függvényt (hook_access és hook_form)  külön-külön mindegyik új tartalomtípusra megírni a fentiek szerint.

Például:

<?php
function 
TECHNICAL-NAME_node_info() {
  return array(
   
'type1' => array(
     
'module' => '
TECHNICAL-NAME_type1'
   
),
   
'type2' => array(
     
'module' => '
TECHNICAL-NAME_type2'
   
)
  );
}
 
function TECHNICAL-NAME_type1_form();
function 
TECHNICAL-NAME_type1_access();

function 
TECHNICAL-NAME_type2_form();
function 
TECHNICAL-NAME_type2_access();
?>