经常需要获得一个分类中的所有项目,并且需要包含子分类中的项目。在以前,这种功能大多都是用手写的SQL来获得,那么是否存在一个新的方法来解决这个问题呢?我们找到了Jcategories类,顾名思义,这个类是处理Joomla分类的。下面我们来讨论一下这个类的具体使用。

 

Jcategories类的实现文件位于:libraire\legacy\categories\categories.php

其他的方法不用细说了,主要谈一下关键的getInstance方法

public static function getInstance($extension, $options = array())
	{
		$hash = md5($extension . serialize($options));

		if (isset(self::$instances[$hash]))
		{
			return self::$instances[$hash];
		}

		$parts = explode('.', $extension);
		$component = 'com_' . strtolower($parts[0]);
		$section = count($parts) > 1 ? $parts[1] : '';
		$classname = ucfirst(substr($component, 4)) . ucfirst($section) . 'Categories';

		if (!class_exists($classname))
		{
			$path = JPATH_SITE . '/components/' . $component . '/helpers/category.php';

			if (is_file($path))
			{
				include_once $path;
			}
			else
			{
				return false;
			}
		}

		self::$instances[$hash] = new $classname($options);

		return self::$instances[$hash];
	}

 这是一个静态的方法,接受两个参数,一个是$extension 表示扩展的名称。$options=array(),表示 该扩展的相关参数选项。这个参数形式在Joomla中非常常见。首先是依据配置参数获得一个哈希值,然后依据这个哈希值判断这个分类对象是否已经存在。存在就直接返回,不存在,那就新建。

下一步就是具体新建对象的方法了。

$parts = explode('.', $extension);

 这搞不明白这段代码在干嘛,也许作者想要你传递content这个字符串,而不是com_content.这是唯一的理解了。通过组件名称获得需要实例化的类的名称。

其实上面的代码的意思是说,一个组件可以有多个分类类的。这的确是一个很好的想法。

$section = count($parts) > 1 ? $parts[1] : '';
$classname = ucfirst(substr($component, 4)) . ucfirst($section) . 'Categories';

这段代码执行的结果就是$className= contentTypeCategories。这个里面的content. type依据实际情况。

下面的代码就比较简单了。判断类是否存在,如果不存在那么就去搜索类的实现文件。路径如下:

$path = JPATH_SITE . '/components/' . $component . '/helpers/category.php';

 


 

看一下他的方法 

 这个类提供了一个get方法。

public function get($id = 'root', $forceload = false)

 作用是装载一个指定分类的并且包括他的子分类到一个JCategoryNode的对象中。$id表示要装载的分类的id.如果成功装载,那么返回JCategoryNode对象,如果失败,那么返回NULL.



收藏
0个人 收藏

关注Joomla中国微信公众号,随时获得最新的Joomla新闻资讯!