1: <?php
2:
3: 4: 5:
6: class Papi_Property_Link 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: 28: 29: 30:
31: public function delete_value( $slug, $post_id, $type ) {
32: $values = $this->load_value( null, $slug, $post_id );
33: $result = true;
34:
35: foreach ( $values as $key => $val ) {
36: $out = papi_delete_property_meta_value( $post_id, $slug . '_' . $key );
37: $result = $out ? $result : $out;
38: }
39:
40: if ( $result ) {
41: $result = papi_delete_property_meta_value( $post_id, $slug );
42: }
43:
44: return $result;
45: }
46:
47: 48: 49: 50: 51: 52: 53: 54: 55: 56:
57: public function format_value( $value, $slug, $post_id ) {
58: return $this->load_value( $value, $slug, $post_id );
59: }
60:
61: 62: 63: 64: 65:
66: public function get_default_settings() {
67: return [];
68: }
69:
70: 71: 72: 73: 74: 75: 76: 77: 78:
79: public function load_value( $value, $slug, $post_id ) {
80: $values = [
81: 'post_id',
82: 'url',
83: 'title',
84: 'target'
85: ];
86:
87: if ( is_array( $value ) || is_object( $value ) ) {
88: $values = (array) $value;
89:
90: foreach ( $values as $key => $val ) {
91: unset( $values[$key] );
92: $key = preg_replace( '/^' . $slug . '\_/', '', $key );
93: $values[$key] = $val;
94: }
95: } else {
96: foreach ( $values as $index => $key ) {
97: $values[$key] = get_post_meta(
98: $post_id,
99: sprintf( '%s_%s', $slug, $key ),
100: true
101: );
102: unset( $values[$index] );
103: }
104: }
105:
106: $values = (object) $values;
107:
108: if ( isset( $values->$slug ) && is_numeric( $values->$slug ) ) {
109: unset( $values->$slug );
110: }
111:
112: return $this->prepare_link_array( $values );
113: }
114:
115: 116: 117:
118: public function html() {
119: $value = $this->get_value();
120: $value = is_array( $value ) || is_object( $value ) ? $value : [];
121: $value = (object) $value;
122: ?>
123:
124: <div class="papi-property-link" data-replace-slug="true" data-slug="<?php echo $this->html_name(); ?>">
125: <?php if ( isset( $value->url ) ): ?>
126: <table class="papi-table link-table">
127: <tbody>
128: <tr>
129: <td>
130: <?php _e( 'URL', 'papi' ); ?>
131: </td>
132: <td>
133: <a href="<?php echo $value->url; ?>" target="_blank"><?php echo $value->url; ?></a>
134: <input type="hidden" value="<?php echo $value->title . ' - ' . $value->url; ?>" data-papi-rule="<?php echo $this->html_name(); ?>">
135: <input class="wp-link-url" type="hidden" value="<?php echo $value->url; ?>" name="<?php echo $this->html_name(); ?>[url]">
136: </td>
137: </tr>
138: <tr>
139: <td>
140: <?php _e( 'Title', 'papi' ); ?>
141: </td>
142: <td>
143: <?php echo $value->title; ?>
144: <input class="wp-link-text" type="hidden" value="<?php echo $value->title; ?>" name="<?php echo $this->html_name(); ?>[title]">
145: </td>
146: </tr>
147: <tr>
148: <td>
149: <?php _e( 'Target', 'papi' ); ?>
150: </td>
151: <td>
152: <?php echo $value->target === '_blank' ? __( 'New window', 'papi' ) : __( 'Same window', 'papi' ); ?>
153: <input class="wp-link-target" type="hidden" value="<?php echo $value->target; ?>" name="<?php echo $this->html_name(); ?>[target]">
154: </td>
155: </tr>
156: </tbody>
157: </table>
158: <?php endif; ?>
159:
160: <p class="papi-file-select">
161: <span class="<?php echo isset( $value->url ) ? 'papi-hide' : ''; ?>">
162: <?php _e( 'No link selected', 'papi' ); ?>
163: <button class="button" data-link-action="add"><?php _e( 'Add link', 'papi' ); ?></button>
164: </span>
165: <span class="<?php echo isset( $value->url ) ? '' : 'papi-hide'; ?>">
166: <button class="button" data-link-action="edit"><?php _e( 'Edit link', 'papi' ); ?></button>
167: <button class="button" data-link-action="remove"><?php _e( 'Remove link', 'papi' ); ?></button>
168: </span>
169: </p>
170: </div>
171: <?php
172: }
173:
174: 175: 176: 177: 178: 179: 180: 181: 182:
183: public function import_value( $value, $slug, $post_id ) {
184: if ( is_array( $value ) || is_object( $value ) ) {
185: return $this->update_value( (array) $value, $slug, $post_id );
186: }
187: }
188:
189: 190: 191: 192: 193: 194: 195: 196:
197: protected function prepare_link_array( $values ) {
198: $array = is_array( $values );
199: $values = (object) $values;
200:
201:
202: if ( ! isset( $values->url ) || empty( $values->url ) ) {
203: return $array ? (array) $values : $values;
204: }
205:
206:
207: if ( ! isset( $values->post_id ) || empty( $values->post_id ) ) {
208: $values->post_id = url_to_postid( $values->url );
209: }
210:
211:
212: if ( $values->post_id > 0 ) {
213: $values->url = get_permalink( $values->post_id );
214: }
215:
216: return $array ? (array) $values : $values;
217: }
218:
219: 220: 221:
222: public function render_link_template() {
223: ?>
224: <script type="text/template" id="tmpl-papi-property-link">
225: <table class="papi-table link-table">
226: <tbody>
227: <tr>
228: <td>
229: <?php _e( 'URL', 'papi' ); ?>
230: </td>
231: <td>
232: <%= link %>
233: <input type="hidden" value="<%= title %> - <%= href %>" data-papi-rule="<%= slug %>">
234: <input class="wp-link-url" type="hidden" value="<%= href %>" name="<%= slug %>[url]">
235: </td>
236: </tr>
237: <tr>
238: <td>
239: <?php _e( 'Title', 'papi' ); ?>
240: </td>
241: <td>
242: <%= title %>
243: <input class="wp-link-text" type="hidden" value="<%= title %>" name="<%= slug %>[title]">
244: </td>
245: </tr>
246: <tr>
247: <td>
248: <?php _e( 'Target', 'papi' ); ?>
249: </td>
250: <td>
251: <input class="wp-link-target" type="hidden" value="<%= target %>" name="<%= slug %>[target]">
252: <%= target === '_blank' ? '<?php _e( 'New window', 'papi' ) ?>' : '<?php _e( 'Same window', 'papi' ); ?>' %>
253: </td>
254: </tr>
255: </tbody>
256: </table>
257: </script>
258: <?php
259: }
260:
261: 262: 263: 264: 265: 266: 267: 268: 269:
270: public function update_value( $values, $slug, $post_id ) {
271: $values = $this->prepare_link_array( $values );
272:
273: foreach ( $values as $key => $val ) {
274: $values[$slug . '_' . $key] = $val;
275: unset( $values[$key] );
276: }
277:
278: $values[$slug] = 1;
279:
280: return $values;
281: }
282:
283: 284: 285:
286: protected function setup_actions() {
287: add_action( 'admin_head', [$this, 'render_link_template'] );
288: }
289: }
290: