Category Archives: magento

B2C平台之Opencart

Opencart是一个类似于Magento一样的B2C平台程序,但是不同于Mangeto的复杂和强大,Opencat是一个很清爽的B2C平台,轻便的MVC结构,让我觉得Opencart采取了类似Codeignter框架的设计思想,相对于Mangento使用的Zend框架,简直是轻便了许多许多。在Magento下面,如果你要修改一点内容,在不熟悉架构的前提下,至少要一天时间才能大致掌握;而我在Opencart上简单的修改了一个注册内容的部分,只修改了一个tpl模板页面和另外两个controller就可以了,不到10分钟时间。

经过大致对这两个B2C框架的观察,Mangento适合那些“大型”的B2C网站,你能够有一个团队来控制的修改你的网站;而Opencart则更适合中小型的B2C网站。甚至如果你的B2C不需要那么多复杂的流程的话,完全可以使用Opencart。

Opencart目前不足的地方在于document不足,起码没有magento那么多。不过Opencart基础的system和engner中的php文件和class也不多,简单的研究一下就差不多了。

学习Magento系统架构(一)

magento版本:1.7

首先了解magento的url路由情况。把用户注册的url:/customer/account/create/作为例子。

首先这个url属于customer这个module,代码和配置文件的位置在:

\app\code\core\Mage\Customer
\app\design\frontend\base\default\template\customer(使用magento的默认template)
\app\design\frontend\base\default\layout\customer.xml(默认模板的customer界面配置)

/customer/account/create/的layout文件是在\app\design\frontend\base\default\layout\customer.xml中设定的,所以需要在这个文件中查看信息:

<customer_account_create translate="label">
        <label>Customer Account Registration Form</label>
        <!-- Mage_Customer -->
        <remove name="right"/>
        <remove name="left"/>

        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
        <reference name="content">
            <block type="customer/form_register" name="customer_form_register" template="customer/form/register.phtml">
                <block type="page/html_wrapper" name="customer.form.register.fields.before" as="form_fields_before" translate="label">
                    <label>Form Fields Before</label>
                </block>
            </block>
        </reference>
    </customer_account_create>

从这里大致能看出来采用单栏结构,并且删除了right和left部分,页面template是customer/form/register.phtml.在register
.phtml中,有几行代码是用来读取属性数据的:

<li class="fields">
        <?php echo $this->getLayout()->createBlock('customer/widget_name')->setObject($this->getFormData())->setForceUseCustomerAttributes(true)->toHtml() ?>
</li>

$this->getLayout()->createBlock(‘customer/widget_name’)读取了\app\code\core\Mage\Customer\Block\Widget\Name.php这个block,$this->getFormData()是Register.php这个block中的代码:

    public function getFormData()
    {
        $data = $this->getData('form_data');
        if (is_null($data)) {
            $formData = Mage::getSingleton('customer/session')->getCustomerFormData(true);
            $data = new Varien_Object();
            if ($formData) {
                $data->addData($formData);
                $data->setCustomerData(1);
            }
            if (isset($data['region_id'])) {
                $data['region_id'] = (int)$data['region_id'];
            }
            $this->setData('form_data', $data);
        }
        return $data;
    }

看起来像是从session中获取已经登录的用户名。但是setForceUseCustomerAttributes(true)这个函数不知道是从那里来的,我在register.phtml中把这个函数删除了直接用后面的tohtml()也能成功的创建注册页面。

\app\code\core\Mage\Customer\Block\Widget\Name.php是如何tohtml()的?是通过它的phtml:

public function _construct()
    {
        parent::_construct();

        // default template location
        $this->setTemplate('customer/widget/name.phtml');
    }

来创建的。

Magento修改客户注册或者登录的模板

大爷的,网上的教程都是基于1.5版本的,1.6或者1.7的都已经把customer的login.phtml和register.phtml转移到了app\design\frontend\base\default\template\persistent\customer\form目录,我说在原来的目录中改了也不起效。

可以通过:
System -> Configuration -> CUSTOMERS -> Persistent Shopping Cart -> General Options -> Enable Persistence = No的方法关闭Persistent Shopping Cart功能,或者把app/etc/modules/Mage_Persistent.xml 设置为active = false.

参考:如何关闭Persistent

Magento添加手机号注册字段

第一步、新建一个模块,在app/etc/modules/目录下新建文件Shuishui_Customer.xml

<config>  
    <modules>  
        <Shuishui_Customer>  
            <active>true</active>  
            <codePool>community</codePool>  
        </Shuishui_Customer>  
    </modules>  
</config>  

第二步、新建这个模块的config配置文件,位置在app/code/community/Shuishui/Customer/etc/config.xml

<?xml version="1.0"?>  
  
<config>  
    <modules>  
        <Shuishui_Customer>  
            <version>0.1.0</version>  
        </Shuishui_Customer>  
    </modules>  
    <global>  
    <fieldsets>  
        <customer_account>  
              <mobile><create>1</create><update>1</update></mobile>  
        </customer_account>  
    </fieldsets>  
        <models>  
            <Shuishui_Customer>  
                <class>Shuishui_Customer_Model</class>  
            </Shuishui_Customer>  
        </models>  
        <helpers>  
            <Shuishui_Customer>  
                <class>Shuishui_Customer_Helper</class>  
            </Shuishui_Customer>  
        </helpers>  
        <resources>  
            <customerattribute_setup>  
                <setup>  
                    <module>Shuishui_Customer</module>  
                    <class>Shuishui_Customer_Model_Entity_Setup</class>  
                </setup>  
            </customerattribute_setup>  
        </resources>  
    </global>     
</config>  

第三步、新建一个model类,继承自Mage_Customer_Model_Entity_Setup类,类里新添加一个字段,位置在app/code/community/Shuishui/Customer/Model/Entity/Setup.php

class Fanxiang_Customer_Model_Entity_Setup extends Mage_Customer_Model_Entity_Setup  

'created_at' => array(  
                        'type'          => 'static',  
                        'label'         => 'Created At',  
                        'visible'       => false,  
                        'required'      => false,  
                        'input'         => 'date',  
                    ),  
                    'mobile' => array(  
                        'type'          => 'static',  
                        'label'         => 'Mobile',  
                        'visible'       => true,  
                        'required'      => false,  
                        'sort_order'    => 80,  
                    ),  
                ),  
            ),  
  
            'customer_address'=>array(  
                'entity_model'  =>'customer/customer_address',  
                'table' => 'customer/address_entity',  
                'additional_attribute_table' => 'customer/eav_attribute',  
                'entity_attribute_collection' => 'customer/address_attribute_collection',  

下一步需要在magento的EVA中新建mobile这个属性,在数据库中创建这个字段:

$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$setup->addAttribute('customer','mobile',array(  
      'label' => 'Mobile',  
      'visible'=>1,  
      'required'=>0,  
      'position'=>1,  
      'sort_order'=>80,  
       
));

我是把这段创建新的属性的代码放在了\app\design\frontend\base\default\template\customer\form\register.phtml中执行的,打开注册页面后就能看到在magento的eav_attribute表中最后加了个mobile的字段。

在前台注册页面的模板文件中添加一个新的表单项,位置在template\customer\form\register.phtml

<li>  
    <label for="mobile" class="required"><em>*</em><?php echo $this->__('mobile') ?></label>  
    <div class="input-box">  
    <input type="text" name="mobile" id="mobile" value="" title="<?php echo $this->__('mobile') ?>" class="input-text  required-entry" />  
    </div>  
</li>  

Magento更改添加货物是默认库存状态

在\app\design\adminhtml\default\default\template\catalog\product\tab\inventory.phtml

            <tr>
            <td class="label"><label for="inventory_stock_availability"><?php echo Mage::helper('catalog')->__('Stock Availability') ?></label></td>
            <td class="value"><select id="inventory_stock_availability" name="<?php echo $this->getFieldSuffix() ?>[stock_data][is_in_stock]" class="select" <?php echo $_readonly;?>>
            <?php foreach ($this->getStockOption() as $option): ?>
                <?php $_selected = ($option['value'] == $this->getFieldValue('is_in_stock')) ? 'selected="selected"' : '' ?>
                <option value="<?php echo $option['value'] ?>" <?php echo $_selected ?>><?php echo $option['label'] ?></option>
            <?php endforeach; ?>
            </select>
            </td>

默认是“无库存”,第五行代码是决定在option中是否显示”selected”:

<?php $_selected = ($option['value'] == $this->getFieldValue('is_in_stock')) ? 'selected="selected"' : '' ?>

根据($option[‘value’] == $this->getFieldValue(‘is_in_stock’)得出的结果来判断$_selected是空还是非空,默认状态是库存空,我改了这一行:

<?php $_selected = ($option['value'] == $this->getFieldValue('is_in_stock')) ? '': 'selected="selected"'  ?>

刷新后添加Magento商品的时候库存这一行就是默认为有库存了。