Magento 多站点多域名安装教程

在电子商务越来越火的今天,在线建立自己的商店已经不是一件很困难的事了,Open Source的网店软件比比皆是,现在最流行Prestashop, Magento, Opencart等等,以Magento最为著名,可扩展性强,多商店统一后台管理,对SEO友好。在这里可以看到三个软件的对比

这篇文章是安装magento子域名的教程,请先进行安装之前,确认以下几点:

1.请先确认子域名是否已经指向你的服务器

2.可以编辑.htaccess文件

3. 熟悉Cpanel操作

我们的目标是建立一个独立在线商店store.xbc.me,再安装一个mage.xbc.me的子域名商店,后台统一使用store.xbc.me的后台。我们可以一步一步来安装一个测试的Store商店和子域名商店。

首先创建数据库,在cpanel面板的MYSQL数据库页面添加Store的数据库

magento-tutorial-multi-site-multi-domain-1

使用密码生成器来加强安全性

magento-tutorial-multi-site-multi-domain-2

为xbcme_store用户授权

magento-tutorial-multi-site-multi-domain-3

 

授予全部的权限

magento-tutorial-multi-site-multi-domain-4

添加一个子域名,store.xbc.me目录指向ROOT/store/magento

magento-tutorial-multi-site-multi-domain-5

添加子域名mage.xbc.me,和store指向同一个目录。

magento-tutorial-multi-site-multi-domain-6

现在有了两个子域名了。ROOT代表你的根目录。

store.xbc.me    对应目录  ROOT/store/magento

mage.xbc.me  对应目录   ROOT/store/magento

上传magento的安装包到ROOT/store,我这里测试安装的版本为1.6.1。解压后会自动生成magento文件夹。

如果想安装示例数据的话,可以使用sample-data里面的media替换掉magento,然后导入sample-data的sample-data。sql。

现在可以访问http://store.xbc.me,就会出现magento的经典安装界面。

magento-tutorial-multi-site-multi-domain-10

使用默认的设置就可以了,直接点Continue。

magento-tutorial-multi-site-multi-domain-11

添加数据库信息

magento-tutorial-multi-site-multi-domain-12

Web设置,使用默认的设置即可。

magento-tutorial-multi-site-multi-domain-13

创建管理员帐号

magento-tutorial-multi-site-multi-domain-14

安装完成后,转到后台System-> Manage Stores。

magento-tutorial-multi-site-multi-domain-16

点击Create Website

magento-tutorial-multi-site-multi-domain-17

创建一个新的网站

Name:Mage.xbc.me

Code:mage

Sort Order : 显示的顺序,选填。

magento-tutorial-multi-site-multi-domain-18

保存网站,点击Save Website,创建一个新的商店,点击Create Store。

magento-tutorial-multi-site-multi-domain-20

选择新建的网站:Mage.xbc.me

Website:Mage.xbc.me

Name:Main Store

Root Category:Defult Category

magento-tutorial-multi-site-multi-domain-21

保存商店,点击Save Store。创建一个商店的视图,点击Create  Store View。

magento-tutorial-multi-site-multi-domain-23

填写刚刚创建的Store信息。

Store:Main Store

Name:English

Code:mage_en

Status:Enabled

Sort Order:选填。

magento-tutorial-multi-site-multi-domain-24

保存视图信息,点击Save Store View。就可以看到我们创建的Mage.xbc.me网站信息

magento-tutorial-multi-site-multi-domain-26

现在开配置Mage.xbc.me网站的URL,转到System->Configuration,选择Current Configuration Scope为Mage。xbc.me

magento-tutorial-multi-site-multi-domain-28

选择GENERAL->Web选项,设置Unsecure 和secure选项,去掉Use Default视图的单选框

设置Base URL为http://mage.xbc.me

magento-tutorial-multi-site-multi-domain-29

按照官方的多站点安装向导,修改.htaccess。用你熟悉的编辑器打开.htaccess,在结尾处添加一下内容:

SetEnvIf Host store\.xbc\.me MAGE_RUN_CODE=base
SetEnvIf Host store\.xbc\.me MAGE_RUN_TYPE=website
 
