17, 'element' => 'repeater_container', 'attributes' => [ 'name' => $this->key, 'class' => '', 'value' => [], ], 'settings' => [ 'label' => __('Repeater Container', 'fluentformpro'), 'admin_field_label' => '', 'container_class' => '', 'label_placement' => '', 'validation_rules' => array(), 'max_repeat_field' => '', 'conditional_logics' => [], 'repeater_columns' => '2', 'container_width' => '', 'repeater_container_settings' => '' ], 'columns' => [ ['width' => 50, 'fields' => []], ['width' => 50, 'fields' => []], ], 'editor_options' => array( 'title' => __('Repeat Container', 'fluentformpro'), 'icon_class' => 'ff-edit-repeat', 'template' => '' ), ]; } public function getGeneralEditorElements() { return [ 'label', 'label_placement', 'admin_field_label', 'repeater_container_settings', 'container_width' ]; } public function getEditorCustomizationSettings() { return [ 'repeater_container_settings' => [ 'template' => 'repeaterContainers', 'label' => __('Container Columns', 'fluentformpro'), 'help_text' => __('Number of Columns in Container', 'fluentformpro') ] ]; } public function getAdvancedEditorElements() { return [ 'container_class', 'name', 'conditional_logics', 'max_repeat_field', ]; } /** * Compile and echo the html element * @param array $data [element data] * @param stdClass $form [Form Object] * @return void */ public function render($data, $form) { wp_enqueue_script('fluentform-advanced'); $data = apply_filters('fluentform/rendering_field_data_' . $data['element'], $data, $form); $rootName = $data['attributes']['name']; $data['attributes']['class'] = $this->getContainerClass($data); $data['attributes']['data-max_repeat'] = ArrayHelper::get($data, 'settings.max_repeat_field'); $data['attributes']['data-root_name'] = $rootName; $atts = $this->buildAttributes(ArrayHelper::except($data['attributes'], 'name')); $ariaLabel = esc_attr(ArrayHelper::get($data, 'attributes.label')); $columns = $data['columns']; ob_start(); ?>
> buildElementLabel($data, $form); ?>
renderColumns($columns, $rootName, $data, $form); ?>
columnClass; $totalWidth = 0; foreach ($columns as $columnIndex => $column) { if (!isset($column['width'])) { $column['width'] = ceil(100 / count($data['columns'])); } $totalWidth += $column['width']; $newColumnClass = $columnClass . ' ff-t-column-' . ($columnIndex + 1); echo "
"; foreach ($column['fields'] as $field) { $field['attributes'] = $this->prepareFieldAttributes($field, $rootName, $fieldIndex, $data, $form); if($labelPlacement = ArrayHelper::get($field, 'settings.label_placement')) { $data['attributes']['class'] .= ' ff-el-form-'.$labelPlacement; } // Normalize field element type $field['element'] = $field['element'] === 'input_mask' ? 'input_text' : $field['element']; ?>
'; } $buttonWidth = 100 - $totalWidth; echo "
"; echo $this->getRepeater($data['element']); echo "
"; } protected function getContainerClass($data) { $containerClass = ArrayHelper::get($data, 'settings.container_class', ''); $hasConditions = $this->hasConditions($data) ? 'has-conditions ' : ''; $containerClass .= ' ' . $hasConditions; $container_css_class = $this->wrapperClass . ' ff_columns_total_' . count($data['columns']); $container_css_class .= ' ' . strip_tags($containerClass); return esc_attr($container_css_class); } protected function prepareFieldAttributes($field, $rootName, $index, $data, $form) { return [ 'aria-label' => 'repeater level 1 and field ' . $field['settings']['label'], 'name' => $rootName . '[0][' . $index . ']', 'id' => $this->makeElementId($data, $form) . '_' . $index, 'data-repeater_index' => $index, 'data-type' => 'repeater_container', 'data-name' => $rootName . '_' . $index . '_0', 'data-error_index' => $rootName . '[' . $index . ']', 'data-default' => ArrayHelper::get($field, 'attributes.value') ]; } /** * Compile repeater buttons * @param string $el [element name] * @return string */ protected function getRepeater($el) { $div = '
'; $div .= ''; $div .= ''; $div .= '
'; return $div; } public function renderResponse($response, $field, $form_id) { // Maybe reuse repeater field response render if (defined('FLUENTFORM_RENDERING_ENTRIES')) { return __('....', 'fluentformpro'); } if (is_string($response) || empty($response) || !is_array($response)) { return ''; } $columns = ArrayHelper::get($field, 'raw.columns'); $fields = []; foreach ( $columns as $column){ $columnFields = ArrayHelper::get($column, 'fields', []); $fields = array_merge($fields, $columnFields); } $columnCount = (count($fields) > count((array)$response[0])) ? count($fields) : count((array)$response[0]); $columns = array_fill(0, $columnCount, 'column'); if (defined('FLUENTFORM_DOING_CSV_EXPORT')) { return self::getResponseAsText($response, $fields, $columns); } return $this->getResponseHtml($response, $fields, $columns); } protected function getResponseHtml($response, $fields, $columns) { ob_start(); ?>
$count): ?> $item): ?> $count): ?>
count((array)ArrayHelper::get($response, 0))) ? count($fields) : count((array)ArrayHelper::get($response, 0)); $columns = array_fill(0, $columnCount, 'column'); } $totalColumns = count($columns); $text = ''; foreach ($columns as $index => $count) { $text .= trim(ArrayHelper::get($fields, $index . '.settings.label', ' ')); if( $index+1 != $totalColumns ) { $text .= " | "; } } $text .= "\n"; foreach ($response as $responseIndex => $item): foreach ($columns as $index => $count): $text .= ArrayHelper::get($item, $index); if( $index+1 != $totalColumns ) { $text .= " | "; } endforeach; $text .= "\n"; endforeach; return $text; } }