GlobalTable=$wpdb->prefix.$prefix.'_global_table'; $this->TranslationTable=$wpdb->prefix.$prefix.'_translations'; add_action( 'init', function () { load_plugin_textdomain('additional-product-fields-for-woocommerce', false, dirname(plugin_basename(dirname(__FILE__))) . '/languages/'); }); \add_filter('woo_extra_products_get_loader',array($this,'GetLoader')); new WooStagesManager($this); new ProductDesignerAjax($this,$prefix); new OrderDesignerAjax($this,$prefix); new AIAjax($this,$prefix); require_once $this->DIR.'Integration/RNEPO.php'; \add_action( 'admin_menu', array( $this, 'AddMenuFr' ), 1000 ); add_action('admin_notices', array($this,'ShowNotice')); //add_action( 'elementor/widgets/register', array($this,'RegisterElementorWidget') ); if($this->IsPR()) { new PRLoader($this); } } public function RegisterElementorWidget($widgetManager){ $widgetManager->register( new ElementorWidget() ); } public function ShowNotice(){ if(isset($_GET['DismissAllInOneNotice'])&&intval($_GET['DismissAllInOneNotice'])==1) { update_option('AllInOneNoticeTime',-1); return; } if(get_option('DismissAllInOneNotice',false)===true) { return; } $time=get_option('AllInOneNoticeTime',false); if($time==-1) return; if($time===false) { update_option('AllInOneNoticeTime', strtotime("now")); return; } $past_date = strtotime( '-14 days' ); if ( $past_date < $time ) { return; } echo '
AIO Forms

'.esc_html__('Are you enjoing extra product options for WooCommerce? Try our form builder!','additional-product-fields-for-woocommerce').'

  • '.esc_html__('Tons of fields and all of them are available in the free version!','additional-product-fields-for-woocommerce').'
  • '.esc_html__('Support for conditional logic, formulas, multiple step forms etc. (also available in the free version!)','additional-product-fields-for-woocommerce').'
  • '.esc_html__('Easy to use and intuitive','additional-product-fields-for-woocommerce').'
