Magento中基准目录

http://blog.ifeeline.com/411.html中探讨了全局XML文件如何构建,其中涉及到了目录的获取。这里继续这个内容。

Mage_Core_Model_Config类的构造函数会实例化一个Mage_Core_Model_Config_Options类,这个类设置了Magento的基准目录。不过需要记住,Mage_Core_Model_Config是一个最新被实例化的对象之一(在Mage::app()中,实例化Mage_Core_Model_App后),所有Mage_Core_Model_Config对象的Option对象很早就进入场景了(因为它在Config类构造函数中实例化)。Option提供的getDir方法其实是其它方法的包装器:

1
2
3
4
5
6
7
8
9
10

public function getDir($type)
{
$method = 'get'.ucwords($type).'Dir';
$dir = $this->$method();
if (!$dir) {
throw Mage::exception('Mage_Core', 'Invalid dir type requested: '.$type);
}
return $dir;
}

具体实现就不陈述了。

如果要获取这个Option对象可以这样做:

1
2

Mage::getConfig()->getOptions();

那么要获取某个目录自然是:

1
2

Mage::getConfig()->getOptions()->getDir("var"); //获取var目录

这种做法在任何代码中都是可行的。不过Mage.php中提供了一个包装器,然你可以忘记Config对象 和 Option对象:

1
2
3
4
5

public static function getBaseDir($type = 'base')
{
return self::getConfig()->getOptions()->getDir($type);
}

以下是一览表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

//以网站根目录为/www/vfeelit/public_html为例
Mage::getBaseDir('base'); # /www/vfeelit/public_html
Mage::getBaseDir('app'); # /www/vfeelit/public_html/app
Mage::getBaseDir('code'); # /www/vfeelit/public_html/app/code
Mage::getBaseDir('design'); # /www/vfeelit/public_html/app/design
Mage::getBaseDir('etc'); # /www/vfeelit/public_html/app/etc
Mage::getBaseDir('lib'); # /www/vfeelit/public_html/lib
Mage::getBaseDir('locale'); # /www/vfeelit/public_html/app/locale
Mage::getBaseDir('media'); # /www/vfeelit/public_html/media
Mage::getBaseDir('skin'); # /www/vfeelit/public_html/skin
Mage::getBaseDir('var'); # /www/vfeelit/public_html/var
Mage::getBaseDir('tmp'); # /www/vfeelit/public_html/var/tmp
Mage::getBaseDir('cache'); # /www/vfeelit/public_html/var/cache
Mage::getBaseDir('log'); # /www/vfeelit/public_html/var/log
Mage::getBaseDir('session'); # /www/vfeelit/public_html/var/session
Mage::getBaseDir('upload'); # /www/vfeelit/public_html/media/upload
Mage::getBaseDir('export'); # /www/vfeelit/public_html/var/export

接下来看看模块的基础目录,对应的包装器是Mage类中的getModuleDir方法:

1
2
3
4
5

public static function getModuleDir($type, $moduleName)
{
return self::getConfig()->getModuleDir($type, $moduleName);
}

可见它是Config对象的getModuleDir的包装器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

public function getModuleDir($type, $moduleName)
{
$codePool = (string)$this->getModuleConfig($moduleName)->codePool;
$dir = $this->getOptions()->getCodeDir().DS.$codePool.DS.uc_words($moduleName, DS);

switch ($type) {
case 'etc':
$dir .= DS.'etc';
break;

case 'controllers':
$dir .= DS.'controllers';
break;

case 'sql':
$dir .= DS.'sql';
break;
case 'data':
$dir .= DS.'data';
break;

case 'locale':
$dir .= DS.'locale';
break;
}

$dir = str_replace('/', DS, $dir);
return $dir;
}

代码很简单,不需要做很多解释。一下是一览表:

1
2
3
4
5
6
7
8

Mage::getModuleDir('','Packagename_Modulename'); //不要忽略这个用法,它直接返回模块的基路径
Mage::getModuleDir('etc','Packagename_Modulename');
Mage::getModuleDir('controllers','Packagename_Modulename');
Mage::getModuleDir('sql','Packagename_Modulename');
Mage::getModuleDir('data','Packagename_Modulename');
Mage::getModuleDir('locale','Packagename_Modulename');
getBaseDir 和 getModuleDir务必记住,就和getModel() getHelper()一样必须牢记。
坚持原创技术分享,您的支持将鼓励我继续创作!