Drupal 7:自定义模块:在自定义块中显示自定义contentTypy

时间:2014-08-06 20:25:01

标签: drupal drupal-7 drupal-modules drupal-hooks

我是Drupal 7的新人,所以我有一个问题。

我有自己的内容类型作家,包括标题,生命年,照片,描述等字段。

我有一项任务是在页面上显示3个随机写作者。实际上我已经在Views模块的帮助下完成了它,但我想自己做。

所以我创建了我自己的模块random_content:

<?php

function random_content_help($path, $arg) {
  switch ($path) {
    case "admin/help#random_content":
    return '<p>'. t("Displays random content") .'</p>';
   break;
  }  
}

function random_content_block_info() {
  $blocks['random_content'] = array(
    'info' => t('Random content'), 
    'cache' => DRUPAL_CACHE_PER_ROLE, 
  );
  return $blocks;
}

function random_content_contents() {
    $query = db_select('node', 'n')
    ->fields('n', array('nid', 'title'))
    ->condition('type', 'writers')
    ->orderBy('rand()') 
    ->range(0,3)
    ->execute();
    return $query; 
}

function random_content_block_view($delta = '') {
  switch($delta){
    case 'random_content':
    $block['subject'] = t('Random content');
    if(user_access('access content')) {
      $result = random_content_contents();       
      $items = array();           
      foreach ($result as $node){
                $items[] = array(
                'data' => l($node->title, 'node/' . $node->nid) . '</br>',
              );
      }
      if (empty($items)) { 
        $block['content'] = t('No data availible.'); 
      } else {
        $block['content'] = theme('item_list', array(
          'items' => $items));
      }
    }
  }
  return $block;
 }

正如您所看到的,我只学会添加指向特定内容的链接。但是,如何显示标题,生命年限,照片和描述等完整信息?

1 个答案:

答案 0 :(得分:1)

要显示完整节点或部分节点,您需要加载节点。 E.g。

$my_node = node_load($nid);

$render_array = array();
$render_array['title'] = array(
   '#type' => 'markup',
   '#markup' => $my_node->title
);
$author = field_get_items('node', $my_node, 'field_author','und');  
$render_array['author'] = array(
   '#type' => 'markup',
   '#markup' => $author[0]['safe_value']
);

// or as some like to do it

$render_array['author'] = array(
   '#type' => 'markup',
   '#markup' => $my_node->field_author['und'][0]['value']
);
echo drupal_render($render_array);

注意'und'常量表示语言未定义。如果您启用了翻译/语言以及针对不同语言的不同内容,则必须使用“en”,“de”等作为相应的语言。

您还可以让drupal渲染节点,然后操作或检索单个项目。喜欢这个

$my_node = node_load($nid);
$build = node_view($my_node,'full');
$build['body'][0]['#markup'] = $build['body'][0]['#markup'].' some addition';
$build['field_author'][0]['#markup'] = $build['field_author'][0]['#markup'].' my favorite';

echo drupal_render($build);

使用后一种方法的好处是,然后整个主题引擎启动,并设置所有挂钩作用于内容等。当然,如果您只想检索值,则不需要它。

另请注意,我假设您的作者字段名为field_author。您应该在字段编辑窗口中检查内容类型。