Overview

Namespaces

  • None
  • Quform
    • Traduttore_Registry

Classes

  • Quform
  • Quform_Admin_InsertForm
  • Quform_Admin_Page
  • Quform_Admin_Page_Controller
  • Quform_Admin_Page_Dashboard
  • Quform_Admin_Page_Entries
  • Quform_Admin_Page_Entries_Edit
  • Quform_Admin_Page_Entries_List
  • Quform_Admin_Page_Entries_View
  • Quform_Admin_Page_Factory
  • Quform_Admin_Page_Forms_Add
  • Quform_Admin_Page_Forms_Edit
  • Quform_Admin_Page_Forms_List
  • Quform_Admin_Page_Help
  • Quform_Admin_Page_Preview
  • Quform_Admin_Page_Settings
  • Quform_Admin_Page_Tools
  • Quform_Admin_Page_Tools_ExportEntries
  • Quform_Admin_Page_Tools_ExportForm
  • Quform_Admin_Page_Tools_Home
  • Quform_Admin_Page_Tools_ImportForm
  • Quform_Admin_Page_Tools_Migrate
  • Quform_Admin_Page_Tools_Uninstall
  • Quform_Api
  • Quform_Block
  • Quform_Builder
  • Quform_Captcha
  • Quform_ClassLoader
  • Quform_Confirmation
  • Quform_Container
  • Quform_Dashboard_Widget
  • Quform_Dispatcher
  • Quform_Element
  • Quform_Element_Captcha
  • Quform_Element_Checkbox
  • Quform_Element_Column
  • Quform_Element_Container
  • Quform_Element_Container_Iterator
  • Quform_Element_Date
  • Quform_Element_Email
  • Quform_Element_Factory
  • Quform_Element_Field
  • Quform_Element_File
  • Quform_Element_Group
  • Quform_Element_Hidden
  • Quform_Element_Honeypot
  • Quform_Element_Html
  • Quform_Element_Multi
  • Quform_Element_Multiselect
  • Quform_Element_Name
  • Quform_Element_Page
  • Quform_Element_Password
  • Quform_Element_Radio
  • Quform_Element_Recaptcha
  • Quform_Element_Row
  • Quform_Element_Select
  • Quform_Element_Submit
  • Quform_Element_Text
  • Quform_Element_Textarea
  • Quform_Element_Time
  • Quform_Entry_Controller
  • Quform_Entry_Exporter
  • Quform_Entry_List_Settings
  • Quform_Entry_List_Table
  • Quform_Entry_Processor
  • Quform_Entry_UserSearcher
  • Quform_Filter_Abstract
  • Quform_Filter_Alpha
  • Quform_Filter_AlphaNumeric
  • Quform_Filter_Digits
  • Quform_Filter_Regex
  • Quform_Filter_Static
  • Quform_Filter_StripTags
  • Quform_Filter_Trim
  • Quform_Form
  • Quform_Form_Controller
  • Quform_Form_Exporter
  • Quform_Form_Factory
  • Quform_Form_Importer
  • Quform_Form_Iterator
  • Quform_Form_List_Settings
  • Quform_Form_List_Table
  • Quform_Form_Processor
  • Quform_License
  • Quform_Migrator
  • Quform_NonceRefresher
  • Quform_Notification
  • Quform_Notification_Resender
  • Quform_Options
  • Quform_Permissions
  • Quform_Repository
  • Quform_ScriptLoader
  • Quform_Session
  • Quform_Settings
  • Quform_Shortcode
  • Quform_Themes
  • Quform_TokenReplacer
  • Quform_Toolbar
  • Quform_Translations
  • Quform_Updater
  • Quform_Upgrader
  • Quform_Uploader
  • Quform_Validator_Abstract
  • Quform_Validator_Alpha
  • Quform_Validator_AlphaNumeric
  • Quform_Validator_Array
  • Quform_Validator_Captcha
  • Quform_Validator_Date
  • Quform_Validator_Digits
  • Quform_Validator_Duplicate
  • Quform_Validator_Email
  • Quform_Validator_FileUpload
  • Quform_Validator_GreaterThan
  • Quform_Validator_Honeypot
  • Quform_Validator_Identical
  • Quform_Validator_InArray
  • Quform_Validator_Length
  • Quform_Validator_LessThan
  • Quform_Validator_Recaptcha
  • Quform_Validator_Regex
  • Quform_Validator_Required
  • Quform_Validator_Static
  • Quform_Validator_Time
  • Quform_View
  • Quform_ViewFactory
  • Quform_Widget_Form
  • Quform_Widget_Popup