SetEnvIf Host mage\.xbc\.me MAGE_RUN_CODE=mage
SetEnvIf Host mage\.xbc\.me MAGE_RUN_TYPE=website

 

打开http://store.xbc.mehttp://mage.xbc.me都可以正常访问了。

过滤Magento地址的P.O Box

原因很简单,我们使用的快递是UPS,UPS是不送P.O.Boxes地址的。这就需要在支付填写地址时进行验证。

在自己动手之前,我找了一个解决方案preventing P.O. Boxes in shipping addresses 。这篇文章里面写得比较清楚。

只需要修改Customer/Model/Address/Abstract.php 和Checkout/Model/Type/Onepage.php 就行。在作者的基础上,我做了一点小的修改。原文是在新建一个validate_pobox的函数,我是直接把验证添加到validate函数里的。

找到文件

/app/code/core/Mage/Customer/Model/Address/Abstract.php

将下面这段代码加到validate函数的下面

if ($this->getCountryModel()->getRegionCollection()->getSize()
               && !Zend_Validate::is($this->getRegionId(), 'NotEmpty')) {
            $errors[] = $helper->__('Please enter the state/province.');
        }

添加验证代码之后就变成下面这样了

if ($this->getCountryModel()->getRegionCollection()->getSize()
   	&& !Zend_Validate::is($this->getRegionId(), 'NotEmpty')) {
    	$errors[] = $helper->__('Please enter the state/province.');
   }
   //add filter for P.O. Box
if( preg_match("/p\.* *o\.* *box/i", $this->getStreet(1))
      || preg_match("/p\.* *o\.* *box/i", $this->getStreet(2)) )
  {
      $errors[] = $helper->__('We cannot ship to PO boxes.');
  }

然后为了不修改Magento的Core文件,然后将文件移到local文件夹

/app/code/local/Mage/Customer/Model/Address/Abstract.php

下即可。

在参考这篇文章Adding validation to registration form in Magento后,我创建了一个插件 No PO Box Shipping。该插件是重写了Mage_Sales_Model_Quote_Address这个类实现的。在实现的过程中遇到无法重写abstract class的问题。Mage_Sales_Model_Quote_Address 是从Mage_Customer_Model_Address_Abstract 类继承过来的。validate函数是写在Mage_Customer_Model_Address_Abstract 这个抽象函数的,本来想直接重写这个类,后来失败了,在Magento中是无法重写Absract Class的,因为Magento在core里面是直接继承这个抽象类的,例如

class Matt_Nopobox_Model_Quote_Address extends Mage_Customer_Model_Address_Abstract

Magento 可以重写非class 主要是因为Magento使用的URI命名来实例化对象。

$helper = Mage::helper('mymodule/myclass');

但是abstract class是直接在php文件中继承,所以替换的时候并没有hook上.

文件app/code/core/Mage/Core/Model/Config.php的类Mage_Core_Model_Config.该类会在getGroupedClassName函数里,会检查是否被rewrite, 如果被重写过,就会返回重写后的对象.

 

插件下载地址:

No PO Box Shipping

 

参考资料

http://www.westwideweb.com/wp/2011/03/15/magento-prevent-entry-of-po-boxes-for-shipping-address/

http://www.fontis.com.au/blog/magento/preventing-po-box-shipping-addresses

http://www.magentocommerce.com/boards/viewthread/18494/P15/

http://www.webbitten.com/index.php?option=com_content&view=article&id=6&Itemid=2

http://inchoo.net/ecommerce/magento/how_to_override_magento_model_classes/

Xampp安装PHPUnit

最近准备着手开发Magento的插件,为了保证插件的代码质量,决定采用TDD的方法进行开发。在PHP实战中看到的TDD的开发方法,突然觉得豁然开朗,开发起来一点都不费力气,现在终于有机会亲自实现了。

当然,在卷起袖子之前,还需要配置好PHPUnit的开发环境。在PHPUnit的最新版本已经迁移到自己的pear.phpunit.de网站上了。本文假设你已经配置好Xampp的开发环境,我之前的文章PHP开发环境的搭建

