1: <?php
2:
3: 4: 5:
6: class Papi_Property_File extends Papi_Property {
7:
8: 9: 10: 11: 12:
13: public $convert_type = 'object';
14:
15: 16: 17: 18: 19:
20: public $default_value = [];
21:
22: 23: 24: 25: 26:
27: protected $file_type = 'file';
28:
29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
39: public function format_value( $value, $slug, $post_id ) {
40: if ( is_numeric( $value ) ) {
41: $meta = wp_get_attachment_metadata( $value );
42:
43: if ( isset( $meta ) && ! empty( $meta ) ) {
44: $att = get_post( $value );
45: $mine = [
46: 'alt' => trim( strip_tags( get_post_meta( $value, '_wp_attachment_image_alt', true ) ) ),
47: 'caption' => trim( strip_tags( $att->post_excerpt ) ),
48: 'description' => trim( strip_tags( $att->post_content ) ),
49: 'id' => intval( $value ),
50: 'is_image' => (bool) wp_attachment_is_image( $value ),
51: 'title' => $att->post_title,
52: 'url' => wp_get_attachment_url( $value ),
53: ];
54:
55: $meta = is_array( $meta ) ? $meta : ['file' => $meta];
56:
57: if ( isset( $meta['sizes'] ) ) {
58: foreach ( $meta['sizes'] as $size => $val ) {
59: if ( $src = wp_get_attachment_image_src( $mine['id'], $size ) ) {
60: $meta['sizes'][$size]['url'] = $src[0];
61: }
62: }
63: }
64:
65: return (object) array_merge( $meta, $mine );
66: }
67:
68: return (int) $value;
69: }
70:
71: if ( is_array( $value ) ) {
72: foreach ( $value as $k => $v ) {
73: $value[$k] = $this->format_value( $v, $slug, $post_id );
74: }
75:
76: return $value;
77: }
78:
79: if ( is_object( $value ) && ! isset( $value->url ) ) {
80: return;
81: }
82:
83: return $value;
84: }
85:
86: 87: 88: 89: 90:
91: public function get_default_settings() {
92: return [
93: 'multiple' => false
94: ];
95: }
96:
97: 98: 99: 100: 101:
102: public function get_labels() {
103: return [
104: 'add' => __( 'Add file', 'papi' ),
105: 'no_file' => __( 'No file selected', 'papi' )
106: ];
107: }
108:
109: 110: 111:
112: public function html() {
113: $css_classes = '';
114: $labels = $this->get_labels();
115: $settings = $this->get_settings();
116: $slug = $this->html_name();
117: $value = papi_to_array( $this->get_value() );
118:
119:
120: $value = array_filter( $value, function ( $item ) {
121: return is_object( $item ) && isset( $item->id ) && ! empty( $item->id );
122: } );
123:
124: $show_button = empty( $value );
125:
126: if ( $settings->multiple ) {
127: $css_classes .= ' multiple ';
128: $slug .= '[]';
129: $show_button = true;
130: }
131: ?>
132:
133: <div class="papi-property-file <?php echo $css_classes; ?>" data-file-type="<?php echo esc_attr( $this->file_type ); ?>">
134: <p class="papi-file-select <?php echo $show_button ? '' : 'papi-hide'; ?>">
135: <?php
136: if ( ! $settings->multiple ) {
137: echo $labels['no_file'] . ' ';
138: }
139:
140: papi_render_html_tag( 'input', [
141: 'name' => $slug,
142: 'type' => 'hidden',
143: 'value' => ''
144: ] );
145:
146: papi_render_html_tag( 'button', [
147: 'data-slug' => $slug,
148: 'class' => 'button',
149: 'type' => 'button',
150:
151: $labels['add']
152: ] );
153: ?>
154: </p>
155: <div class="attachments">
156: <?php
157: if ( is_array( $value ) ):
158: foreach ( $value as $key => $file ):
159: $url = wp_get_attachment_thumb_url( $file->id );
160:
161: if ( empty( $url ) ) {
162: $url = wp_mime_type_icon( $file->id );
163: }
164: ?>
165: <div class="attachment">
166: <a class="check" href="#">X</a>
167: <div class="attachment-preview">
168: <div class="thumbnail">
169: <div class="centered">
170: <?php
171: papi_render_html_tag( 'img', [
172: 'alt' => $file->alt,
173: 'src' => $url
174: ] );
175:
176: papi_render_html_tag( 'input', [
177: 'name' => $slug,
178: 'type' => 'hidden',
179: 'value' => $file->id
180: ] );
181: ?>
182: </div>
183: <?php if ( $this->file_type === 'file' ): ?>
184: <div class="filename">
185: <div><?php echo basename( $file->file ); ?></div>
186: </div>
187: <?php endif; ?>
188: </div>
189: </div>
190: </div>
191: <?php
192: endforeach;
193: endif;
194: ?>
195: </div>
196: <div class="clear"></div>
197: </div>
198:
199: <?php
200: }
201:
202: 203: 204: 205: 206: 207: 208: 209: 210:
211: public function import_value( $value, $slug, $post_id ) {
212: if ( $this->get_setting( 'multiple' ) ) {
213: $values = [];
214:
215: foreach ( papi_to_array( $value ) as $item ) {
216: if ( is_object( $item ) && isset( $item->id ) && $this->is_attachment( $item->id ) ) {
217: $values[] = $item->id;
218: } else if ( is_numeric( $item ) ) {
219: if ( $this->is_attachment( $item ) ) {
220: $values[] = $item;
221: }
222: }
223: }
224:
225: return array_filter( $values, function ( $val ) {
226: return ! empty( $val );
227: } );
228: }
229:
230: if ( is_object( $value ) && isset( $value->id ) && $this->is_attachment( $value->id ) ) {
231: return (int) $value->id;
232: }
233:
234: if ( is_numeric( $value ) && $this->is_attachment( (int) $value ) ) {
235: return (int) $value;
236: }
237:
238: return 0;
239: }
240:
241: 242: 243: 244: 245: 246: 247:
248: protected function is_attachment( $id ) {
249: return get_post_type( (int) $id ) === 'attachment';
250: }
251:
252: 253: 254:
255: public function render_file_template() {
256: ?>
257: <script type="text/template" id="tmpl-papi-property-file">
258: <a class="check" href="#">X</a>
259: <div class="attachment-preview">
260: <div class="thumbnail">
261: <div class="centered">
262: <img src="<%= url %>" alt="<%= alt %>"/>
263: <input type="hidden" value="<%= id %>" name="<%= slug %>"/>
264: </div>
265: <% if (typeof filename !== "undefined") { %>
266: <div class="filename">
267: <div><%= filename %></div>
268: </div>
269: <% } %>
270: </div>
271: </div>
272: </script>
273: <?php
274: }
275:
276: 277: 278:
279: protected function setup_actions() {
280: add_action( 'admin_head', [$this, 'render_file_template'] );
281: }
282:
283: 284: 285:
286: protected function setup_filters() {
287: add_action(
288: 'wp_get_attachment_metadata',
289: [$this, 'wp_get_attachment_metadata'],
290: 10,
291: 2
292: );
293: }
294:
295: 296: 297: 298: 299: 300: 301: 302:
303: public function wp_get_attachment_metadata( $data, $post_id ) {
304: if ( papi_is_empty( $data ) ) {
305: return get_post_meta( $post_id, '_wp_attached_file', true );
306: }
307:
308: return $data;
309: }
310: }
311: