【问题标题】:My Magento Extension Install Script Will Not Run我的 Magento 扩展安装脚本将无法运行
【发布时间】:2011-01-17 20:28:05
【问题描述】:

我正在尝试为我的扩展程序创建一个安装脚本,但由于某种原因它不会是安装脚本。扩展将显示在 core_resource 表中,但我尝试创建的属性不会创建。

我很确定脚本甚至没有被调用,因为我在开头放了一个 exit() 并且网站运行得很好。

这是我的配置 XML 文件中的内容。这被放置在全局 -> 资源路径中:

<nie_setup>
    <setup>
        <module>Nie_Nie</module>
    </setup>
    <connection>
        <use>core_setup</use>
    </connection>
</nie_setup>

我的安装脚本如下:

$installer = $this;
$setup = new Mage_Eav_Model_Entity_Setup('core_setup');
$installer->startSetup();

$setup->addAttribute('customer', 'nie_admin', array(
    'input'                 => 'text',
    'type'                  => 'text',
    'backend'               => '',
    'visible'               => 0,
    'required'          => 0,
    'user_defined'  => 1,
));

$installer->endSetup();

我在这里遗漏了什么明显的东西是脚本无法运行的原因吗?

【问题讨论】:

  • 请公布安装脚本的位置
  • /app/code/local/Nie/Nie/sql/nie_setup/mysql4-install-0.0.1.php
  • 确保 中模块名称的大小写与资源配置中的 大小写相同。我自己也遇到了这个问题。

标签: php magento attributes installation


【解决方案1】:

通过this article 确保您对设置资源的作用、它们的工作方式以及如何排除故障没有任何误解。

一旦你这样做了,从你在这个问题线程上所说的一切来看,听起来你正在“安装”你的资源,但你的安装脚本永远不会运行。我的猜测是您在

中使用的版本号
//0.0.1 is your version number
mysql4-install-0.0.1.php

与您的模块版本不匹配

<modules>
    <Nie_Nie>
        <version>?.?.?</version>
    </Nie_Nie>
</modules>

这些应该匹配脚本才能运行。我认为 Magento 足够聪明,可以在找到以前的版本时运行它们,但是设置资源中的代码很难理解,所以我总是确保它们匹配。

无论如何,您可以通过以下方式查看 magento 在运行您的设置资源时尝试运行的文件。从core_resource 中删除与您的模块相关的所有条目。清除缓存。然后在setup类中找到如下位置

app/code/core/Mage/Core/Model/Resource/Setup.php

protected function _modifyResourceDb($actionType, $fromVersion, $toVersion)
{
    ... 

    $sqlFilesDir = Mage::getModuleDir('sql', $modName).DS.$this->_resourceName;        

    if (!is_dir($sqlFilesDir) || !is_readable($sqlFilesDir)) {
        return false;
    }

    ...

    $sqlDir->close();

    if (empty($arrAvailableFiles)) {
        return false;
    }

    ...

    $arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles);
    if (empty($arrModifyFiles)) {
        return false;
    }

然后修改它们,添加一些临时调试异常

    if (!is_dir($sqlFilesDir) || !is_readable($sqlFilesDir)) {
        throw new Exception("$sqlFilesDir not found");
        return false;
    }

    ...

    if (empty($arrAvailableFiles)) {
        throw new Exception("No files found to run");
        return false;
    }

    ...

    $arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles);
    if (empty($arrModifyFiles)) {
        throw new Exception("No valid upgrade files found to run for ");
        return false;
    }

    throw new Exception("If you're getting here, we have a file.  Remove your exceptions here and place one in your installer to make sure it's the one you think it is.");

重新加载页面,您将收到异常文本,抱怨 Magento 找不到的任何内容。这应该足以帮助您跟踪 Magento 正在尝试运行但未能找到的安装程序脚本。请记住删除core_resource 中的模块行并清除缓存。 (Magento 缓存哪些模块需要检查安装/升级)

如果这不起作用,请开始深入研究 applyAllDataUpdates 的逻辑并找出该类不包含您的安装程序文件的原因。

