Es gibt einige Dinge, an denen Sie arbeiten können.
- Da keine Referenz übergeben wird, können Sie mithilfe von zusätzlichem Speicher Objekte übergeben, Arrays können jedoch nicht standardmäßig als Referenz übergeben werden. Oder fügen Sie eine
&
in der Funktion angegebene Parameterdeklaration hinzufunction hello(array &$world)
- Ungültige Schecks, wenn etwas nicht da ist, sofort zurücksenden. Versuchen Sie nicht, etwas zu finden, das nicht da ist
- Die Lesbarkeit kann manchmal schwierig sein
- füge ein paar Dokumente hinzu (damit du verstehst, ob du sie in ein paar Tagen, Monaten oder Jahren siehst)
- Intelligentere
if
Anweisungen, um weniger Einrückungen zu erzielen
- funktionen sollten nur einen zweck haben, den bestand aktualisieren oder die aktualisierung betreffen, nicht beides, also vielleicht sogar einige funktionen in noch kleinere funktionen schneiden. Versuchen Sie, eine solche Logik in Ihrem Kopf zu erstellen und von dort aus zu überarbeiten.
- Werfen Sie einen Blick auf
->cleanModelCache()->clearInstance()
von Mage_Core_Model_Model_Abstract
, um zugrunde liegende Daten für einige Objekte zu löschen und die Dinge zu beschleunigen.
- grob alle anderen Dinge, die bereits gesagt wurden.
Es wurde eine aktualisierte Version Ihres Codes mit einigen Inline-Empfehlungen zu Ihrem aktuellen Code hinzugefügt. Ich könnte ein bisschen weitermachen, aber es würde momentan nicht mehr dazu beitragen.
Funktion 1: Zweck ist das Durchlaufen der Sammlung
/**
* Walk collection
*
* @param Mage_Core_Model_Resource_Db_Collection_Abstract $collection
* @return void
*/
public function functionOne($collection)
{
// ...
// Walk collection, create references instead of passing array data
foreach ($collection as $item) {
// Update stock for product
if (!$this->_functionTwo($item)) {
// Not updated, continue next
continue;
}
// Update related products
$this->_functionThree($item); // Use same object again, no extra memory is used
}
// ...
}
Funktion 2: Zweck ist die Aktualisierung des Bestands bei Änderung
/**
* Update stock item if changed, returns true if updated
*
* @param Mage_Core_Model_Model_Abstract $item
* @return bool
*/
function _functionTwo($item)
{
$model = Mage::getModel('catalog/product');
/** @var $model Mage_Catalog_Model_Product */
$id = $model->getIdBySku($item->getData('sku'));
if (!$id) {
// no id found, so stop looking nothing up
return false;
}
// Get option value for store 1
$inventoryStatus = $model->getResource()
->getAttributeRawValue($id, 'product_inventory_status', 1);
if (!$inventoryStatus) {
// No need for another lookup in db, because the status isn't set
return false;
}
$invStatus = $model->getResource()
->getAttribute('product_inventory_status')
->setStoreId(0) // Get admin value
->getSource()
->getOptionText($inventoryStatus);
if (!$invStatus) {
// No need for another lookup in db, because the status has no text
return false;
}
if ($invStatus === 'Z') {
// Inventory status to not change something
return false;
}
$stockItem = Mage::getModel('cataloginventory/stock_item');
/** @var $stockItem Mage_CatalogInventory_Model_Stock_Item */
// $stockItem->setData(array()); // unneeded piece of code
$stockItem->loadByProduct($id);
if ($stockItem->getQty() == $item->getData('quantity')) {
// Valid stock
return false;
}
// Update stock
$stockItem->setQty($item->getData('quantity'));
$stockItem->save();
// End function and call function three separately, does something else
return true;
}
Funktion 3: Zweck der Aktualisierung zugehöriger Lagerartikel
/**
* Update related stock items, return false if no related items are found
*
* @param Mage_Core_Model_Model_Abstract $item
* @return bool
*/
function functionThree($item)
{
$collectionOfKits = Mage::getModel('kitinventory/kitinventory')
->getCollection()
->addFieldToFilter('related_sku', $item->getData('sku')); // Check if your indexes are set on these columns
if (!$collectionOfKits->getSize()) {
// Nothing found to relate to
return false;
}
$connection = Mage::getSingleton('core/resource')
->getConnection('core_write');
// Walk kits
foreach ($collectionOfKits as $kit) {
// getData is slightly faster then getSku(unless you've implemented it in your model)
// getSku -> __call('getSku') -> get -> lowercase('sku') -> getData('sku') | note, Magento has some internal caching in this
$kitSku = $kit->getData('sku');
$kitCollection = Mage::getModel('kitinventory/kitinventory')
->getCollection()
->addFieldToFilter('kit_sku', $kitSku)
->setOrder('related_sku', 'ASC');
// Use just a fetchAll to create a fast db query
$select = $kitCollection->getSelect();
$select->reset(Zend_Db_Select::COLUMNS)
->distinct()
->columns('related_sku')
->columns('required_quantity');
// Fetch component sku
$componentSkus = $connection->fetchAll($select, 0);
// Fetch required quantity
$componentRequiredQuantity = $connection->fetchCol($select, 1);
// ...
$componentProductCollection = Mage::getModel('catalog/product')
->getCollection()
->joinField('qty',
'cataloginventory/stock_item',
'qty',
'product_id = entity_id',
'{{table}}.stock_id = 1',
'left');
$componentProductCollection->addAttributeToFilter('sku', array('in' => $componentSkus));
// Next line will invoke a load on the product collection
foreach ($componentProductCollection as $component) {
$quantity = $component->getQty();
// ...
}
// You could choose to do a fetchAll here instead to get just the data you need
$connection = $componentProductCollection->getConnection();
foreach ($connection->fetchAll($componentProductCollection->getSelect()) as $row) {
// Will have a array here
$quantity = $row['quantity'];
// ... -- do not not which funky magic happens here
}
$kitId = Mage::getModel('catalog/product')
->getIdBySku($kitSku);
if (!$kitId) {
// No id
continue;
}
// You could also take a look if you can sum the stock and do a single update instead
$kitStockItem = Mage::getModel('cataloginventory/stock_item')
->loadByProduct($kitId);
$this->functionFour($kitStockItem, $kitSku, $amountOfKitsPossible);
// Or something like this, update single field
$connection->update($kitStockItem->getResource()->getMainTable(), array('qty' => $quantity), 'item_id = ' . $kitStockItem->getId());
}
return true;
}
Funktion 4: Musste einige glückliche (oder unglückliche) Vermutungen anstellen, für den Moment ist es eine nutzlose Funktion, die wie in Funktion 3 hinzugefügt werden kann.
/**
* Save stock item if changed and something else, rather not say ;-)
*
* @param Mage_Catalog_Inventory_Model_Stock_Item $kitStockItem
* @param string $kitSku
* @param int $amountOfKitsPossible Guessed it
*/
function functionFour($kitStockItem, $kitSku, $amountOfKitsPossible)
{
// ...
// Do not know the rest of the code, so I wouldn't know which I could optimize here
// If it isn't to serious, you could look at a single query and not hitting extra functions
// Check if changed
if ($quantity !=$kitStockItem->getData('qty')) {
$kitStockItem->setQty($quantity);
$kitStockItem->save();
}
// ...
}
}
functionOne($collection)
? In welcher Reihenfolge würde die Größe / Anzahl der Artikel liegen? Muss eine Schleife ausgeführt werden, um die SKUs zu erhalten?