クラス
ItemListCSV
ソース ソース
ファイル: src/Admin/ItemListCSV.php
class ItemListCSV { /** * Upload CSV Combo-sets * * @var array */ private $combosets = []; /** * Registers hooks * * @author Evan D Shaw <evandanielshaw@gmail.com> * @return void */ public function init() { $opts = SettingsPage::getOptions(); if ($opts[SettingsPage::ENABLE_ITEMCSV_OPT] === 'no') { return; } add_filter('usces_filter_downloadcsv_add_header', [get_class(), 'addHeaders']); add_filter('dlseller_filter_downloadcsv_add_header', [get_class(), 'addHeaders']); add_filter('usces_filter_downloadcsv_add_skuvalue', [get_class(), 'addComboSetCells'], 10, 2); add_filter('dlseller_filter_downloadcsv_add_skuvalue', [get_class(), 'addComboSetCells'], 10, 2); add_filter('usces_filter_uploadcsv_add_min_field_num', [get_class(), 'incrementUploadCSVFieldCount']); add_filter('dlseller_filter_uploadcsv_add_min_field_num', [get_class(), 'incrementUploadCSVFieldCount']); add_action('dlseller_after_uploadcsv_line_processed', [$this, 'prepareComboSet']); add_action('usces_after_uploadcsv_line_processed', [$this, 'prepareComboSet']); add_action('dlseller_after_uploadcsv_lines_processed', [$this, 'insertComboSets']); add_action('usces_after_uploadcsv_lines_processed', [$this, 'insertComboSets']); } /** * Returns list of Combo-set headers for exported CSV * * @author Evan D Shaw <evandanielshaw@gmail.com> * @return string[] */ public static function getHeaders() { return [ __('COMBO-SET', 'wcexics'), ]; } /** * Increments upload CSV field count by the number of columns required by Combo-set * * @author Evan D Shaw <evandanielshaw@gmail.com> * @param int $fieldnum * @return int */ public static function incrementUploadCSVFieldCount($fieldnum) { return $fieldnum + count(self::getHeaders()); } /** * Adds Combo-set headers to exported CSV * * @author Evan D Shaw <evandanielshaw@gmail.com> * @param string $line * @return string */ public static function addHeaders($line) { $th_h = ',"'; $th_f = '"'; foreach (self::getHeaders() as $header) { $line .= $th_h . $header . $th_f; } return $line; } /** * Adds Combo-set cells to exported CSV * * @author Evan D Shaw <evandanielshaw@gmail.com> * @param string $line_sku * @param array $sku * @return mixed */ public static function addComboSetCells($line_sku, $sku) { $td_h = ',"'; $td_f = '"'; $skumetaid = $sku['meta_id']; $comboset = ComboSet::getComboSetBySkuMetaId($skumetaid); if ($comboset instanceof GenericError) { for ($i = 0; $i < count(self::getHeaders()); $i++) { $line_sku .= $td_h . $td_f; } return $line_sku; } $jsona = $comboset->getJson(); $jsona['groups'] = []; foreach ($comboset->getGroups() as $group) { $groupjson = $group->jsonSerialize(); $items = []; foreach ($group->getItems() as $item) { $sku = wel_get_sku_by_id($item->getSkuMetaId()); $ijson = $item->getJson(); $ijson['skucode'] = $sku['code']; $ijson['postId'] = $item->getPostId(); $items[] = $ijson; } $groupjson['items'] = $items; $jsona['groups'][] = $groupjson; } // output up to 5MB is kept in memory, if it becomes bigger it will automatically be written to a temporary file $csv = fopen('php://temp/maxmemory:' . (5 * 1024 * 1024), 'r+'); fputcsv($csv, [json_encode($jsona)]); rewind($csv); // put it all in a variable $output = stream_get_contents($csv); $line_sku .= ',' . trim($output); return $line_sku; } /** * Prepare combo-set data and append to combo-sets array for later processing * * @author Evan D Shaw <evandanielshaw@gmail.com> * @param array $args * @return void */ public function prepareComboSet($args) { if (empty($args['sku']) || empty($args['post_id'])) { return; } $sku = wel_get_sku($args['post_id'], $args['sku']['code']); if (empty($sku)) { return; } $offset = 0; if (defined('WCEX_DLSELLER')) { $offset = 1; } $csi = $offset + USCES_COL_SKU_APPLICABLE_TAXRATE + count(self::getHeaders()); $comboset = !empty($args['datas'][$csi]) ? (string)$args['datas'][$csi] : '[]'; $comboset = json_decode($comboset, true); if (empty($comboset)) { return; } $comboset['skuMetaId'] = $sku['meta_id']; $this->combosets[] = $comboset; } /** * Inserts upload CSV combo-sets * * @author Evan D Shaw <evandanielshaw@gmail.com> * @return void */ public function insertComboSets() { foreach ($this->combosets as $comboset) { $this->insertComboSet($comboset); } } /** * Inserts a single upload CSV row combo-set * * @author Evan D Shaw <evandanielshaw@gmail.com> * @global \wpdb $wpdb * @param array $comboset * @return void */ public function insertComboSet($comboset) { global $wpdb; $wpdb->query('START TRANSACTION'); $cs = (new REST\ComboSet())->create(['skuMetaId' => $comboset['skuMetaId']], $comboset); if ($cs instanceof GenericError) { return; } foreach ($comboset['groups'] as $group) { $gres = (new REST\ComboGroup())->create(['comboSetId' => $cs->getId()], $group); if ($gres instanceof GenericError) { $wpdb->query('ROLLBACK'); return; } foreach ($group['items'] as $item) { if (empty($item['skucode']) || empty($item['postId'])) { continue; } $sku = wel_get_sku($item['postId'], $item['skucode']); if (empty($sku)) { continue; } $res = (new REST\GroupItem())->create( ['groupId' => $gres->getId()], array_merge($item, ['welitemSkuMetaId' => $sku['meta_id']]) ); if ($res instanceof GenericError) { $wpdb->query('ROLLBACK'); return; } } } $wpdb->query('COMMIT'); } }
- addComboSetCells — Adds Combo-set cells to exported CSV
- addHeaders — Adds Combo-set headers to exported CSV
- getHeaders — Returns list of Combo-set headers for exported CSV
- incrementUploadCSVFieldCount — Increments upload CSV field count by the number of columns required by Combo-set
- init — Registers hooks
- insertComboSet — Inserts a single upload CSV row combo-set
- insertComboSets — Inserts upload CSV combo-sets
- prepareComboSet — Prepare combo-set data and append to combo-sets array for later processing