magento前端控制器的功能

前端控制器类名:Mage_Core_Controller_Varien_Front(单例)
作用:所有请求经过index.php转入Mage::run方法,经过初始化后,经前端控制器输入到本次请求相应的路由控制器(起一下分配的作用).
重要类变量:4大路由控制器,经过此类可以取得相应的路由控制器,由于继承自Varien_Object得到_data变量,所以在一个请求过程,可以向此对象中加入你需要的任何数据.

Array(
[admin] => Mage_Core_Controller_Varien_Router_Admin Object
[standard] => Mage_Core_Controller_Varien_Router_Standard Object
[cms] => Mage_Cms_Controller_Router Object
[default] => Mage_Core_Controller_Varien_Router_Default Object
)

在初始化时收集路由时,分别植入了两个事件,分别是:
controller_front_init_before事件:我们可以通过此事件侦听来修改前端控制器类中的数据,在收集路由前的动作.
controller_front_init_routers事件:这个事件侦听者做了一件事,把cms路由控制器加入到了到前端控制器类变量_routers中.其中key 为 cms,值为Mage_Cms_Controller_Router的实例.
从上所述,[cms] => Mage_Cms_Controller_Router Object这个路由是由事件加入的!

路由控制器初始化后,几个路由主要的功能和取代规则

代号key 类名 作用
admin Mage_Core_Controller_Varien_Router_Admin 收集所有admin路由(模块),并把前端控制器转过来的admin模块转入admin用户控制器
standard Mage_Core_Controller_Varien_Router_Standard 收集所有frontend(前台)路由(模块),并把前端控制器转过来的frontend模块转入frontend用户控制器
cms Mage_Cms_Controller_Router 当admin/standard无法处理时,交由此路由处理,用来处理cms page
default Mage_Core_Controller_Varien_Router_Default 当admin/standard/cms无法处理时,交由此路由处理,用来处理中url不存在的情况

magento初始化命令Mage::run($mageRunCode, $mageRunType),参数的意义

magento store设置
magento website 设置
标准语法如下:

/* Store or website code */
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';

/* Run store or run website */
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';

Mage::run($mageRunCode, $mageRunType);

多网店语法如下:

switch($_SERVER['HTTP_HOST']) {
case ‘two.com’:
case ‘www..twocom’:
Mage::run(‘two’, ‘website’);
break;
default:
Mage::run($mageRunCode, $mageRunType);
break;
}

从中可以得知,$mageRunCode是website及store中对应的code参数,$mageRunType为website或store,默认是store

magento初始化的主要内容

一:总体说明
Magento 初始化是指一个请求到来时,在分配到前端控制器或者路由控制器之前要做的一些系统初始化工作,这些初始化一般收集系统的初始化配置数据,并把其缓存起来,供后继的请求使用。同时要初始化一些重要的类,供请求后继使用,这些类一般是单例的(整个请求过程只有一个这样的类),并将相应的数据存放在一些类中,如:
 self::$_app = new Mage_Core_Model_App();
 self::$_events = new Varien_Event_Collection();
 self::$_config = new Mage_Core_Model_Config();
二:配置数据库加载
对于magento支持的网店/website/store view,是通过后台的配置数据库来实现一些参数的不同配置,这些配置将加载到初始化的xml中,解释如下:

表core_config_data字段scope有三个值:default/websites/stores/.字段scope_id意义由scope值决定,如果为default那个scope_id为0.websites对应的是网站id,stores对应的是网站视图id.合并的规划是这样的:
1、scope为default的将合并到<config><default>节点之下.
2、默认情况下magento的core_website表中有两条数,说明前台,后台由不同的网站构成。但后台admin的id为0.在_xml中存在<config><websites><admin>…,<config><websites><base>…,如果我们再新建website,如code为youthor,那么就会多一个<config><websites><youthor>…,首先<config><default>下的所有节点会全部分别加入到三个网站节点面下:如<config><websites><base>下面.然后到表core_config_data属于自己网站的配置信息,加入到自己网站节点下,如:<config><websites><base>…下面。
3、默认情况下magento的core_store表中有两条数,说明前台,后台由不同的商店视图构成。但后台admin的id为0.在_xml中存在<config><stores><admin>…,<config><stores><default>…如果我们再新建store view如:code为youthor,那么就会多一个<config><stores><youthor>…首先本store view的website下的所有节点。如<config><websites><base>下节点copy到store view下,如:<config><stores><default>下,注意:这里如果有相同的,将不会覆盖,然后再从表core_config_data属于自己商店视图的配置信息,加入到自己商店视图节点下,如:<config><stores><default>下面.

在Magento后台配置系统参数据中,在下拉框中只能选择默认的(默认设置)/网站级/商店视图级,不能选择商店(组)级.当选择默认的(默认设置),右边的设置项后面没有checkbox,当选择网站级,右边的设置项后面有checkbox,说明为:使用缺省值,默认是勾选的,如果去掉,修改一下值再保存,将在core_config_data多一条记录,scope就是websites,scope_id为选择的网站id.当选择商店视图级时右边的设置项后面有checkbox,说明为:使用网站值,默认是勾选的,如果去掉,修改一下值再保存,将在core_config_data多一条记录,scope就是stores,scope_id为选择的商店视图id.

三:xml的生成结构:
magento初始化的xml结构

global:定义一些全局使用的配置,如models,blocks,helpers,resources,resource等定义.
default:定义默认的参数配置,
如上面分析的core_config_data表
modules:定义模块配置
frontend:定义网站前台的配置
adminhtml/admin定义后台的配置
install:安装时要使用的一些配置
websites:定义网站的配置参数,如上面分析的core_config_data表
stores:定义商店的配置参数,
如上面分析的core_config_data表
crontab:为定时调度器,也就是定时触发一些程序的一些配置。

