1
|
|
|
<?php |
|
|
|
|
2
|
|
|
/** |
3
|
|
|
* @file class-gravityview-field-fileupload.php |
4
|
|
|
* @package GravityView |
5
|
|
|
* @subpackage includes\fields |
6
|
|
|
*/ |
7
|
|
|
|
8
|
|
|
class GravityView_Field_FileUpload extends GravityView_Field { |
9
|
|
|
|
10
|
|
|
var $name = 'fileupload'; |
|
|
|
|
11
|
|
|
|
12
|
|
|
var $_gf_field_class_name = 'GF_Field_FileUpload'; |
|
|
|
|
13
|
|
|
|
14
|
|
|
var $group = 'advanced'; |
|
|
|
|
15
|
|
|
|
16
|
|
|
public function __construct() { |
17
|
|
|
$this->label = esc_html__( 'File Upload', 'gravityview' ); |
18
|
|
|
parent::__construct(); |
19
|
|
|
} |
20
|
|
|
|
21
|
|
|
function field_options( $field_options, $template_id, $field_id, $context, $input_type ) { |
|
|
|
|
22
|
|
|
|
23
|
|
|
unset( $field_options['search_filter'] ); |
24
|
|
|
|
25
|
|
|
if( 'edit' === $context ) { |
|
|
|
|
26
|
|
|
return $field_options; |
27
|
|
|
} |
28
|
|
|
|
29
|
|
|
$add_options['link_to_file'] = array( |
|
|
|
|
30
|
|
|
'type' => 'checkbox', |
31
|
|
|
'label' => __( 'Display as a Link:', 'gravityview' ), |
32
|
|
|
'desc' => __('Display the uploaded files as links, rather than embedded content.', 'gravityview'), |
|
|
|
|
33
|
|
|
'value' => false, |
34
|
|
|
'merge_tags' => false, |
35
|
|
|
); |
36
|
|
|
|
37
|
|
|
return $add_options + $field_options; |
38
|
|
|
} |
39
|
|
|
|
40
|
|
|
/** |
41
|
|
|
* Return an array of files prepared for output. |
42
|
|
|
* |
43
|
|
|
* Processes files by file type and generates unique output for each. Returns array for each file, with the following keys: |
44
|
|
|
* - `file_path` => The file path of the file, with a line break |
45
|
|
|
* - `html` => The file output HTML formatted |
46
|
|
|
* |
47
|
|
|
* @since 1.2 |
48
|
|
|
* @todo Support `playlist` shortcode for playlist of video/audio |
49
|
|
|
* @param string $value Field value passed by Gravity Forms. String of file URL, or serialized string of file URL array |
50
|
|
|
* @param string $gv_class Field class to add to the output HTML |
51
|
|
|
* @return array Array of file output, with `file_path` and `html` keys (see comments above) |
52
|
|
|
*/ |
53
|
|
|
static function get_files_array( $value, $gv_class ) { |
|
|
|
|
54
|
|
|
|
55
|
|
|
$gravityview_view = GravityView_View::getInstance(); |
56
|
|
|
|
57
|
|
|
extract( $gravityview_view->getCurrentField() ); |
|
|
|
|
58
|
|
|
|
59
|
|
|
$output_arr = array(); |
60
|
|
|
|
61
|
|
|
// Get an array of file paths for the field. |
62
|
|
|
$file_paths = rgar( $field , 'multipleFiles' ) ? json_decode( $value ) : array( $value ); |
63
|
|
|
|
64
|
|
|
// Process each file path |
65
|
|
|
foreach( $file_paths as $file_path ) { |
|
|
|
|
66
|
|
|
|
67
|
|
|
// If the site is HTTPS, use HTTPS |
68
|
|
|
if(function_exists('set_url_scheme')) { $file_path = set_url_scheme($file_path); } |
|
|
|
|
69
|
|
|
|
70
|
|
|
// This is from Gravity Forms's code |
71
|
|
|
$file_path = esc_attr(str_replace(" ", "%20", $file_path)); |
|
|
|
|
72
|
|
|
|
73
|
|
|
// If the field is set to link to the single entry, link to it. |
74
|
|
|
$link = !empty( $field_settings['show_as_link'] ) ? GravityView_API::entry_link( $entry, $field ) : $file_path; |
|
|
|
|
75
|
|
|
|
76
|
|
|
// Get file path information |
77
|
|
|
$file_path_info = pathinfo($file_path); |
|
|
|
|
78
|
|
|
|
79
|
|
|
$html_format = NULL; |
|
|
|
|
80
|
|
|
|
81
|
|
|
$disable_lightbox = false; |
82
|
|
|
|
83
|
|
|
$disable_wrapped_link = false; |
84
|
|
|
|
85
|
|
|
// Is this an image? |
86
|
|
|
$image = new GravityView_Image(array( |
87
|
|
|
'src' => $file_path, |
88
|
|
|
'class' => 'gv-image gv-field-id-'.$field_settings['id'], |
89
|
|
|
'alt' => $field_settings['label'], |
90
|
|
|
'width' => (gravityview_get_context() === 'single' ? NULL : 250) |
|
|
|
|
91
|
|
|
)); |
92
|
|
|
|
93
|
|
|
$content = $image->html(); |
94
|
|
|
|
95
|
|
|
// The new default content is the image, if it exists. If not, use the file name as the content. |
96
|
|
|
$content = !empty( $content ) ? $content : $file_path_info['basename']; |
|
|
|
|
97
|
|
|
|
98
|
|
|
// If pathinfo() gave us the extension of the file, run the switch statement using that. |
99
|
|
|
$extension = empty( $file_path_info['extension'] ) ? NULL : strtolower( $file_path_info['extension'] ); |
|
|
|
|
100
|
|
|
|
|
|
|
|
101
|
|
|
|
102
|
|
|
switch( true ) { |
|
|
|
|
103
|
|
|
|
104
|
|
|
// Audio file |
105
|
|
|
case in_array( $extension, wp_get_audio_extensions() ): |
106
|
|
|
|
107
|
|
|
$disable_lightbox = true; |
108
|
|
|
|
109
|
|
|
if( shortcode_exists( 'audio' ) ) { |
|
|
|
|
110
|
|
|
|
111
|
|
|
$disable_wrapped_link = true; |
112
|
|
|
|
113
|
|
|
/** |
114
|
|
|
* @filter `gravityview_audio_settings` Modify the settings passed to the `wp_video_shortcode()` function |
115
|
|
|
* @since 1.2 |
116
|
|
|
* @param array $audio_settings Array with `src` and `class` keys |
117
|
|
|
*/ |
118
|
|
|
$audio_settings = apply_filters( 'gravityview_audio_settings', array( |
119
|
|
|
'src' => $file_path, |
120
|
|
|
'class' => 'wp-audio-shortcode gv-audio gv-field-id-'.$field_settings['id'] |
|
|
|
|
121
|
|
|
)); |
122
|
|
|
|
123
|
|
|
/** |
124
|
|
|
* Generate the audio shortcode |
125
|
|
|
* @see http://codex.wordpress.org/Audio_Shortcode |
126
|
|
|
* @see https://developer.wordpress.org/reference/functions/wp_audio_shortcode/ |
127
|
|
|
*/ |
128
|
|
|
$content = wp_audio_shortcode( $audio_settings ); |
129
|
|
|
|
130
|
|
|
} |
131
|
|
|
|
132
|
|
|
break; |
133
|
|
|
|
134
|
|
|
// Video file |
135
|
|
|
case in_array( $extension, wp_get_video_extensions() ): |
136
|
|
|
|
137
|
|
|
$disable_lightbox = true; |
138
|
|
|
|
139
|
|
|
if( shortcode_exists( 'video' ) ) { |
|
|
|
|
140
|
|
|
|
141
|
|
|
$disable_wrapped_link = true; |
142
|
|
|
|
143
|
|
|
/** |
144
|
|
|
* @filter `gravityview_video_settings` Modify the settings passed to the `wp_video_shortcode()` function |
145
|
|
|
* @since 1.2 |
146
|
|
|
* @param array $video_settings Array with `src` and `class` keys |
147
|
|
|
*/ |
148
|
|
|
$video_settings = apply_filters( 'gravityview_video_settings', array( |
149
|
|
|
'src' => $file_path, |
150
|
|
|
'class' => 'wp-video-shortcode gv-video gv-field-id-'.$field_settings['id'] |
|
|
|
|
151
|
|
|
)); |
152
|
|
|
|
153
|
|
|
/** |
154
|
|
|
* Generate the video shortcode |
155
|
|
|
* @see http://codex.wordpress.org/Video_Shortcode |
156
|
|
|
* @see https://developer.wordpress.org/reference/functions/wp_video_shortcode/ |
157
|
|
|
*/ |
158
|
|
|
$content = wp_video_shortcode( $video_settings ); |
159
|
|
|
|
160
|
|
|
} |
161
|
|
|
|
162
|
|
|
break; |
163
|
|
|
|
164
|
|
|
// PDF |
165
|
|
|
case $extension === 'pdf': |
166
|
|
|
|
167
|
|
|
// PDF needs to be displayed in an IFRAME |
168
|
|
|
$link = add_query_arg( array( 'TB_iframe' => 'true' ), $link ); |
169
|
|
|
|
170
|
|
|
break; |
171
|
|
|
|
172
|
|
|
// if not image, do not set the lightbox (@since 1.5.3) |
173
|
|
|
case !in_array( $extension, array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' ) ): |
|
|
|
|
174
|
|
|
|
175
|
|
|
$disable_lightbox = true; |
176
|
|
|
|
177
|
|
|
break; |
178
|
|
|
|
179
|
|
|
} |
180
|
|
|
|
181
|
|
|
// If using Link to File, override the content. |
182
|
|
|
// (We do this here so that the $disable_lightbox can be set. Yes, there's a little more processing time, but oh well.) |
183
|
|
|
if( !empty( $field_settings['link_to_file'] ) ) { |
|
|
|
|
184
|
|
|
|
185
|
|
|
// Force the content to be the file name |
186
|
|
|
$content = $file_path_info["basename"]; |
|
|
|
|
187
|
|
|
|
188
|
|
|
// Restore the wrapped link |
189
|
|
|
$disable_wrapped_link = false; |
190
|
|
|
|
191
|
|
|
} |
192
|
|
|
|
193
|
|
|
// Whether to use lightbox or not |
194
|
|
|
if( $disable_lightbox || empty( $gravityview_view->atts['lightbox'] ) || !empty( $field_settings['show_as_link'] ) ) { |
|
|
|
|
195
|
|
|
|
196
|
|
|
$link_atts = empty( $field_settings['show_as_link'] ) ? array( 'target' => '_blank' ) : array(); |
197
|
|
|
|
198
|
|
|
} else { |
199
|
|
|
|
200
|
|
|
$link_atts = array( |
201
|
|
|
'rel' => sprintf( "%s-%s", $gv_class, $entry['id'] ), |
|
|
|
|
202
|
|
|
'target' => '_blank', |
203
|
|
|
'class' => 'thickbox', |
204
|
|
|
); |
205
|
|
|
|
206
|
|
|
} |
207
|
|
|
|
208
|
|
|
/** |
209
|
|
|
* @filter `gravityview/fields/fileupload/link_atts` Modify the link attributes for a file upload field |
210
|
|
|
* @param array|string $link_atts Array or attributes string |
211
|
|
|
* @param array $field Current GravityView field array |
212
|
|
|
*/ |
213
|
|
|
$link_atts = apply_filters( 'gravityview/fields/fileupload/link_atts', $link_atts, $gravityview_view->getCurrentField() ); |
214
|
|
|
|
215
|
|
|
/** |
216
|
|
|
* @filter `gravityview/fields/fileupload/disable_link` Filter to alter the default behaviour of wrapping images (or image names) with a link to the content object |
217
|
|
|
* @since 1.5.1 |
218
|
|
|
* @param bool $disable_wrapped_link whether to wrap the content with a link to the content object. |
219
|
|
|
* @param array $gravityview_view->field_data |
220
|
|
|
* @see GravityView_API:field_value() for info about $gravityview_view->field_data |
221
|
|
|
*/ |
222
|
|
|
$disable_wrapped_link = apply_filters( 'gravityview/fields/fileupload/disable_link', $disable_wrapped_link, $gravityview_view->getCurrentField() ); |
223
|
|
|
|
224
|
|
|
// If the HTML output hasn't been overridden by the switch statement above, use the default format |
225
|
|
|
if( !empty( $content ) && empty( $disable_wrapped_link ) ) { |
|
|
|
|
226
|
|
|
|
227
|
|
|
/** |
228
|
|
|
* Modify the link text (defaults to the file name) |
229
|
|
|
* |
230
|
|
|
* @since 1.7 |
231
|
|
|
* |
232
|
|
|
* @param string $content The existing anchor content. Could be `<img>` tag, audio/video embed or the file name |
233
|
|
|
* @param array $field GravityView array of the current field being processed |
234
|
|
|
*/ |
235
|
|
|
$content = apply_filters( 'gravityview/fields/fileupload/link_content', $content, $gravityview_view->getCurrentField() ); |
236
|
|
|
|
237
|
|
|
$content = gravityview_get_link( $link, $content, $link_atts ); |
238
|
|
|
} |
239
|
|
|
|
240
|
|
|
$output_arr[] = array( |
241
|
|
|
'file_path' => $file_path, |
242
|
|
|
'content' => $content |
|
|
|
|
243
|
|
|
); |
244
|
|
|
|
245
|
|
|
} // End foreach loop |
246
|
|
|
|
247
|
|
|
/** |
248
|
|
|
* @filter `gravityview/fields/fileupload/files_array` Modify the files array |
249
|
|
|
* @since 1.7 |
250
|
|
|
* @param array $output_arr Associative array of files \n |
251
|
|
|
* @type string $file_path The path to the file as stored in Gravity Forms \n |
252
|
|
|
* @type string $content The generated output for the file \n |
253
|
|
|
* @param array $field GravityView array of the current field being processed |
254
|
|
|
*/ |
255
|
|
|
$output_arr = apply_filters( 'gravityview/fields/fileupload/files_array', $output_arr, $gravityview_view->getCurrentField() ); |
256
|
|
|
|
257
|
|
|
return $output_arr; |
258
|
|
|
} |
259
|
|
|
|
260
|
|
|
} |
261
|
|
|
|
262
|
|
|
new GravityView_Field_FileUpload; |
263
|
|
|
|
The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.
The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.
To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.