praiadeseselle/wire/modules/Process/ProcessPageTrash.module

161 lines
4.9 KiB
Text

<?php namespace ProcessWire;
/**
* ProcessWire Page Trash Process
*
* Provides empty trash capability.
*
* For more details about how Process modules work, please see:
* /wire/core/Process.php
*
* ProcessWire 3.x, Copyright 2022 by Ryan Cramer
* https://processwire.com
*
*/
class ProcessPageTrash extends Process {
const debug = false;
const defaultTimeLimit = 30;
const defaultPageLimit = 0;
public static function getModuleInfo() {
return array(
'title' => __('Page Trash', __FILE__), // getModuleInfo title
'summary' => __('Handles emptying of Page trash', __FILE__), // getModuleInfo summary
'version' => 103,
'permanent' => true,
);
}
/**
* Check if an empty request has been received and delete if so, otherwise render a confirmation form
*
*/
public function ___execute() {
if(!$this->wire()->user->isSuperuser()) throw new WirePermissionException();
$input = $this->wire()->input;
$timeLimit = abs((int) $input->post('time_limit'));
if($timeLimit > 0) $this->session->setFor($this, 'timeLimit', $timeLimit);
if(!$input->post('submit_empty') || !$input->post('confirm_empty')) {
// render a form showing what pages are in the trash and confirming they want to empty it
if($input->post('submit_empty')) $this->warning($this->_('You must check the box to confirm'));
return $this->render();
}
$this->session->CSRF->validate();
$options = array(
'verbose' => true,
'timeLimit' => $timeLimit > 0 ? $timeLimit : self::defaultTimeLimit,
);
$result = $this->wire()->pages->emptyTrash($options);
if(self::debug) $this->warning($result);
$error = false;
$message = sprintf($this->_n('Deleted %d page', 'Deleted %d pages', $result['numDeleted']), $result['numDeleted']);
if($result['numDeleted'] && $result['pagesPerSecond'] && $result['numDeleted'] > $result['pagesPerSecond']) {
$message .= ' ' . sprintf($this->_('(%d pages per second)'), $result['pagesPerSecond']);
}
if($result['numRemain'] > 0) {
$message .= ' - ' . sprintf($this->_('Not all pages could be deleted (%d remain)'), $result['numRemain']);
$error = true;
}
if($result['timeExpired']) {
$message .= ' - ' . sprintf($this->_('Time limit reached (%d seconds)'), "$options[timeLimit]");
$error = true;
}
$session = $this->wire()->session;
if($error) {
$session->warning($message);
$session->redirect('./');
} else {
// redirect to admin root after emptying trash
$session->message($message);
$session->redirect($this->wire()->config->urls('admin'));
}
return ''; // unreachable due to redirects above
}
/**
* Render a form showing what pages are in the trash and confirming they want to empty it
*
*/
protected function render() {
$modules = $this->wire()->modules;
$trashTotal = $this->pages->trasher()->getTrashTotal();
/** @var InputfieldForm $form */
$form = $modules->get("InputfieldForm");
$form->attr('action', './');
$form->attr('method', 'post');
if(!$trashTotal) return "<h2>" . $this->_("The trash is empty") . "</h2>";
/** @var InputfieldCheckbox $field */
$field = $modules->get("InputfieldCheckbox");
$field->attr('name', 'confirm_empty');
$field->attr('value', 1);
$field->label2 = $this->_('Empty the trash (confirm)');
$field->label = sprintf(
$this->_n('Permanently delete %d page in the trash?', 'Permanently delete %d pages in the trash?', $trashTotal),
$trashTotal
);
if($trashTotal > 100) {
$field->notes = $this->_("If there are too many items in the trash, you may have to empty it multiple times.");
}
$form->add($field);
/** @var InputfieldMarkup $field */
$field = $modules->get("InputfieldMarkup");
$field->label = $this->_('Pages in the trash');
$field->icon = 'list';
$field->collapsed = Inputfield::collapsedYes;
/** @var ProcessPageList $pageList */
$pageList = $this->modules->get('ProcessPageList');
$pageList->set('id', $this->config->trashPageID);
$pageList->set('showRootPage', false);
$field->value = $pageList->execute();
$form->add($field);
/** @var InputfieldInteger $f */
$f = $modules->get('InputfieldInteger');
$f->attr('name', 'time_limit');
$f->label = $this->_('Time limit (in seconds)');
$timeLimit = (int) $this->session->getFor($this, 'timeLimit');
$f->attr('value', $timeLimit > 0 ? $timeLimit : self::defaultTimeLimit);
$f->icon = 'clock-o';
$f->collapsed = Inputfield::collapsedYes;
$form->add($f);
/** @var InputfieldSubmit $field */
$field = $modules->get("InputfieldSubmit");
$field->attr('name', 'submit_empty');
$field->showInHeader(true);
$field->icon = 'trash';
$form->add($field);
/** @var InputfieldButton $field */
$field = $modules->get("InputfieldButton");
$field->attr('name', 'submit_cancel');
$field->setSecondary(true);
$field->value = $this->_('Cancel');
$field->href = $this->wire()->config->urls->admin;
$field->icon = 'times';
$form->add($field);
return $form->render();
}
}