Magento模型启动资源

这次,我们为模型创建一个启动资源(SetupResource),让Magento自动创建表。接下来,我们还会创建一个升级安装资源脚本,从而实现模型的自动升级。本节介绍的内容大概分为以下几步。
•添加启动资源配置文件
•创建启动资源类文件
•创建安装脚本
•创建升级脚本

添加启动资源配置文件
<resources>
    <!-- ... -->
    <test_subscribe_setup>
        <setup>
            <module>Magentotutorial_Weblog</module>
            <class>TestSubscribe_Model_Resource_Setup</class>
        </setup>
    </test_subscribe_setup>
    <!-- ... -->
</resources>

<test_subscribe_setup>标签用来用来识别该启动资源。Magento建议该命名使用”模块名_setup”的格式。标签必须包含当前“命名空间_模块名”。指定我们为该模块创建的启动资源类名。对于简单的启动资源脚本,我们不需要创建自定义的类文件,当然应用自定义的启动资源脚本,更灵活,更易于扩展。
还要在一下路劲创建以下文件

File: app/code/local/Test/Subscribe/Model/Resource/Setup.php
class Test_Subscribe_Model_Resource_Setup extends Mage_Core_Model_Resource_Setup {}

完成之后,重新刷新页面,页面就能够正常显示了。到这里,启动资源配置文件初步完成。

创建安装脚本

接下来,开始创建安装脚本。该脚本会包含CREATE TABLE或其他SQL代码,用来初始化该模块。首先,回忆下配置文件,

    <modules>
        <Test_Subscribe>
            <version>1.0.0</version>
        </Test_Subscribe>
    </modules>

这部分是所有配置文件必须的,用来识别一个模块的版本号。安装脚本的命名就需要依据此版本号。我们假设当前Subscribe模块的版本号为0.1.0。在下列路径创建启动脚本,并暂时写入下列代码。

File: app/code/local/Test/Subscribe/sql/test_subscribe_setup/install-1.0.0.php
启动资源版本

core_resource该表包含所有已安装的模块及其版本号。该表的记录也是Magento知道如何避免重复运行安装、更新脚本的原因。如果在开发阶段,你想让系统重新运行安装脚本,可以从该表中删除相应的模块记录。

Magento启动脚本详解

一起来看下这个启动脚本,首先,第一行中有个$this。

$installer = $this;

安装脚本都是在启动资源类的上下文中运行的,所以上面的 $ this表示的就是启动资源类。也就是说,在安装脚本中,任何对于 $ this的引用都是对于启动资源类对象的引用。在核心模块的启动脚本中,Magento团队都将该对象的引用赋值给$installer变量,当然这并不是必须的,但是从Magento团队的做法来看,这也算是一个最佳实践。
继续解析启动脚本,上面的代码前后调用了两个方法。

$installer->startSetup();
//...
$instaler->endSetup();

如果你看过Mage_Core_Model_Resource_Setup类(启动资源类继承自该类),路径位于app/code/core/Mage/Core/Model/Resource/Setup.php,你会发现这些方法进行了一些基础的SQL操作。

$installer = $this;
$installer->startSetup();

$table = $this->getConnection()
    ->newTable($installer->getTable('subscribe_stock_item'))
    ->addColumn('item_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
        'identity'  => true,
        'unsigned'  => true,
        'nullable'  => false,
        'primary'   => true,
    ), 'Item Id')
    ->addColumn('product_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
        'unsigned'  => true,
        'nullable'  => false,
    ), 'Product Id')
    ->addColumn('email_address', Varien_Db_Ddl_Table::TYPE_VARCHAR, null, array(
        'nullable'  => false,
    ), 'Email Address')
    ->addColumn('is_reply', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
        'unsigned'  => true,
        'nullable'  => false,
        'default'   => '0',
    ), 'Is Reply')
    ->addColumn('created_at', Varien_Db_Ddl_Table::TYPE_TIMESTAMP, null, array(
        'nullable'  => false,
    ), 'Created At');
$this->getConnection()->createTable($table);
$installer->endSetup();

$installer->run(…);

该方法的参数包含创建数据库表的所有SQL语句,就想在命令行中键入的命令一样。可以在这个参数中指定任意数量的SQL语句,只需要用分号隔开每条SQL语句即可。当然,可能你还注意到了下面这个方法,

$installer->getTable('test/subscribe');

getTable()方法需要一个Magento模型URI作为参数,返回表名。当然你也可以硬编码为该表的名字,这里之所以使用这个方法,主要是为了确保即使表名更改,也可以正常获取到修改后的表名。Mage_Core_Model_Resource_Setup类包含了许多类似getTable()的非常有用的助手方法。想要学习安装脚本,最后的办法就是看Magento核心代码中模块的SQL升级脚本

模块升级

Magento的启动资源支持简单的版本支持,能够自动运行脚本升级模块的数据库表结构。

Magento模块的安装脚本只会运行一次,并且不会再次为这个模块运行另外一个安装脚本(当然,除非你手动从core_resource表中删除该记录)。所以,如果想更改表结构,可以创建一个升级脚本(upgrade script)。升级脚本和安装脚本非常类似,不同之处也会在下文中一一提到。

File: app/code/local/test/subscribe/sql/test_subscribe/upgrade-1.0.0-2.0.0.php:
echo 'Testing our upgrade script (mysql4-upgrade-0.1.0-0.2.0.php) and halting execution to avoid updating the system version number <br />';
<span style="color: #ff0000;">die();</span>

可以看到,升级脚本与安装脚本都在同样的文件夹中,命名方式稍有不同。最明显的是,升级脚本中包含upgrade。其次,包含两个版本号,用“-”分隔开。第一个版本号(0.1.0)是我们要升级的模块的版本号。第二个(0.2.0)是当前模块要升级到的版本号。

清空Magento缓存,访问任意页面,可以看到脚本并不会运行。我们需要更新配置文件中的版本号来促发更新脚本。

   <modules>
        <Test_Subscribe>
            <version>2.0.0</version>
        </Test_Subscribe>
    </modules>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迁就i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值