/** * 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; }