如何为您的模块使用安装脚本?


22

我知道,您可以通过在如下<global>空间中的模块的etc / config.xml文件中声明安装脚本来为自己的模块使用安装脚本:

<resources>
    <catalog_setup>
        <setup>
            <module>Mage_Catalog</module>
            <class>Mage_Catalog_Model_Resource_Setup</class>
        </setup>
    </catalog_setup>
</resources>

然后,某些模块使用文件,mysql4-install-0.0.1.php而其他模块使用install-0.0.1.php。因此,何时在文件名前使用mysql4,何时不使用它?

另外,当我的安装脚本未运行时该怎么办才能找出原因呢?


1
确保删除core_resource表中的条目以再次运行设置。
Rick Kuipers 2013年

除了其他答案之外,阅读magentocommerce.com/images/uploads/RDBMS_Guide2.pdf也可能很有趣。它来自核心团队,描述了1.6版所做更改背后的想法。我认为,不仅知道有什么改变了,也是为什么。
Celldweller

Answers:


21

从Magento 1.6及更高版本开始,由于添加了多RDBMS支持,因此不再需要使用mysql4。

要查明为什么它没有运行,您可以检查exception.log或system.log,也许Magento找不到您的安装程序类。创建安装脚本非常简单。

还要查看Alan Storm的指南:http : //alanstorm.com/magento_setup_resources


11

自@erfan saif以来,magento从1.6开始获得了多rdbms支持。但是在现实世界中,我只知道mysql后端。

重要的是要了解,magento可以针对不同的后端具有不同的安装/升级/数据脚本。如果要使用mysql支持但不支持标准SQL的特殊索引类型,则可以实现mysql4-install-1.0.0.php脚本。如果您的脚本是通用脚本,请使用install-1.0.0.php

如果看一下Mage_Core_Model_Resource_Setup,我会发现两个有趣的事情:

  1. 您可以命名文件(%s-)%s-VERSION。(php | sql)
  2. 如果您有两个安装脚本(但使用数据脚本,则是相同的(app / code / core / Mage / Core / Model / Resource / Setup.php:520))magento比通用脚本更喜欢专用脚本(作为一个)会)

应用程序/代码/核心/法师/核心/模型/资源/Setup.php:488

$regExpDb   = sprintf('#^%s-(.*)\.(php|sql)$#i', $actionType);
$regExpType = sprintf('#^%s-%s-(.*)\.(php|sql)$#i', $resModel, $actionType);

while (false !== ($file = $handlerDir->read())) {
    $matches = array();
    if (preg_match($regExpDb, $file, $matches)) {
        $dbFiles[$matches[1]] = $filesDir . DS . $file;
    } else if (preg_match($regExpType, $file, $matches)) {
        $typeFiles[$matches[1]] = $filesDir . DS . $file;
    }
}
[...]
foreach ($typeFiles as $version => $file) {
    $dbFiles[$version] = $file;
}

请注意,如果您命名脚本.sql,则会直接将其调用到数据库中:

// app/code/core/Mage/Core/Model/Resource/Setup.php:621
switch ($fileType) {
    case 'php':
        $conn   = $this->getConnection();
        $result = include $fileName;
        break;
    case 'sql':
        $sql = file_get_contents($fileName);
        if (!empty($sql)) {

            $result = $this->run($sql);

另外,当我的安装脚本未运行时该怎么办才能找出原因呢?

我更喜欢在安装/升级文件的开头添加die('sadf'),因为如果调用它,则可以多次运行它,因此在更改任何内容之前,我可以检查一下我设置的所有变量是否正确。数据库。如果我在屏幕上看到“ sadf”,我知道脚本正在运行。

我magento加载(而不是sadf),是时候进行调试了,我的两个标准错误是:

  1. 我忘记将脚本添加到配置中
  2. 我有sql/忘记的目录,例如sql/install-1.0.0.php而不是sql/my_module_setup/install-1.0.0.php

并且因为我认为它适合此处,所以请谨慎使用变量名:http : //blog.fabian-blechschmidt.de/articles/file-kills-setup-script.html

UPDATE @ rouven-rieker通过Twitter添加,在magento 1.6中添加了数据和缺少的mysql4-。如果需要向后兼容,请小心!


3

如果脚本未运行,则还应检查模块版本是否与安装脚本的版本匹配。

<modules>
    <Your_Module>
        <version>0.0.1</version>
    </Your_Module>
</modules> 

1

如果您的脚本未运行,请在core_resource和刷新缓存中重置版本号。Magento似乎会提前缓存版本,当启用所有缓存时,它会错过运行安装脚本的机会。因为我们都在禁用缓存的情况下工作,所以我们可能不会注意到这一点,但是如果启用了缓存,则无法通过上传在Live网站上进行安装。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.