【问题标题】:Magento 1.7 Cannot send headers; headers already sent inMagento 1.7 无法发送标头;已经发送的标头
【发布时间】:2013-03-27 22:04:12
【问题描述】:

已解决 我在 Jonathan Hussey 的帮助下解决了这个问题 我改变了这一行:

$mModel->getCollection()->load($mId)->getData();

为此:

$mModel->getCollection()->addFieldToFilter('met_id',$Id)->getSelect();

问题
我创建了自定义模块,该模块将选项卡添加到带有附加文本字段的管理产品页面。 当我尝试保存此产品时,我收到此错误:

a:5:{i:0;s:140:"Cannot send headers; headers already sent in /home/nano/domains/mydomain/public_html/gw/lib/Varien/Data/Collection/Db.php, line 693";i:1;s:1630:"#0 /home/nano/domains/mydomain/public_html/gw/lib/Zend/Controller/Response/Abstract.php(148): Zend_Controller_Response_Abstract->canSendHeaders(true)...

我在 Observer.php 中看到了这个错误:

$mId = $collection['m_id'];         
$mModel->getCollection()->load($mId)->getData(); <-- this line give an error

$data['met_id'] = $mId;
$data['product_id'] = $product->getId();
$data['metf1'] = $this->_getRequest()->getPost('f1');
$mModel->setData($data);
$mModel->save();

你有什么想法可以解决这个问题吗?

编辑 管理模板标签文件的内容:

<?php
$product = Mage::registry('current_product');
$mItem = Mage::getModel('mmodel/mmodel')->getCollection()->
addFilter('product_id',$product->getId())->getFirstItem();

echo '<div class="input-field">
 <label for="f1">File</label>
 <input type="text" class="input-text" name="f1" id="f1" value='.$mItem['f1'].' />
</div>';


在 Observer.php 中的 $mModel-&gt;getCollection()-&gt;load($mId)-&gt;getData(); 行之后调试回溯

SELECT `main_table`.* FROM `mmodel` AS `main_table`
    Debug Backtrace:
    File    Line    Function
    /home/nano/domains/mydomain/public_html/gw/app/code/local/GW/MModel/Model/Observer.php  42  printDebugBacktrace
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Core/Model/App.php    1338    saveProductTabData
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Core/Model/App.php    1317    _callObserverMethod
    /home/nano/domains/mydomain/public_html/gw/app/Mage.php 468 dispatchEvent
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Core/Model/Abstract.php   466 dispatchEvent
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Catalog/Model/Product.php 548 _afterSave
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Core/Model/Abstract.php   319 _afterSave
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php   714 save
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Core/Controller/Varien/Action.php 419 saveAction
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php    250 dispatch
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Core/Controller/Varien/Front.php  176 match
    /home/nano/domains/mydomain/public_html/gw/app/code/core/Mage/Core/Model/App.php    354 dispatch
    /home/nano/domains/mydomain/public_html/gw/app/Mage.php 704 run
    /home/nano/domains/mydomain/public_html/gw/index.php    87  run

【问题讨论】:

  • 可能是你在?&gt;标签之后的源文件末尾留下了一些空格,或者你在发送标头之前使用echo命令开始输出。
  • 感谢您的建议。但是我检查了所有模块文件中的空格几次,但没有找到任何空格。也许管理模板是造成这个问题的原因。请看,我编辑帖子。
  • 考虑到 Magento 的 MVC 架构,这是一个奇怪的问题。你能得到完整的堆栈跟踪吗?
  • 可能发生的情况是您在发送标头后尝试运行一些代码。这个错误告诉你的是标题已经从被调用的页面返回,实际上修改它们为时已晚。确保您的代码在函数中调用 header() 之前没有回显或打印。 (堆栈跟踪有助于找到这个)..这就是我得到的不幸..祝你好运。
  • @netme - 我认为这是最可能的解决方案,到目前为止我已经多次遇到过。您可以从所有类/函数文件中删除 ?&gt;,并确保在打开 &lt;?php 之前没有空格(例如,没有 _&lt;?php)

标签: php magento zend-framework magento-1.7


【解决方案1】:

使用集合时,如果您希望记录或输出该集合的 SQL,则应仅将参数传递给 -&gt;load()。如果您不希望集合返回所有项目,您可以使用-&gt;getSelect() 从集合中提取选择对象,并使用standard Zend methods 进行过滤。

如果你追溯你的收集命令,你会看到,因为你传递了一个参数,它回显了收集 SQL。

$mModel->getCollection()->load($mId)->getData();

根据错误信息查看lib/Varien/Data/Collection/Db.php 并找到load() 方法。您将看到它接受两个参数,$printQuery 和 $logQuery,您已将参数传递给 $printQuery。您看到的方法中有几行:

$this->printLogQuery($printQuery, $logQuery);

查看printLogQuery() 方法,您会看到作为 $printQuery 参数传递的任何计算结果为 true 的内容都会根据错误消息触发第 693 行的回显:

echo is_null($sql) ? $this->getSelect()->__toString() : $sql;

这就是在您的情况下发送标头的原因。从-&gt;load() 中删除参数或传递 false,它应该可以解决您的问题。

【讨论】:

  • 您的回答解决了我的问题 :) 谢谢大家的帮助。我无法点击“这个答案很有用”,因为我没有足够的声望点。
  • 不用担心,很高兴您的问题得到了解决。
猜你喜欢
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多