A node-ok a következő tulajdonságokkal rendelkeznek:
nid: egyedi azonosító.
vid: egyedi változat azonosító (revision ID).
type: node típus, pl. blog, story, article, image, stb.
title: 128 karakter hosszú rövid cím. Ha nincs azt 0 jelzi a node_type.has_title mezőben.
uid: a szerző felhasználói azonosítója (user ID). Alapértelmezésben minden node-nak egy szerzője van.
status: 0 = unpublished (rejtett, jogosultsági szint: “administer nodes”); 1 = publikált, (jogosultsági szint: “access content”).
created: Unix timestamp.
changed: Unix timestamp
comment: (integer) a kommentárok státusa:
- 0 = Comments have been disabled (default).
- 1 = No more comments are allowed
- 2 = Comments can be viewed/created
promote: (integer) megjelenjen-e a főoldalon?
- 1 = igen
- 0 = nem
moderate: (integer) 0 = moderation is disabled, 1 = enabled. Figyelem: There is no interface in the core Drupal installation for this field.
sticky: (integer) 1 = a node sticky, 0 = a nod nem sticky. A “sticky” node-ok a listák élére kerülnek.
Ha új node típust készítünk egy node modult kell írni. Lépések:
1) .install fájl, benne:
function <module>_install() {
// create table(s)
}
function <module>_uninstall() {
2) .info fájl
db_query('DROP TABLE {<module>}');
}
3) .module fájl, benne:
a node definíciója (hook_node_info()):
function <module>_node_info() {
menü callback függvény (hook_menu()):
// We return an array since a module can define multiple node
// types. We're only defining one node type.
return array(
'<module>' => array(
'name' => t('<Module>'), // Required.
'module' => '<module>', // Required.
'description' => t('...'), // Required.
'has_title' => TRUE,
'title_label' => t('Title'),
'has_body' => TRUE,
'body_label' => t('The content'),
'min_word_count' => 2,
'locked' => TRUE
)
);
}
function <module>_menu($may_cache) {
engedélyek definiálása (hook_perm()):
$items = array();
// Do not cache this menu item during the development
if (!$may_cache) {
$items[] = array(
'path' => 'node/add/<module>',
'title' => t('<module>'),
'access' => user_access('create <module>'),
);
}
return $items;
}
function <module>_perm() {
engedélyezés (hook_access()):
return array('create <module>', 'edit own <module>');
}
function <module>_access($op, $node) {
az űrlap testreszabása (hook_form()):
global $user;
if ($op == 'create') {
return (user_access('create <module>'));
}
if ($op == 'update' || $op == 'delete') {
return (user_access('edit own <module>')
&& ($user->uid == $node->uid));
}
}
function <module>_form($node) {
ellenőrzés (hook_validate):
// Get metadata for this node type
// (we use it for labeling title and body fields).
// We defined this in <module>_node_info().
$type = node_get_types('type', $node);
$form['title'] = array(
'#type' => 'textfield',
'#title' => check_plain($type->title_label),
'#required' => TRUE,
'#default_value' => $node->title,
'#weight' => -5
);
$form['body_filter']['body'] = array(
'#type' => 'textarea',
'#title' => check_plain($type->body_label),
'#default_value' => $node->body,
'#rows' => 7,
'#required' => TRUE
);
$form['body_filter']['filter'] = filter_form($node->format);
$form['punchline']['field'] = array(
'#type' => 'textarea',
'#title' => t('Punchline'),
'#required' => TRUE,
'#default_value' => $node->punchline,
'#weight' => 5
);
$form['punchline']['filter'] = filter_form(
$node->punchline_format);
return $form;
}
function <module>_validate($node) {
mentés (hook_insert):
// Enforce a minimum word length of 3.
if (isset($node->punchline)
&& str_word_count($node->punchline) <= 3) {
$type = node_get_types('type', $node);
form_set_error(
'punchline',
t('The punchline of your #type is too short. You need at least three words.',
array('#type' => $type->name)));
}
}
function <module>_insert($node) {
módosítás (hook_update):
db_query("INSERT INTO {<module>} (nid, vid, punchline)
VALUES (%d, %d, '%s')",
$node->nid, $node->vid, $node->punchline);
}
function <module>_update($node) {
törlés (hook_delete):
if ($node->revision) {
<module>_insert($node);
} else {
db_query("UPDATE {<module>} SET punchline='%s'
WHERE vid=%d", $node->punchline, $node->vid);
}
}
function <module>_delete(&$node) {
az egyedi attribútumok betöltése a node-ba (hook_load):
db_query('DELETE FROM {<module>} WHERE nid = %d', $node->nid);
}
function <module>_load($node) {
megjelenítés (hook_view):
// a theme által használt JS-hez:
drupal_add_js('misc/collapse.js');
return db_fetch_object(db_query(
'SELECT punchline FROM {<module>} WHERE vid = %d',
$node->vid));
}
function <module>_view($node, $teaser = FALSE, $page = FALSE) {
Enélkül csak a standard node mezők (title, body) jelennének meg.
if (!$teaser) {
// Use Drupal's default node view.
$node = node_prepare($node, $teaser);
// Add a random number of Ha's to simulate a laugh track.
$node->guffaw = str_repeat(t('Ha!'), mt_rand(0, 10));
// Now add the punchline.
$node->content['punchline'] = array(
'#value' => theme('<module>_punchline', $node),
'#weight' => 2
);
}
if ($teaser) {
// Use Drupal's default node view.
$node = node_prepare($node, $teaser);
}
return $node;
}
Sminkelés.
themes/<theme_name>/node-<module>.tpl.php:
<div class="node<?php if ($sticky) { print " sticky"; } ?>
Nem saját típusú node-ok módosítása (hook_nodeapi):
<?php if (!$status) { print " node-unpublished"; } ?>">
<?php if ($picture) {
print $picture;
}?>
<?php if ($page == 0) { ?><h2 class="title"><a href="<?php
print $node_url?>"><?php print $title?></a></h2><?php }; ?>
<span class="submitted"><?php print $submitted?></span>
<span class="taxonomy"><?php print $terms?></span>
<div class="content">
<?php print $content?>
<fieldset class="collapsible collapsed">
<legend>Punchline</legend>
<div class="form-item">
<label><?php print check_markup($node->punchline)?></label>
<label><?php print $node->guffaw?></label>
</div>
</fieldset>
</div>
<?php if ($links) { ?><div class="links">» <?php print $links?></div>
<?php }; ?>
</div>
hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL)
$op - az aktuális művelet, ami lehet:
- delete
- insert
- load
- view
- update
- validate
- submit
- prepare
- search result
- update index
- rss item
Ha az $op == "view", $a3 = $teaser (boolean vagyis 'is teaser?') és a $a4 = $page (boolean vagyis 'is page?')