我正在尝试为我的扩展程序创建安装脚本,由于某种原因,它不会安装脚本。扩展名将显示在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();
这里有什么显而易见的东西,这就是脚本无法运行的原因吗?
答案 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模块加载以及加载该模块的版本:
@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();
}
app/code/core/Mage/Core/Model/Resource/Setup.php
在函数结束时写:
__construct()
它将记录所有加载了版本号的模块。在这里,您可以检查模块是否已加载。
答案 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文件,确保模块的名称准确无误并且准确指定了代码池。