我的Magento扩展安装脚本无法运行

时间:2011-01-17 20:28:06

标签: php magento attributes installation install

我正在尝试为我的扩展程序创建安装脚本,由于某种原因,它不会安装脚本。扩展名将显示在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();

这里有什么显而易见的东西,这就是脚本无法运行的原因吗?

8 个答案:

答案 0 :(得分:71)

完成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.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的逻辑并弄清楚为什么该类不包含您的安装程序文件。

答案 1 :(得分:14)

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

设置可能需要半天时间,但Magento的实时调试是学习和理解代码的最佳方式。帮自己一个忙,立即投资。

答案 2 :(得分:13)

当我遇到这个问题时,我不得不禁用缓存。无论出于什么原因,仅仅冲洗它都无济于事。

答案 3 :(得分:3)

根据Magento Knowledgebase,您可以尝试在<class>中添加<setup>标记。这样,您可以确保使用正确的设置模型,并且(如果它到达那里)将模型传递给您的安装脚本,无需手动创建$setup

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

答案 4 :(得分:3)

您可以登录Magento whcih模块加载以及加载该模块的版本:

  1. 转到@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.activity_main); Thread thread=new Thread(new Runnable() { @Override public void run() { try{ URL url=new URL("http://www.thehindu.com/news/cities/bangalore/?service=rss"); XmlPullParserFactory factory=XmlPullParserFactory.newInstance(); factory.setNamespaceAware(false); XmlPullParser xPP=factory.newPullParser(); xPP.setInput(getInputStream(url), "UTF-8"); boolean insideItem=false; int eventType=xPP.getEventType(); while(eventType!=XmlPullParser.END_DOCUMENT){ if(eventType==XmlPullParser.START_TAG){ if(xPP.getName().equals("item")){ insideItem=true; }else if(xPP.getName().equals("title")){ if(insideItem){ Headlines.add(xPP.getText()); Log.d("RSS Feed1",xPP.getText()); } }else if(xPP.getName().equals("link")){ if(insideItem){ links.add(xPP.getText()); Log.d("RSS Feed2", xPP.getText()); } } }else if(eventType==XmlPullParser.END_TAG && xPP.getName().equalsIgnoreCase("item")){ insideItem=false; } xPP.next(); } MainActivity.this.runOnUiThread(new Runnable() { @Override public void run(){ ArrayAdapter adapter=new ArrayAdapter(MainActivity.this,R.layout.content_main,Headlines); setListAdapter(adapter); } }); }catch (MalformedURLException e){ e.printStackTrace(); }catch(XmlPullParserException e){ e.printStackTrace(); }catch(IOException e){ e.printStackTrace(); } } }); thread.start(); }
  2. 转到功能app/code/core/Mage/Core/Model/Resource/Setup.php
  3. 在函数结束时写:

    __construct()

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

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

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

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

问题是,我们在几周之前安装了一个较新版本的模块,由于与其他模块的冲突也导致了错误,所以我们从数据库备份中部分转回了一些表格,我们也放回了旧文件。一切都恢复了,

当我们尝试重新更新模块时,该模块现在与其他扩展兼容(冲突被删除),sql更新脚本将无法运行。

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

我们手动将版本号更改为较低版本,繁荣,升级脚本已启动,一切正常!

答案 7 :(得分:0)

确保检查您的app / etc / modules文件,确保模块的名称准确无误并且准确指定了代码池。