product details

This commit is contained in:
Almira Krdzic
2018-09-12 16:42:21 +02:00
parent 35484c6d4f
commit e53b243d96
65 changed files with 3327 additions and 1520 deletions

View File

@@ -1,136 +1,63 @@
<?php
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
/**
* Implementas groups of optional packages available for wiaas standard package type
*
* Class Wiaas_Package_Option_Groups
*/
class Wiaas_Package_Option_Groups {
private static $package_option_groups_meta_key = '_wiaas_package_option_groups';
private static $cart_item_option_items_key = '_wiaas_option_items';
private static $cart_item_option_parent_key = '_wiaas_option_for';
public static function init() {
self::_add_options_hooks();
add_action( 'woocommerce_checkout_create_order_line_item', array( __CLASS__, 'add_order_item_meta' ), 10, 3 );
add_filter( 'woocommerce_hidden_order_itemmeta', array( __CLASS__, 'hidden_order_item_meta' ) );
add_filter('wiaas_package_types', array( __CLASS__, 'register_option_package_type' ) );
}
private static function _add_options_hooks() {
// Add bundle-specific cart item data based on posted vars.
add_filter( 'woocommerce_add_cart_item_data', array( __CLASS__, 'add_cart_item_data' ), 10, 2 );
/**
* Register option as ne of available wiaas package types
* @param $package_types
*
* @return array
*/
public static function register_option_package_type($package_types) {
$package_types[] = 'option';
// Add option items to the cart.
add_action( 'woocommerce_add_to_cart', array( __CLASS__, 'add_options_to_cart' ), 10, 6 );
return $package_types;
}
private static function _remove_options_hooks() {
/**
* Retrives options group name for package option
* @param $package
* @param $option_package
*
* @return string|null
*/
public static function get_group_name_for_package_option($package, $option_package) {
$option_groups = $package->get_meta( '_wiaas_package_option_groups' );
remove_filter( 'woocommerce_add_cart_item_data', array( __CLASS__, 'add_cart_item_data' ));
remove_action('woocommerce_add_to_cart', array( __CLASS__, 'add_options_to_cart' ));
}
public static function add_order_item_meta( $order_item, $cart_item_key, $cart_item ){
if (isset($cart_item[self::$cart_item_option_items_key])) {
$order_item->add_meta_data( self::$cart_item_option_items_key, $cart_item[self::$cart_item_option_items_key] );
}
if (isset($cart_item[self::$cart_item_option_parent_key])) {
$order_item->add_meta_data( self::$cart_item_option_parent_key, $cart_item[self::$cart_item_option_parent_key], true );
}
}
public static function hidden_order_item_meta( $hidden ) {
return array_merge( $hidden, array(
self::$cart_item_option_items_key,
self::$cart_item_option_parent_key,
) );
}
public static function set_package_option_groups($package, $groups_data) {
$package->update_meta_data( self::$package_option_groups_meta_key, $groups_data );
$package->save_meta_data();
}
public static function add_cart_item_data($cart_item_data, $package_id) {
// If cart item that will be added is actually requested package
if ($_POST['package_id'] = $package_id) {
// Prepare additional data for later use.
if ( ! isset( $cart_item_data[self::$cart_item_option_items_key] ) ) {
$cart_item_data[self::$cart_item_option_items_key ] = array();
}
}
return $cart_item_data;
}
public static function add_options_to_cart($cart_item_key, $package_id, $quantity, $variation_id, $variation, $cart_item_data) {
$is_option_parent = $_POST['package_id'] = $package_id && isset($cart_item_data[self::$cart_item_option_items_key]);
$has_selected_options = isset($_POST['options']) && is_array($_POST['options']);
if ($is_option_parent && $has_selected_options) {
self::_remove_options_hooks();
$options_ids = $_POST['options'];
foreach ($options_ids as $option_id) {
$option_package = wc_get_product($option_id);
if (is_object($option_package)) {
$option_cart_item_key = WC()->cart->add_to_cart($option_id);
if ($option_cart_item_key) {
WC()->cart->cart_contents[$option_cart_item_key][self::$cart_item_option_parent_key] = $cart_item_key;
WC()->cart->cart_contents[ $cart_item_key ][self::$cart_item_option_items_key][] = $option_cart_item_key;
}
}
}
self::_add_options_hooks();
}
}
public static function get_cart_item_options($cart_item) {
$option_cart_items = array();
if (isset($cart_item[self::$cart_item_option_items_key])) {
$option_cart_items_ids = $cart_item[self::$cart_item_option_items_key];
foreach ($option_cart_items_ids as $option_cart_item_id) {
$option_cart_item = WC()->cart->get_cart_item($option_cart_item_id);
if (isset($option_cart_item)) {
$option_cart_items[] = $option_cart_item;
foreach ($option_groups as $option_group) {
foreach ($option_group['options'] as $group_option_id) {
if ((int) $group_option_id === $option_package->get_id()) {
return $option_group['name'];
}
}
}
return $option_cart_items;
}
public static function get_order_item_options($order_items, $parent_order_item) {
$option_order_items = array();
if (isset($parent_order_item['wiaas_option_items']) && isset($parent_order_item['bundle_cart_key'])) {
foreach ($order_items as $order_item) {
if (isset($order_item['bundle_cart_key']) && $order_item['wiaas_option_for'] === $parent_order_item['bundle_cart_key']) {
$option_order_items[] = $order_item;
}
}
}
return $option_order_items;
return null;
}
/**
* Retrieve groups of optional packages configured for provided package
* @param $package
*
* @return array
*/
public static function get_package_option_groups($package) {
$groups_data = $package->get_meta( self::$package_option_groups_meta_key );
$groups_data = $package->get_meta( '_wiaas_package_option_groups' );
$option_groups = array();
@@ -153,6 +80,16 @@ class Wiaas_Package_Option_Groups {
return $option_groups;
}
/**
* Set groups of optional packages for provided package
* @param $package
* @param $groups_data
*/
public static function set_package_option_groups($package, $groups_data) {
$package->update_meta_data( '_wiaas_package_option_groups', $groups_data );
$package->save_meta_data();
}
}
Wiaas_Package_Option_Groups::init();