/** * Wrapper function to make sure GravityView_Extension has loaded * @return void */ function gv_extension_featured_entry_load() { if (!class_exists('GravityView_Extension')) { if (class_exists('GravityView_Plugin') && is_callable(array('GravityView_Plugin', 'include_extension_framework'))) { GravityView_Plugin::include_extension_framework(); } else { // We prefer to use the one bundled with GravityView, but if it doesn't exist, go here. include_once GV_DT_DIR . 'lib/class-gravityview-extension.php'; } } class GV_Extension_DataTables extends GravityView_Extension { protected $_title = 'DataTables'; protected $_version = '1.3'; const version = '1.3'; protected $_text_domain = 'gv-datatables'; protected $_min_gravityview_version = '1.1.7'; protected $_path = __FILE__; public function add_hooks() { // load DataTables admin logic add_action('gravityview_include_backend_actions', array($this, 'backend_actions')); // load DataTables core logic add_action('init', array($this, 'core_actions'), 19); // Register specific template. Run at 30 priority because GravityView_Plugin::frontend_actions() runs at 20 add_action('init', array($this, 'register_templates'), 30); } function backend_actions() { include_once GV_DT_DIR . 'includes/class-admin-datatables.php'; } function core_actions() { include_once GV_DT_DIR . 'includes/class-datatables-data.php'; include_once GV_DT_DIR . 'includes/extensions/class-datatables-extension.php'; include_once GV_DT_DIR . 'includes/extensions/class-datatables-tabletools.php'; include_once GV_DT_DIR . 'includes/extensions/class-datatables-scroller.php'; include_once GV_DT_DIR . 'includes/extensions/class-datatables-fixedheader.php'; include_once GV_DT_DIR . 'includes/extensions/class-datatables-responsive.php'; } function register_templates() { include_once GV_DT_DIR . 'includes/class-datatables-template.php'; } } new GV_Extension_DataTables(); }
/** * Wrapper function to make sure GravityView_Extension has loaded * @return void */ function gv_extension_visual_composer_load() { if (!class_exists('GravityView_Extension')) { if (class_exists('GravityView_Plugin') && is_callable(array('GravityView_Plugin', 'include_extension_framework'))) { GravityView_Plugin::include_extension_framework(); } else { // We prefer to use the one bundled with GravityView, but if it doesn't exist, go here. include_once plugin_dir_path(__FILE__) . 'lib/class-gravityview-extension.php'; } } class GravityView_Visual_Composer extends GravityView_Extension { protected $_title = 'Visual Composer'; protected $_version = '1.0.3'; protected $_min_gravityview_version = '1.1.7'; protected $_text_domain = 'gravityview-visual-composer'; protected $_path = __FILE__; function add_hooks() { // Visual Composer isn't loaded. if (!function_exists('vc_map')) { self::add_notice(array('message' => sprintf('The GravityView Visual Composer extension requires the %sVisual Composer%s plugin.', '<a href="http://katz.si/visualcomposer">', '</a>'))); do_action('gravityview_log_debug', 'GravityView_Visual_Composer[add_hooks] Not loading: Visual Composer isnt active.'); return; } add_action('admin_init', array($this, 'vc_map')); } /** * Add the GravityView menu to the Visual Composer menu * @uses vc_map * @return void */ function vc_map() { global $vc_manager; $views = get_posts(array('post_type' => 'gravityview', 'numberposts' => -1, 'status' => 'publish')); if (empty($views) || is_wp_error($views)) { // By default, there are no Views found. $gravityview_array[__('No GravityView Views found.', 'gravityview-visual-composer')] = ''; $params = array(array('type' => 'dropdown', 'heading' => __('View', 'gravityview-visual-composer'), 'param_name' => 'id', 'value' => $gravityview_array, 'description' => GravityView_Post_Types::no_views_text(), 'admin_label' => true)); } else { // Overwrite the default $views_array = array(__('Select a View to Insert', 'gravityview-visual-composer') => ''); // Map the title of the view to the ID foreach ($views as $view) { $title = !empty($view->post_title) ? esc_attr($view->post_title) : __('(no title)', 'gravityview-visual-composer'); $views_array[$title] = $view->ID; } $params = $this->get_params($views_array); } vc_map(array('name' => __('GravityView', 'gravityview-visual-composer'), 'base' => 'gravityview', 'icon' => plugins_url('assets/img/icon.png', __FILE__), 'category' => __('Content', 'gravityview-visual-composer'), 'description' => __('Embed a View', 'gravityview-visual-composer'), 'params' => $params)); } // if gravityview active /** * Map GravityView * @see GravityView_View_Data::get_default_args() * @param array $views Array of Views * @return array Array of parameters */ function get_params($views_array) { if (!class_exists('GravityView_View_Data')) { return $views_array; } $default_params = array('page_size' => GravityView_View_Data::get_default_arg('page_size', true), 'show_only_approved' => GravityView_View_Data::get_default_arg('show_only_approved', true), 'lightbox' => GravityView_View_Data::get_default_arg('lightbox', true)); // Add the view picker first $params = array(array('value' => $views_array, 'heading' => __('View', 'gravityview-visual-composer'), 'description' => __('Select a View to add it to your post or page.', 'gravityview-visual-composer'), 'type' => 'dropdown', 'param_name' => 'id', 'admin_label' => true)); foreach (array('page_size', 'lightbox', 'show_only_approved', 'user_edit') as $key) { $param = GravityView_View_Data::get_default_arg($key, true); $type = isset($param['type']) ? $param['type'] : null; $heading = isset($param['label']) ? $param['label'] : null; $value = isset($param['value']) ? $param['value'] : null; // Different name for dropdown switch ($param['type']) { case 'select': $type = 'dropdown'; $value = isset($param['options']) ? $param['options'] : array(); break; case 'checkbox': $heading = ''; $value = array($heading => $value); break; case 'number': case 'text': $type = 'textfield'; break; } $params[] = array('type' => $type, 'heading' => $heading, 'class' => !empty($param['class']) ? $param['class'] : NULL, 'param_name' => $key, 'description' => empty($param['desc']) ? NULL : $param['desc'], 'value' => $value, 'admin_label' => true); } return $params; } } new GravityView_Visual_Composer(); }
/** * Wrapper function to make sure GravityView_Extension has loaded * @return void */ function gv_extension_advanced_filtering_load() { if (!class_exists('GravityView_Extension')) { if (class_exists('GravityView_Plugin') && is_callable(array('GravityView_Plugin', 'include_extension_framework'))) { GravityView_Plugin::include_extension_framework(); } else { // We prefer to use the one bundled with GravityView, but if it doesn't exist, go here. include_once plugin_dir_path(__FILE__) . 'lib/class-gravityview-extension.php'; } } class GravityView_Advanced_Filtering extends GravityView_Extension { protected $_title = 'Advanced Filtering'; protected $_version = '1.0.11'; protected $_min_gravityview_version = '1.7.1'; /** * @since 1.0.11 * @type int */ protected $_item_id = 30; protected $_path = __FILE__; function add_hooks() { add_action('gravityview_metabox_filter_after', array($this, 'render_metabox')); // Admin_Views::add_scripts_and_styles() runs at 999 add_action('admin_enqueue_scripts', array($this, 'admin_enqueue_scripts'), 1100); add_action('admin_print_footer_scripts', array($this, 'print_javascript'), 1100); // Add the magic filter add_filter('gravityview_search_criteria', array($this, 'filter_search_criteria'), 100, 3); add_filter('gravityview_noconflict_scripts', array($this, 'no_conflict_filter')); } /** * Add the scripts to the no-conflict mode whitelist * @param array $scripts Array of script keys * @return array Modified array */ function no_conflict_filter($scripts) { $scripts[] = 'gform_tooltip_init'; $scripts[] = 'gform_field_filter'; $scripts[] = 'gform_forms'; $scripts[] = 'gravityview_adv_filter_admin'; return $scripts; } /** * Modify search criteria * @param array $criteria Existing search criteria array, if any * @param [type] $form_ids Form IDs for the search * @param [type] $passed_view_id (optional) * @return [type] [description] */ function filter_search_criteria($criteria, $form_ids = null, $passed_view_id = NULL) { global $gravityview_view; if (is_admin() && (!defined('DOING_AJAX') || defined('DOING_AJAX') && !DOING_AJAX)) { return $criteria; } $view_id = !empty($passed_view_id) ? $passed_view_id : GravityView_View::getInstance()->getViewId(); if (empty($view_id)) { do_action('gravityview_log_error', 'GravityView_Advanced_Filtering[filter_search_criteria] Empty View ID.', $gravityview_view); $criteria['search_criteria']['field_filters'][] = self::get_lock_filter(); $criteria['search_criteria']['field_filters']['mode'] = 'all'; return $criteria; } $view_filters = self::get_view_filter_vars($view_id); if (!empty($view_filters) && is_array($view_filters)) { do_action('gravityview_log_debug', 'GravityView_Advanced_Filtering[filter_search_criteria] about to add search criteria', $view_filters); //sanitize filters - no empty search values foreach ($view_filters as $k => $filter) { // Don't use `empty()` because `0` is a valid value if ($k !== 'mode' && (!isset($filter['value']) || $filter['value'] === '')) { unset($view_filters[$k]); } } // add advanced filters if defined if (count($view_filters) > 1) { do_action('gravityview_log_debug', 'GravityView_Advanced_Filtering[filter_search_criteria] Added search criteria', $view_filters); foreach ($view_filters as $k => $filter) { if ($k !== 'mode') { $filter = self::parse_advanced_filters($filter, $view_id); $criteria['search_criteria']['field_filters'][] = $filter; } else { $criteria['search_criteria']['field_filters']['mode'] = $filter; } } } } else { do_action('gravityview_log_debug', 'GravityView_Advanced_Filtering[filter_search_criteria] No additional search criteria.'); } return $criteria; } /** * For some specific field types prepare the filter value before adding it to search criteria * @param array $filter * @return array */ static function parse_advanced_filters($filter = array(), $view_id = NULL) { if (empty($filter['key']) || !function_exists('gravityview_get_field_type') || !class_exists('GFCommon') || !class_exists('GravityView_API')) { return $filter; } if (!empty($view_id)) { $form_id = gravityview_get_form_id($view_id); $form = gravityview_get_form($form_id); } else { global $gravityview_view; $form = $gravityview_view->form; } // replace merge tags $filter['value'] = GravityView_API::replace_variables($filter['value'], $form, array()); $field_type = gravityview_get_field_type($form, $filter['key']); switch ($field_type) { case 'date': $local_timestamp = GFCommon::get_local_timestamp(); $date = strtotime($filter['value'], $local_timestamp); if ($date) { $filter['value'] = date('Y-m-d', $date); } else { do_action('gravityview_log_error', __METHOD__ . ' - Date formatting passed to Advanced Filter is invalid', $filter['value']); } break; } return $filter; } /** * Creates a filter that should return zero results * @since 1.0.7 * @return array */ public static function get_lock_filter() { return array('key' => 'created_by', 'operator' => 'is', 'value' => 'Advanced Filter Force Zero Results Filter'); } /** * Store the filter settings in the `_gravityview_filters` post meta * @param int $post_id Post ID * @return void */ function save_post($post_id) { if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return; } // validate post_type if (!isset($_POST['post_type']) || 'gravityview' != $_POST['post_type']) { return; } $form_id = !empty($_POST['gravityview_form_id']) ? $_POST['gravityview_form_id'] : ''; $form = gravityview_get_form($form_id); $filters = GFCommon::get_field_filters_from_post($form); update_post_meta($post_id, '_gravityview_filters', $filters); } /** * Enqueue scripts on Views admin * @see advfilter-admin-views.js * @param [type] $hook [description] * @return [type] [description] */ function admin_enqueue_scripts($hook) { global $post; // Don't process any scripts below here if it's not a GravityView page. if (!gravityview_is_admin_page($hook) || empty($post->ID)) { return; } $form_id = gravityview_get_form_id($post->ID); if (empty($form_id)) { return; } $filter_settings = self::get_field_filters($post->ID); if (empty($filter_settings['field_filters']) || empty($filter_settings['init_filter_vars'])) { do_action('gravityview_log_error', '[print_javascript] Filter settings were not properly set', $filter_settings); return; } $script_debug = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min'; wp_enqueue_script('gravityview_adv_filter_admin', plugins_url('assets/js/advfilter-admin-views' . $script_debug . '.js', __FILE__), array('jquery', 'gform_field_filter'), $this->_version); wp_localize_script('gravityview_adv_filter_admin', 'gvAdvFilterVar', array('gformFieldFilters' => $filter_settings['field_filters'], 'gformInitFilter' => $filter_settings['init_filter_vars'])); } function tooltips($tooltips = array()) { $tooltips['gv_advanced_filter'] = array('title' => __('Advanced Filter', 'gravity-view-advanced-filter'), 'value' => wpautop(__('Limit what entries are visible based on entry values. The entries are filtered before the View is displayed. When users perform a search, results will first be filtered by these settings.', 'gravity-view-advanced-filter') . '<h6>' . __('Limit to Logged-in User Entries', 'gravity-view-advanced-filter') . '</h6>' . __('To limit entries to those created by the current user, select "Created By", "is" & "Logged-in User" from the drop-down menus.', 'gravity-view-advanced-filter') . ' ' . __('If you want to limit entries to those created by the current user, but allow the administrators to view all the entries, select "Logged-in User (disabled for admins)" from the drop-down menu.', 'gravity-view-advanced-filter'))); return $tooltips; } /** * Render the HTML container that will be replaced by the Javascript * @return void */ function render_metabox($settings = array()) { include plugin_dir_path(__FILE__) . 'partials/metabox.php'; } static function get_view_filter_vars($post_id, $admin_formatting = false) { $init_filter_vars = get_post_meta($post_id, '_gravityview_filters', true); if (empty($init_filter_vars)) { return false; } // migration purposes from the old version with JSON_ENCODE if (!is_array($init_filter_vars) && strpos($init_filter_vars, '{') === 0) { $init_filter_vars = json_decode($init_filter_vars, true); } // In the Admin, the Javascript requires special formatting. if ($admin_formatting && array_key_exists('mode', $init_filter_vars)) { // Re-set this below $mode = $init_filter_vars['mode']; unset($init_filter_vars['mode']); // GF stores the field filter data as a flat array. // We need to set the `filters` key with the fields $init_filter_vars = array('filters' => $init_filter_vars, 'mode' => $mode); // The Javascript expects the `field` key, not the `key` key. foreach ($init_filter_vars['filters'] as &$filter) { $filter['field'] = $filter['key']; } } // Only show listings created by the current user. // This will return no entries if the user is logged out. foreach ($init_filter_vars as $k => &$filter) { if (isset($filter['key']) && isset($filter['value']) && $filter['key'] === 'created_by' && in_array($filter['value'], array('created_by', 'created_by_or_admin'))) { /** * Customise the capabilities that define an Administrator able to view entries in frontend when filtered by Created_by * * @param array|string $capabilities List of admin capabilities * @param int $post_id View ID where the filter is set * * @since 1.0.9 */ $admin_caps = apply_filters('gravityview/adv_filter/admin_caps', array('manage_options', 'gravityforms_view_entries'), $post_id); if ($filter['value'] === 'created_by_or_admin' && GFCommon::current_user_can_any($admin_caps)) { unset($init_filter_vars[$k]); } else { $filter['value'] = get_current_user_id(); } } } return apply_filters('gravityview/adv_filter/view_filters', $init_filter_vars, $post_id); } static function get_field_filters($post_id) { $form_id = gravityview_get_form_id($post_id); $form = gravityview_get_form($form_id); // Fixes issue on Views screen when deleting a view if (empty($form)) { return; } $field_filters = GFCommon::get_field_filter_settings($form); if ($approved_column = GravityView_Admin_ApproveEntries::get_approved_column($form)) { $approved_column = intval(floor($approved_column)); } // Add currently logged in user option foreach ($field_filters as &$filter) { // Add negative match to approval column if ($approved_column && $filter['key'] === $approved_column) { $filter['operators'][] = 'isnot'; continue; } // Gravity Forms already creates a "User" option. // We don't care about specific user, just the logged in status. if ($filter['key'] === 'created_by') { // Update the default label to be more descriptive $filter['text'] = esc_attr__('Created By', 'gravity-view-advanced-filter'); $current_user_filters = array(array('text' => __('Logged-in User (disabled for Admins)', 'gravity-view-advanced-filter'), 'value' => 'created_by_or_admin'), array('text' => __('Logged-in User', 'gravity-view-advanced-filter'), 'value' => 'created_by')); foreach ($current_user_filters as $user_filter) { // Add to the beginning on the value options array_unshift($filter['values'], $user_filter); } } } $init_field_id = 0; $init_field_operator = "contains"; $default_init_filter_vars = array("mode" => "all", "filters" => array(array("field" => $init_field_id, "operator" => $init_field_operator, "value" => ''))); $view_filter_vars = self::get_view_filter_vars($post_id, true); $init_filter_vars = !empty($view_filter_vars) ? $view_filter_vars : $default_init_filter_vars; /** * allow field filters manipulation * @param array $field_filters configured filters */ $field_filters = apply_filters('gravityview/adv_filter/field_filters', $field_filters, $post_id); return array('field_filters' => $field_filters, 'init_filter_vars' => $init_filter_vars); } /** * Output the script necessary for the drop-down to work * @param string $hook Admin page $pagenow string * @return void */ function print_javascript($hook) { global $post; // Don't process any scripts below here if it's not a GravityView page. if (!gravityview_is_admin_page($hook) || empty($post->ID)) { return; } ?> <style type="text/css"> #entry_filters_warning { display: none; } #gform-no-filters { padding: 1em 0; cursor: pointer; width: 100%; } #gform-no-filters img { float:right; margin: 2px .25em; } #gv-advanced-filter .gform-field-filter { margin: .5em 0; } /** Text input filter */ #gv-advanced-filter input.gform-filter-value, #gv-advanced-filter select { margin: 0 .3em; width: auto; max-width: 32%; } #gv-advanced-filter .gform-field-filter .gform-add { margin: 0 5px 0 2px; } #gv-advanced-filter h3 { margin-bottom: .5em; padding-left: 0; } #gv-advanced-filter .description { margin-bottom: .5em; } </style> <?php } } // end class new GravityView_Advanced_Filtering(); }