【问题标题】:Can't find Custom Database Table in Magento在 Magento 中找不到自定义数据库表
【发布时间】:2012-01-05 17:42:38
【问题描述】:

我创建了一个自定义模块,用于创建自定义数据库表。为了创建自定义数据库表,我一直在关注 Alan Storm 的教程 http://alanstorm.com/magento_setup_resourceshttp://alanstorm.com/magento_models_orm

我的模块条目显示在 core_resource 表中,但实际没有显示。

这是我的 config.xml 代码

<?xml version="1.0"?>
<config>
 <modules>
    <Ajzele_SimpleModel>
        <version>0.0.1</version>
    </Ajzele_SimpleModel>
</modules>
<global>

  <models>
   <simplemodel>
     <class>Ajzele_SimpleModel_Model</class>
     <resourceModel>simplemodel_mysql4</resourceModel>      
   </simplemodel>

   <simplemodel_mysql4>
     <class>Ajzele_SimpleModel_Model_Mysql4</class>
      <entities>
          <simplemodel>
                  <table>simplemodel</table>
           </simplemodel>
       </entities>                
   </simplemodel_mysql4>  

 </models>

 <resources>
        <simplemodel_setup>
            <setup>
                <module>Ajzele_SimpleModel</module>
       <class>Ajzele_SimpleModel_Model_Mysql4_Setup</class>
            </setup>

            <connection>
                <use>core_setup</use>
            </connection>

        </simplemodel_setup>

        <simplemodel_read>
            <connection>
                <use>core_read</use>
            </connection>
        </simplemodel_read>  

        <simplemodel_write>
            <connection>
                <use>core_write</use>
            </connection>
        </simplemodel_write>  

</resources>        
</global>    
    </config>

而我的模型文件结构是

   Model
     SimpleModel.php
     Mysql4
       SimpleModel.php
       Setup.php
       SimpleModel
          Collection.php

这是我的 sql/simplemodel_setup/mysql4-install-0.0.1.php 的内容

     <?php

    $installer = $this;

   $installer->startSetup();

   $baseTableName = 'simplemodel';

   $sql = "
   SET FOREIGN_KEY_CHECKS=0;
   -- ----------------------------
   -- Table structure for `simplemodel`
   -- ----------------------------
   DROP TABLE IF EXISTS {$this->getTable($baseTableName)};
   CREATE TABLE {$this->getTable($baseTableName)} (
    `simplemodel_id` int(11) NOT NULL AUTO_INCREMENT,
    `field1` varchar(255) DEFAULT NULL,
    `field2` varchar(255) DEFAULT NULL,
     PRIMARY KEY (`simplemodel_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ";

    $installer->run($sql);

    $installer->endSetup();

我尝试了各种调试方法,但没有得到任何异常或错误。我应该怎么做才能让我的表格真正显示在数据库中?

【问题讨论】:

  • 这里没有足够的信息。我们至少需要您的sql/ 文件夹的内容。
  • 我已经编辑了这个问题。请看一下,如果有帮助,请告诉我。
  • 删除core_resource 表中的条目以再次运行安装脚本。
  • 如果我从 core_resource 表中删除条目并重新加载页面,我会收到错误消息。错误报告将此作为第一行“/home/atsdev/public_html/app/code///sql/simplemodel_setup not found”

标签: php zend-framework magento


【解决方案1】:

我建议您将 Magento 置于开发者模式并调试 XML 的跟踪以检查 XML。要在开发人员模式下配置 Magento,您应该将变量 MAGE_IS_DEVELOPER_MODE 放在虚拟主机的定义中或 Magento 根目录的 .htaccess 中。 例如在虚拟主机中:

<VirtualHost *:80>
   DocumentRoot "C:\Program Files\Zend\Apache2/htdocs/local.pruebas.com"
   ServerName local.pruebas.com
   DirectoryIndex index.html index.php index.htm
   SetEnv MAGE_IS_DEVELOPER_MODE "1"    
   <Directory "C:\Program Files\Zend\Apache2/htdocs/local.pruebas.com">
       AllowOverride All
       Options All
       Order allow,deny
       Allow from all
   </Directory>

稍后你应该在第 66 行修改 index.php 并放入

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
Varien_Profiler::enable();
    Mage::setIsDeveloperMode(true);
    ini_set('display_errors', 1);
 }

Varien_Profiler::enable();和 ini_set('display_errors', 1);没有条件我认为是错误的。 现在,当 XML 中有错误时,您看不到 simplexml_load_string() 错误:

警告:simplexml_load_string() [function.simplexml-load-string]:实体:第 4 行:解析器错误:解析 C:\Program Files\Zend\Apache2\htdocs\local.pruebas.com\lib 中的属性名称时出错\Varien\Simplexml\Config.php 在第 510 行......

然后,是时候调试了 1.first:进入app/etc/Ajzele_SimpleModel并强制报错,例如:

<config>
     <modules>
        <Ajzele_SimpleModel <!--remove a '>' to force an error-->
           <active>true</active>
           <codePool>local</codePool>
        </Ajzele_SimpleModel>
     </modules>
</config>

您应该会看到错误。

2.second:进入app/code/local/Ajzele/SimpleModel/etc/config.xml,重试该过程

<config>
    <modules>
      <Ajzele_SimpleModel <!-- remove a '>' to verify that you load correctly your extension 
          <version>0.0.1</version>
      </Ajzele_SimpleModel>
    </modules>
    <global>

      <models>
          <simplemodel>
               <class>Ajzele_SimpleModel_Model</class>
                  <resourceModel>simplemodel_mysql4</resourceModel>      
          </simplemodel>
      </models>
     </global>
 </config>

如果此时您没有简单的 xml 错误,则说明您没有正确加载您的扩展,下一步是调试和调试 config.xml

这不是一个具体的答案,但我认为你可以看到这个解决方案。 谢谢,对不起我的英语

【讨论】:

  • 试过你的调试方法,但它只是说当我的脚本在 sql/simplemodel_setup 文件夹中时它找不到我的安装程序脚本。关于为什么找不到我的安装程序脚本的任何想法?
【解决方案2】:

你能不能试着这样定义:

<resources>
        <selo_modulo1_setup>
            <setup>
                <module>Selo_Modulo1</module>
            </setup>
        </selo_modulo1_setup>
    </resources>

然后放入你的module/sql/selo_modulo1_setup/install-1.6.0.0.php,以及安装脚本的例子:

<?php
die('All right');

/* @var $installer Mage_Core_Model_Resource_Setup */
$installer = $this;
$installer->startSetup();
/**
 * Create table 'poll'
 */
$table = $installer->getConnection()
    ->newTable($installer->getTable('selo_modulo1/blog_post'))
    ->addColumn('post_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
        'identity'  => true,
        'unsigned'  => true,
        'nullable'  => false,
        'primary'   => true,
        ), 'Post Id')
    ->addColumn('title', Varien_Db_Ddl_Table::TYPE_TEXT, 255, array(
        ), 'Post title')
    ->addColumn('content', Varien_Db_Ddl_Table::TYPE_TEXT, 1024, array(
        ), 'Post content')
    ->setComment('Blog_post');//Comentario de la tabla.
$installer->getConnection()->createTable($table);

$installer->endSetup();

为了不犯错误,我的扩展协议是将代码复制/粘贴到核心的类似模块并调整以供我使用。

问候大卫

【讨论】:

  • 所以只需用您的代码更改资源部分和安装程序脚本?但是,由于您提到的表名与我的不同, 是否也需要更改?
【解决方案3】:

在安装脚本的顶部放置一个die(__FILE__); 语句,从core_resources 中删除模块的行,rm -rf var/cache/mage--* 然后在浏览器中访问您的站点,您应该会得到文件名你的文件。如果您确实删除了 die 声明,那么您应该一切顺利。

我的猜测是,当您的文件不包含创建表的代码时,Magento 会运行​​升级。一旦 core_resources 中的版本增加,安装脚本将不会重新运行。

【讨论】:

  • 我试着放置你的骰子(FILE);并从模块中删除了该行,但我只是得到一个错误页面,报告说它找不到我的 simplemodel_setup。
  • 你的安装类是否一定有类名 Ajzele_SimpleModel_Model_Mysql4_Setup 并且位于 app/code/local/Ajzele/SimpleModel/Model/Mysql4/Setup.php?
  • 是的,它有正确的类名和正确的位置。我想开始创建一个模块 n 从而使用不同的模块名称一步一步地重新创建表。只是为了确保我没有错过任何东西。然后必须创建 Setup.php 吗?
  • 是的,据我记得这是强制性的,尽管我认为在较新的版本中它被重命名为 Model/Resource/Setup.php。由于您应该继承核心设置类,您需要检查您的 Magento 版本是否位于 app/code/core/Mage/Core/Model/Resource/Setup.php 或 app/code/core/Mage /Core/Model/Mysql4/Setup.php
  • 符合我的 Magento 版本 (1.6.1) 它应该位于 app/code/core/Mage/Core/Model/Resource/Setup.php 中。除此之外,我只是尝试用不同的名称从头开始创建一个单独的模块。我只创建了其中绝对没有文件的文件夹结构,只是创建了 app/etc/modules/Companyname_Module.xml,清除了我的缓存并刷新了浏览器,但在系统>>配置>>高级中看不到它。这看起来很奇怪,有什么想法吗?
【解决方案4】:

我使用您的结构创建了一个简单的模块,并且设置资源脚本运行正常。您可以看到该模块here。与您的模块进行比较,一旦您在安装程序脚本中抛出异常,就开始逐行调试您的 SQL。

【讨论】:

  • 我确实尝试过逐行调试我的 SQL,并且还在 MySQL 查询窗口中运行了 sql 查询,它运行得非常好。我认为它只是因为某种原因找不到我的安装程序脚本,每次我第一次运行我的模块时都会发生这种情况。在创建新表之前我是否遗漏了任何特定步骤?
  • 我关注了您的文章alanstorm.com/magento_setup_resources,一切都很好,直到您检查升级脚本是否运行正常的步骤。我从来没有收到“正在运行升级......”的消息
  • 另外,如果我从 core_resource 表中手动删除该行,然后添加实际的“CREATE table”脚本并重新加载页面,我会不断收到错误页面。直到我去手动添加该行。但后来我的桌子也没有出现
  • 那么可能的原因是什么,每件事都很好,但它从不运行我的安装程序脚本?或者即使它确实如此,因为我在表中看到我的模块条目,实际的“创建表”SQL 永远不会被执行?
  • 您的任何意见将不胜感激。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多