クラス
ComboGroup
ソース ソース
ファイル: src/API/ComboGroup.php
class ComboGroup
{
/**
* Creates a new combo group for a combo-set and returns it
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @global \wpdb $wpdb
* @param int $comboSetId
* @param string $label
* @param bool $optional
* @param bool $enableMultiSelect
* @return GenericError|ComboGroupType
*/
public static function createComboGroup($comboSetId, $label = '', $optional = false, $enableMultiSelect = false) {
global $wpdb;
$position = 0;
$curtime = Utils::getCurrentUTCDateTimeString();
$csgt = Schema::getComboSetGroupsTable();
$comboset = ComboSet::getComboSetById($comboSetId);
if ($comboset instanceof GenericError) {
return $comboset;
}
$isgitem = GroupItem::skuIsGroupItem($comboset->getSkuMetaId());
if ($isgitem instanceof GenericError) {
return $isgitem;
}
if ($isgitem === true) {
return Master::getErrorStore()->getErrorResponse(ErrorStore::SKU_IS_COMBO_SET_GROUP_ITEM);
}
$position = (int)$wpdb->get_var(
$wpdb->prepare("SELECT COUNT(ID) FROM {$csgt} WHERE combo_set_id = %d", $comboSetId)
);
$res = $wpdb->insert(
$csgt,
[
'combo_set_id' => $comboSetId,
'group_label' => (string)$label,
'optional' => (int)$optional,
'allow_multiple_selections' => (int)$enableMultiSelect,
'position' => $position,
'created_at' => $curtime,
'updated_at' => $curtime,
],
['%d', '%s', '%d', '%d', '%d', '%s', '%s']
);
if ($res === false) {
return Master::getErrorStore()->getErrorResponse(ErrorStore::INTERNAL_SERVER_ERROR);
}
return self::getComboGroupById($wpdb->insert_id);
}
/**
* Updates a combo group for a combo-set and returns it
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @global \wpdb $wpdb
* @param int $groupId
* @param string $label
* @param bool $optional
* @param bool $enableMultiSelect
* @return GenericError|ComboGroupType
*/
public static function updateComboGroup($groupId, $label, $optional, $enableMultiSelect) {
global $wpdb;
$combogroup = self::getComboGroupById($groupId);
if (empty($combogroup)) {
return Master::getErrorStore()->getErrorResponse(
ErrorStore::COMBO_GROUP_NOT_FOUND,
[$groupId],
[],
[$groupId]
);
}
$curtime = Utils::getCurrentUTCDateTimeString();
$csgt = Schema::getComboSetGroupsTable();
$res = $wpdb->update(
$csgt,
[
'group_label' => (string)$label,
'optional' => (int)$optional,
'allow_multiple_selections' => (int)$enableMultiSelect,
'updated_at' => $curtime,
],
['ID' => $groupId],
['%s', '%d', '%d', '%s'],
['%d']
);
if (empty($res)) {
return Master::getErrorStore()->getErrorResponse(ErrorStore::INTERNAL_SERVER_ERROR);
}
return self::getComboGroupById($groupId);
}
/**
* Duplicates a combo group
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @global \wpdb $wpdb
* @param int $groupId
* @param string $label
* @return GenericError|ComboGroupType
*/
public static function duplicateComboGroup($groupId, $label) {
global $wpdb;
$combogroup = self::getComboGroupById($groupId);
if (empty($combogroup)) {
return Master::getErrorStore()->getErrorResponse(
ErrorStore::COMBO_GROUP_NOT_FOUND,
[$groupId],
[],
[$groupId]
);
}
$wpdb->query('START TRANSACTION');
$newgroup = self::createComboGroup(
$combogroup->getComboSetId(),
!empty($label) ? (string)$label : '',
$combogroup->getOptional(),
$combogroup->getEnableMultiSelect()
);
if ($newgroup instanceof GenericError) {
$wpdb->query('ROLLBACK');
return $newgroup;
}
foreach ($combogroup->getItems() as $gitem) {
$newgitem = GroupItem::createGroupItem(
$newgroup->getId(),
$gitem->getSkuMetaId(),
$gitem->getPriceModifier(),
$gitem->getItemLabel(),
$gitem->getItemQuantity()
);
if ($newgitem instanceof GenericError) {
$wpdb->query('ROLLBACK');
return $newgitem;
}
}
$wpdb->query('COMMIT');
$dupgroup = self::getComboGroupById($newgroup->getId());
if (empty($dupgroup)) {
return Master::getErrorStore()->getErrorResponse(
ErrorStore::COMBO_GROUP_NOT_FOUND,
[$newgroup->getId()],
[],
[$newgroup->getId()]
);
}
return $dupgroup;
}
/**
* Deletes a combo group
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @global \wpdb $wpdb
* @param int $groupId
* @return GenericError|true
*/
public static function deleteComboGroup($groupId) {
global $wpdb;
$csgt = Schema::getComboSetGroupsTable();
$res = $wpdb->delete($csgt, ['id' => $groupId], ['%d']);
if ($res === false) {
return Master::getErrorStore()->getErrorResponse(ErrorStore::INTERNAL_SERVER_ERROR);
}
return true;
}
/**
* Returns an instance of `\Aivec\Welcart\Extensions\ItemComboSet\Types\ComboGroup`
* given a group id, or `null` on failure or if not found
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @global \wpdb $wpdb
* @param int $id
* @return null|ComboGroupType
*/
public static function getComboGroupById($id) {
global $wpdb;
$csgt = Schema::getComboSetGroupsTable();
$group = $wpdb->get_row(
$wpdb->prepare("SELECT * FROM {$csgt} cg WHERE cg.ID = %d", $id),
ARRAY_A
);
if (empty($group)) {
return null;
}
$items = GroupItem::getAllGroupItemsByComboGroupId($id);
if (empty($items)) {
$items = [];
}
return new ComboGroupType(
$group['ID'],
$group['combo_set_id'],
$group['group_label'],
(bool)(int)$group['optional'],
(bool)(int)$group['allow_multiple_selections'],
$group['position'],
$items,
$group['created_at'],
$group['updated_at']
);
}
/**
* Returns list of combo groups for a combo-set item
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @global \wpdb $wpdb
* @param int $comboSetId
* @return ComboGroupType[]|GenericError
*/
public static function getAllComboGroupsByComboSetId($comboSetId) {
global $wpdb;
$csgt = Schema::getComboSetGroupsTable();
$groupids = $wpdb->get_results(
$wpdb->prepare("SELECT ID FROM {$csgt} WHERE combo_set_id = %d ORDER BY position ASC", (int)$comboSetId),
ARRAY_A
);
if ($groupids === null) {
return Master::getErrorStore()->getErrorResponse(ErrorStore::INTERNAL_SERVER_ERROR);
}
$groups = [];
foreach ($groupids as $groupid) {
$group = self::getComboGroupById($groupid['ID']);
if (!empty($group)) {
$groups[] = $group;
}
}
return $groups;
}
/**
* Re-orders combo group positions for a combo-set
*
* @author Evan D Shaw <evandanielshaw@gmail.com>
* @global \wpdb $wpdb
* @param int $comboSetId
* @param int[] $groupIds
* @return GenericError|bool `true` if anything was reordered, `false` otherwise
*/
public static function reorderComboGroups($comboSetId, $groupIds) {
global $wpdb;
$comboSetId = (int)$comboSetId;
$groupIds = !empty($groupIds) ? (array)$groupIds : [];
$updated = false;
$wpdb->query('START TRANSACTION');
foreach ($groupIds as $position => $groupId) {
$group = self::getComboGroupById($groupId);
if ($group === null || $group->getComboSetId() !== $comboSetId || $group->getPosition() === $position) {
continue;
}
$updated = true;
$res = $wpdb->update(
Schema::getComboSetGroupsTable(),
[
'position' => $position,
'updated_at' => Utils::getCurrentUTCDateTimeString(),
],
['id' => $groupId],
['%d', '%s'],
['%d']
);
if ($res === false) {
$wpdb->query('ROLLBACK');
return Master::getErrorStore()->getErrorResponse(ErrorStore::INTERNAL_SERVER_ERROR);
}
}
$wpdb->query('COMMIT');
return $updated;
}
}
- createComboGroup — Creates a new combo group for a combo-set and returns it
- deleteComboGroup — Deletes a combo group
- duplicateComboGroup — Duplicates a combo group
- getAllComboGroupsByComboSetId — Returns list of combo groups for a combo-set item
- getComboGroupById — Returns an instance of `\Aivec\Welcart\Extensions\ItemComboSet\Types\ComboGroup` given a group id, or `null` on failure or if not found
- reorderComboGroups — Re-orders combo group positions for a combo-set
- updateComboGroup — Updates a combo group for a combo-set and returns it