'.esc_html__('Learn more','additional-product-fields-for-woocommerce').'
'; } public function GetLoader(){ return $this; } public function AddMenuFr(){ if(!$this->IsPR()) add_submenu_page('woocommerce',__('Global product options','additional-product-fields-for-woocommerce'),__('Global product options','additional-product-fields-for-woocommerce'), 'manage_woocommerce','woocommerce_extra_product_add_global_options', array($this,'AddGlobalOptionsFr')); } public function AddGlobalOptionsFr(){ $promo=new GlobalPromo($this); $promo->Render(); } public function IsPR(){ return \file_exists($this->DIR.'pr'); } public function OnPluginIsActivated() { set_transient( '_woo_extra_products_go_to_welcome', true, 30 ); } public function CheckIfPDFAdmin(){ if(!current_user_can('manage_options')) { die(__('Forbidden','additional-product-fields-for-woocommerce')); } } public function OnCreateTable() { require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); $sql = "CREATE TABLE " . $this->GlobalTable . " ( id INT AUTO_INCREMENT, options MEDIUMTEXT, conflict_style VARCHAR(200), include MEDIUMTEXT, exclude MEDIUMTEXT, name VARCHAR(200) NOT NULL, last_update DATETIME, disabled TINYINT, server_options MEDIUMTEXT, PRIMARY KEY (id) ) COLLATE utf8_general_ci;"; \dbDelta($sql); $sql="CREATE TABLE ".$this->TranslationTable." ( translation_id int AUTO_INCREMENT, id int not null, type TINYINT not null, lang_code VARCHAR(10) NOT NULL, translations MEDIUMTEXT, PRIMARY KEY (translation_id) ) COLLATE utf8_general_ci;"; dbDelta($sql); } public function RegisterScripts(){ global $post, $typenow, $current_screen; if($current_screen->post_type=='product') { $this->EnqueueProductBuilder(); } } public function CreateHooks() { add_action('admin_footer',array($this,'AddDeactivationDialog')); add_action('admin_menu', array($this,'WelcomePageMenu')); add_action( 'admin_head', array($this,'RemoveWelcomePage' )); add_action( 'admin_init', array($this,'AdminInit') ); add_action( 'admin_notices', array($this,'ReviewNotice') ); add_action('admin_enqueue_scripts',array($this,'RegisterScripts')); add_filter( 'woocommerce_product_data_tabs', array( $this, 'AddProductTab' ) ); add_action( 'woocommerce_product_data_panels', array( $this, 'AddProductPanel' ) ); add_action( 'woocommerce_process_product_meta', array( $this, 'SaveProductMeta' ) ); add_action( 'woocommerce_before_add_to_cart_button', array( $this, 'BeforeAddToCartButton' ) ); add_action( 'woocommerce_after_shop_loop_item', array( $this, 'BeforeAddToCartButtonLoop' ) , 10 ); add_filter('woo-extra-product-get-additional-fields',array($this,'GetAllFields'),10,5); \add_filter('woo-extra-product-get-field-by-type',array($this,'GetPHPField'),10,6); new FreeCartItemPrinter($this); } public function ReviewNotice(){ $review=new ReviewHelper($this); $review->Start(); } public function GetAllFields($fields){ $fields[]='FBMaskedField'; $fields[]='FBColorPickerField'; $fields[]='FBCheckBox'; $fields[]='FBDatePicker'; $fields[]='FBTextWithStyles'; $fields[]='FBDivider'; $fields[]='FBLinkButton'; $fields[]='FBDropDown'; $fields[]='FBMaskedField'; $fields[]='FBParagraph'; $fields[]='FBRadio'; $fields[]='FBTextArea'; $fields[]='FBTextField'; $fields[]='FBNumber'; $fields[]='FBSlider'; $fields[]='FBButtonCounter'; $fields[]='FBButtonSelection'; $fields[]='FBSwitch'; $fields[]='FBSignature'; $fields[]='FBColorSwatcher'; $fields[]='FBTermOfService'; $fields[]='FBGoogleMaps'; $fields[]='FBTextualImage'; $fields[]='FBTotalField'; return $fields; } public function GetPHPField($field,$loader,$fieldType,$column,$fieldOptions,$entry) { if($field!=null) return $field; switch ($fieldType) { case 'masked': return new FBTextField($loader,$column,$fieldOptions,$entry); } } public function WelcomePageMenu(){ add_dashboard_page('Welcome', 'Welcome', 'read', 'woo-extra-product-welcome', array($this,'WelcomePage')); } public function RemoveWelcomePage(){ remove_submenu_page( 'index.php', 'woo-extra-product-welcome' ); } public function WelcomePage(){ global $rninstance; $rninstance=$this; require_once $this->DIR.'pages/Welcome.php'; } public function AdminInit(){ if ( ! get_transient( '_woo_extra_products_go_to_welcome' ) ) { return; } // Delete the redirect transient delete_transient( '_woo_extra_products_go_to_welcome' ); // Bail if activating from network, or bulk if ( is_network_admin() || isset( $_GET['activate-multi'] ) ) { return; } if ( \get_option( '_woo_extra_products_go_to_welcome') !='') { return; } // Delete the redirect transient \update_option( '_woo_extra_products_go_to_welcome' ,true); // Redirect to bbPress about page wp_safe_redirect( add_query_arg( array( 'page' => 'woo-extra-product-welcome' ), admin_url( 'index.php' ) ) ); } public function BeforeAddToCartButtonLoop() { $addInProductLoop=false; if(!apply_filters('woo-extra-product-add-in-product-loop',$addInProductLoop)) return; $this->BeforeAddToCartButton(); } public function BeforeAddToCartButton(){ $previousData=null; if(isset($_GET['cart_item'])&&isset($_GET['nonce'])) { $nonce=strval($_GET['nonce']); $cartKey=strval($_GET['cart_item']); if(!\wp_verify_nonce($nonce,'edit_'.$cartKey)) return; $cart_contents = WC()->cart->cart_contents; if(isset($cart_contents[$cartKey])) { $cartItem=$cart_contents[$cartKey]; $previousData=array(); if(isset($cartItem['rn_entry'])) { $previousData['Fields']=$cartItem['rn_entry']->Fields; } $previousData['CartKey']=$cartKey; $previousData['Quantity']=$cartItem['quantity']; } } $id=\uniqid(); echo '
'; global $product; $repository=new ProductRepository(); /** @var FormBuilderOptions $options */ $options=\json_decode($repository->GetProductExtraOptions($product->get_id())); if($options==false) return; $translations=array('InternalShared'); do_action('rndevtools_initializing_rendering','ExtraProductOptions','Form'); global $productsToLoad; if($productsToLoad==null) $productsToLoad=array(); $productsToLoad[]=$id; global $rnProdDependencies; if($rnProdDependencies==null) $rnProdDependencies=array(); if(isset($options->ExtensionsUsed)) { foreach($options->ExtensionsUsed as $extension) { $rnProdDependencies=\apply_filters('woo-extra-product-get-extension-runnable-'.$extension,$rnProdDependencies); } } if($this->IsPR()) { $productTranslations=new ProductTranslations($this); $productTranslations->MaybeTranslateProduct($product->get_id(),$options,$translations); } $this->AddRNTranslator($translations); $this->AddScript('shared-core','js/dist/SharedCore_bundle.js',array('@RNTranslator','wp-element','regenerator-runtime')); $this->AddScript('internal-shared','js/dist/InternalShared_bundle.js',array('@shared-core')); $this->AddScript('form-builder','js/dist/FormBuilder_bundle.js',array('@RNTranslator','@internal-shared','jquery')); $this->AddStyle('form-builder','js/dist/FormBuilder_bundle.css'); if(isset($options->MultipleSteps)&&$options->MultipleSteps!=null) { $this->AddScript('multiplesteps','js/dist/MultipleSteps_bundle.js', array('@form-builder')); $rnProdDependencies[]='@multiplesteps'; } $fieldsWithTranslation=['FBRepeater']; $fieldsWidthStyle=['FBAppointment','FBPopUpSelector','FBGroupButton','FBColorPickerField','FBSizeChart','FBDropDown','FBDatePicker','FBPopup','FBTextWithStyles','FBCollapsible','FBDateRange','FBFile','FBGroupPanel','FBImagePicker','FBList','FBRepeater','FBSlider','FBRange','FBButtonSelection','FBSignature','FBColorSwatcher','FBTermOfService','FBSearchableSelect','FBLikertScale','FBSurvey','FBFontPicker']; if(isset($options->DynamicFieldTypes)) { if(isset($options->Version)) { foreach ($options->DynamicFieldTypes as $currentDynamicField) { $result=apply_filters('woo-extra-product-load-field',['wasLoaded'=>false,'dependencies'=>$rnProdDependencies,'fieldName'=>$currentDynamicField,'form'=>$options]); if($result['wasLoaded']) { $rnProdDependencies=$result['dependencies']; continue; } $rnProdDependencies[] = '@' . $currentDynamicField; $this->AddScript($currentDynamicField, 'js/dist/' . $currentDynamicField . '_bundle.js', array('@form-builder')); if(\in_array($currentDynamicField,$fieldsWidthStyle)) $this->AddStyle($currentDynamicField, 'js/dist/' . $currentDynamicField . '_bundle.css'); if(\in_array($currentDynamicField,$fieldsWithTranslation)) $this->AddRNTranslator($currentDynamicField); } }else{ $additionalFields=array(); $additionalFields=\apply_filters('woo-extra-product-get-additional-fields',$additionalFields); $rnProdDependencies=array(); foreach ($additionalFields as $field) { $rnProdDependencies[]='@'.$field; $this->AddScript($field,'js/dist/'.$field.'_bundle.js',array('@form-builder')); } $rnProdDependencies=apply_filters('woo-extra-product-fields-loaded',$rnProdDependencies); } } if(isset($options->AdditionalDependencies)) { foreach($options->AdditionalDependencies as $dependency) { $this->AddScript($dependency,'js/dist/'.$dependency.'_bundle.js',array('@form-builder')); if($dependency=='ImagePreviewManager'||$dependency=='Tooltip') $this->AddStyle($dependency,'js/dist/'.$dependency.'_bundle.css'); $rnProdDependencies[]='@'.$dependency; } } if($this->IsPR()) { $rnProdDependencies[]='@FormulaParser'; $rnProdDependencies[]='@FormBuilderPr'; $this->AddScript('FormBuilderPr', 'js/dist/FormBuilderPr_bundle.js',array('@form-builder')); $this->AddScript('FormulaParser', 'js/dist/FormulaParser_bundle.js'); } PluginIntegrationManager::Initialize($this->GetLoader()); $this->RemoveScript('runnable-form-builder'); $rnProdDependencies=apply_filters('woo-extra-product-load-extra-options',$rnProdDependencies,$product,$options); $this->AddScript('runnable-form-builder','js/dist/RunnableFormBuilder_bundle.js',\array_merge($rnProdDependencies, array('@form-builder'))); $variations=$repository->GetVariations($product->get_id()); $attributes=$repository->GetAttributes($product->get_id(),true,true); if($options!=null) { do_action('woo-extra-product-before-load-options',$options); /** Kept for compatibility reasons, do not use */ do_action('woo-extra-product-load-fonts', $options); } if(isset($options->AdditionalDependencies)) { foreach($options->AdditionalDependencies as $dependency) { if($dependency=='HasRoleFunction') { $user = get_userdata(get_current_user_id()); $roles=[]; if ($user) { global $wp_roles; foreach ($user->roles as $role) { $roleLabel = ''; if (isset($wp_roles->roles[$role])) { $roleLabel = $wp_roles->roles[$role]['name']; } $roles[$role] = $roleLabel; } } $this->LocalizeScript('rnPBUserData','form-builder','',['Roles'=>$roles]); } } } $this->LocalizeScript('ProductBuilderOptions_'.$id,'form-builder','ProductBuilder',\apply_filters('woo-extra-product-load-vars',array( 'Options'=>(array)$options, "URL"=>$this->URL, 'IsVariable'=>$product->has_child(), 'WCCurrency'=>array( 'Format'=>get_woocommerce_price_format(), 'Decimals'=>wc_get_price_decimals(), 'ThousandSeparator'=>wc_get_price_thousand_separator(), 'DecimalSeparator'=>wc_get_price_decimal_separator(), 'Symbol'=>get_woocommerce_currency_symbol(), ), 'Product'=>array( "Id"=>$product->get_id(), 'Price'=>$product->get_price(), 'SalePrice'=>$product->get_sale_price() ), 'Variations'=>$variations, 'Attributes'=>$attributes, 'PreviousData'=>$previousData ),\apply_filters('woo-extra-product-get-post-id',$product->get_id()),$this)); } public function SaveProductMeta(){ if(isset($_POST['rednao_advanced_product_options'])&&\is_object(\json_decode(\stripslashes($_POST['rednao_advanced_product_options'])))) { $options=json_decode(\stripslashes($_POST['rednao_advanced_product_options'])); global $post_id; if(count($options->Rows)==0) { $repository=new ProductRepository(); $repository->SaveProductExtraOptions($post_id,'','',''); }else { $repository = new ProductRepository(); $repository->SaveProductExtraOptions($post_id, $_POST['rednao_advanced_product_options'], $_POST['rednao_advanced_product_server_options'],$_POST['rednao_advanced_fees']); } if(isset($_POST['rednao_advanced_translations'])&&trim($_POST['rednao_advanced_translations'])!='') { $translations=json_decode(stripslashes($_POST['rednao_advanced_translations'])); if(!is_array($translations)) return; $repository->SaveTranslations($post_id,ProductRepository::TRANSLATION_TYPE_PRODUCT,$translations); } } } public function AddProductTab($tabs){ $tabs['rednao-advanced-products'] = array( 'label' => esc_html__( 'Advanced Product Options', 'additional-product-fields-for-woocommerce' ), 'target' => 'rednao-advanced-products', 'class' => array( 'rednao-advanced-products','hide_if_grouped') ); return $tabs; } public function AddProductPanel(){ $panel= new ProductBuilderPanel($this); $panel->Execute(); } public function AddDeactivationDialog(){ $pluginName = \plugin_basename($this->MainFilePath); echo ''; $this->AddScript('Shared','js/dist/SharedCore_bundle.js',array('wp-element','regenerator-runtime')); $this->AddScript('DeactivationDialog','js/dist/DeactivationDialog_bundle.js',array('Shared')); } private function EnqueueProductBuilder() { } }