经常需要获得一个分类中的所有项目,并且需要包含子分类中的项目。在以前,这种功能大多都是用手写的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.