มีบางสิ่งที่คุณสามารถทำงานได้;
- ไม่ผ่านการอ้างอิงดังนั้นการใช้หน่วยความจำเพิ่มเติมคุณสามารถส่งผ่านวัตถุได้ แต่ค่าเริ่มต้นไม่สามารถส่งผ่านอาร์เรย์ได้ หรือเพิ่ม
&
ในการประกาศพารามิเตอร์ฟังก์ชั่นเช่นfunction hello(array &$world)
- การตรวจสอบที่ไม่ถูกต้องหากสิ่งที่ไม่ได้กลับมีทันที อย่าพยายามหาบางอย่างที่ไม่ได้อยู่ที่นั่น
- บางครั้งการอ่านอาจเป็นเรื่องยาก
- เพิ่มเอกสาร (เพื่อให้คุณสามารถเข้าใจถ้าคุณเห็นมันในไม่กี่วัน, พระ, ปี)
if
งบที่ฉลาดขึ้นเพื่อลดการเยื้อง
- ฟังก์ชั่นควรมีเพียงจุดประสงค์เดียวอัพเดตสต็อคหรืออัพเดตที่เกี่ยวข้องไม่ใช่ทั้งสองอย่างดังนั้นอาจตัดบางฟังก์ชั่นในฟังก์ชั่นที่เล็กกว่า พยายามสร้างตรรกะดังกล่าวในใจและทำใหม่จากที่นั่น
- ลองดู
->cleanModelCache()->clearInstance()
จากMage_Core_Model_Model_Abstract
เพื่อล้างข้อมูลพื้นฐานสำหรับวัตถุบางอย่างสามารถเร่งความเร็วของสิ่งต่างๆได้
- ของหยาบสิ่งอื่น ๆ ทั้งหมดที่ได้รับการกล่าวแล้ว
เพิ่มเวอร์ชันที่อัปเดตของโค้ดของคุณพร้อมกับคำแนะนำแบบอินไลน์ในโค้ดปัจจุบันของคุณฉันสามารถใช้งานได้อีกเล็กน้อย แต่ในปัจจุบันจะไม่เพิ่มไปอีก
ฟังก์ชั่น 1: วัตถุประสงค์คือการเดินคอลเลกชัน
/**
* 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
}
// ...
}
ฟังก์ชั่น 2: วัตถุประสงค์คือการปรับปรุงสต็อกถ้ามีการเปลี่ยนแปลง
/**
* 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;
}
ฟังก์ชั่น 3: วัตถุประสงค์ในการอัพเดทรายการสต็อคที่เกี่ยวข้อง
/**
* 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;
}
ฟังก์ชั่น 4: ต้องคาดเดาโชคดี (หรือโชคร้าย) สำหรับตอนนี้มันเป็นฟังก์ชั่นที่ไร้ประโยชน์สามารถเพิ่มได้เช่นเดียวกับในฟังก์ชั่น 3
/**
* 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)
? ขนาด / จำนวนรายการจะเรียงตามลำดับอย่างไร จำเป็นหรือไม่ที่จะต้องวนซ้ำเพื่อให้ได้ SKU?