Interfaces

  • Quform_Attachable
  • Quform_Element_Editable
  • Quform_Filter_Interface
  • Quform_Validator_Interface

Constants

  • Quform\Traduttore_Registry\TRANSIENT_KEY_PLUGIN
  • Quform\Traduttore_Registry\TRANSIENT_KEY_THEME

Functions

  • Quform\Traduttore_Registry\add_project
  • Quform\Traduttore_Registry\clean_translations_cache
  • Quform\Traduttore_Registry\get_available_locales
  • Quform\Traduttore_Registry\get_installed_translations
  • Quform\Traduttore_Registry\get_translations
  • Quform\Traduttore_Registry\register_clean_translations_cache
  • Quform\Traduttore_Registry\sanitize_date
  • Overview
  • Namespace
  • Class
  1: <?php
  2: 
  3: /**
  4:  * @copyright Copyright (c) 2009-2022 ThemeCatcher (https://www.themecatcher.net)
  5:  */
  6: class Quform_Admin_Page_Entries_List extends Quform_Admin_Page_Entries
  7: {
  8:     /**
  9:      * @var Quform_Form_Factory
 10:      */
 11:     protected $formFactory;
 12: 
 13:     /**
 14:      * @var Quform_Options
 15:      */
 16:     protected $options;
 17: 
 18:     /**
 19:      * @param  Quform_ViewFactory       $viewFactory
 20:      * @param  Quform_Repository        $repository
 21:      * @param  Quform_Form_Factory      $formFactory
 22:      * @param  Quform_Options           $options
 23:      */
 24:     public function __construct(Quform_ViewFactory $viewFactory, Quform_Repository $repository,
 25:                                 Quform_Form_Factory $formFactory, Quform_Options $options)
 26:     {
 27:         parent::__construct($viewFactory, $repository);
 28: 
 29:         $this->formFactory = $formFactory;
 30:         $this->options = $options;
 31:     }
 32: 
 33:     public function init()
 34:     {
 35:         $this->template = QUFORM_TEMPLATE_PATH . '/admin/entries/list.php';
 36:     }
 37: 
 38:     /**
 39:      * Enqueue the page styles
 40:      */
 41:     protected function enqueueStyles()
 42:     {
 43:         wp_enqueue_style('qtip2', Quform::url('css/jquery.qtip.min.css'), array(), '3.0.4');
 44:         wp_enqueue_style('spectrum', Quform::adminUrl('css/spectrum.min.css'), array(), '1.8.1');
 45: 
 46:         parent::enqueueStyles();
 47:     }
 48: 
 49:     /**
 50:      * Enqueue the page scripts
 51:      */
 52:     protected function enqueueScripts()
 53:     {
 54:         wp_enqueue_script('jeditable', Quform::adminUrl('js/jquery.jeditable.min.js'), array('jquery'), '2.0.17', true);
 55:         wp_enqueue_script('qtip2', Quform::url('js/jquery.qtip.min.js'), array('jquery'), '3.0.4', true);
 56:         wp_enqueue_script('spectrum', Quform::adminUrl('js/spectrum.min.js'), array(), '1.8.1', true);
 57: 
 58:         parent::enqueueScripts();
 59: 
 60:         wp_enqueue_script('quform-entries-list', Quform::adminUrl('js/entries.list.min.js'), array('jquery', 'jquery-ui-sortable'), QUFORM_VERSION, true);
 61: 
 62:         wp_localize_script('quform-entries-list', 'quformEntriesListL10n', array(
 63:             'singleDeleteEntryMessage' => __('Are you sure you want to delete this entry? All data for this entry will be lost and this cannot be undone.', 'quform'),
 64:             'pluralDeleteEntryMessage' => __('Are you sure you want to delete these entries? All data for these entries will be lost and this cannot be undone.', 'quform'),
 65:             'saveEntriesTableSettingsNonce' => wp_create_nonce('quform_save_entries_table_settings'),
 66:             'entryLabelEditHtml' => $this->getEntryLabelEditHtml()
 67:         ));
 68:     }
 69: 
 70:     /**
 71:      * Process this page and send data to the view
 72:      */
 73:     public function process()
 74:     {
 75:         if ( ! current_user_can('quform_view_entries')) {
 76:             wp_die(__( 'You do not have sufficient permissions to access this page.', 'quform'), 403);
 77:         }
 78: 
 79:         // Deal with read/unread/delete actions
 80:         $this->processActions();
 81: 
 82:         if (isset($_GET['id']) && Quform::isNonEmptyString($_GET['id'])) {
 83:             $config = $this->repository->getConfig((int) $_GET['id']);
 84: 
 85:             if ($config === null) {
 86:                 wp_die(esc_html__('The form could not be found. Perhaps it was deleted?', 'quform'));
 87:             }
 88:         } else {
 89:             $config = $this->repository->firstConfig();
 90: 
 91:             if ($config === null) {
 92:                 // There are no forms, redirect
 93:                 wp_safe_redirect(admin_url('admin.php?page=quform.forms'));
 94:                 exit;
 95:             }
 96:         }
 97: 
 98:         $config['environment'] = 'listEntry';
 99: 
100:         $form = $this->formFactory->create($config);
101: 
102:         $this->addPageMessages();
103: 
104:         $table = new Quform_Entry_List_Table($this, $form, $this->repository, $this->options);
105:         $table->prepare_items();
106: 
107:         $perPage = get_user_meta(get_current_user_id(), 'quform_entries_per_page', true);
108:         if ( ! is_numeric($perPage)) {
109:             $perPage = 20;
110:         }
111: 
112:         $this->view->with(array(
113:             'form' => $form,
114:             'table' => $table,
115:             'perPage' => $perPage,
116:             'labels' => $this->repository->getFormEntryLabels($form->getId())
117:         ));
118: 
119:         add_filter('removable_query_args', array($this, 'removableQueryArgs'));
120:     }
121: 
122:     protected function processActions()
123:     {
124:         $nonce = Quform::get($_GET, '_wpnonce');
125:         $action = null;
126:         $ids = array();
127: 
128:         if (isset($_GET['eid'])) {
129:             $action = Quform::get($_GET, 'action');
130:             $ids = (int) $_GET['eid'];
131:         } elseif (isset($_GET['eids'])) {
132:             $action = $this->getBulkAction();
133:             $ids = (array) Quform::get($_GET, 'eids');
134:             $ids = array_map('intval', $ids);
135:         } elseif (isset($_GET['delete_all'])) {
136:             $action = 'delete_all';
137:         }
138: 
139:         if ($action == null) {
140:             if (Quform::get($_GET, '_wp_http_referer')) {
141:                 wp_safe_redirect(esc_url_raw(remove_query_arg(array('_wp_http_referer', '_wpnonce'), wp_unslash($_SERVER['REQUEST_URI']))));
142:                 exit;
143:             }
144: 
145:             return;
146:         }
147: 
148:         do_action('quform_pre_process_entries_list_action', $action, $ids);
149: 
150:         $returnUrl = remove_query_arg(array('action', 'action2', 'eid', 'eids', 'read', 'unread', 'trashed', 'deleted', 'error'), wp_get_referer());
151: 
152:         switch ($action) {
153:             case 'read':
154:                 $result = $this->processReadAction($ids, $nonce);
155:                 $returnUrl = add_query_arg($result, $returnUrl);
156:                 break;
157:             case 'unread':
158:                 $result = $this->processUnreadAction($ids, $nonce);
159:                 $returnUrl = add_query_arg($result, $returnUrl);
160:                 break;
161:             case 'trash':
162:                 $result = $this->processTrashAction($ids, $nonce);
163:                 $returnUrl = add_query_arg($result, $returnUrl);
164:                 break;
165:             case 'untrash':
166:                 $result = $this->processUntrashAction($ids, $nonce);
167:                 $returnUrl = add_query_arg($result, $returnUrl);
168:                 break;
169:             case 'delete':
170:                 $result = $this->processDeleteAction($ids, $nonce);
171:                 $returnUrl = add_query_arg($result, $returnUrl);
172:                 break;
173:             case 'delete_all':
174:                 $ids = $this->repository->getEntryIdsByStatus((int) Quform::get($_GET, 'id'), 'trash');
175:                 $result = $this->processDeleteAction($ids, $nonce);
176:                 $returnUrl = add_query_arg($result, $returnUrl);
177:                 break;
178:         }
179: 
180:         wp_safe_redirect(esc_url_raw($returnUrl));
181:         exit;
182:     }
183: 
184:     /**
185:      * Process marking entries as read
186:      *
187:      * @param   int|array  $entryIds
188:      * @param   string     $nonce
189:      * @return  array      The result message
190:      */
191:     protected function processReadAction($entryIds, $nonce)
192:     {
193:         if (is_array($entryIds)) {
194:             $nonceAction = 'bulk-qfb-entries';
195:         } else {
196:             $nonceAction = 'quform_read_entry_' . $entryIds;
197:             $entryIds = array($entryIds);
198:         }
199: 
200:         if ( ! $nonce || ! count($entryIds)) {
201:             return array('error' => self::BAD_REQUEST);
202:         }
203: 
204:         if ( ! current_user_can('quform_view_entries')) {
205:             return array('error' => self::NO_PERMISSION);
206:         }
207: 
208:         if ( ! wp_verify_nonce($nonce, $nonceAction)) {
209:             return array('error' => self::NONCE_CHECK_FAILED);
210:         }
211: 
212:         $count = $this->repository->readEntries($entryIds);
213: 
214:         return array('read' => $count);
215:     }
216: 
217:     /**
218:      * Process marking entries as unread
219:      *
220:      * @param   int|array  $entryIds
221:      * @param   string     $nonce
222:      * @return  array      The result message
223:      */
224:     protected function processUnreadAction($entryIds, $nonce)
225:     {
226:         if (is_array($entryIds)) {
227:             $nonceAction = 'bulk-qfb-entries';
228:         } else {
229:             $nonceAction = 'quform_unread_entry_' . $entryIds;
230:             $entryIds = array($entryIds);
231:         }
232: 
233:         if ( ! $nonce || ! count($entryIds)) {
234:             return array('error' => self::BAD_REQUEST);
235:         }
236: 
237:         if ( ! current_user_can('quform_view_entries')) {
238:             return array('error' => self::NO_PERMISSION);
239:         }
240: 
241:         if ( ! wp_verify_nonce($nonce, $nonceAction)) {
242:             return array('error' => self::NONCE_CHECK_FAILED);
243:         }
244: 
245:         $count = $this->repository->unreadEntries($entryIds);
246: 
247:         return array('unread' => $count);
248:     }
249: 
250:     /**
251:      * Process trashing entries
252:      *
253:      * @param   int|array  $entryIds
254:      * @param   string     $nonce
255:      * @return  array      The result message
256:      */
257:     protected function processTrashAction($entryIds, $nonce)
258:     {
259:         if (is_array($entryIds)) {
260:             $nonceAction = 'bulk-qfb-entries';
261:         } else {
262:             $nonceAction = 'quform_trash_entry_' . $entryIds;
263:             $entryIds = array($entryIds);
264:         }
265: 
266:         if ( ! $nonce || ! count($entryIds)) {
267:             return array('error' => self::BAD_REQUEST);
268:         }
269: 
270:         if ( ! current_user_can('quform_delete_entries')) {
271:             return array('error' => self::NO_PERMISSION);
272:         }
273: 
274:         if ( ! wp_verify_nonce($nonce, $nonceAction)) {
275:             return array('error' => self::NONCE_CHECK_FAILED);
276:         }
277: 
278:         $count = $this->repository->trashEntries($entryIds);
279: 
280:         return array('trashed' => $count);
281:     }
282: 
283:     /**
284:      * Process trashing entries
285:      *
286:      * @param   int|array  $entryIds
287:      * @param   string     $nonce
288:      * @return  array      The result message
289:      */
290:     protected function processUntrashAction($entryIds, $nonce)
291:     {
292:         if (is_array($entryIds)) {
293:             $nonceAction = 'bulk-qfb-entries';
294:         } else {
295:             $nonceAction = 'quform_untrash_entry_' . $entryIds;
296:             $entryIds = array($entryIds);
297:         }
298: 
299:         if ( ! $nonce || ! count($entryIds)) {
300:             return array('error' => self::BAD_REQUEST);
301:         }
302: 
303:         if ( ! current_user_can('quform_delete_entries')) {
304:             return array('error' => self::NO_PERMISSION);
305:         }
306: 
307:         if ( ! wp_verify_nonce($nonce, $nonceAction)) {
308:             return array('error' => self::NONCE_CHECK_FAILED);
309:         }
310: 
311:         $count = $this->repository->untrashEntries($entryIds);
312: 
313:         return array('untrashed' => $count);
314:     }
315: 
316:     /**
317:      * Process deleting entries
318:      *
319:      * @param   int|array  $entryIds
320:      * @param   string     $nonce
321:      * @return  array      The result message
322:      */
323:     protected function processDeleteAction($entryIds, $nonce)
324:     {
325:         if (is_array($entryIds)) {
326:             $nonceAction = 'bulk-qfb-entries';
327:         } else {
328:             $nonceAction = 'quform_delete_entry_' . $entryIds;
329:             $entryIds = array($entryIds);
330:         }
331: 
332:         if ( ! $nonce || ! count($entryIds)) {
333:             return array('error' => self::BAD_REQUEST);
334:         }
335: 
336:         if ( ! current_user_can('quform_delete_entries')) {
337:             return array('error' => self::NO_PERMISSION);
338:         }
339: 
340:         if ( ! wp_verify_nonce($nonce, $nonceAction)) {
341:             return array('error' => self::NONCE_CHECK_FAILED);
342:         }
343: 
344:         $count = $this->repository->deleteEntries($entryIds);
345: 
346:         return array('deleted' => $count);
347:     }
348: 
349:     /**
350:      * Get the name of the bulk action
351:      *
352:      * @return string|null
353:      */
354:     protected function getBulkAction()
355:     {
356:         $action = null;
357: 
358:         $a1 = Quform::get($_GET, 'action', '-1');
359:         $a2 = Quform::get($_GET, 'action2', '-1');
360: 
361:         if ($a1 != '-1') {
362:             $action = $a1;
363:         } elseif ($a2 != '-1') {
364:             $action = $a2;
365:         }
366: 
367:         return $action;
368:     }
369: 
370:     /**
371:      * Add messages to the page based on the query vars
372:      */
373:     protected function addPageMessages()
374:     {
375:         $read = (int) Quform::get($_GET, 'read');
376:         if ($read > 0) {
377:             /* translators: %s: the number of entries */
378:             $this->addMessage('success', sprintf(_n('%s entry marked as read', '%s entries marked as read', $read, 'quform'), number_format_i18n($read)));
379:         }
380: 
381:         $unread = (int) Quform::get($_GET, 'unread');
382:         if ($unread > 0) {
383:             /* translators: %s: the number of entries */
384:             $this->addMessage('success', sprintf(_n('%s entry marked as unread', '%s entries marked as unread', $unread, 'quform'), number_format_i18n($unread)));
385:         }
386: 
387:         $trashed = (int) Quform::get($_GET, 'trashed');
388:         if ($trashed > 0) {
389:             /* translators: %s: the number of entries */
390:             $this->addMessage('success', sprintf(_n('%s entry moved to the Trash', '%s entries moved to the Trash', $trashed, 'quform'), number_format_i18n($trashed)));
391:         }
392: 
393:         $untrashed = (int) Quform::get($_GET, 'untrashed');
394:         if ($untrashed > 0) {
395:             /* translators: %s: the number of entries */
396:             $this->addMessage('success', sprintf(_n('%s entry restored', '%s entries restored', $untrashed, 'quform'), number_format_i18n($untrashed)));
397:         }
398: 
399:         $deleted = (int) Quform::get($_GET, 'deleted');
400:         if ($deleted > 0) {
401:             /* translators: %s: the number of entries */
402:             $this->addMessage('success', sprintf(_n('%s entry deleted', '%s entries deleted', $deleted, 'quform'), number_format_i18n($deleted)));
403:         }
404: 
405:         switch ((int) Quform::get($_GET, 'error')) {
406:             case self::BAD_REQUEST:
407:                 $this->addMessage('error', __('Bad request.', 'quform'));
408:                 break;
409:             case self::NO_PERMISSION:
410:                 $this->addMessage('error', __('You do not have permission to do this.', 'quform'));
411:                 break;
412:             case self::NONCE_CHECK_FAILED:
413:                 $this->addMessage('error', __('Nonce check failed.', 'quform'));
414:                 break;
415:         }
416:     }
417: 
418:     /**
419:      * Additional query arguments that can be hidden by history.replaceState
420:      *
421:      * @param   array  $args
422:      * @return  array
423:      */
424:     public function removableQueryArgs($args)
425:     {
426:         $args[] = 'read';
427:         $args[] = 'unread';
428: 
429:         return $args;
430:     }
431: 
432:     /**
433:      * Get the HTML for the admin navigation menu
434:      *
435:      * @param   array|null  $currentForm  The data for the current form (if any)
436:      * @param   array       $extra        Extra HTML to add to the nav, the array key is the hook position
437:      * @return  string
438:      */
439:     public function getNavHtml(array $currentForm = null, array $extra = array())
440:     {
441:         $extra[40] = sprintf(
442:             '<div class="qfb-nav-item qfb-nav-page-info"><i class="qfb-nav-page-icon qfb-mdi qfb-mdi-message"></i><span class="qfb-nav-page-title">%s</span></div>',
443:             /* translators: %s: the form name */
444:             Quform::escape(sprintf(__('Entries for %s', 'quform'), $currentForm['name']))
445:         );
446: 
447:         $extra[50] = '<div class="qfb-nav-item qfb-nav-item-right"><a id="qfb-show-entries-table-settings" class="qfb-nav-item-link"><i class="qfb-mdi qfb-mdi-settings"></i></a></div>';
448: 
449:         return parent::getNavHtml($currentForm, $extra);
450:     }
451: 
452:     /**
453:      * Get the HTML for an entry label for the entry label settings
454:      *
455:      * @param   array|null  $label
456:      * @return  string
457:      */
458:     public function getEntryLabelEditHtml(array $label = null)
459:     {
460:         $output = sprintf(
461:             '<div class="qfb-entry-label-edit qfb-cf"%s%s>',
462:             is_array($label) ? sprintf(' data-label="%s"', Quform::escape(wp_json_encode($label))) : '',
463:             is_array($label) ? sprintf(' style="background-color: %s;"', Quform::escape($label['color'])) : ''
464:         );
465: 
466:         $output .= sprintf(
467:             '<span class="qfb-entry-label-edit-name" title="%s">%s</span>',
468:             esc_attr__('Click to edit name', 'quform'),
469:             is_array($label) ? Quform::escape($label['name']) : ''
470:         );
471: 
472:         $output .= '<div class="qfb-entry-label-edit-actions">';
473:         $output .= '<span class="qfb-entry-label-edit-action-color"><i class="qfb-mdi qfb-mdi-format_color_fill"></i></span>';
474:         $output .= '<span class="qfb-entry-label-edit-action-duplicate"><i class="qfb-mdi qfb-mdi-content_copy"></i></span>';
475:         $output .= '<span class="qfb-entry-label-edit-action-remove"><i class="qfb-icon qfb-icon-trash"></i></span>';
476:         $output .= '</div></div>';
477: 
478:         return $output;
479:     }
480: }
481: 
API documentation generated by ApiGen