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 = '
';
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;
}
}