【讨论】:

  • 您的调试方法告诉我,我的脚本在错误的目录中。非常感谢!我可以继续工作一天!
  • 很好的答案,艾伦。难道你不认为应该有一个严格的模式,如果你尝试设置某些东西并且设置不正确,你可以告诉 Magento 向你抱怨吗?升级脚本、路由、主题,有很多东西在你第一次设置时很难设置,如果能让 Magento 专门向你抱怨问题所在,那就太好了。我认为这样做的模块会很棒。
  • 我同意 sparcksoft 关于 Magento 无声无息地失败的观点,即使是日志文件的条目也值得付出努力。我仍然不喜欢 Magento 如何在没有某种校验和的情况下盲目地安装任何匹配的东西。另外,如果您只是在更新/安装上执行原始 SQL,大多数人都没有意识到您可以使用 .sql 而不是 .php 作为安装文件的提示。
  • 不要忘记清除 Magento 缓存。即使我们知道应该这样做,但通常会忘记它!
  • @PratikCJoshi 本文提供了有关如何在更现代的 Magento 版本中跟踪完整路径的信息。 vinaikopp.com/2014/11/03/magento-setup-scripts
【解决方案2】:

当我遇到这个问题时,我实际上不得不禁用缓存。无论出于何种原因,仅仅冲洗它并没有帮助。

【讨论】:

  • 在mateyyy上现货
【解决方案3】:

追踪此错误的最简单和最有用的方法是到setup your IDE to debug Magento 并在您的mysql4-install-0.0.1.php 中设置断点。如果断点没有被命中,那么您就知道问题是否在您的 XML 配置中。如果断点确实被命中,您可以通过代码跟踪找到错误的来源。

设置可能需要半天时间,但 Magento 的实时调试是迄今为止学习和理解代码的最佳方式。帮自己一个忙,现在就进行投资。

【讨论】:

  • 应该注意,如果代码库使用垃圾 IonCube zend 模块(许多设计不佳的第三方模块需要),则无法进行实时调试。
【解决方案4】:

根据Magento Knowledgebase,您可以尝试在&lt;setup&gt; 中包含&lt;class&gt; 标签。通过这种方式,您可以确保使用正确的安装模型,并且(如果它达到那么远)将该模型传递给您的安装脚本,从而无需手动创建 $setup

检查安装脚本的文件权限及其所在目录。有时我发现从core_resources 删除记录也有助于启动该过程。

【讨论】:

    【解决方案5】:

    您可以检查加载了哪些模块以及加载了该模块的哪个版本的 Magento:

    1. 转到app/code/core/Mage/Core/Model/Resource/Setup.php
    2. 转到函数__construct()
    3. 函数写入结束:

      Mage::log($modName); Mage::log($this->_moduleConfig);

    它将记录所有加载有版本号的模块。在这里您可以检查您的模块是否已加载。

    【讨论】:

      【解决方案6】:

      您应该将模块的版本向上更改一点,以执行更新脚本。

      <modules>
          <Nie_Nie>
              <version>1.5.0.0</version>
          </Nie_Nie>
      </modules>
      

      如果此版本等于core_resources 中的资源版本,则不会执行表升级脚本。并且版本应该与升级脚本的名称匹配

      【讨论】:

      • 我尝试更改版本号并没有运行脚本。它只是更改了 core_resources 表中的版本号。
      • 一些更明显的问题:你的升级脚本在 sql/nie_setup 目录中吗?你的模块目录是 app/code/local/Nie/Nie?
      【解决方案7】:

      我们的商店http://www.looxis.de也遇到了同样的问题 为了更新我们正在使用的扩展,我们通过 FTP 传输了所有文件,但数据库在清除缓存后不会自行更新。所以更新后的扩展无法运行,我们无法登录后端。

      寻找解决方案,我们找到了这个页面。

      问题是,我们在几周前安装了更新版本的模块,由于与其他模块的冲突也产生了错误,所以我们从数据库备份中部分调回了一些表,我们还放回了旧文件。一切都恢复正常了,

      当我们尝试新更新模块时,该模块现在与其他扩展兼容(冲突已消除),sql 更新脚本不会运行。

      这是由于表“core_resources”造成的。在那里,模块版本号被设置为我们几周前安装的最新版本 - 所以 magento 不会识别出新的更新已经再次执行,它假定最新版本已经存在。

      我们手动将版本号更改为较低的版本,然后砰,升级脚本启动,一切正常!

      【讨论】:

        【解决方案8】:

        请务必检查您的 app/etc/modules 文件,确保您的模块名称准确且代码池指定准确。

        【讨论】:

          猜你喜欢
          • 2014-08-26
          • 1970-01-01
          • 2011-06-19
          • 1970-01-01
          • 1970-01-01
          • 2015-04-01
          • 1970-01-01
          • 2018-07-09
          • 1970-01-01
          相关资源
          最近更新 更多