分类目录归档:Magento

Magento codepools 介绍

Magento有三个不同的Codepools在app/code/文件夹中
.Core
.Community
.Local

app/code/core –
Core这个目录是放Magento自身核心代码的地方, 这个文件夹只属于Magento核心开发者们, 也就是说你绝不能动里面的任何文件, 如果你修改了这个文件夹下面的文件, 那么, 以后当你准备升级Magento的时候, 你就能尝到不听取忠告的惩罚了:)

app/code/community  –
这个目录是属于Magento社区开发者的. 它用来放置第三方模块或者插件, 无论是收费的, 还是免费的. 无论是在MagentoConnect上面找到的, 还是直接在第三方插件的官方站点下载的. 那就是说, 如果你已经安装的有插件的话, 那肯定是在app/code/community/目录里面.

app/code/local –
如果你有一个基于Magento的网站, 同时你又想自己对网站做一些调整, 或者, 你是一个Magento开发者, 你本来就有调整Magento一些逻辑的打算, 那么, Local这个目录就是为你而准备的.当你下载了Magento时这个文件夹是不存在的,必须先创建。
无论你是打算覆盖Magento的extensions, Blocks还是其他的Methods, 你都可以从Core目录拷贝对应的文件及其相应的文件夹结构到Local目录, 然后, 按照你的意愿做任何修改. 当然, 你也可以在这个目录, 创建自己的extensions.

这三个Code Pools在Magento里面是如何相互作用的呢?

要搞清楚这个问题, 我们需要打开Magento的主文件app/Mage.php
    

/**
* Set include path
*/
$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local';
$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community';
$paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core';
$paths[] = BP . DS . 'lib';
 
$appPath = implode(PS, $paths);
set_include_path($appPath . PS . Mage::registry('original_include_path'));
include_once "Mage/Core/functions.php";
include_once "Varien/Autoload.php";

从上面的代码段, 我们可以看出, Magento使用include paths的顺序, 首先它会检索Local目录, 如果没有, 它会接着检查Community目录, 如果都没有的话, 它最后才会加载Core目录的文件. 这也是给开发者提供了一个重写Magento类而不修改核心文件的一个方法.

Magento getModel getResourceModel getResourceSingleton之间的关系

获取一个resource model的方法有三种,可以根据源码看到他们之间的联系

1. Mage::getResourceModel('customer/customer');

path: /app/mage.php
    /**
     * Retrieve object of resource model
     *
     * @param   string $modelClass
     * @param   array $arguments
     * @return  Object
     */
    public static function getResourceModel($modelClass, $arguments = array())
    {
        return self::getConfig()->getResourceModelInstance($modelClass, $arguments);
    }

2. Mage::getResourceSingleton('customer/customer');

path: /app/mage.php
     /**
     * Retrieve resource vodel object singleton
     *
     * @param   string $modelClass
     * @param   array $arguments
     * @return  object
     */
    public static function getResourceSingleton($modelClass = '', array $arguments = array())
    {
        $registryKey = '_resource_singleton/'.$modelClass;
        if (!self::registry($registryKey)) {
            self::register($registryKey, self::getResourceModel($modelClass, $arguments));
        }
        return self::registry($registryKey);
    }

3. Mage::getModel('customer/customer')->getResource();

path: /app/mage.php
    /**
     * Retrieve model object
     *
     * @link    Mage_Core_Model_Config::getModelInstance
     * @param   string $modelClass
     * @param   array $arguments
     * @return  Mage_Core_Model_Abstract
     */
    public static function getModel($modelClass = '', $arguments = array())
    {
        return self::getConfig()->getModelInstance($modelClass, $arguments);
    }

