クラス
CartPages
ソース ソース
ファイル: src/Pages/CartPages.php
class CartPages
{
/**
* Registers hooks
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @return void
*/
public static function init() {
$loader = function () {
$loadcore = apply_filters('wcexics_filter_load_cart_table_default_css', true);
if ($loadcore === true) {
Cart::loadCss();
}
do_action('wcexics_load_cart_table_assets');
};
(new ConditionalAssetsLoader())->loadCartPageAssets($loader);
(new ConditionalAssetsLoader())->loadConfirmPageAssets($loader);
(new ConditionalAssetsLoader())->loadMemberPageAssets($loader);
(new ConditionalAssetsLoader())->loadOrderCompletionPageAssets(function () use ($loader) {
$loader();
Loader::loadCoreCss();
});
add_filter('usces_filter_cart_item_name_nl', [get_class(), 'displayGroupItemsInCartItemNameEmail'], 10, 2);
add_filter('usces_filter_cart_item_name', [get_class(), 'displayGroupItemsInCartItemName'], 10, 2);
add_filter('usces_filter_cart_row', [get_class(), 'addComboSetItemsInput'], 20, 3);
}
/**
* Adds group items underneath the cart item name in emails and PDF files
*
* Unfortunately, this same filter is used when displaying the cart item name in PDF files so
* we need to make sure to not use HTML in that case. The only way to do that is by checking
* whether an `index` key exists in the `$args` parameter. It's an ugly solution but it's the
* only one available.
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @param string $cartItemName
* @param array $args
* @return string
*/
public static function displayGroupItemsInCartItemNameEmail($cartItemName, $args) {
if (usces_is_html_mail() && !isset($args['index'])) {
return self::displayGroupItemsInCartItemName($cartItemName, $args);
}
$data = self::getComboSetCart($args['cart_row']);
if (empty($data)) {
return $cartItemName;
}
return $cartItemName . Cart::getComboSetCartDetailsNoHtml($data['cartRows'], !isset($args['index']));
}
/**
* Adds group items HTML underneath the cart item name
*
* Applies to the member page, cart page, confirm page, and order completion page
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @param string $cartItemName
* @param array $args
* @return string
*/
public static function displayGroupItemsInCartItemName($cartItemName, $args) {
if (empty($args['cart_row'])) {
return $cartItemName;
}
$data = self::getComboSetCart($args['cart_row']);
if (empty($data)) {
return $cartItemName;
}
return $cartItemName . Cart::getComboSetCartDetailsHtml($data['cartRows']);
}
/**
* Returns cart data for a combo-set cart row
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @global \usc_e_shop $usces
* @global \wpdb $wpdb
* @param array $cart_row
* @return null|array
*/
public static function getComboSetCart($cart_row) {
global $usces, $wpdb;
$cserial = null;
$isordercart = false;
$grouplabelmap = [];
$itemlabelmap = [];
$ordercart = [];
if (!empty($cart_row['serial'])) {
$cserial = $cart_row['serial'];
} elseif (!empty($cart_row['cart_serial'])) {
$cserial = $cart_row['cart_serial'];
$isordercart = true;
}
if ($cserial === null) {
return null;
}
$sels = unserialize($cserial);
if (empty($sels['comboSetId']) || !isset($sels['comboSetItems'])) {
return null;
}
if ($isordercart === true) {
$csgioct = Schema::getComboSetGroupItemsOrderCartTable();
$results = $wpdb->get_results(
$wpdb->prepare(
"SELECT * FROM {$csgioct} WHERE combo_set_cart_id = %d ORDER BY cart_id ASC",
$cart_row['cart_id']
),
ARRAY_A
);
if ($results !== null) {
$index = 0;
foreach ($sels['comboSetItems'] as $gitem) {
if (empty($results[$index]['cart_serial'])) {
continue;
}
$gocserial = $results[$index]['cart_serial'];
$gisels = unserialize($gocserial);
$grouplabelmap[$gisels['groupId']] = !empty($gisels['groupLabel']) ? $gisels['groupLabel'] : '';
$itemlabelmap[$gisels['itemId']] = !empty($gisels['itemLabel']) ? $gisels['itemLabel'] : '';
$ordercart[$gisels['itemId']] = $results[$index];
$index++;
}
}
} else {
$cscart = !empty($_SESSION['usces_cart'][$cserial]) ? $_SESSION['usces_cart'][$cserial] : [];
$grouplabelmap = !empty($cscart['grouplabelmap']) ? $cscart['grouplabelmap'] : [];
$itemlabelmap = !empty($cscart['itemlabelmap']) ? $cscart['itemlabelmap'] : [];
$ordercart = [];
}
$rows = [];
foreach ($sels['comboSetItems'] as $serial => $gitem) {
$gisels = unserialize($serial);
$gicsels = (new \usces_cart())->key_unserialize($serial);
$rows[$gisels['groupId']]['groupLabel'] = '';
$glabel = '';
if (!empty($grouplabelmap[$gisels['groupId']])) {
$glabel = $grouplabelmap[$gisels['groupId']];
}
$itemLabel = '';
if (!empty($itemlabelmap[$gisels['itemId']])) {
$itemLabel = $itemlabelmap[$gisels['itemId']];
} else {
$itemLabel = wcexics_get_group_item_default_label(
$usces->getItemName($gicsels['post_id']),
$usces->getItemSkuDisp($gicsels['post_id'], urldecode($gicsels['sku'])),
$gitem['quant'],
$gitem['price']
);
}
$opts = !empty($gicsels['options']) ? $gicsels['options'] : [];
$giordercart = isset($ordercart[$gisels['itemId']]) ? $ordercart[$gisels['itemId']] : null;
if (is_array($giordercart) && isset($giordercart['cart_id'])) {
$options = wcexics_api_get_group_item_ordercart_meta('option', $giordercart['cart_id']);
$options = is_array($options) ? $options : [];
foreach ($options as $opt) {
$optv = maybe_unserialize($opt['meta_value']);
if (is_array($optv)) {
$optva = [];
foreach ($optv as $optvav) {
$optva[urlencode((string)$optvav)] = urlencode((string)$optvav);
}
$optv = $optva;
} else {
$optv = urlencode((string)$optv);
}
$opts[urlencode($opt['meta_key'])] = $optv;
}
}
$rows[$gisels['groupId']]['groupLabel'] = $glabel;
$rows[$gisels['groupId']]['groupItems'][] = [
'name' => $itemLabel,
'itemId' => $gisels['itemId'],
'ordercart' => $giordercart,
'options' => $opts,
];
}
return [
'cserial' => $cserial,
'grouplabelmap' => $grouplabelmap,
'groupItems' => $sels['comboSetItems'],
'cartRows' => $rows,
];
}
/**
* Adds combo-set ID and group items inputs for use in `up_serialize`
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @param string $row
* @param array $cart
* @param array $materials
* @return string
*/
public static function addComboSetItemsInput($row, $cart, $materials) {
$sels = unserialize($materials['cart_row']['serial']);
if (empty($sels['comboSetId']) || empty($sels['comboSetItems'])) {
return $row;
}
$i = $materials['i'];
$comboSetId = $sels['comboSetId'];
$comboSetItems = serialize($sels['comboSetItems']);
$row .= "<input type='hidden' name='comboSetId[{$i}]' value='{$comboSetId}' />";
$row .= "<input type='hidden' name='comboSetItems[{$i}]' value='{$comboSetItems}' />";
return $row;
}
}
- addComboSetItemsInput — Adds combo-set ID and group items inputs for use in `up_serialize`
- displayGroupItemsInCartItemName — Adds group items HTML underneath the cart item name
- displayGroupItemsInCartItemNameEmail — Adds group items underneath the cart item name in emails and PDF files
- getComboSetCart — Returns cart data for a combo-set cart row
- init — Registers hooks