Drupal 7 开发内部培训资料, 分头诗人

为不同的节点类型匹配相应的taxonomy_term视图

赞成!
0
否决!

网站中包含多个内容类型,每个内容类型的字段都不尽相同,欲在不同的分类页面显示特定的字段,并覆写其样式。

drupal模块顾问希望之翼建议使用views提供了一个默认的视图‘taxonomy_term’+panel模块,可以实现针对不同的节点类型关联对应的views视图。

经过一上午摸索,至今未果。

 

请问还有没有其他的方法,快速实现。

 

1 个回答

赞成!
1
否决!

这里写一个方法:

步骤1,添加模块,名称叫mytaxonomy,建立5个文件,分别是

 

  • mytaxonomy.module --- 模块hook
  • mytaxonomy.info --- 模块信息
  • mytaxonomy.pages.inc --- 函数
  • product.tpl.php --- 产品模版
  • catetory_block.tpl.php --- 分类block 模版

 

步骤2,mytaxonomy.info 文件:

name = Drupalla
description = 猪跑啦.
core = 7.x
package = Drupalla
files[] = mytaxonomy.module

 

 

步骤3,mytaxonomy.module 文件,增加5个hook,分别是

 

  • hook_menu:定义一个变量路径叫 category/%
  • hook_theme:指向列表名为mytaxonomy,就能自动用product.tpl.php跟catetory_block.tpl.php模版文件
  • hook_permission:指定这个category/% 路径的访问权限
  • hook_block_info:建立一个左侧的sidebar block 的信息
  • hook_block_view:建立一个左侧的sidebar block 的内容

 

/**
 * Implements hook_menu().
 */
function  mytaxonomy_menu() {
  // Admin settings for the site.
  $items['category/%'] = array(
    'title' => '分类',
    'description' => '分类',
    'page callback' => 'show_product',//指定函数
    'page arguments' => array(1),
    'file' => 'mytaxonomy.pages.inc',//指定函数的所在文件
    'access arguments' => array('view product'),
    'access callback' => TRUE,
    'type' => MENU_NORMAL_ITEM, 
  );
  return $items;
}

function mytaxonomy_theme(){
	return array(
	'product' => array(
        'template' => 'product',
	'variables' => array()
	),
	'catetory_block' => array(
        'template' => 'catetory_block',
	'variables' => array()
	),
	);
}
function mytaxonomy_permission() {
  return array(
    'view product' =>  array(
      'title' => t('View product'),
    ),
  );
}



/**
 * Implements hook_block_info().
 */
function mytaxonomy_block_info() {
  $blocks['catetory_block'] = array(
    'info' => t('Category'),
    'cache' => DRUPAL_NO_CACHE,
  );//如有多个分类,就写多个block,复制多份
  return $blocks;
}
/**
 * Implements hook_block_view().
 */
function mytaxonomy_block_view($block_name = '') {
  if ($block_name == 'catetory_block') {
    $content = show_catetory();// 定义block的函数
    $block = array(
      'subject' => t('Category'),
      'content' => $content,
    );
	}//如有多个分类,就写多个block,复制多份
  return $block;
}



function show_catetory()//只提供大概db_select 写法。根据自己改写
{	
	$output = '';
	$query = db_select('taxonomy_term_data','td');
	$query->leftJoin('taxonomy_term_hierarchy','th','td.tid = th.tid');
	$query->fields('td')->fields('th', array('parent'))
		->condition('td.vid', '2')->condition('th.parent', 0)->orderBy('weight', 'ASC')->orderBy('tid', 'DESC');
	$query = $query->execute()->fetchAll();
	$rows = array();
	foreach ($query as $ob)
	{
		$row = array();
		$row['tid'] = $ob -> tid;
		$row['name'] = l($ob -> name, 'category/'.$ob -> tid);//指定路径到 hook_menu 中的$items['category/%']
		$p = db_select('taxonomy_term_hierarchy', 't')->fields('t')->condition('t.parent', $ob -> tid)->execute();
		$row['num_of_results'] = ' ('.$p->rowCount().')';//分类下有多少个文章;
		$rows[] = $row;
	}	
	$output .= theme('catetory_block', array('rows' => $rows));//用catetory_block.tpl.php 模版
	return $output;
}

 

步骤4,mytaxonomy.pages.inc

 

<?php

function show_product($tid){
    //通过获取过来的tid写sql,写法如步骤三的function show_catetory()
    //注意 $output .= theme('product', array('rows' => $rows));//用product.tpl.php 模版
	$output = '';
	$query = db_select('field_data_field_manufacturers','f')->extend('PagerDefault')->limit(50);//注意这行field_data_field_manufacturers是你的表
	$query->fields('f', array('entity_id'))
		->condition('f.field_manufacturers_tid', $tid)->orderBy('field_manufacturers_tid', 'DESC');
	$query = $query->execute()->fetchAll();
	$rows = array();
	foreach ($query as $ob)
	{
		$row = array();
		$node = node_load($ob->entity_id);
		//print_r($node);
		$row['title'] = l($node->title, 'node/'.$node->nid);
		$image = "";
		if(!empty($node->field_thumb)){$image = '<img src="'.file_create_url($node->field_thumb['und'][0]['uri']).'">';}
		$row['image'] = $image;
		$row['author'] = $node->name;
		$row['created'] = $node->created;
		$rows[] = $row;		
	}
	$output .= theme('pager');
	$output .= theme('product', array('rows' => $rows));//用product.tpl.php 模版
	$output .= theme('pager');
	return $output;
}

 

步骤5,product.tpl.php跟catetory_block.tpl.php

只给出大概写法,参数得自己根据传过来的data变

product.tpl.php

<?php foreach($rows as $data){?>
<div class="productlist">
  <?php print $data['image'] ?><div style="height:50px;width:260px;"><?php print $data['title'] ?></div>
</div>
<?php }?>

catetory_block.tpl.php

<ul>
<?php foreach($rows as $data){?>
<li><?php print $data['name'] ?></li>
<?php }?>
</ul>

步骤6,安装模块,在block页,把模块所生成的block拉到想显示的区域里面。这里假使拖拉到左侧sidebar。

 

步骤7,清空缓存。打开网站,在sidebar会出现分类,分类模版是catetory_block.tpl.php。点击分类的每个项,地址的格式是category/%,进入后,显示此分类的产品,产品对应模版是product.tpl.php 。