path: /app/code/core/Mage/Core/Model/Abstract.php
    /**
     * Retrieve model resource
     *
     * @return Mage_Core_Model_Mysql4_Abstract
     */
    public function getResource()
    {
        return $this->_getResource();
    }

    
    /**
     * Get resource instance
     *
     * @return Mage_Core_Model_Mysql4_Abstract
     */
    protected function _getResource()
    {
        if (empty($this->_resourceName)) {
            Mage::throwException(Mage::helper('core')->__('Resource is not set.'));
        }

        return Mage::getResourceSingleton($this->_resourceName);
    }

Magento getModel getSingleton等常用函数详解

Mage::getModel函数详解:

在通常的PHP初始化类对象的时候,使用以下方式进行生成。
$modelSales = new ModelSales();
但是在magento中初始化模型对象时候,使用以下的方式进行生成模型对象。
$product = Mage::getModel(’catalog/product’);
我们阅读magneto系统核心代码,发现在执行Mage::getModel(‘catalog/product’)函数时候完成了以下几个步骤:
在系统配置中寻找节点。
在节点中间寻找节点。
在节点中寻找节点。
在class节点所包含的内容(假设定义为Mage_Catalog_Model)和data拼接成最终的类名称,经过magento类规范变成Mage_Catalog_Model_Product。
然后在Mage/Catalog/Model/Product.php文件中读取类定义并生成对象。
每一次执行的时候,都会重新生成一个模型对象。
最终返回一个Mage_Core_Model_Abstract子类对象。

    
/**
 * Retrieve model object
 *
 * @link    Mage_Core_Model_Config::getModelInstance
 * @param   string $modelClass
 * @param   array $arguments
 * @return  Mage_Core_Model_Abstract
 */
public static function getModel($modelClass = '', $arguments = array())
{
    return self::getConfig()->getModelInstance($modelClass, $arguments);
}
Mage::getSingleton函数详解:

getSingleton最终也是返回一个Mage_Core_Model_Abstract子类对象,但是其和getModel函数最大的区别是永远只生成一个对象,并将生成的对象通过Mage::registry函数注册到magento系统当中,再次执行getSingleton时获取到上一次生成的对象。
我们通过以下的系统源代码可以清楚的看到其和getModel函数的区别。

    
/**
 * Retrieve model object singleton
 *
 * @param   string $modelClass
 * @param   array $arguments
 * @return  Mage_Core_Model_Abstract
 */
public static function getSingleton($modelClass='', array $arguments=array())
{
    $registryKey = '_singleton/'.$modelClass;
    if (!self::registry($registryKey)) {
        self::register($registryKey, self::getModel($modelClass, $arguments));
    }
    return self::registry($registryKey);
}
Mage::helper函数详解:

在通常的PHP初始化类对象的时候,使用以下方式进行生成。
$helper_sales = new HelperSales();
但是在magento中初始化类对象时候,使用以下的方式进行生成对象。
$helper_sales = Mage::helper(‘sales/data’);
我们阅读magneto系统核心代码,发现在执行Mage::helper(‘sales/data’)函数时候完成了以下几个步骤:
在系统配置中寻找节点。
在节点中间寻找节点。
在节点中寻找节点。
在class节点所包含的内容(假设定义为Mage_Sales_Helper)和data拼接成最终的类名称,经过magento类规范变成Mage_Sales_Helper_Data。
然后在Mage/Sales/Helper/Data.php文件中读取类定义并生成对象。

    
/**
 * Deprecated, use self::helper()
 *
 * @param string $type
 * @return object
 */
public static function helper($name)
{
    if (strpos($name, '/') === false) {
        $name .= '/data';
    }
 
    $registryKey = '_helper/' . $name;
    if (!self::registry($registryKey)) {
        $helperClass = self::getConfig()->getHelperClassName($name);
        self::register($registryKey, new $helperClass);
    }
    return self::registry($registryKey);
}
Mage::register函数详解:

在Mage类中使用$_registry存储生成的对象,这样生成的对象在全局都可以访问。Mage::register函数有两种格式:
public static function register($key, $value, $graceful = false) 注册一个新的变量
public static function registry($key) 通过$key获取已有变量
public static function unregister($key) 注销一个变量
Magento源文件:

    
public static function register($key, $value, $graceful = false)
{
    if (isset(self::$_registry[$key])) {
        if ($graceful) {
            return;
        }
        self::throwException('Mage registry key "'.$key.'" already exists');
    }
    self::$_registry[$key] = $value;
}
/**
 * Retrieve a value from registry by a key
 *
 * @param string $key
 * @return mixed
 */
public static function registry($key)
{
    if (isset(self::$_registry[$key])) {
        return self::$_registry[$key];
    }
    return null;
}
Mage::getBaseUrl以及其他路径获取函数详解:

获取当前店铺的路径。默认参数是Mage_Core_Model_Store::URL_TYPE_LINK,返回http://example.com/index.php/。
还可以使用以下几个参数:

    
Mage_Core_Model_Store::URL_TYPE_LINK link http://example.com/index.php/
Mage_Core_Model_Store::URL_TYPE_DIRECT_LINK direct_link http://example.com/index.php/
Mage_Core_Model_Store::URL_TYPE_WEB web http://example.com/
Mage_Core_Model_Store::URL_TYPE_SKIN skin http://example.com/skin/
Mage_Core_Model_Store::URL_TYPE_JS js http://example.com/js/
Mage_Core_Model_Store::URL_TYPE_MEDIA media http://example.com/media/

当然,也可以使用简短的代码来获取js。Mage::getBaseUrl(‘js’);

    
/**
 * Get base URL path by type
 *
 * @param string $type
 * @return string
 */
public static function getBaseUrl($type = Mage_Core_Model_Store::URL_TYPE_LINK, $secure = null)
{
    return self::app()->getStore()->getBaseUrl($type, $secure);
}

Mage_Core_Helper_Url类调用路径
函数位于app/code/core/Mage/Core/Model/Url.php当中。
1.获取当前路径Mage::help(‘core/url’)->getCurrentUrl();
    
/**
 * Retrieve current url
 *
 * @return string
 */
public function getCurrentUrl()
{
    return $this->_getUrl('*/*/*', array('_current' => true, '_use_rewrite' => true));
}

2.获取主页路径 Mage::help(‘core/url’)->getHomeUrl();

    
/**
 * Retrieve homepage url
 *
 * @return string
 */
public function getHomeUrl()
{
    return Mage::getBaseUrl();
}

在Block和Phtml文件中,可以使用getUrl函数直接调用路径,一般使用在Block文件中。该函数定义在app/code/core/Mage/Core/Block/Abstract.php文件中。
如$this->getUrl(‘customer/account/login’);表示用户登录页面。

    
/**
 * Generate url by route and parameters
 *
 * @param   string $route
 * @param   array $params
 * @return  string
 */
public function getUrl($route='', $params=array())
{
    return $this->_getUrlModel()->getUrl($route, $params);//该函数调用Mage::help('core/url')->getUrl($route, $params);来进行处理,效果一样。
}

如果调用skin中某个文件,可以直接使用getSkinUrl函数,一般用在Phtml文件中。如$this->getSkinUrl(‘images/calendar.gif’);表示获取指定模板中的images/calendar.gif文件。

    
/**
 * Retrieve url of skins file
 *
 * @param   string $file path to file in skin
 * @param   array $params
 * @return  string
 */
public function getSkinUrl($file=null, array $params=array())
{
    return Mage::getDesign()->getSkinUrl($file, $params);
}
getData函数

可以直接获取对象中的某个值,如获取产品的sku值,可以使用$product->getData(‘sku’);,也可以使用$product->getSku();
在没有参数的情况下,getData函数会返回一个数组,你可以print_r($Product->getData()); 讲所有数据打印出来。也可以使用$arrProduct = $Product->getData(); echo $arrProduct->sku;