PageRenderTime 45ms CodeModel.GetById 11ms RepoModel.GetById 1ms app.codeStats 0ms

/wp-content/plugins/woocommerce-gravityforms-product-addons/gravityforms-product-addons.php

https://bitbucket.org/theshipswakecreative/psw
PHP | 1058 lines | 774 code | 222 blank | 62 comment | 197 complexity | a149fc4ce51bbe8a9aacb3999b26dff6 MD5 | raw file
Possible License(s): LGPL-3.0, Apache-2.0
  1. <?php
  2. /*
  3. Plugin Name: WooCommerce - Gravity Forms Product Add-Ons
  4. Plugin URI: http://woothemes.com/woocommerce
  5. Description: Allows you to use Gravity Forms on individual WooCommerce products. Requires the Gravity Forms plugin to work.
  6. Version: 2.8.1
  7. Author: Lucas Stark
  8. Author URI: http://lucasstark.com
  9. Requires at least: 3.1
  10. Tested up to: 3.3
  11. Copyright: © 2009-2011 Lucas Stark.
  12. License: GNU General Public License v3.0
  13. License URI: http://www.gnu.org/licenses/gpl-3.0.html
  14. */
  15. /**
  16. * Required functions
  17. */
  18. if (!function_exists('woothemes_queue_update'))
  19. require_once( 'woo-includes/woo-functions.php' );
  20. /**
  21. * Plugin updates
  22. */
  23. woothemes_queue_update(plugin_basename(__FILE__), 'a6ac0ab1a1536e3a357ccf24c0650ed0', '18633');
  24. if (is_woocommerce_active()) {
  25. load_plugin_textdomain('wc_gf_addons', null, dirname(plugin_basename(__FILE__)) . '/languages');
  26. if (defined('DOING_AJAX')) {
  27. include 'gravityforms-product-addons-ajax.php';
  28. }
  29. include 'compatibility.php';
  30. class woocommerce_gravityforms {
  31. var $settings;
  32. var $edits = array();
  33. var $gravity_products = array();
  34. var $shortcode_product_id = null;
  35. public function __construct() {
  36. add_action('wp_head', array($this, 'on_wp_head'));
  37. add_action('init', array($this, 'on_init'));
  38. // Enqueue Gravity Forms Scripts
  39. add_action('wp_enqueue_scripts', array(&$this, 'woocommerce_gravityform_enqueue_scripts'), 10);
  40. // Addon display
  41. add_action('woocommerce_before_add_to_cart_button', array(&$this, 'woocommerce_gravityform'), 10);
  42. // Filters for price display
  43. add_filter('woocommerce_grouped_price_html', array(&$this, 'get_price_html'), 10, 2);
  44. add_filter('woocommerce_variation_price_html', array(&$this, 'get_price_html'), 10, 2);
  45. add_filter('woocommerce_variation_sale_price_html', array(&$this, 'get_price_html'), 10, 2);
  46. add_filter('woocommerce_variable_price_html', array(&$this, 'get_price_html'), 10, 2);
  47. add_filter('woocommerce_variable_sale_price_html', array(&$this, 'get_price_html'), 10, 2);
  48. add_filter('woocommerce_variable_empty_price_html', array(&$this, 'get_price_html'), 10, 2);
  49. add_filter('woocommerce_variable_free_sale_price_html', array(&$this, 'get_free_price_html'), 10, 2);
  50. add_filter('woocommerce_variable_free_price_html', array(&$this, 'get_free_price_html'), 10, 2);
  51. add_filter('woocommerce_sale_price_html', array(&$this, 'get_price_html'), 10, 2);
  52. add_filter('woocommerce_price_html', array(&$this, 'get_price_html'), 10, 2);
  53. add_filter('woocommerce_empty_price_html', array(&$this, 'get_price_html'), 10, 2);
  54. add_filter('woocommerce_free_sale_price_html', array(&$this, 'get_free_price_html'), 10, 2);
  55. add_filter('woocommerce_free_price_html', array(&$this, 'get_free_price_html'), 10, 2);
  56. // Filters for cart actions
  57. add_filter('woocommerce_add_cart_item_data', array(&$this, 'add_cart_item_data'), 10, 2);
  58. add_filter('woocommerce_get_cart_item_from_session', array(&$this, 'get_cart_item_from_session'), 10, 2);
  59. add_filter('woocommerce_get_item_data', array(&$this, 'get_item_data'), 10, 2);
  60. add_filter('woocommerce_add_cart_item', array(&$this, 'add_cart_item'), 10, 1);
  61. add_action('woocommerce_order_item_meta', array(&$this, 'order_item_meta'), 10, 2);
  62. // Add meta to order 2.0
  63. add_action('woocommerce_add_order_item_meta', array($this, 'order_item_meta_2'), 10, 2);
  64. add_filter('woocommerce_add_to_cart_validation', array(&$this, 'add_to_cart_validation'), 99, 3);
  65. //Order Again
  66. add_filter('woocommerce_order_again_cart_item_data', array($this, 'on_get_order_again_cart_item_data'), 10, 3);
  67. // Write Panel
  68. add_action('add_meta_boxes', array(&$this, 'add_meta_box'));
  69. add_action('woocommerce_process_product_meta', array(&$this, 'process_meta_box'), 1, 2);
  70. add_action('admin_notices', array($this, 'admin_install_notices'));
  71. //Modify Add to Cart Buttons
  72. add_action('init', array($this, 'get_gravity_products'));
  73. add_action('wp', array($this, 'get_embedded_products'));
  74. }
  75. function on_init() {
  76. if (wc_is_21x()) {
  77. add_filter('woocommerce_loop_add_to_cart_link', array($this, 'get_add_to_cart_link21'), 99, 2);
  78. } else {
  79. add_filter('woocommerce_loop_add_to_cart_link', array($this, 'get_add_to_cart_link'), 99, 3);
  80. }
  81. }
  82. function admin_install_notices() {
  83. if (!class_exists('RGForms')) {
  84. ?>
  85. <div id="message" class="updated woocommerce-error wc-connect">
  86. <div class="squeezer">
  87. <h4><?php _e('<strong>Gravity Forms Not Found</strong> &#8211; The Gravity Forms Plugin is required to build and manage the forms for your products.', 'wc_gf_addons'); ?></h4>
  88. <p class="submit"><a href="http://www.gravityforms.com/" class="button-primary"><?php _e('Get Gravity Forms', 'wc_gf_addons'); ?></a></p>
  89. </div>
  90. </div>
  91. <?php
  92. }
  93. }
  94. function on_wp_head() {
  95. echo '<style type="text/css">';
  96. echo 'dd ul.bulleted { float:none;clear:both; }';
  97. echo '</style>';
  98. }
  99. function get_gravity_products() {
  100. global $wpdb;
  101. $metakey = '_gravity_form_data';
  102. $this->gravity_products = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key=%s", $metakey));
  103. }
  104. function get_add_to_cart_link($anchor, $product, $link) {
  105. if (is_array($this->gravity_products) && in_array($product->id, $this->gravity_products)) {
  106. $link['url'] = apply_filters('variable_add_to_cart_url', get_permalink($product->id));
  107. $link['label'] = apply_filters('variable_add_to_cart_text', __('Select options', 'woocommerce'));
  108. return sprintf('<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" class="%s button product_type_%s">%s</a>', esc_url($link['url']), esc_attr($product->id), esc_attr($product->get_sku()), esc_attr($link['class']), esc_attr('variable'), esc_html($link['label']));
  109. } else {
  110. return $anchor;
  111. }
  112. }
  113. function get_add_to_cart_link21($link, $product) {
  114. if (is_array($this->gravity_products) && in_array($product->id, $this->gravity_products)) {
  115. $label = $product->is_purchasable() && $product->is_in_stock() ? __('Select options', 'woocommerce') : __('Read More', 'woocommerce');
  116. $label = apply_filters('woocommerce_product_add_to_cart_text', $label, $product);
  117. return sprintf('<a href="%s" rel="nofollow" data-product_id="%s" data-product_sku="%s" class="button add_to_cart_button product_type_%s">%s</a>', get_permalink($product->id), esc_attr($product->id), esc_attr($product->get_sku()), 'variable', esc_html($label));
  118. } else {
  119. return $link;
  120. }
  121. }
  122. //Fix up any add to cart button that has a gravity form assoicated with the product.
  123. function on_wp_footer() {
  124. global $wpdb;
  125. $metakey = '_gravity_form_data';
  126. $product_ids = $wpdb->get_col($wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_key=%s", $metakey));
  127. if (is_array($product_ids)) {
  128. $product_ids = array_flip($product_ids);
  129. foreach ($product_ids as $k => $v) {
  130. $product_ids[$k] = get_permalink($k);
  131. }
  132. }
  133. ?>
  134. <script type="text/javascript">
  135. jQuery(document).ready(function($) {
  136. var gravityform_products = <?php echo json_encode($product_ids); ?>;
  137. var label = "<?php echo apply_filters('gravityforms_add_to_cart_text', apply_filters('variable_add_to_cart_text', __('Select options', 'wc_gf_addons'))); ?>";
  138. $('.add_to_cart_button').each(function() {
  139. if ($(this).data('product_id') in gravityform_products) {
  140. $(this).text(label);
  141. $(this).click(function(event) {
  142. event.preventDefault();
  143. var product_id = $(this).data('product_id');
  144. window.location = gravityform_products[product_id];
  145. return false;
  146. });
  147. }
  148. });
  149. });
  150. </script>
  151. <?php
  152. }
  153. /* ----------------------------------------------------------------------------------- */
  154. /* Write Panel */
  155. /* ----------------------------------------------------------------------------------- */
  156. function add_meta_box() {
  157. global $post;
  158. add_meta_box('woocommerce-gravityforms-meta', __('Gravity Forms Product Add-Ons', 'wc_gf_addons'), array(&$this, 'meta_box'), 'product', 'normal', 'default');
  159. }
  160. function meta_box($post) {
  161. ?>
  162. <script type="text/javascript">
  163. jQuery(document).ready(function($) {
  164. $('#gravityform-id').change(function() {
  165. if ($(this).val() != '') {
  166. $('.gforms-panel').show();
  167. } else {
  168. $('.gforms-panel').hide();
  169. }
  170. })
  171. });
  172. </script>
  173. <div id="gravityforms_data" class="panel woocommerce_options_panel">
  174. <h4><?php _e('General', 'wc_gf_addons'); ?></h4>
  175. <?php
  176. $gravity_form_data = get_post_meta($post->ID, '_gravity_form_data', true);
  177. $gravityform = NULL;
  178. if (is_array($gravity_form_data) && isset($gravity_form_data['id']) && is_numeric($gravity_form_data['id'])) {
  179. $form_meta = RGFormsModel::get_form_meta($gravity_form_data['id']);
  180. if (!empty($form_meta)) {
  181. $gravityform = RGFormsModel::get_form($gravity_form_data['id']);
  182. }
  183. }
  184. ?>
  185. <div class="options_group">
  186. <p class="form-field">
  187. <label for="gravityform-id"><?php _e('Choose Form', 'wc_gf_addons'); ?></label>
  188. <?php
  189. echo '<select id="gravityform-id" name="gravityform-id"><option value="">' . __('None', 'wc_gf_addons') . '</option>';
  190. foreach (RGFormsModel::get_forms() as $form) {
  191. echo '<option ' . selected($form->id, $gravity_form_data['id']) . ' value="' . esc_attr($form->id) . '">' . wptexturize($form->title) . '</option>';
  192. }
  193. echo '</select>';
  194. ?>
  195. </p>
  196. <?php
  197. woocommerce_wp_checkbox(array(
  198. 'id' => 'gravityform-display_title',
  199. 'label' => __('Display Title', 'wc_gf_addons'),
  200. 'value' => isset($gravity_form_data['display_title']) && $gravity_form_data['display_title'] ? 'yes' : ''));
  201. woocommerce_wp_checkbox(array(
  202. 'id' => 'gravityform-display_description',
  203. 'label' => __('Display Description', 'wc_gf_addons'),
  204. 'value' => isset($gravity_form_data['display_description']) && $gravity_form_data['display_description'] ? 'yes' : ''));
  205. ?>
  206. </div>
  207. <div class="options_group" style="padding: 0 9px;">
  208. <?php if (!empty($gravityform) && is_object($gravityform)) : ?>
  209. <h4><a href="<?php printf('%s/admin.php?page=gf_edit_forms&id=%d', get_admin_url(), $gravityform->id) ?>" class="edit_gravityform">Edit <?php echo $gravityform->title; ?> Gravity Form</a></h4>
  210. <?php endif; ?>
  211. </div>
  212. </div>
  213. <div id="price_labels_data" class="gforms-panel panel woocommerce_options_panel" <?php echo empty($gravity_form_data['id']) ? "style='display:none;'" : ''; ?>>
  214. <h4><?php _e('Price Labels', 'wc_gf_addons'); ?></h4>
  215. <div class="options_group">
  216. <?php
  217. woocommerce_wp_checkbox(array(
  218. 'id' => 'gravityform-disable_woocommerce_price',
  219. 'label' => __('Remove WooCommerce Price?', 'wc_gf_addons'),
  220. 'value' => isset($gravity_form_data['disable_woocommerce_price']) ? $gravity_form_data['disable_woocommerce_price'] : ''));
  221. woocommerce_wp_text_input(array('id' => 'gravityform-price-before', 'label' => __('Price Before', 'wc_gf_addons'),
  222. 'value' => isset($gravity_form_data['price_before']) ? $gravity_form_data['price_before'] : '',
  223. 'placeholder' => __('Base Price:', 'wc_gf_addons'), 'description' => __('Enter text you would like printed before the price of the product.', 'wc_gf_addons')));
  224. woocommerce_wp_text_input(array('id' => 'gravityform-price-after', 'label' => __('Price After', 'wc_gf_addons'),
  225. 'value' => isset($gravity_form_data['price_after']) ? $gravity_form_data['price_after'] : '',
  226. 'placeholder' => __('', 'wc_gf_addons'), 'description' => __('Enter text you would like printed after the price of the product.', 'wc_gf_addons')));
  227. ?>
  228. </div>
  229. </div>
  230. <div id="total_labels_data" class="gforms-panel panel woocommerce_options_panel" <?php echo empty($gravity_form_data['id']) ? "style='display:none;'" : ''; ?>>
  231. <h4><?php _e('Total Calculations', 'wc_gf_addons'); ?></h4>
  232. <?php
  233. echo '<div class="options_group">';
  234. woocommerce_wp_checkbox(array(
  235. 'id' => 'gravityform-disable_calculations',
  236. 'label' => __('Disable Calculations?', 'wc_gf_addons'),
  237. 'value' => isset($gravity_form_data['disable_calculations']) ? $gravity_form_data['disable_calculations'] : ''));
  238. echo '</div><div class="options_group">';
  239. woocommerce_wp_checkbox(array(
  240. 'id' => 'gravityform-disable_label_subtotal',
  241. 'label' => __('Disable Subtotal?', 'wc_gf_addons'),
  242. 'value' => isset($gravity_form_data['disable_label_subtotal']) ? $gravity_form_data['disable_label_subtotal'] : ''));
  243. woocommerce_wp_text_input(array('id' => 'gravityform-label_subtotal', 'label' => __('Subtotal Label', 'wc_gf_addons'),
  244. 'value' => isset($gravity_form_data['label_subtotal']) && !empty($gravity_form_data['label_subtotal']) ? $gravity_form_data['label_subtotal'] : 'Subtotal',
  245. 'placeholder' => __('Subtotal', 'wc_gf_addons'), 'description' => __('Enter "Subtotal" label to display on for single products.', 'wc_gf_addons')));
  246. echo '</div><div class="options_group">';
  247. woocommerce_wp_checkbox(array(
  248. 'id' => 'gravityform-disable_label_options',
  249. 'label' => __('Disable Options Label?', 'wc_gf_addons'),
  250. 'value' => isset($gravity_form_data['disable_label_options']) ? $gravity_form_data['disable_label_options'] : ''));
  251. woocommerce_wp_text_input(array('id' => 'gravityform-label_options', 'label' => __('Options Label', 'wc_gf_addons'),
  252. 'value' => isset($gravity_form_data['label_options']) && !empty($gravity_form_data['label_options']) ? $gravity_form_data['label_options'] : 'Options',
  253. 'placeholder' => __('Options', 'wc_gf_addons'), 'description' => __('Enter the "Options" label to display for single products.', 'wc_gf_addons')));
  254. echo '</div><div class="options_group">';
  255. woocommerce_wp_checkbox(array(
  256. 'id' => 'gravityform-disable_label_total',
  257. 'label' => __('Disable Total Label?', 'wc_gf_addons'),
  258. 'value' => isset($gravity_form_data['disable_label_total']) ? $gravity_form_data['disable_label_total'] : ''));
  259. woocommerce_wp_text_input(array('id' => 'gravityform-label_total', 'label' => __('Total Label', 'wc_gf_addons'),
  260. 'value' => isset($gravity_form_data['label_total']) && !empty($gravity_form_data['label_total']) ? $gravity_form_data['label_total'] : 'Total',
  261. 'placeholder' => __('Total', 'wc_gf_addons'), 'description' => __('Enter the "Total" label to display for single products.', 'wc_gf_addons')));
  262. echo '</div>';
  263. ?>
  264. </div>
  265. <?php
  266. }
  267. function process_meta_box($post_id, $post) {
  268. global $woocommerce_errors;
  269. // Save gravity form as serialised array
  270. if (isset($_POST['gravityform-id']) && !empty($_POST['gravityform-id'])) {
  271. $product = null;
  272. if (function_exists('get_product')) {
  273. $product = get_product($post_id);
  274. } else {
  275. $product = new WC_Product($post_id);
  276. }
  277. if ($product->product_type != 'variable' && empty($product->price) && ($product->price != '0' || $product->price != '0.00')) {
  278. $woocommerce_errors[] = __('You must set a price for the product before the gravity form will be visible. Set the price to 0 if you are performing all price calculations with the attached Gravity Form.', 'woocommerce');
  279. }
  280. $gravity_form_data = array(
  281. 'id' => $_POST['gravityform-id'],
  282. 'display_title' => isset($_POST['gravityform-display_title']) ? true : false,
  283. 'display_description' => isset($_POST['gravityform-display_description']) ? true : false,
  284. 'disable_woocommerce_price' => isset($_POST['gravityform-disable_woocommerce_price']) ? 'yes' : 'no',
  285. 'price_before' => $_POST['gravityform-price-before'],
  286. 'price_after' => $_POST['gravityform-price-after'],
  287. 'disable_calculations' => isset($_POST['gravityform-disable_calculations']) ? 'yes' : 'no',
  288. 'disable_label_subtotal' => isset($_POST['gravityform-disable_label_subtotal']) ? 'yes' : 'no',
  289. 'disable_label_options' => isset($_POST['gravityform-disable_label_options']) ? 'yes' : 'no',
  290. 'disable_label_total' => isset($_POST['gravityform-disable_label_total']) ? 'yes' : 'no',
  291. 'label_subtotal' => $_POST['gravityform-label_subtotal'],
  292. 'label_options' => $_POST['gravityform-label_options'],
  293. 'label_total' => $_POST['gravityform-label_total']
  294. );
  295. update_post_meta($post_id, '_gravity_form_data', $gravity_form_data);
  296. } else {
  297. delete_post_meta($post_id, '_gravity_form_data');
  298. }
  299. }
  300. /* ----------------------------------------------------------------------------------- */
  301. /* Product Form Functions */
  302. /* ----------------------------------------------------------------------------------- */
  303. function woocommerce_gravityform() {
  304. global $post, $woocommerce;
  305. include_once( 'gravityforms-product-addons-form.php' );
  306. $gravity_form_data = get_post_meta($post->ID, '_gravity_form_data', true);
  307. if (is_array($gravity_form_data) && $gravity_form_data['id']) {
  308. $product = null;
  309. if (function_exists('get_product')) {
  310. $product = get_product($post->ID);
  311. } else {
  312. $product = new WC_Product($post->ID);
  313. }
  314. $product_form = new woocommerce_gravityforms_product_form($gravity_form_data['id'], $post->ID);
  315. $product_form->get_form($gravity_form_data);
  316. $add_to_cart_value = '';
  317. if ($product->is_type('variable')) :
  318. $add_to_cart_value = 'variation';
  319. elseif ($product->has_child()) :
  320. $add_to_cart_value = 'group';
  321. else :
  322. $add_to_cart_value = $product->id;
  323. endif;
  324. if (!function_exists('get_product')) {
  325. //1.x only
  326. $woocommerce->nonce_field('add_to_cart');
  327. echo '<input type="hidden" name="add-to-cart" value="' . $add_to_cart_value . '" />';
  328. } else {
  329. echo '<input type="hidden" name="add-to-cart" value="' . $post->ID . '" />';
  330. }
  331. }
  332. echo '<div class="clear"></div>';
  333. }
  334. function woocommerce_gravityform_enqueue_scripts() {
  335. global $post;
  336. if (is_product()) {
  337. $gravity_form_data = get_post_meta($post->ID, '_gravity_form_data', true);
  338. if ($gravity_form_data && is_array($gravity_form_data)) {
  339. //wp_enqueue_script("gforms_gravityforms", GFCommon::get_base_url() . "/js/gravityforms.js", array("jquery"), GFCommon::$version, false);
  340. gravity_form_enqueue_scripts($gravity_form_data['id'], false);
  341. wp_enqueue_script('wc-gravityforms-product-addons', woocommerce_gravityforms::plugin_url() . '/assets/js/gravityforms-product-addons.js', array('jquery'), true);
  342. }
  343. } elseif ($this->shortcode_product_id) {
  344. $gravity_form_data = get_post_meta($this->shortcode_product_id, '_gravity_form_data', true);
  345. if ($gravity_form_data && is_array($gravity_form_data)) {
  346. //wp_enqueue_script("gforms_gravityforms", GFCommon::get_base_url() . "/js/gravityforms.js", array("jquery"), GFCommon::$version, false);
  347. gravity_form_enqueue_scripts($gravity_form_data['id'], false);
  348. wp_enqueue_script('wc-gravityforms-product-addons', woocommerce_gravityforms::plugin_url() . '/assets/js/gravityforms-product-addons.js', array('jquery'), true);
  349. }
  350. }
  351. }
  352. public function get_embedded_products() {
  353. global $post;
  354. if (!is_admin()) {
  355. if ($post) {
  356. $pattern = get_shortcode_regex();
  357. if (preg_match_all('/' . $pattern . '/s', $post->post_content, $matches) && array_key_exists(2, $matches) && in_array('product_page', $matches[2])) {
  358. if (preg_match('~\[product_page\s+id\s*=\s*("|\')(?<id>.*?)\1\s*\]~i', $post->post_content, $m)) {
  359. if (isset($m['id'])) {
  360. $this->shortcode_product_id = (int) $m['id'];
  361. }
  362. }
  363. }
  364. }
  365. }
  366. }
  367. function get_price_html($html, $_product) {
  368. $gravity_form_data = get_post_meta($_product->id, '_gravity_form_data', true);
  369. if ($gravity_form_data && is_array($gravity_form_data)) {
  370. if (isset($gravity_form_data['disable_woocommerce_price']) && $gravity_form_data['disable_woocommerce_price'] == 'yes') {
  371. $html = '';
  372. }
  373. if (isset($gravity_form_data['price_before'])) {
  374. $html = '<span class="woocommerce-price-before">' . $gravity_form_data['price_before'] . ' </span>' . $html;
  375. }
  376. if (isset($gravity_form_data['price_after'])) {
  377. $html .= '<span class="woocommerce-price-after"> ' . $gravity_form_data['price_after'] . '</span>';
  378. }
  379. }
  380. return $html;
  381. }
  382. function get_free_price_html($html, $_product) {
  383. $gravity_form_data = get_post_meta($_product->id, '_gravity_form_data', true);
  384. if ($gravity_form_data && is_array($gravity_form_data)) {
  385. if (isset($gravity_form_data['price_before'])) {
  386. $html = '<span class="woocommerce-price-before">' . $gravity_form_data['price_before'] . ' </span>';
  387. }
  388. if (isset($gravity_form_data['price_after'])) {
  389. $html .= '<span class="woocommerce-price-after"> ' . $gravity_form_data['price_after'] . '</span>';
  390. }
  391. }
  392. return $html;
  393. }
  394. function get_formatted_price($price) {
  395. return woocommerce_price($price);
  396. }
  397. function disable_notifications($disabled, $form, $lead) {
  398. return true;
  399. }
  400. function disable_confirmation($confirmation, $form, $lead, $ajax) {
  401. if (is_array($confirmation) && isset($confirmation['redirect'])) {
  402. return $confirmation;
  403. } else {
  404. return false;
  405. }
  406. }
  407. function add_to_cart_validation($valid, $product_id, $quantity) {
  408. global $woocommerce;
  409. if (!$valid) {
  410. return false;
  411. }
  412. // Check if we need a gravity form!
  413. $gravity_form_data = get_post_meta($product_id, '_gravity_form_data', true);
  414. if (is_array($gravity_form_data) && $gravity_form_data['id'] && empty($_POST['gform_form_id']))
  415. return false;
  416. if (isset($_POST['gform_form_id']) && is_numeric($_POST['gform_form_id'])) {
  417. $form_id = $_POST['gform_form_id'];
  418. //Gravity forms generates errors and warnings. To prevent these from conflicting with other things, we are going to disable warnings and errors.
  419. $err_level = error_reporting();
  420. error_reporting(0);
  421. //MUST disable notifications manually.
  422. add_filter('gform_disable_user_notification_' . $form_id, array(&$this, 'disable_notifications'), 10, 3);
  423. add_filter('gform_disable_admin_notification_' . $form_id, array(&$this, 'disable_notifications'), 10, 3);
  424. add_filter('gform_disable_notification_' . $form_id, array(&$this, 'disable_notifications'), 10, 3);
  425. add_filter("gform_confirmation_" . $form_id, array($this, "disable_confirmation"), 10, 4);
  426. require_once(GFCommon::get_base_path() . "/form_display.php");
  427. $_POST['gform_submit'] = $_POST['gform_old_submit'];
  428. GFFormDisplay::process_form($form_id);
  429. $_POST['gform_old_submit'] = $_POST['gform_submit'];
  430. unset($_POST['gform_submit']);
  431. if (!GFFormDisplay::$submission[$form_id]['is_valid']) {
  432. return false;
  433. }
  434. if (GFFormDisplay::$submission[$form_id]['page_number'] != 0) {
  435. return false;
  436. }
  437. error_reporting($err_level);
  438. }
  439. return $valid;
  440. }
  441. //When the item is being added to the cart.
  442. function add_cart_item_data($cart_item_meta, $product_id) {
  443. global $woocommerce;
  444. if (isset($cart_item_meta['_gravity_form_data']) && isset($cart_item_meta['_gravity_form_lead'])) {
  445. return $cart_item_meta;
  446. }
  447. $gravity_form_data = get_post_meta($product_id, '_gravity_form_data', true);
  448. $cart_item_meta['_gravity_form_data'] = $gravity_form_data;
  449. if ($gravity_form_data && is_array($gravity_form_data) && isset($gravity_form_data['id']) && intval($gravity_form_data['id']) > 0) {
  450. $form_id = $gravity_form_data['id'];
  451. $form_meta = RGFormsModel::get_form_meta($form_id);
  452. //Gravity forms generates errors and warnings. To prevent these from conflicting with other things, we are going to disable warnings and errors.
  453. $err_level = error_reporting();
  454. error_reporting(0);
  455. //MUST disable notifications manually.
  456. add_filter('gform_disable_user_notification_' . $form_id, array(&$this, 'disable_notifications'), 10, 3);
  457. add_filter('gform_disable_admin_notification_' . $form_id, array(&$this, 'disable_notifications'), 10, 3);
  458. add_filter('gform_disable_notification_' . $form_id, array(&$this, 'disable_notifications'), 10, 3);
  459. add_filter("gform_confirmation_" . $form_id, array($this, "disable_confirmation"), 10, 4);
  460. if (empty($form_meta)) {
  461. return $cart_item_meta;
  462. }
  463. require_once(GFCommon::get_base_path() . "/form_display.php");
  464. $_POST['gform_submit'] = $_POST['gform_old_submit'];
  465. GFFormDisplay::process_form($form_id);
  466. $_POST['gform_old_submit'] = $_POST['gform_submit'];
  467. unset($_POST['gform_submit']);
  468. $lead = GFFormDisplay::$submission[$form_id]['lead'];
  469. $cart_item_meta['_gravity_form_lead'] = array();
  470. foreach ($form_meta['fields'] as $field) {
  471. if (isset($field['displayOnly']) && $field['displayOnly']) {
  472. continue;
  473. }
  474. $value = RGFormsModel::get_lead_field_value($lead, $field);
  475. if (isset($field['inputs']) && is_array($field['inputs'])) {
  476. foreach ($field['inputs'] as $input) {
  477. $cart_item_meta['_gravity_form_lead'][strval($input['id'])] = $value[strval($input['id'])];
  478. }
  479. } else {
  480. $cart_item_meta['_gravity_form_lead'][strval($field['id'])] = $value;
  481. }
  482. }
  483. if (GFFormDisplay::$submission[$form_id]['is_valid']) {
  484. add_filter('add_to_cart_redirect', array(&$this, 'get_redirect_url'), 99);
  485. if (get_option('woocommerce_cart_redirect_after_add') == 'yes') {
  486. $_SERVER['REQUEST_URI'] = add_query_arg(array('invalid' => 1));
  487. }
  488. }
  489. error_reporting($err_level);
  490. }
  491. return $cart_item_meta;
  492. }
  493. function get_cart_item_from_session($cart_item, $values) {
  494. if (isset($values['_gravity_form_data'])) {
  495. $cart_item['_gravity_form_data'] = $values['_gravity_form_data'];
  496. }
  497. if (isset($values['_gravity_form_lead'])) {
  498. $cart_item['_gravity_form_lead'] = $values['_gravity_form_lead'];
  499. }
  500. if (isset($cart_item['_gravity_form_lead']) && isset($cart_item['_gravity_form_data'])) {
  501. $this->add_cart_item($cart_item);
  502. }
  503. return $cart_item;
  504. }
  505. function get_item_data($other_data, $cart_item) {
  506. if (isset($cart_item['_gravity_form_lead']) && isset($cart_item['_gravity_form_data'])) {
  507. //Gravity forms generates errors and warnings. To prevent these from conflicting with other things, we are going to disable warnings and errors.
  508. $err_level = error_reporting();
  509. error_reporting(0);
  510. $gravity_form_data = $cart_item['_gravity_form_data'];
  511. $form_meta = RGFormsModel::get_form_meta($gravity_form_data['id']);
  512. if (!empty($form_meta)) {
  513. $lead = $cart_item['_gravity_form_lead'];
  514. $lead['id'] = uniqid() . time() . rand();
  515. $products = $this->get_product_fields($form_meta, $lead);
  516. $valid_products = array();
  517. foreach ($products['products'] as $id => $product) {
  518. if ($product['quantity']) {
  519. $valid_products[] = $id;
  520. }
  521. }
  522. foreach ($form_meta['fields'] as $field) {
  523. if ($field['inputType'] == 'hiddenproduct' || $field['type'] == 'total' || (isset($field['displayOnly']) && $field['displayOnly'])) {
  524. continue;
  525. }
  526. if ($field['type'] == 'product') {
  527. if (!in_array($field['id'], $valid_products)) {
  528. continue;
  529. }
  530. }
  531. $value = RGFormsModel::get_lead_field_value($lead, $field);
  532. $arr_var = (is_array($value)) ? implode('', $value) : '-';
  533. if (!empty($value) && !empty($arr_var)) {
  534. $display_value = GFCommon::get_lead_field_display($field, $value, isset($lead["currency"]) ? $lead["currency"] : false, false);
  535. $price_adjustement = false;
  536. $display_value = apply_filters("gform_entry_field_value", $display_value, $field, $lead, $form_meta);
  537. $display_text = GFCommon::get_lead_field_display($field, $value, isset($lead["currency"]) ? $lead["currency"] : false, true);
  538. $display_text = apply_filters("woocommerce_gforms_field_display_text", $display_text, $display_value, $field, $lead, $form_meta);
  539. $display_title = GFCommon::get_label($field);
  540. $other_data[] = array('name' => $display_title, 'display' => $display_text, 'value' => $display_value);
  541. }
  542. }
  543. }
  544. error_reporting($err_level);
  545. }
  546. return $other_data;
  547. }
  548. //Helper function, used when an item is added to the cart as well as when an item is restored from session.
  549. function add_cart_item($cart_item) {
  550. global $woocommerce;
  551. // Adjust price if required based on the gravity form data
  552. if (isset($cart_item['_gravity_form_lead']) && isset($cart_item['_gravity_form_data'])) {
  553. //Gravity forms generates errors and warnings. To prevent these from conflicting with other things, we are going to disable warnings and errors.
  554. $err_level = error_reporting();
  555. error_reporting(0);
  556. $gravity_form_data = $cart_item['_gravity_form_data'];
  557. $form_meta = RGFormsModel::get_form_meta($gravity_form_data['id']);
  558. if (empty($form_meta)) {
  559. $_product = $cart_item['data'];
  560. $woocommerce->add_error($_product->get_title() . __(' is invalid. Please remove and try readding to the cart', 'wc_gf_addons'));
  561. return $cart_item;
  562. }
  563. $lead = $cart_item['_gravity_form_lead'];
  564. $products = array();
  565. $total = 0;
  566. $lead['id'] = uniqid() . time() . rand();
  567. $products = $this->get_product_fields($form_meta, $lead);
  568. if (!empty($products["products"])) {
  569. foreach ($products["products"] as $product) {
  570. $price = GFCommon::to_number($product["price"]);
  571. if (is_array(rgar($product, "options"))) {
  572. $count = sizeof($product["options"]);
  573. $index = 1;
  574. foreach ($product["options"] as $option) {
  575. $price += GFCommon::to_number($option["price"]);
  576. $class = $index == $count ? " class='lastitem'" : "";
  577. $index++;
  578. }
  579. }
  580. $subtotal = floatval($product["quantity"]) * $price;
  581. $total += $subtotal;
  582. }
  583. $total += floatval($products["shipping"]["price"]);
  584. }
  585. $cart_item['data']->adjust_price($total);
  586. error_reporting($err_level);
  587. }
  588. return $cart_item;
  589. }
  590. function order_item_meta($item_meta, $cart_item) {
  591. if (isset($cart_item['_gravity_form_lead']) && isset($cart_item['_gravity_form_data'])) {
  592. //Gravity forms generates errors and warnings. To prevent these from conflicting with other things, we are going to disable warnings and errors.
  593. $err_level = error_reporting();
  594. error_reporting(0);
  595. $gravity_form_data = $cart_item['_gravity_form_data'];
  596. $form_meta = RGFormsModel::get_form_meta($gravity_form_data['id']);
  597. if (!empty($form_meta)) {
  598. $lead = $cart_item['_gravity_form_lead'];
  599. $lead['id'] = uniqid() . time() . rand();
  600. $products = $this->get_product_fields($form_meta, $lead);
  601. $valid_products = array();
  602. foreach ($products['products'] as $id => $product) {
  603. if ($product['quantity']) {
  604. $valid_products[] = $id;
  605. }
  606. }
  607. foreach ($form_meta['fields'] as $field) {
  608. if ((isset($field['inputType']) && $field['inputType'] == 'hiddenproduct') || (isset($field['displayOnly']) && $field['displayOnly'])) {
  609. continue;
  610. }
  611. if ($field['type'] == 'product') {
  612. if (!in_array($field['id'], $valid_products)) {
  613. continue;
  614. }
  615. }
  616. $value = RGFormsModel::get_lead_field_value($lead, $field);
  617. $arr_var = (is_array($value)) ? implode('', $value) : '-';
  618. if (!empty($value) && !empty($arr_var)) {
  619. try {
  620. $display_value = GFCommon::get_lead_field_display($field, $value, isset($lead["currency"]) ? $lead["currency"] : false, false);
  621. $display_text = GFCommon::get_lead_field_display($field, $value, isset($lead["currency"]) ? $lead["currency"] : false, true);
  622. $price_adjustement = false;
  623. $display_value = apply_filters("gform_entry_field_value", $display_value, $field, $lead, $form_meta);
  624. $display_title = GFCommon::get_label($field);
  625. $display_title = apply_filters("woocommerce_gforms_order_meta_title", $display_title, $field, $lead, $form_meta);
  626. $display_value = apply_filters("woocommerce_gforms_order_meta_value", $display_value, $field, $lead, $form_meta);
  627. if (apply_filters('woocommerce_gforms_strip_meta_html', true, $display_value, $field, $lead, $form_meta)) {
  628. if (strstr($display_value, '<li>')) {
  629. $display_value = str_replace('<li>', '', $display_value);
  630. $display_value = explode('</li>', $display_value);
  631. $display_value = strip_tags(implode(', ', $display_value));
  632. $display_value = substr($display_value, 0, strlen($display_value) - 2);
  633. }
  634. $display_value = strip_tags($display_value);
  635. }
  636. $item_meta->add($display_title, $display_value);
  637. } catch (Exception $e) {
  638. }
  639. }
  640. }
  641. }
  642. error_reporting($err_level);
  643. }
  644. }
  645. public function order_item_meta_2($item_id, $cart_item) {
  646. if (function_exists('woocommerce_add_order_item_meta')) {
  647. if (isset($cart_item['_gravity_form_lead']) && isset($cart_item['_gravity_form_data'])) {
  648. woocommerce_add_order_item_meta($item_id, '_gravity_forms_history', array(
  649. '_gravity_form_lead' => $cart_item['_gravity_form_lead'],
  650. '_gravity_form_data' => $cart_item['_gravity_form_data']
  651. )
  652. );
  653. //Gravity forms generates errors and warnings. To prevent these from conflicting with other things, we are going to disable warnings and errors.
  654. $err_level = error_reporting();
  655. error_reporting(0);
  656. $gravity_form_data = $cart_item['_gravity_form_data'];
  657. $form_meta = RGFormsModel::get_form_meta($gravity_form_data['id']);
  658. if (!empty($form_meta)) {
  659. $lead = $cart_item['_gravity_form_lead'];
  660. $lead['id'] = uniqid() . time() . rand();
  661. $products = $this->get_product_fields($form_meta, $lead);
  662. $valid_products = array();
  663. foreach ($products['products'] as $id => $product) {
  664. if (!isset($product['quantity'])) {
  665. } elseif ($product['quantity']) {
  666. $valid_products[] = $id;
  667. }
  668. }
  669. foreach ($form_meta['fields'] as $field) {
  670. if ((isset($field['inputType']) && $field['inputType'] == 'hiddenproduct') || (isset($field['displayOnly']) && $field['displayOnly'])) {
  671. continue;
  672. }
  673. if ($field['type'] == 'product') {
  674. if (!in_array($field['id'], $valid_products)) {
  675. continue;
  676. }
  677. }
  678. $value = RGFormsModel::get_lead_field_value($lead, $field);
  679. $arr_var = (is_array($value)) ? implode('', $value) : '-';
  680. if (!empty($value) && !empty($arr_var)) {
  681. try {
  682. if ($field['type'] == 'fileupload' && isset($lead[$field['id']])) {
  683. $display_value = $lead[$field['id']];
  684. } else {
  685. $display_value = GFCommon::get_lead_field_display($field, $value, isset($lead["currency"]) ? $lead["currency"] : false, apply_filters('woocommerce_gforms_use_label_as_value', true, $value, $field, $lead, $form_meta));
  686. $price_adjustement = false;
  687. $display_value = apply_filters("gform_entry_field_value", $display_value, $field, $lead, $form_meta);
  688. }
  689. $display_title = GFCommon::get_label($field);
  690. $display_title = apply_filters("woocommerce_gforms_order_meta_title", $display_title, $field, $lead, $form_meta, $item_id, $cart_item);
  691. $display_value = apply_filters("woocommerce_gforms_order_meta_value", $display_value, $field, $lead, $form_meta, $item_id, $cart_item);
  692. if (apply_filters('woocommerce_gforms_strip_meta_html', true, $display_value, $field, $lead, $form_meta, $item_id, $cart_item)) {
  693. if (strstr($display_value, '<li>')) {
  694. $display_value = str_replace('<li>', '', $display_value);
  695. $display_value = explode('</li>', $display_value);
  696. $display_value = trim( strip_tags(implode(', ', $display_value)));
  697. $display_value = trim($display_value, ',');
  698. }
  699. $display_value = strip_tags(wp_kses( $display_value, '') );
  700. }
  701. $display_text = GFCommon::get_lead_field_display($field, $value, isset($lead["currency"]) ? $lead["currency"] : false, false);
  702. $display_value = apply_filters("woocommerce_gforms_field_display_text", $display_value, $display_text, $field, $lead, $form_meta);
  703. woocommerce_add_order_item_meta($item_id, $display_title, $display_value);
  704. } catch (Exception $e) {
  705. }
  706. }
  707. }
  708. }
  709. error_reporting($err_level);
  710. }
  711. }
  712. }
  713. public function get_product_fields($form, $lead, $use_choice_text = false, $use_admin_label = false) {
  714. $products = array();
  715. foreach ($form["fields"] as $field) {
  716. $id = $field["id"];
  717. $lead_value = RGFormsModel::get_lead_field_value($lead, $field);
  718. $quantity_field = GFCommon::get_product_fields_by_type($form, array("quantity"), $id);
  719. $quantity = sizeof($quantity_field) > 0 ? RGFormsModel::get_lead_field_value($lead, $quantity_field[0]) : 1;
  720. switch ($field["type"]) {
  721. case "product" :
  722. //ignore products that have been hidden by conditional logic
  723. $is_hidden = RGFormsModel::is_field_hidden($form, $field, array(), $lead);
  724. if ($is_hidden)
  725. continue;
  726. //if single product, get values from the multiple inputs
  727. if (is_array($lead_value)) {
  728. $product_quantity = sizeof($quantity_field) == 0 && !rgar($field, "disableQuantity") ? rgget($id . ".3", $lead_value) : $quantity;
  729. if (empty($product_quantity))
  730. continue;
  731. if (!rgget($id, $products))
  732. $products[$id] = array();
  733. $products[$id]["name"] = $use_admin_label && !rgempty("adminLabel", $field) ? $field["adminLabel"] : $lead_value[$id . ".1"];
  734. $products[$id]["price"] = rgar($lead_value, $id . ".2");
  735. $products[$id]["quantity"] = $product_quantity;
  736. }
  737. else if (!empty($lead_value)) {
  738. if (empty($quantity))
  739. continue;
  740. if (!rgar($products, $id))
  741. $products[$id] = array();
  742. if ($field["inputType"] == "price") {
  743. $name = $field["label"];
  744. $price = $lead_value;
  745. } else {
  746. list($name, $price) = explode("|", $lead_value);
  747. }
  748. $products[$id]["name"] = !$use_choice_text ? $name : RGFormsModel::get_choice_text($field, $name);
  749. $products[$id]["price"] = $price;
  750. $products[$id]["quantity"] = $quantity;
  751. $products[$id]["options"] = array();
  752. }
  753. if (isset($products[$id])) {
  754. $options = GFCommon::get_product_fields_by_type($form, array("option"), $id);
  755. foreach ($options as $option) {
  756. $option_value = RGFormsModel::get_lead_field_value($lead, $option);
  757. $option_label = empty($option["adminLabel"]) ? $option["label"] : $option["adminLabel"];
  758. if (is_array($option_value)) {
  759. foreach ($option_value as $value) {
  760. $option_info = GFCommon::get_option_info($value, $option, $use_choice_text);
  761. if (!empty($option_info))
  762. $products[$id]["options"][] = array("field_label" => rgar($option, "label"), "option_name" => rgar($option_info, "name"), "option_label" => $option_label . ": " . rgar($option_info, "name"), "price" => rgar($option_info, "price"));
  763. }
  764. }
  765. else if (!empty($option_value)) {
  766. $option_info = GFCommon::get_option_info($option_value, $option, $use_choice_text);
  767. $products[$id]["options"][] = array("field_label" => rgar($option, "label"), "option_name" => rgar($option_info, "name"), "option_label" => $option_label . ": " . rgar($option_info, "name"), "price" => rgar($option_info, "price"));
  768. }
  769. }
  770. }
  771. break;
  772. }
  773. }
  774. $shipping_field = GFCommon::get_fields_by_type($form, array("shipping"));
  775. $shipping_price = $shipping_name = "";
  776. if (!empty($shipping_field) && !RGFormsModel::is_field_hidden($form, $shipping_field[0], array(), $lead)) {
  777. $shipping_price = RGFormsModel::get_lead_field_value($lead, $shipping_field[0]);
  778. $shipping_name = $shipping_field[0]["label"];
  779. if ($shipping_field[0]["inputType"] != "singleshipping") {
  780. list($shipping_method, $shipping_price) = explode("|", $shipping_price);
  781. $shipping_name = $shipping_field[0]["label"] . " ($shipping_method)";
  782. }
  783. }
  784. $shipping_price = GFCommon::to_number($shipping_price);
  785. $product_info = array("products" => $products, "shipping" => array("name" => $shipping_name, "price" => $shipping_price));
  786. $product_info = apply_filters("gform_product_info_{$form["id"]}", apply_filters("gform_product_info", $product_info, $form, $lead), $form, $lead);
  787. return $product_info;
  788. }
  789. function get_redirect_url($url) {
  790. global $woocommerce;
  791. if (!empty($url)) {
  792. return $url;
  793. } elseif (get_option('woocommerce_cart_redirect_after_add') == 'yes' && $woocommerce->error_count() == 0) {
  794. $url = $woocommerce->cart->get_cart_url();
  795. } else {
  796. $ref = false;
  797. if (!empty($_REQUEST['_wp_http_referer']))
  798. $ref = $_REQUEST['_wp_http_referer'];
  799. else if (!empty($_SERVER['HTTP_REFERER']))
  800. $ref = $_SERVER['HTTP_REFERER'];
  801. $url = $ref ? $ref : $url;
  802. }
  803. return $url;
  804. }
  805. public function on_get_order_again_cart_item_data($data, $item, $order) {
  806. //disable validation
  807. remove_filter('woocommerce_add_to_cart_validation', array(&$this, 'add_to_cart_validation'), 99, 3);
  808. $history = isset($item['gravity_forms_history']) ? maybe_unserialize($item['gravity_forms_history']) : false;
  809. if (!$history) {
  810. //Not sure why exactly WC strips out the leading _, let's check for it anyways
  811. isset($item['_gravity_forms_history']) ? maybe_unserialize($item['_gravity_forms_history']) : false;
  812. }
  813. if ($history) {
  814. $glead = isset($history['_gravity_form_lead']) ? $history['_gravity_form_lead'] : false;
  815. $gdata = isset($history['_gravity_form_data']) ? $history['_gravity_form_data'] : false;
  816. if ($glead && $gdata) {
  817. $data['_gravity_form_lead'] = $glead;
  818. $data['_gravity_form_data'] = $gdata;
  819. }
  820. }
  821. return $data;
  822. }
  823. /** Helper functions ***************************************************** */
  824. /**
  825. * Get the plugin url.
  826. *
  827. * @access public
  828. * @return string
  829. */
  830. public static function plugin_url() {
  831. return plugins_url(basename(plugin_dir_path(__FILE__)), basename(__FILE__));
  832. }
  833. }
  834. $woocommerce_gravityforms = new woocommerce_gravityforms();
  835. }