1

解決済み 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>';


$mModel->getCollection()->load($mId)->getData();Observer.php から の行の後にバックトレースをデバッグする

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
4

1 に答える 1

4

->load()コレクションを操作するときは、そのコレクションの SQL をログに記録または出力する場合にのみ引数を渡す必要があります。コレクションがすべてのアイテムを返さないようにしたい場合は、コレクションから選択オブジェクトを取得し、標準の Zend メソッドでこのよう->getSelect()にフィルタリングできます。

コレクションコマンドをトレースバックすると、引数を渡すため、コレクションSQLからエコーされることがわかります。

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

lib/Varien/Data/Collection/Db.phpエラーメッセージに従って見て、load()方法を見つけてください。$printQuery$logQueryの 2 つの引数を受け入れることがわかります。引数を$printQueryに渡しました。表示されるメソッドの数行下:

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

printLogQuery()メソッドを見ると、trueと評価される$printQuery引数として渡されたものはすべて、エラー メッセージに従って 693 行でエコーをトリガーすることがわかります。

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

これがあなたのケースでヘッダーを送信しているものです。引数を削除するかfalse->load()を渡すと、問題が解決するはずです。

于 2013-03-28T08:12:30.777 に答える