PluginProbe
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI / 8.0.5
GamiPress – Gamification plugin to reward points, badges & ranks in WordPress, now with AI v8.0.5
8.0.5 8.0.4 8.0.3 8.0.1 8.0.2 8.0.0 7.9.9.7 7.9.9.6 7.9.9.5 7.9.9.4 7.9.9.3 7.9.9.2 7.9.9.1 7.9.9 7.9.8 7.9.7 7.9.6 7.9.5 7.9.4 7.9.3 7.9.2 7.9.1 7.9.0 7.8.9 7.8.8 All 47 releases
← All changes | includes/admin/meta-boxes/log-extra-data-ui.php +346 -0 7.9.4 → 8.0.5 View file →
@@ -1,0 +1,346 @@
1 +<?php
2 +/**
3 + * Log Extra Data UI
4 + *
5 + * @package GamiPress\Admin\Log_Extra_Data_UI
6 + * @author GamiPress <[email protected]>, Ruben Garcia <[email protected]>
7 + * @since 1.0.0
8 + */
9 +// Exit if accessed directly
10 +if( !defined( 'ABSPATH' ) ) exit;
11 +
12 +/**
13 + * Add log data and extra data meta box
14 + *
15 + * @since 1.0.0
16 + * @return void
17 + */
18 +function gamipress_add_log_extra_data_ui_meta_box() {
19 +
20 + add_meta_box( 'gamipress_log_details_ui', __( 'Log Details', 'gamipress' ), 'gamipress_log_details_ui_meta_box', 'gamipress_logs', 'side', 'default' );
21 + add_meta_box( 'gamipress_log_extra_data_ui', __( 'Extra Data', 'gamipress' ), 'gamipress_log_extra_data_ui_meta_box', 'gamipress_logs', 'normal', 'default' );
22 +
23 +}
24 +add_action( 'add_meta_boxes', 'gamipress_add_log_extra_data_ui_meta_box' );
25 +
26 +/**
27 + * Renders the log data meta box
28 + *
29 + * @since 1.2.8
30 + *
31 + * @param stdClass $object The current object
32 + */
33 +function gamipress_log_details_ui_meta_box( $object = null ) {
34 + ?>
35 + <div id="log-data-ui">
36 + <?php gamipress_log_details_ui_html( $object, $object->type ); ?>
37 + </div>
38 + <?php
39 +}
40 +
41 +/**
42 + * Renders the log data meta box HTML
43 + *
44 + * @since 1.2.8
45 + *
46 + * @param stdClass $object The current object
47 + * @param string $type Type to render form
48 + */
49 +function gamipress_log_details_ui_html( $object, $type ) {
50 +
51 + global $ct_table;
52 +
53 + // Setup vars
54 + $log_types = gamipress_get_log_types();
55 + $primary_key = $ct_table->db->primary_key;
56 + $object_id = $object->$primary_key;
57 +
58 + ?>
59 + <div class="submitbox" id="submitpost" style="margin: -6px -12px -12px;">
60 +
61 + <div id="minor-publishing">
62 +
63 + <div id="misc-publishing-actions">
64 +
65 + <div class="misc-pub-section misc-pub-post-status">
66 + <?php echo __( 'Type:', 'gamipress' ); ?> <span id="post-status-display"><?php echo isset( $log_types[$object->type] ) ? $log_types[$object->type] : $object->type ; ?></span>
67 + </div>
68 +
69 + <div class="misc-pub-section misc-pub-visibility" id="visibility">
70 + <?php echo __( 'Visibility:', 'gamipress' ); ?> <span id="post-visibility-display"><?php echo $object->access === 'public' ? __( 'Public', 'gamipress' ) : __( 'Private', 'gamipress' ); ?></span>
71 + </div>
72 +
73 + <div class="misc-pub-section curtime misc-pub-curtime">
74 + <span id="timestamp"><?php echo __( 'Date:', 'gamipress' ); ?> <b><abbr title="<?php echo date( 'Y/m/d g:i:s a', strtotime( $object->date ) ); ?>"><?php echo date( 'Y/m/d', strtotime( $object->date ) ); ?></abbr></b></span>
75 + </div>
76 +
77 + </div>
78 +
79 + </div>
80 +
81 + <div id="major-publishing-actions">
82 +
83 + <div id="delete-action">
84 + <?php
85 + printf(
86 + '<a href="%s" class="submitdelete deletion" onclick="%s" aria-label="%s">%s</a>',
87 + ct_get_delete_link( $ct_table->name, $object_id ),
88 + "return confirm('" .
89 + esc_attr( __( "Are you sure you want to delete this item?\\n\\nClick \\'Cancel\\' to go back, \\'OK\\' to confirm the delete." ) ) .
90 + "');",
91 + esc_attr( __( 'Delete permanently' ) ),
92 + __( 'Delete Permanently' )
93 + );
94 + ?>
95 + </div>
96 +
97 + <div id="publishing-action">
98 + <span class="spinner"></span>
99 + <?php submit_button( __( 'Save Changes' ), 'primary large', 'ct-save', false ); ?>
100 + </div>
101 +
102 + <div class="clear"></div>
103 +
104 + </div>
105 +
106 + </div>
107 + <?php
108 +}
109 +
110 +/**
111 + * Renders the log extra data
112 + *
113 + * @since 1.0.0
114 + * @param stdClass $object The current object
115 + */
116 +function gamipress_log_extra_data_ui_meta_box( $object = null ) {
117 + ?>
118 + <div id="log-extra-data-ui">
119 + <?php gamipress_log_extra_data_ui_html( $object, $object->log_id, $object->type ); ?>
120 + </div>
121 + <?php
122 +}
123 +
124 +/**
125 + * Renders the HTML for meta box based on the log type given
126 + *
127 + * @since 1.0.0
128 + *
129 + * @param stdClass $object The current object
130 + * @param integer $object_id The current object ID
131 + * @param string $type Type to render form
132 + */
133 +function gamipress_log_extra_data_ui_html( $object, $object_id, $type ) {
134 +
135 + // Start with an underscore to hide fields from custom fields list
136 + $prefix = '_gamipress_';
137 + $fields = array();
138 +
139 + if( $type === 'event_trigger' ) {
140 +
141 + $fields = array(
142 + array(
143 + 'name' => __( 'Trigger', 'gamipress' ),
144 + 'tooltip' => __( 'The event user has triggered.', 'gamipress' ),
145 + 'label_cb' => 'cmb_tooltip_label_cb',
146 + 'id' => 'trigger_type',
147 + 'type' => 'advanced_select',
148 + 'options' => gamipress_get_activity_triggers(),
149 + ),
150 + array(
151 + 'name' => __( 'Count', 'gamipress' ),
152 + 'tooltip' => __( 'Number of times user triggered this event until this log.', 'gamipress' ),
153 + 'label_cb' => 'cmb_tooltip_label_cb',
154 + 'id' => $prefix . 'count',
155 + 'type' => 'text',
156 + ),
157 + );
158 +
159 + $trigger = $object->trigger_type;
160 +
161 + // If is a specific activity trigger, then add the achievement_post field
162 + if( in_array( $trigger, array_keys( gamipress_get_specific_activity_triggers() ) ) ) {
163 +
164 + $achievement_post_id = ct_get_object_meta( $object_id, $prefix . 'achievement_post', true );
165 + $achievement_post_site_id = ct_get_object_meta( $object_id, $prefix . 'achievement_post_site_id', true );
166 +
167 + $fields[] = array(
168 + 'name' => __( 'Assigned Post', 'gamipress' ),
169 + 'tooltip' => __( 'Attached post to this log.', 'gamipress' ),
170 + 'label_cb' => 'cmb_tooltip_label_cb',
171 + 'id' => $prefix . 'achievement_post',
172 + 'type' => 'select',
173 + 'options' => array(
174 + $achievement_post_id => gamipress_get_specific_activity_trigger_post_title( $achievement_post_id, $trigger, $achievement_post_site_id ),
175 + ),
176 + );
177 + }
178 + } else if( $type === 'achievement_earn' || $type === 'achievement_award' ) {
179 + $achievement_id = ct_get_object_meta( $object_id, $prefix . 'achievement_id', true );
180 +
181 + $fields = array(
182 + array(
183 + 'name' => __( 'Achievement', 'gamipress' ),
184 + 'tooltip' => __( 'Achievement user has earned.', 'gamipress' ),
185 + 'label_cb' => 'cmb_tooltip_label_cb',
186 + 'id' => $prefix . 'achievement_id',
187 + 'type' => 'select',
188 + 'options' => array(
189 + $achievement_id => gamipress_get_post_field( 'post_title', $achievement_id ),
190 + ),
191 + ),
192 + );
193 + } else if( in_array( $type, array( 'points_award', 'points_earn', 'points_revoke', 'points_deduct', 'points_expend' ) ) ) {
194 + // Grab our points types as an array
195 + $points_types_options = array(
196 + '' => 'Default'
197 + );
198 +
199 + foreach( gamipress_get_points_types() as $slug => $data ) {
200 + $points_types_options[$slug] = $data['plural_name'];
201 + }
202 +
203 + $fields = array(
204 + array(
205 + 'name' => __( 'Points', 'gamipress' ),
206 + 'tooltip' => ( $type === 'points_award' || $type === 'points_earn' ? __( 'Points user has earned.', 'gamipress' ) : __( 'Points deducted to user.', 'gamipress' ) ),
207 + 'label_cb' => 'cmb_tooltip_label_cb',
208 + 'id' => $prefix . 'points',
209 + 'type' => 'text_small',
210 + ),
211 + array(
212 + 'name' => __( 'Points Type', 'gamipress' ),
213 + 'tooltip' => ( $type === 'points_award' || $type === 'points_earn' ? __( 'Points type user has earned.', 'gamipress' ) : __( 'Points type deducted to user.', 'gamipress' ) ),
214 + 'label_cb' => 'cmb_tooltip_label_cb',
215 + 'id' => $prefix . 'points_type',
216 + 'type' => 'select',
217 + 'options' => $points_types_options
218 + ),
219 + array(
220 + 'name' => __( 'Total Points', 'gamipress' ),
221 + 'tooltip' => __( 'Total points user has earned until this log.', 'gamipress' ),
222 + 'label_cb' => 'cmb_tooltip_label_cb',
223 + 'id' => $prefix . 'total_points',
224 + 'type' => 'text_small',
225 + ),
226 + );
227 +
228 + } else if( $type === 'rank_earn' || $type === 'rank_award' ) {
229 + $rank_id = ct_get_object_meta( $object_id, $prefix . 'rank_id', true );
230 +
231 + $fields = array(
232 + array(
233 + 'name' => __( 'Rank', 'gamipress' ),
234 + 'tooltip' => __( 'Rank user has earned.', 'gamipress' ),
235 + 'label_cb' => 'cmb_tooltip_label_cb',
236 + 'id' => $prefix . 'rank_id',
237 + 'type' => 'select',
238 + 'options' => array(
239 + $rank_id => gamipress_get_post_field( 'post_title', $rank_id ),
240 + ),
241 + ),
242 + );
243 + }
244 +
245 + if( in_array( $type, array( 'achievement_award', 'points_award', 'points_revoke', 'rank_award' ) ) ) {
246 + $admin_id = ct_get_object_meta( $object_id, $prefix . 'admin_id', true );
247 + $admin = get_userdata( $admin_id );
248 +
249 + $fields[] = array(
250 + 'name' => __( 'Administrator', 'gamipress' ),
251 + 'tooltip' => ( $type === 'points_revoke' ? __( 'User has made the revoke.', 'gamipress' ) : __( 'User has made the award.', 'gamipress' ) ),
252 + 'label_cb' => 'cmb_tooltip_label_cb',
253 + 'id' => $prefix . 'admin_id',
254 + 'type' => 'select',
255 + 'options' => array(
256 + $admin_id => $admin->user_login,
257 + ),
258 + );
259 + }
260 +
261 + /**
262 + * Log extra data fields
263 + *
264 + * @since 1.0.0
265 + * @updated 1.6.3 Added $object parameter
266 + *
267 + * @param array $fields Log extra fields.
268 + * @param int $log_id The log ID.
269 + * @param string $type The log type. See gamipress_get_log_types().
270 + * @param stdClass $object The log object.
271 + *
272 + * @return array
273 + */
274 + $fields = apply_filters( 'gamipress_log_extra_data_fields', $fields, $object_id, $type, $object );
275 +
276 + if( ! empty( $fields ) ) {
277 +
278 + // Create a new box to render the form
279 + $cmb2 = new CMB2( array(
280 + 'id' => 'log_extra_data_ui_box',
281 + 'classes' => 'gamipress-form gamipress-box-form',
282 + 'hookup' => false,
283 + 'show_on' => array(
284 + 'key' => 'gamipress_logs',
285 + 'value' => $object_id
286 + ),
287 + 'fields' => $fields
288 + ) );
289 +
290 + $cmb2->object_id( $object_id );
291 +
292 + $cmb2->show_form();
293 +
294 + } else {
295 +
296 + _e( 'No extra data registered', 'gamipress' );
297 +
298 + }
299 +
300 +}
301 +
302 +/**
303 + * AJAX Handler for retrieve the HTML with
304 + *
305 + * @since 1.0.0
306 + * @return void
307 + */
308 +function gamipress_get_log_extra_data_ui_ajax_handler() {
309 + // Security check, forces to die if not security passed
310 + check_ajax_referer( 'gamipress_admin', 'nonce' );
311 +
312 + ct_setup_table( 'gamipress_logs' );
313 +
314 + $ct_object = ct_get_object( absint( $_REQUEST['object_id'] ) );
315 +
316 + gamipress_log_extra_data_ui_html( $ct_object, $ct_object->log_id, sanitize_text_field( $_REQUEST['type'] ) );
317 + die;
318 +}
319 +add_action( 'wp_ajax_gamipress_get_log_extra_data_ui', 'gamipress_get_log_extra_data_ui_ajax_handler' );
320 +
321 +/**
322 + * Helper function to recursive search an array key
323 + *
324 + * @since 1.0.0
325 + *
326 + * @param $needle_key
327 + * @param $array
328 + *
329 + * @return bool|mixed
330 + */
331 +function gamipress_array_search_key( $needle_key, $array ) {
332 +
333 + foreach( $array as $key => $value ) {
334 +
335 + if( $key == $needle_key )
336 + return $value;
337 +
338 + if( is_array( $value ) ) {
339 + if( ( $result = gamipress_array_search_key( $needle_key, $value ) ) !== false )
340 + return $result;
341 + }
342 + }
343 +
344 + return false;
345 +
346 +}