Magento modèle->save() ne marche pas de travail
Bonjour mon modèle save() de la fonction ne marche pas. Cache Magento éteint. Mon code ci-dessous:
$newInventory = Mage::getModel('reservation/newinventory');
Mage::log( get_class( $newInventory ) ); //print Apptha_Reservation_Model_Newinventory
$newInventory->setEntityId( $productId );
$newInventory->setRoomTypeId( $roomTypeId );
$newInventory->setRoomsCount( $roomsCount );
$newInventory->setDateFrom( $checkInStamp );
$newInventory->setDateTo( $checkOutStamp );
$newInventory->setOrderId( $orderId );
$query = $newInventory->save();
Mage::log( "save query below: " ); //I get this string
Mage::log( $query->toString() ); //return 2012-10-15T06:00:58+00:00 DEBUG (7): 17, 7, 8,
//1349913600, 1349913600, 300000040, 12
C'est mon code\local\Apptha\Reservation\etc\config.xml
<models>
<reservation>
<class>Apptha_Reservation_Model</class>
<resourceModel>reservation_mysql4</resourceModel>
</reservation>
<reservation_mysql4>
<class>Apptha_Reservation_Model_Mysql4</class>
<entities>
<newinventory>
<table>apptha_booking_hotel_newinventory</table>
</newinventory>
</entities>
</reservation_mysql4>
</models>
<resources>
<reservation_setup>
<setup>
<module>Apptha_Reservation</module>
<class>Mage_Catalog_Model_Resource_Eav_Mysql4_Setup</class>
</setup>
<connection>
<use>core_setup</use>
</connection>
</reservation_setup>
<reservation_write>
<connection>
<use>core_write</use>
</connection>
</reservation_write>
<reservation_read>
<connection>
<use>core_read</use>
</connection>
</reservation_read>
</resources>
Ce que je fais de mal? Pourquoi la nouvelle ligne n'apparaît pas dans la db?
Mise à JOUR de 1
Dans mon index.php j'ai
error_reporting(E_ALL ^ E_NOTICE);
//if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
Mage::setIsDeveloperMode(true);
ini_set("display_errors", 1);
//}
Mise à JOUR 2
Mon code\local\Apptha\Reservation\Model\newinventory.php ci-dessous
class Apptha_Reservation_Model_Newinventory extends Mage_Core_Model_Abstract{
protected function _construct(){
$this->_init('reservation/newinventory');
}
}
Mon code\local\Apptha\Reservation\Model\Mysql4\newinventory.php ci-dessous
class Apptha_Reservation_Model_Mysql4_Newinventory extends Mage_Core_Model_Mysql4_Abstract{
protected function _construct(){
$this->_init('reservation/newinventory', 'id');
}
}
Si je n'obtiens des erreurs de Magento. Il ressemble à Magento trouver tous les chemins (modèle, de ressources, etc...) Mais de toute façon ne peut pas enregistrer() mes données.
Mise à JOUR 3
J'ai inséré le code de log de requêtes dans Mysql.php public function query($sql, $bind = array())
$code = 'SQL: ' . $sql . "\r\n";
if ($bind) {
$code .= 'BIND: ' . print_r($bind, true) . "\r\n";
}
Mage::Log("[".date('Y-m-d H:i:s')."] ".$code);
Puis-je obtenir dans le fichier log:
2012-10-15T09:54:31+00:00 DEBUG (7): [2012-10-15 09:54:31] SQL: INSERT INTO
`apptha_booking_hotel_newinventory` (`entity_id`, `room_type_id`, `rooms_count`, `date_from`,
`date_to`, `order_id`) VALUES (?, ?, ?, ?, ?, ?)
BIND: Array
(
[0] => 17
[1] => 7
[2] => 8
[3] => 1349913600
[4] => 1349913600
[5] => 300000040
)
J'essaie manuellement exécuter cette requête dans phpmyadmin, Ça fonctionne. Mais Magento peut pas le faire.
Mise à JOUR 4
d'accord. Alors que j'étais debuging ce problème, j'ai écrit supplémentaires testModel action dans le contrôleur essayé de tester la méthode save() de la fonction. Je l'ai vu, Il y a travaillé.
Puis je suis retournée à l'origine, la fonction et découvert quand je fais enregistrer() en dehors de si-bloc puis save() fonctionne très bien. si je fais save() à l'intérieur si-bloc,alors il ne fonctionne pas.
Je journal d'une chaîne de caractères à l'intérieur de si-bloc et assurez-vous que, de l'exécution de rentrer à l'intérieur si-bloc. Donc en fait la question de savoir pourquoi la save() ne fonctionne pas à l'intérieur si le bloc ci-dessous:
if ( $state == "complete" ){
Mage::log('here');
$newInventory = Mage::getModel('reservation/newinventory');
$newInventory->setEntityId(12);
$newInventory->setRoomTypeId(7);
$newInventory->setRoomsCount(8);
$newInventory->setDateFrom(1349913600);
$newInventory->setDateTo(1349913600);
$newInventory->setOrderId(300000040);
$query = $newInventory->save();
die;
}
mais si l'état de la
if ( $state === "processing" )
puis Il fonctionne très bien. Ce code sont en fonction d'observateur lors de statut de la commande est changé. Quand l'admin à faire de la "facture" pour le produit, producr de l'état est modifié à partir de "traitement" à "terminé". Thefore Magento go dans la fonction deux fois. Première fois sur le "traitement" de la save() fonctionne bien, mais sur la "complète" Ça ne fonctionne pas.
- Vous faites mal, vous raconter les étapes à déboguer.
- Alan, quand j'ai créer le modèle que j'ai suivrez les étapes de votre blog. Tout à l'heure C'est mon propre modèle de impore de l'extension. J'ai écrit le code ci-dessus, mais ne peut pas comprendre pourquoi Ça ne fonctionne pas.
- Les gens ont besoin de plus d'informations que "ça ne fonctionne pas" pour vous aider.
- vous comprendre. J'ai tourné sur display_errors et error_reporting. Mais je n'ai vraiment pas obtenir toutes les erreurs de Magento. Et C'est étrangler.
- un peu en retard à la fête, mais si le PK de votre table n'est pas automatique incrémentielle, vous devez ajouter
$this->_isPkAutoIncrement = false;
dans votre modèle de ressources de la construction. Sinon, enregistrez-le() ne fonctionnera pas en mode silencieux. source: watson-net.com/blog/magento-database-model-primary-keys - c'était vraiment utile, je n'aurais jamais pu le comprendre, cela a fonctionné pour moi, merci pour le partage!
- Merci beaucoup. J'étais à la recherche depuis plus de deux heures. Votre solution fonctionne parfaitement et +1
Vous devez vous connecter pour publier un commentaire.
Donc le problème est dans l'interne Magento traitement. J'ai passé 1 journée à le comprendre.
Mais Arrêter maintenant et résolu en utilisant un autre observateur d'événements sales_order_save_commit_after où j'ai chèque à l'ordre de l'état est complété et utiliser la méthode save() de la fonction. Et bien sûr, ici, Il fonctionne très bien.
J'ai un peu de sérieux doutes quant à l' $newInventory contient votre modèle. Vous déclarez entité hotel_newinventory dans config.xml mais en essayant de charger l'entité newinventory. Vous pouvez vérifier cela de cette façon:
Si je suis à droite et le résultat n'est pas votre modèle de classe, essayez de modifier la ligne suivante
à
vous pouvez également persister modèles avec le "sales_order_place_after" (pas besoin d'utiliser "sales_order_save_commit_after") de l'Événement.
Vous juste ne pouvez pas arrêter l'exécution en raison de la transaction sql n'est pas finie "sales_order_place_after" rien ne peut être écrit directement, mais plus tard, lorsque la transaction s'est engagé à la base de données.
espère que cela aide quelqu'un.