This Magento shell script sorts the values of a given attribute after the order of values in a given CSV file (sets option value position).
<?php /** * * Magento * * NOTICE OF LICENSE * * This source file is subject to the Open Software License (OSL 3.0) * It is available through the world-wide-web at this URL: * http://opensource.org/licenses/osl-3.0.php * * * @category AskSheldon * @package AskSheldon_Misc * @copyright Copyright (c) 2016 Marcel Lange (https://www.ask-sheldon.com) * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @author Marcel Lange <info@ask-sheldon.com>) * * Changes the sorting of asksheldon_size attribute options (sets sort order) * call it with param 'iknowwhatido=yes' to make it work! * */ require_once('../AskSheldon_Shell_Abstract.php'); class AskSheldon_Misc_Attribute_Option_Sorter extends AskSheldon_Shell_Abstract { const TARGET_ATTRIBUTE = 'asksheldon_size'; const REFERENCESTORE = 2; private $_oWriteConnection = null; private $_sOptionTable = null; private $_sOptionLableTable = null; /* * Starter * */ public function run() { error_reporting(E_ALL); ini_set('display_errors', 1); if (!$this->getArg('iknowwhatido') || $this->getArg('iknowwhatido') != 'yes') { echo $this->usageHelp(); echo "\n DEACTIVATED (call it with param '-iknowwhatido yes' to make it work!) \n"; return -1; } if (!$this->getArg('inputfile')) { echo $this->usageHelp(); echo "\n You have to give me the right params master! \n"; return -1; } $rFile = fopen($this->getArg('inputfile'), 'r'); if ($rFile) { $iCount = 1; while (($aData = fgetcsv($rFile)) !== false) { $sSizeDE = $aData[0]; $this->_setAttributeOptionSorting($sSizeDE, $iCount++); } } } /** * Retrieve Usage Help Message * */ public function usageHelp() { return <<<USAGE Usage: php -f update_size_attribute_option_order.php -iknowwhatido [options] iknowwhatido lifeguard flag inputfile CSV-file with size sorting as the first and only column without header line!!! help This help USAGE; } private function _setAttributeOptionSorting($sSize, $iPosition) { $oSelect = new Varien_Db_Select($this->_getWriteConnection()); $oSelect->from( ['eao' => $this->_getOptionTable()], ['option_id'] ) ->join( ['eaov' => $this->_getOptionLabelTable()], "eao.option_id = eaov.option_id AND eaov.store_id = " . self::REFERENCESTORE, '' ) ->where('eao.attribute_id = ?', $this->_getAttibuteId()) ->where('eaov.value = ?', $sSize); $aResult = $this->_getWriteConnection()->fetchCol($oSelect); foreach ($aResult as $iOptionId) { $this->_getWriteConnection()->update( $this->_getOptionTable(), ['sort_order' => $iPosition], $this->_getWriteConnection()->quoteInto('option_id = ?', $iOptionId) ); } } /** * Returs a write connection * @return Varien_Db_Adapter_Pdo_Mysql */ private function _getWriteConnection() { if (is_null($this->_oWriteConnection)) { $this->_oWriteConnection = Mage::getSingleton('core/resource')->getConnection('core_write'); } return $this->_oWriteConnection; } /** * @return string table name */ private function _getOptionTable() { if (is_null($this->_sOptionTable)) { $this->_sOptionTable = Mage::getSingleton('core/resource')->getTableName('eav/attribute_option'); } return $this->_sOptionTable; } /** * @return string table name */ private function _getOptionLabelTable() { if (is_null($this->_sOptionLableTable)) { $this->_sOptionLableTable = Mage::getSingleton('core/resource')->getTableName('eav/attribute_option_value'); } return $this->_sOptionLableTable; } /** * @return int ID of product attribute asksheldon_size */ private function _getAttibuteId() { return Mage::getSingleton('eav/config')->getAttribute(Mage_Catalog_Model_Product::ENTITY, self::TARGET_ATTRIBUTE)->getId(); } } $oOptionSorter = new AskSheldon_Misc_Attribute_Option_Sorter(); $oOptionSorter->run();
So it is not necessary to set the values via BE-Interface. The value matching to find the respective option-id is done by using the value of the Storeview specified in REFERENCESTORE and the attribute for that the order should be set is determined via TARGET_ATTRIBUTE.
This is how you call the scrip via shell within /mageroot/shell/:
$> php update_size_attribute_option_order.php -iknowwhatido yes -inputfile ../var/import/akssheldon_size_attribute_option_order_import.csv
The CSV has to look like that:
01 02 03 04 8.5-9 9.5-10 10.5-11 19-22 23-24 23-26 25-26 27-28 27-30 29-30 31-32 31-34 33-34 35-36 35-36 W1 35-36 W2 35-38 35-38 W1 35-38 W2 36-38 36-41 37-38 37-38 W1 37-38 W2 38-40 39-40 39-40 W1 39-40 W2 39-40 W3 39-40 W4 39-41 39-42 39-42 W1 39-42 W2 39-42 W3 39-42 W4 40-42 40-46 41-42 41-42 W1 41-42 W2 41-42 W3 41-42 W4 42-43 42-44 43-44 43-44 W3 43-44 W4 43-46 43-46 W3 43-46 W4 44-45 44-46 45-46 45-46 W3 45-46 W4 46 46-48 46-50 47-48 47-50 48 48-50 49-50 50 50-56 51-52 52 54 56 58 62-68 74-80 80-92 98-104 110-116 122-128 134-140 134-146 146-152 152-164 158-164 170-176 ONESIZE CALF 1 CALF 2 CALF 3 CALF 4 L L 44-46 L-XL M M 40-42 M-L S S 36-38 S-M XL XL 46-48 XS XS 34-36 XS-S XXL 3XL 4XL
1 thoughts on “Option value position (select value sort order)”