四:初始化总结
Magento初始化是解析:app/etc/config.xml文件,app/etc/modules/下的所有xml文件,每个模块下的etc/config.xml文件,app/etc/local.xml,然后加载core_config_data表中的配置,这些文件最终会合并并存放到Mage_Core_Model_Config中的_xml中,Mage_Core_Model_Config有很多操作_xml文件的方法,_xml持有的对象是Mage_Core_Model_Config_Element.

如何在magento模板文件中获取controller名称,action名称和module name

/**
* get Controller name
*/
$this->getRequest()->getControllerName();
/**
* get Action name, i.e. the function inside the controller
*/
$this->getRequest()->getActionName();
/**
* get module name
*/
$this->getRequest()->getModuleName();

getRequest()方法还有很多很实用的东西,你在phtml文件中打印下试试

echo "<pre>";
print_r($this->getRequest());
echo "</pre>";

修改magento商品页中加入购物车的默认商品数量

magento系统默认的加入购物车输入框的数量是空的,这里我们让magento的add to cart 显示默认数量为1,修改的文件位于你所使用的magento模板文件夹所在的位置。
一般在template/catalog/product/view/addtocart.phtml
 

<input name=”qty” class=”input-text qty” id=”qty” maxlength=”12″ value=”<?php if($_product->isSaleable()): ?>
<?php echo $this->getMinimalQty($_product)== null?1:$this->getMinimalQty($_product) ?>
<?php else: ?>
<?php echo $this->getMinimalQty($_product)== null?0:$this->getMinimalQty($_product) ?>
<?php endif; ?>” type=”text” />

上面的代码主要是判断是否设置了MinimalQty,如果为最小数量NULL那么加入购物车数量就默认为数量1

Magento下Cookie和Session的使用和设置

Magento中已经封装了cookie和session,就是Magento的核心对象-Mage_Core_Model_Cookie & Mage_Core_Model_Session
首先介绍Mage_Core_Model_Cookie,这个对象主要是用来设置cookie的,里面主要下列方法如下:

public function getDomain();
public function getConfigDomain();
public function getPath();
public function getLifetime();
public function setLifetime();
public function getHttponly();
public function isSecure();
public function set();
public function renew();
public function get();
public function delete();

使用很方便,设置一个Cookie,只要设置cookie的名字和value就可以了 

Mage::getSingleton("core/cookie")->set(“name”,”value”);

获取cookie主要用到的是get()

/*通过cookie名字来获取cookie
* $name = name of the cookie
*/
Mage::getModel('core/cookie')->get($name);
/**
* 得到所有的COOKIE数组
*/
Mage::getModel('core/cookie')->get();
/**
* delete/remove cookie
* $name is mandatory; other parameters are optional and cen be set as null
*/
Mage::getModel('core/cookie')->get($name, $path, $domain, $secure, $httponly);

Mage_Core_Model_Session,这个对象的使用很简单,在Session的设置如下

Mage::getSingleton(‘core/session’)->setXXXX(value);

magento获取指定目录分类的子分类

if($category->hasChildren()) {  //判断是否有子目录
 $ids = $category->getChildren();   //提取子目录id清单
 $subCategories = Mage::getModel('catalog/category')->getCollection();  
 $subCategories->getSelect()->where("e.entity_id in ($ids)");  //提取指定目录ids的上当清单
 $subCategories->addAttributeToSelect('name');  //指定查找目录名称
 $subCategories->load();  
 foreach ($subCategories AS $item) {  
 echo " - " ;  
 echo '<a href="'. $item->getUrl() . '">';   //获取目录链接
 echo $item->getName();   //获取目录名
 echo "</a>(";  
 echo $item->getProductCount();   //获取目录下的产品数量
 //echo $item->getChildrenCount();  //获取目录下子目录数量  
 echo ")";  
 echo "<br/>";  
 }  
 } 



magento通过product获取目录的相关信息

在产品页获得当前产品的所有父分类

$categories = $_product->getCategoryCollection();  
foreach($categories as $_category) {  
// do something  
} 

获取product关联的category  id数组,我们还可以循环该数组来得到每个category的栏目名字和url路径

<?php  
 /**  
 * 通过 product 得到关联的所有categories  
 */ 
 $categoryIds = $product->getCategoryIds();  
 /**  
 *循环 category ids  
 */ 
 foreach($categoryIds as $categoryId) {  
 $category = Mage::getModel('catalog/category')->load($categoryId);  
 ?>  
 Category: <a href="<?php echo $category->getCategoryUrl() ?>"><?php echo $category->getName() ?></a><br/>  
 <?php  
 }  
 ?> 

打开magento的开发调试模式(开发者模式)

index.php你就会发现下面两行代码:
#Mage::setIsDeveloperMode(true);
#ini_set(‘display_errors’, 1);
你只要去掉前面的注释就可以打开开发者模式,在出错的时候会输出信息可以帮助我们调。

另外的可能对调试有用的信息是在var/report目录下的文件。
你还可以打开log。
可能通过后台 — system — configuration
在Current Configuration Scope中选择website后

选择developer — log setting

然后你就可以查看log来调试。

magento查看和调试当前有哪些类被加载到模板

初学者最常见的问题是在某个模板内你不知道有哪些接口你可以用。magento的接口那么丰富,如果这个不会更谈不起二次开发了。其实借助php的最基本的几个函数你就可以查看当前有哪些类哪些接口可以使用了。

echo print_r(get_class_methods(get_class( $this )));

你还可以通过调用block的debug方法:

echo print_r( $this ->debug());

因为magento是在zend 框架下开发的,所以你还可以:

echo Zend_Debug::dump( $this );
具体效果大家自己测!