クラス
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