HTML

View Péter Király's profile on LinkedIn

20 éves a MEK, 10 éves az EPA Én is
MEK önkéntes
vagyok

20 éves a MEK
10 éves az EPA

kirunews

Király Péter, keresés, Lucene, Solr, Java, Perl, PHP, OAI-PMH, webfejlesztés, digitális könyvtár, MARC, FRBR, RDA, Drupal, EAD, EAC, Europeana, eXtensibleCatalog.org, MEK, és sok minden más.

Friss topikok

Linkblog

Drupal API tanulás - 03 - A node-ok

2008.08.14. 19:01 kirunews

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() {
  db_query('DROP TABLE {<module>}');
}
2) .info fájl

3) .module fájl, benne:

a node definíciója (hook_node_info()):

function <module>_node_info() {
  // 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
    )
  );
}
menü callback függvény (hook_menu()):

function <module>_menu($may_cache) {
  $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;
}
engedélyek definiálása (hook_perm()):

function <module>_perm() {
  return array('create <module>', 'edit own <module>');
}
engedélyezés (hook_access()):

function <module>_access($op, $node) {
  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));
  }
}
az űrlap testreszabása (hook_form()):

function <module>_form($node) {
  // 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;
}
ellenőrzés (hook_validate):

function <module>_validate($node) {
  // 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)));
  }
}
mentés (hook_insert):

function <module>_insert($node) {
  db_query("INSERT INTO {<module>} (nid, vid, punchline)
            VALUES (%d, %d, '%s')",
            $node->nid, $node->vid, $node->punchline);
}
módosítás (hook_update):

function <module>_update($node) {
  if ($node->revision) {
    <module>_insert($node);
  } else {
    db_query("UPDATE {<module>} SET punchline='%s'
              WHERE vid=%d", $node->punchline, $node->vid);
  }
}
törlés (hook_delete):

function <module>_delete(&$node) {
  db_query('DELETE FROM {<module>} WHERE nid = %d', $node->nid);
}
az egyedi attribútumok betöltése a node-ba (hook_load):

function <module>_load($node) {
  // 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));
}
megjelenítés (hook_view):

function <module>_view($node, $teaser = FALSE, $page = FALSE) {
  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;
}
Enélkül csak a standard node mezők (title, body) jelennének meg.

Sminkelés.

themes/<theme_name>/node-<module>.tpl.php:

<div class="node<?php if ($sticky) { print " sticky"; } ?>
  <?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">&raquo; <?php print $links?></div>
  <?php }; ?>
</div>
Nem saját típusú node-ok módosítása (hook_nodeapi):

hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL)$op - az aktuális művelet, ami lehet:

  • delete
  • insert
  • load
  • view
  • update
  • validate
  • submit
  • prepare
  • print
  • search result
  • update index
  • rss item

Ha az $op == "view", $a3 = $teaser (boolean vagyis 'is teaser?') és a $a4 = $page (boolean vagyis 'is page?')

Szólj hozzá!

A bejegyzés trackback címe:

https://kirunews.blog.hu/api/trackback/id/tr60616143

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.