SOLVED Я решил эту проблему с помощью Джонатана Хасси, я изменил эту строку:
$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();
У вас есть идеи, как это исправить?
EDIT содержимое файла вкладки шаблона администратора:
<?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>';
Отладка backtrace после строки $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
При работе с коллекциями вы должны передавать аргументы в ->load()
если вы хотите, чтобы SQL для этой коллекции был зарегистрирован или выведен. Если вы не хотите, чтобы коллекция возвращала все элементы, вы можете вытащить ->getSelect()
объект из коллекции с помощью ->getSelect()
и фильтровать со стандартными методами Zend таким образом.
Если вы отследите свою команду коллекции, вы увидите, что вы передаете аргумент, в котором echo выводит сборник 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;
Это то, что отправляет заголовки в вашем случае. Удалите аргумент из ->load()
или передайте false, и он должен исправить вашу проблему.