Modèle non enregistré dans la base de données
-
12-12-2019 - |
Question
J'ai un modèle appelé Warehouses et un autre appelé Warehouse Products qui est associé.Le problème que j'ai est que Warehouse Products n'enregistre pas, malgré son save()
la fonction étant enveloppée dans un try-catch qui ne produit aucun problème.
try {
$model->save();
$session->addSuccess($this->__('The product has been saved.'));
$this->_redirect('*/*/');
return;
} catch (Mage_Core_Exception $e) {
$session->addError($e->getMessage());
} catch (Exception $e) {
$session->addError($this->__('An error occurred while saving this product.'));
}
Si j'utilise le modèle pour renvoyer la table, j'obtiens ce qui suit :
$model->getResource()->getTable();
// Can't retrieve entity config
Cela suggère évidemment qu'il y a quelque chose qui ne va pas avec ma configuration -
<inventorymanagement>
<class>CompanyName_InventoryManagement_Model</class>
<resourceModel>inventorymanagement_resource</resourceModel>
</inventorymanagement>
<inventorymanagement_resource>
<class>TheGenieLab_InventoryManagement_Model_Resource</class>
<entities>
<warehouse>
<table>inventorymanagement_warehouse</table>
</warehouse>
<warehouse_product>
<table>inventorymanagement_warehouse_product</table>
</warehouse_product>
</entities>
</inventorymanagement_resource>
La rubrique ressources :
<resources>
<inventorymanagement_setup>
<setup>
<module>TheGenieLab_InventoryManagement</module>
</setup>
</inventorymanagement_setup>
</resources>
Mes fichiers sont disposés comme ci-dessous :
- Resource
- Warehouse
- Product
- Collection.php
- Collection.php
- Product.php
- Warehouse.php
- Warehouse
- Product.php
- Warehouse.php
Y a-t-il autre chose que je dois faire ?
MODIFIER
Voici un code supplémentaire
Entrepôt > Produit.php
class CompanyName_InventoryManagement_Model_Warehouse_Product extends Mage_Core_Model_Abstract
{
protected function _construct()
{
$this->_init('inventorymanagement/warehouse_product');
}
}
Ressource > Entrepôt > Product.php
class CompanyName_InventoryManagement_Model_Resource_Warehouse_Product extends Mage_Core_Model_Mysql4_Abstract
{
protected function _construct()
{
$this->_init('inventorymanagement/warehouse_product', 'id');
}
}
Ressource > Entrepôt > Produit > Collection.php
class CompanyName_InventoryManagement_Model_Resource_Warehouse_Product_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
protected function _construct()
{
$this->_init('inventorymanagement/warehouse_product');
}
}
La solution
Je l'ai compris.
Avant le $model->save();
J'ai eu ça :
$model = Mage::getModel('inventorymanagement/warehouse_product');
$product = $postData['warehouse_product'];
if (isset($product['id'])) {
$model->load($product['id']);
}
$product['product_id'] = str_replace('product/', '', $product['product_id']);
unset($product['save']);
$model->setData($product);
Le problème était que, comme $product['id'] était défini comme champ masqué sur le formulaire, il était toujours défini ;la vérification d'isset était donc vraie.C'était une économie, mais comme le $model->load()
ce qui se passait, cela n'a permis d'économiser nulle part en particulier.
Pour les méthodes d'addition, j'ai complètement supprimé cette vérification avec l'instruction de chargement, puis j'ai simplement exécuté ceci unset($product['id']);
avant de définir les données.
Tout fonctionne très bien !