Magento 1.7 - Web应用程序外的脚本中的getModel失败

时间:2013-01-18 13:39:34

标签: magento magento-1.7

<global>
    <models>
        <starmall_shipment>
            <class>Starmall_Shipment_Model</class>
            <resourceModel>starmall_shipment_mysql4</resourceModel>
        </starmall_shipment>

        <starmall_shipment_mysql4>
            <class>Starmall_Shipment_Model_Mysql4</class>
            <entities>
                <shipment>
                    <table>starmall_shipment</table>
                </shipment>             
            </entities>
        </starmall_shipment_mysql4>
    </models>
</global>

后端的自定义网格正常工作,我看到网格中有数据 作为我在_prepareCollection中的Grid.php中的调试测试:

    $x = Mage::getModel('starmall_shipment/shipment');
    $x->load(3);

    var_dump($x);  // WORKS and I get information

当我在独立脚本中运行它时:

<?php
    define("MAGE_BASE_DIR", "/home/users/xxx/xxx");
    require_once MAGE_BASE_DIR . '/app/Mage.php';
    Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

    $x = Mage::getModel('starmall_shipment/shipment');
        $x->load(3);

    var_dump($x);   
?>

我看到了这个错误:

No such file or directory  in /home/users/xxx/xxx/lib/Varien/Autoload.php
Failed opening 'Mage/Starmall/Shipment/Model/Shipment.php'

为什么它会在模型​​前添加Mage? 我的配置有什么问题?


添加信息:

/app/etc/Starmall_Shipment.xml

<config>
<modules>
    <Starmall_Shipment>
        <active>true</active>
        <codePool>local</codePool>
    </Starmall_Shipment>
</modules>


真正的问题(可能)

我的Magento托管服务提供商在安装Magento时将此标记默认为int /app/etc/local.xml

<cache>
  <backend>memcached</backend>
  <memcached>
    <servers>
      <server>
        <host>unix:///path/to/memcached.sock</host>
        <persistent>0</persistent>
        <port>0</port>
      </server>
    </servers>
  </memcached>
</cache>

如果我对此标记发表评论,那么我不需要在我的脚本中使用loadModules() 我想知道在进入生产模式时是否需要重新启用它?

7 个答案:

答案 0 :(得分:4)

了解Magento cron的工作原理 - 它也可作为独立脚本(cron.php)和复制粘贴代码到您的自定义模块。 主要内容:

 require 'app/Mage.php';
 ...
 Mage::getConfig()->init()

似乎模块没有加载 尝试在init config之后添加:

Mage::getConfig()->loadModules();

答案 1 :(得分:1)

  

为什么它会在模型​​前面添加Mage?我的配置有什么问题?

要查看发生这种情况,请查看Mage_Core_Model_Config::getGroupedClassName()

    if (empty($className)) {
        if (!empty($config)) {
            $className = $config->getClassName();
        }
        if (empty($className)) {
            $className = 'mage_'.$group.'_'.$groupType;
        }
        if (!empty($class)) {
            $className .= '_'.$class;
        }
        $className = uc_words($className);
    }

这可能意味着两件事之一:

  1. 找不到$config节点(global/models/starmall_shipment
  2. 该节点没有classmodel子节点,或者它是空的
  3. 在你的情况下它看起来像(1),所以问题仍然存在,为什么你的配置没有加载。您确信配置本身是正确的,因此问题必须是模块未加载。

    您可以发布app/etc/modules的模块声明文件吗?

答案 2 :(得分:0)

它是Mage的前置,因为它是核心目录之一。在我的服务器中,我将/ var / www / app / code / core / Mage /视为可导航的路径。

将您的独立脚本放在mage base目录中,并在“开头”使用以下代码

<?php
   require_once 'app/Mage.php';
   Mage::app('admin'); 

希望这足以让您的magento启动并运行,然后您就可以找出路径不按预期方式运行的原因。

答案 3 :(得分:0)

检查商店是否启用了编译模式(系统 - >工具 - >编译)。如果是,则重新运行编译过程

答案 4 :(得分:0)

您应该在<global>中的config.xml标记

下定义您的模型
<global>    
    <models>
        <starmall_shipment>
            <class>Starmall_Shipment_Model</class>
            <resourceModel>starmall_shipment_mysql4</resourceModel>
        </starmall_shipment>

        <starmall_shipment_mysql4>
            <class>Starmall_Shipment_Model_Mysql4</class>
            <entities>
                <shipment>
                    <table>starmall_shipment</table>
                </shipment>             
            </entities>
        </starmall_shipment_mysql4>
    </models>
</global>   

因为您是从模块外部访问的。

答案 5 :(得分:0)

问题确实存在于app/etc/local.xml中,但不应通过调用Mage::app()->loadModules()来解决。

真正的问题是某人(最有可能用于调试目的)禁用了本地模块。

只需更改

<disable_local_modules>true</disable_local_modules>

<disable_local_modules>false</disable_local_modules>
app/etc/local.xml中的

答案 6 :(得分:0)

CarComp在添加后写入   法师::应用程序(&#39;管理&#39;);
该   Mage :: getConfig() - &gt; init()就像魅力一样。