Subversion Repositories web.creative

Rev

Blame | Last modification | View Log | Download

<?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 2018 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;
    }
    
    if($error) {
      $this->session->warning($message);
      $this->session->redirect('./');
    } else {
      // redirect to admin root after emptying trash
      $this->session->message($message);
      $this->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() {

    // $trashPages = $this->pages->get($this->config->trashPageID)->children("limit=2, status<" . Page::statusMax);
    $trashTotal = $this->pages->trasher()->getTrashTotal();

    /** @var InputfieldForm $form */
    $form = $this->modules->get("InputfieldForm"); 
    $form->attr('action', './'); 
    $form->attr('method', 'post'); 

    if(!$trashTotal) return "<h2>" . $this->_("The trash is empty") . "</h2>";

    /** @var InputfieldCheckbox $field */
    $field = $this->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 = $this->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 = $this->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 = $this->modules->get("InputfieldSubmit"); 
    $field->attr('name', 'submit_empty'); 
    $field->showInHeader(true); 
    $field->icon = 'trash';
    $form->add($field);
    
    /** @var InputfieldSubmit $field */
    $field = $this->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();   
  }
}