首先升级你的pear版本,最新PHPUnit 3.6 要求PEAR的版本较高。在开始菜单打开CMD命令行。

cd /d D:\xampp\php
pear config-show
CONFIGURATION (CHANNEL PEAR.PHP.NET):
=====================================
Auto-discover new Channels     auto_discover    1
Default Channel                default_channel  pear.php.net
HTTP Proxy Server Address      http_proxy       <not set>
PEAR server [DEPRECATED]       master_server    pear.php.net
Default Channel Mirror         preferred_mirror pear.php.net
Remote Configuration File      remote_config    <not set>
PEAR executables directory     bin_dir          D:\xampp\php
PEAR documentation directory   doc_dir          D:\xampp\php\docs
PHP extension directory        ext_dir          D:\xampp\php\ext
PEAR directory                 php_dir          D:\xampp\php\pear
PEAR Installer cache directory cache_dir        D:\xampp\php\tmp
PEAR configuration file        cfg_dir          D:\xampp\php\cfg
directory
PEAR data directory            data_dir         D:\xampp\php\data
PEAR Installer download        download_dir     D:\xampp\php\tmp
directory
PHP CLI/CGI binary             php_bin          D:\xampp\php\.\php.exe
php.ini location               php_ini          <not set>
--program-prefix passed to     php_prefix       <not set>
PHP's ./configure
--program-suffix passed to     php_suffix       <not set>
PHP's ./configure
PEAR Installer temp directory  temp_dir         D:\xampp\php\tmp
PEAR test directory            test_dir         D:\xampp\php\tests
PEAR www files directory       www_dir          D:\xampp\php\www
Cache TimeToLive               cache_ttl        3600
Preferred Package State        preferred_state  stable
Unix file mask                 umask            0
Debug Log Level                verbose          1
PEAR password (for             password         <not set>
maintainers)
Signature Handling Program     sig_bin          c:\gnupg\gpg.exe
Signature Key Directory        sig_keydir       C:\Windows\pearkeys
Signature Key Id               sig_keyid        <not set>
Package Signature Type         sig_type         gpg
PEAR username (for             username         <not set>
maintainers)
User Configuration File        Filename         C:\Windows\pear.ini
System Configuration File      Filename         C:\Windows\pearsys.ini

以上是我的pear配置文件,仅供参考,输入以下命令升级pear的版本

pear upgrade pear

查看升级后的版本

pear –V
PEAR Version: 1.9.4
PHP Version: 5.3.5
Zend Engine Version: 2.3.0
Running on: Windows NT ARTHUR-PC 6.1 build 7600 (Unknow Windows version 
Ultimate Edition) i586

升级PHPUnit的版本到3.6,pear自带的版本太低了。

pear upgrade pear/PHPUnit

出现更新失败的信息

pear/PHPUnit is already installed and is the same as the released version 1.3.2
  upgrade failed

先卸载当前的PHPUnit版本

pear uninstall pear/PHPUnit

注意设置自动添加频道

pear config-set auto_discover 1
添加PHPUnit的必要频道
pear channel-discover components.ez.no 
pear channel-discover pear.phpunit.de
pear channel-discover pear.symfony-project.com

安装PHPUnit

pear install --alldeps phpunit/PHPUnit

查看PHPUnit的版本

phpunit –V
 
PHPUnit 3.6.3 by Sebastian Bergmann.

添加pear的路径到你的环境变量,例如D:\xampp\php。这样就能直接打pear命令了。

编写你的第一个测试

cd /d D:\xampp\htdocs\dev142\tests

新建index.php文件

<?php
//This is my first test
class MyFirstTest extends PHPUnit_Framework_TestCase{ 
    public function testFirst(){
        $stack = array();
        $this-&gt;assertEquals(0,count($stack));
    }
}
?>

测试你编写的代码

phpunit index.php
PHPUnit 3.6.3 by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.50Mb
 
OK (1 test, 1 assertion)

参考

http://pear.phpunit.de/

http://amiworks.co.in/talk/installing-pear-and-phpunit-on-wamp-and-windows-7/

https://github.com/sebastianbergmann/phpunit/

http://blog.lixiphp.com/windows-install-pear-phpunit/