public static function render_field($field, $return = false) { $current_user = wp_get_current_user(); $field = wp_parse_args($field, array('field' => false, 'type' => 'text', 'label' => false, 'description' => false, 'prefix' => true, 'scope' => null, 'value' => null, 'capability' => false, 'role' => false, 'logged_in' => false, 'add_more' => false, 'sortable' => false, 'choices' => false, 'list' => true, 'position' => false, 'template' => self::get_template(), 'wrapper' => false, 'columns' => null, 'embed' => false, 'editable' => true, 'child_field' => false, 'label_position' => 'before', 'conditions' => false, 'options' => false, 'on_post_status' => false, 'on_comment_status' => false, 'display' => false, 'group_field' => false, 'required' => false, 'index' => null, 'multiple' => false, 'errors' => false, 'attributes' => array('class' => array(), 'title' => false, 'alt' => false, 'tabindex' => false, 'columns' => null, 'value' => false), 'tax_query' => array('include_children' => true, 'field' => 'term_id', 'operator' => 'IN'), 'meta_query' => array('compare' => '=', 'type' => 'CHAR'))); // Should this field be rendered? if ($field['embed'] && !$return || $field['capability'] && !current_user_can($field['capability']) || !isset($field['field']) || $field['logged_in'] && !is_user_logged_in() || $field['role'] && !piklist_user::current_user_role($field['role'])) { return false; } // Set default scopes based on enviroment if (is_null($field['scope'])) { if (self::is_post()) { $field['scope'] = 'post_meta'; } elseif (self::is_media()) { $field['scope'] = 'post_meta'; } elseif (self::is_term()) { $field['scope'] = 'term_meta'; } elseif (self::is_user()) { $field['scope'] = 'user_meta'; } } // Set Defaults array_push(self::$fields_defaults, $field); // Determine if its a multiple type field if (in_array($field['type'], self::$field_list_types['multiple_fields']) || is_array($field['attributes']) && in_array('multiple', $field['attributes'])) { $field['multiple'] = true; } if ($field['type'] == 'html' && !isset($field['field'])) { $field['field'] = piklist::unique_id(); } // Manage Classes if (isset($field['attributes']['class'])) { $field['attributes']['class'] = !is_array($field['attributes']['class']) ? explode(' ', $field['attributes']['class']) : $field['attributes']['class']; } else { $field['attributes']['class'] = array(); } array_push($field['attributes']['class'], piklist_form::get_field_id($field['field'], $field['scope'], false, $field['prefix'])); // Set Wrapper $wrapper = array('id' => $field['type'] == 'map' ? null : self::get_field_wrapper_id($field), 'class' => array()); // Set Columns if (is_numeric($field['columns']) && !$field['child_field']) { array_push($wrapper['class'], 'piklist-field-type-group piklist-field-column-' . $field['columns']); } if (isset($field['attributes']['columns']) && is_numeric($field['attributes']['columns'])) { array_push($field['attributes']['class'], 'piklist-field-column-' . $field['attributes']['columns']); unset($field['attributes']['columns']); } if (isset($field['attributes']['wrapper_class'])) { array_push($wrapper['class'], $field['attributes']['wrapper_class']); } // Check Statuses $status_types = apply_filters('piklist_status_types', array('post')); foreach ($status_types as $type) { $status = $field['on_' . $type . '_status']; if (!empty($status)) { $object = !empty(self::$save_ids) ? get_post(self::$save_ids[$type], ARRAY_A) : (array) $GLOBALS[$type]; if ((is_admin() && isset($GLOBALS[$type]) || !empty(self::$save_ids)) && isset($object['post_type'])) { $status_list = piklist_cpt::get_post_statuses($object['post_type']); foreach (array('field', 'value', 'hide') as $status_display) { if (isset($status[$status_display])) { $status[$status_display] = is_array($status[$status_display]) ? $status[$status_display] : array($status[$status_display]); foreach ($status[$status_display] as $_status) { if (strstr($_status, '--')) { $status_range = explode('--', $_status); $status_range_start = array_search($status_range[0], $status_list); $status_range_end = array_search($status_range[1], $status_list); if (is_numeric($status_range_start) && is_numeric($status_range_end)) { $status_slice = array(); for ($i = $status_range_start; $i <= $status_range_end; $i++) { array_push($status_slice, $status_list[$i]); } array_splice($status[$status_display], array_search($_status, $status[$status_display]), 1, $status_slice); } } } } } } if (isset($status['hide']) && isset($object[$type . '_status']) && piklist::check_in($status['hide'], $object[$type . '_status'] ? $object[$type . '_status'] : array('draft'))) { return false; } elseif (isset($status['value']) && isset($object[$type . '_status']) && piklist::check_in($status['value'], $object[$type . '_status'] ? $object[$type . '_status'] : array('draft'))) { $field['display'] = true; } } } // Get errors $field['errors'] = piklist_validate::get_errors($field['field'], $field['scope']); // Get field value if (!$field['group_field']) { if (piklist_validate::errors()) { $stored_value = piklist_validate::get_request_value($field['field'], $field['scope']); } if (!isset($stored_value)) { if (self::is_widget()) { $stored_value = isset(piklist_widget::widget()->instance[$field['field']]) ? maybe_unserialize(piklist_widget::widget()->instance[$field['field']]) : $field['value']; } else { $stored_value = self::get_field_value($field['scope'], $field, $field['scope'], piklist_form::get_field_object_id($field), false); } } if (!isset($stored_value) && !isset($field['attributes']['placeholder']) && !$field['multiple']) { $field['attributes']['placeholder'] = htmlspecialchars($field['value']); } elseif (isset($stored_value) || is_array($stored_value) && empty($stored_value)) { $field['value'] = $stored_value; } } // Check for nested fields if ($field['description']) { $field['description'] = self::render_nested_field($field, $field['description']); } if (is_array($field['choices']) && !in_array($field['type'], array('select', 'multiselect'))) { foreach ($field['choices'] as &$choice) { $choice = self::render_nested_field($field, $choice); } } if ($field['conditions']) { if ($field['display'] && empty($field['value']) && $field['type'] != 'group') { return false; } foreach ($field['conditions'] as &$condition) { if (is_array($condition)) { $condition['scope'] = isset($condition['scope']) ? $condition['scope'] : $field['scope']; $condition['id'] = piklist_form::get_field_id($condition['field'], $condition['scope'], false, $field['prefix']); $condition['name'] = piklist_form::get_field_name($condition['field'], $condition['scope'], false, $field['prefix']); $condition['reset'] = isset($condition['reset']) ? $condition['reset'] : true; if (!isset($condition['type']) || empty($condition['type'])) { $condition['type'] = 'toggle'; } if (!in_array('piklist-field-condition', $field['attributes']['class'])) { if (!in_array('piklist-field-condition', $wrapper['class'])) { array_push($wrapper['class'], 'piklist-field-condition'); } if (!in_array('piklist-field-condition-' . $condition['type'], $wrapper['class'])) { array_push($wrapper['class'], 'piklist-field-condition-' . $condition['type']); } } } } } // Set the field template if ($field['group_field'] && self::get_template() == $field['template'] && (strstr(self::$templates[$field['template']]['template'], '</tr>') || $field['template'] == 'default')) { $field['child_field'] = true; $field['template'] = 'field'; } elseif ($field['type'] == 'hidden' || $field['embed']) { $field['template'] = 'field'; } $field['wrapper'] = preg_replace(array('/ {2,}/', '/<!--.*?-->|\\t|(?:\\r?\\n[ \\t]*)+/s'), array(' ', ''), sprintf(self::$templates[$field['template']]['template'], $wrapper['id'], implode(' ', $wrapper['class']))); $field = apply_filters('piklist_pre_render_field', $field); self::$field_rendering = $field; self::$fields_rendered[$field['scope']][$field['field']] = $field; $field_to_render = self::template_tag_fetch('field_wrapper', $field['wrapper']); $rendered_field = do_shortcode($field_to_render); switch ($field['position']) { case 'start': $rendered_field = piklist_form::template_tag_fetch('field_wrapper', $field['wrapper'], 'start') . $rendered_field; break; case 'end': $rendered_field .= piklist_form::template_tag_fetch('field_wrapper', $field['wrapper'], 'end'); break; case 'wrap': $rendered_field = piklist_form::template_tag_fetch('field_wrapper', $field['wrapper'], 'start') . $rendered_field . piklist_form::template_tag_fetch('field_wrapper', $field['wrapper'], 'end'); break; } $rendered_field = apply_filters('piklist_post_render_field', $rendered_field, $field); self::$field_rendering = null; // Return the field as requested if ($return) { return $rendered_field; } else { echo $rendered_field; } }
/** * template_field_group * Render a field group. * * @param array $field The field object. * * @return string The content from rendering the group. * * @access public * @static * @since 1.0 */ public static function template_field_group($field) { $content = ''; $cardinality = 1; foreach ($field['fields'] as &$column) { // Pass through the proper scope and set the field name appropriately if (!isset($column['scope']) && $field['scope']) { $column['scope'] = $field['scope']; } $column = self::setup_field($column); // Pass through common configuration options $column['prefix'] = $field['prefix']; $column['relate'] = $field['relate']; $column['child_field'] = true; $column['child_add_more'] = $field['add_more'] || $field['child_add_more']; $column['attributes']['wrapper_class'] = (isset($column['attributes']['wrapper_class']) ? $column['attributes']['wrapper_class'] : null) . ($field['template'] != 'field' ? 'piklist-field-part' : null); // Check for template if (is_null($column['template'])) { if ($column['label_position'] == 'after') { $column['template'] = 'field_label'; } else { $column['template'] = 'label_field'; } } // If there is an error pass it through if ($field['errors']) { array_push($column['attributes']['class'], 'piklist-error'); } // Set field if needed if ($column['type'] == 'html') { $column['display'] = true; if (!isset($column['field'])) { $column['field'] = piklist::unique_id(); } } // Set the object id $column['object_id'] = $field['object_id'] ? $field['object_id'] : self::get_field_object_id($column); // Handle relate $column = piklist_relate::relate_field($column); if (!$field['field']) { $column['value'] = self::get_field_value($column['scope'], $column, $column['scope'], $column['object_id']); $cardinality = !$column['multiple'] && count($column['value']) > $cardinality && (!is_array($field['value']) || is_array($field['value']) && !piklist::is_associative($field['value'])) ? count($column['value']) : $cardinality; } } unset($column); if ($field['field']) { $cardinality = count($field['value']) > 1 && (!is_array($field['value']) || is_array($field['value']) && !piklist::is_associative($field['value'])) ? count($field['value']) : 1; } $field_rendering = self::$field_rendering; for ($index = 0; $index < $cardinality; $index++) { // Setup group details $group_id = piklist::unique_id(); $group_add_more = false; foreach ($field['fields'] as $column) { // Set index $column['index'] = $index; // Flag this field as a group field $column['group_field'] = true; // Add specific group index $column['attributes']['data-piklist-field-group'] = $group_id; // Update fields on child element if its a group if ($column['type'] == 'group') { foreach ($column['fields'] as &$_field) { $_field['attributes']['data-piklist-field-sub-group'] = $group_id; } } // Check sortable if (isset($field['attributes']['data-piklist-field-sortable'])) { $column['attributes']['data-piklist-field-sortable'] = $field['attributes']['data-piklist-field-sortable']; } // Check add-more if ($column['type'] != 'group' && !$group_add_more && isset($field['attributes']['data-piklist-field-addmore'])) { $group_add_more = true; $column['attributes']['data-piklist-field-addmore'] = $field['attributes']['data-piklist-field-addmore']; $column['attributes']['data-piklist-field-addmore-actions'] = $field['attributes']['data-piklist-field-addmore-actions']; } // Check add-more type if (isset($column['add_more']) && $column['add_more'] && isset($field['attributes']['data-piklist-field-addmore'])) { $column['attributes']['data-piklist-field-addmore-single'] = $field['attributes']['data-piklist-field-addmore']; } // Check conditions if (!empty($field['conditions'])) { if (is_array($column['conditions'])) { $column['conditions'] = array_merge($column['conditions'], $field['conditions']); array_push($column['attributes']['class'], 'piklist-field-condition'); } else { $column['conditions'] = $field['conditions']; } } // Setup child field name if necessary if ($field['field'] && !stristr($column['field'], ':')) { $column['field'] = $field['field'] . ':' . ($group_add_more ? $index . ':' : null) . $column['field']; } // Get values if (piklist_validate::errors()) { $column['errors'] = piklist_validate::get_errors($column); $column['value'] = piklist_validate::get_request_value($column); // Update cardinality if necessary if (!$field['field']) { $cardinality = !$column['multiple'] && count($column['value']) > $cardinality && (!is_array($field['value']) || is_array($field['value']) && !piklist::is_associative($field['value'])) ? count($column['value']) : $cardinality; } if (is_array($column['value']) && (!$column['multiple'] || $column['multiple'] && !piklist::is_flat($column['value']))) { $column['value'] = $column['value'][$column['index']]; } } elseif (is_array($field['value'])) { $path = explode(':', str_replace($field['field'] . ':', '', $column['field'])); $column['value'] = piklist::array_path_get($field['value'], $path); } else { $column['value'] = self::get_field_value($column['scope'], $column, $column['scope'], $column['object_id'], false); if (is_array($column['value']) && (!$column['multiple'] || $column['multiple'] && !piklist::is_flat($column['value']))) { $column['value'] = array_key_exists($column['index'], $column['value']) ? $column['value'][$column['index']] : null; } } $content .= self::render_field($column, true); } } self::$field_rendering = $field_rendering; return $content; }