SubmissionsBuilder.php
4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
namespace NinjaForms\Blocks\DataBuilder;
class SubmissionsBuilder
{
protected $submissions;
/**
* Fieldset Repeater object to contain fieldset functionality
*
* @var \NF_Handlers_FieldsetRepeater
*/
protected $fieldsetRepeater;
public static function make($formID)
{
$submissions = array_map(function ($submission) {
return $submission->get_field_values();
}, Ninja_Forms()->form($formID)->get_subs());
return new self($submissions);
}
public function __construct($submissions)
{
$this->submissions = $submissions;
}
public function get()
{
// Initialize the fieldset repeater object in protected method
$this->initializeFieldsetRepeater();
return array_map([$this, 'toArray'], $this->submissions);
}
protected function toArray($values)
{
$values = array_map([$this, 'formatValue'], $values);
$values = array_filter($values, function ($value, $key) {
return 0 === strpos($key, '_field_');
}, ARRAY_FILTER_USE_BOTH);
return $this->normalizeArrayKeys($values);
}
protected function formatValue($value)
{
/**
* Basic File Uploads support.
*
* Auto-detect a file uploads value, by format, as a serialized array.
* @note using a preliminary `is_serialized()` check to determine
* if the value is from File Uploads, since we do not have
* access to the field information in this context.
*/
if (is_serialized($value)) {
$unserialized = unserialize($value);
if (is_array($unserialized)) {
// This is the default value assuming it is a file upload
$return = implode(', ', array_values($unserialized));
// If it is fieldset repeater data, construct fieldset repeater output instead
$isFieldsetData = $this->fieldsetRepeater->isFieldsetData($unserialized);
if ($isFieldsetData) {
$return = $this->constructOutputForFieldset($unserialized);
}
return $return;
}
}
return $value;
}
/**
* Construct string representation of fieldset repeater data for block
*
*
*
* @param array $fieldsetSubmissionValues
* @return string
*/
protected function constructOutputForFieldset(array $fieldsetSubmissionValues): string
{
$outgoingValue = '';
$list_fields_types = array('listcheckbox', 'listmultiselect', 'listradio', 'listselect', 'listcountry', 'listimage', 'liststate', 'terms');
$extractedSubmissions = $this->fieldsetRepeater->extractSubmissions('', $fieldsetSubmissionValues, []);
// Iterate submission indexes (each repeated fieldset in the submission)
foreach ($extractedSubmissions as $submissionIndex => $fieldsetArray) {
$outgoingValue .= '#' . ($submissionIndex + 1) . ' ';
// Iterate each field within a submission index
foreach ($fieldsetArray as $fieldsetFieldId => $submissionValueArray) {
// Check to see if the type is a list field and if it is...
if (in_array($submissionValueArray['type'], array_values($list_fields_types))) {
// implode the value if is_array
if (is_array($submissionValueArray['value'])) {
$submissionValueArray['value'] = implode(', ', $submissionValueArray['value']);
}
}
$outgoingValue .= $submissionValueArray['value'] . ' ';
}
$outgoingValue .= ' ' . ' ';
}
return $outgoingValue;
}
protected function normalizeArrayKeys($values)
{
$keys = array_map(function ($key) {
return str_replace('_field_', '', $key);
}, array_flip($values));
return array_flip($keys);
}
/**
* Isolate construction of FieldsetRepeater
*/
protected function initializeFieldsetRepeater(): void
{
if (!isset($this->fieldsetRepeater)) {
$this->fieldsetRepeater = \Ninja_Forms()->fieldsetRepeater;
}
}
}