You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.9 KiB
143 lines
3.9 KiB
<?php
|
|
/**
|
|
* Common logic for all shortcodes plugin implements
|
|
*
|
|
* @author Maksym Tsypliakov <maksym.tsypliakov@gmail.com>
|
|
*/
|
|
abstract class PMXI_Controller {
|
|
/**
|
|
* Input class instance to retrieve parameters submitted during page request
|
|
* @var PMXI_Input
|
|
*/
|
|
protected $input;
|
|
/**
|
|
* Error messages
|
|
* @var WP_Error
|
|
*/
|
|
protected $errors;
|
|
/**
|
|
* Warning messages
|
|
* @var WP_Error
|
|
*/
|
|
protected $warnings;
|
|
/**
|
|
* Associative array of data which will be automatically available as variables when template is rendered
|
|
* @var array
|
|
*/
|
|
public $data = array();
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct() {
|
|
$this->input = new PMXI_Input();
|
|
$this->input->addFilter('trim');
|
|
|
|
$this->errors = new WP_Error();
|
|
$this->warnings = new WP_Error();
|
|
|
|
$this->init();
|
|
}
|
|
|
|
/**
|
|
* Method to put controller initialization logic to
|
|
*/
|
|
protected function init() {}
|
|
|
|
/**
|
|
* Checks wether protocol is HTTPS and redirects user to secure connection if not
|
|
*/
|
|
protected function force_ssl() {
|
|
if (force_ssl_admin() && ! is_ssl()) {
|
|
if ( 0 === strpos($_SERVER['REQUEST_URI'], 'http') ) {
|
|
wp_redirect(preg_replace('|^http://|', 'https://', $_SERVER['REQUEST_URI'])); die();
|
|
} else {
|
|
wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); die();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Method returning resolved template content
|
|
*
|
|
* @param string[optional] $viewPath Template path to render
|
|
*/
|
|
protected function render($viewPath = null) {
|
|
|
|
if ( ! get_current_user_id() or ! current_user_can( PMXI_Plugin::$capabilities )) {
|
|
// This nonce is not valid.
|
|
die( 'Security check' );
|
|
} else {
|
|
// assume template file name depending on calling function
|
|
if (is_null($viewPath)) {
|
|
$trace = debug_backtrace();
|
|
$viewPath = str_replace('_', '/', preg_replace('%^' . preg_quote(PMXI_Plugin::PREFIX, '%') . '%', '', strtolower($trace[1]['class']))) . '/' . $trace[1]['function'];
|
|
}
|
|
// append file extension if not specified
|
|
if ( ! preg_match('%\.php$%', $viewPath)) {
|
|
$viewPath .= '.php';
|
|
}
|
|
$filePath = PMXI_Plugin::ROOT_DIR . '/views/' . $viewPath;
|
|
if (is_file($filePath)) {
|
|
extract($this->data);
|
|
include $filePath;
|
|
} else {
|
|
throw new Exception("Requested template file $filePath is not found.");
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display list of errors
|
|
*
|
|
* @param string|array|WP_Error[optional] $msgs
|
|
*/
|
|
protected function error($msgs = NULL) {
|
|
if (is_null($msgs)) {
|
|
$msgs = $this->errors;
|
|
}
|
|
if (is_wp_error($msgs)) {
|
|
unset($msgs->errors['root-element-validation']);
|
|
unset($msgs->errors['upload-validation']);
|
|
unset($msgs->errors['delete-missing-validation']);
|
|
$msgs = $msgs->get_error_messages();
|
|
}
|
|
if ( ! is_array($msgs)) {
|
|
$msgs = array($msgs);
|
|
}
|
|
$this->data['errors'] = $msgs;
|
|
|
|
$viewPathRel = str_replace('_', '/', preg_replace('%^' . preg_quote(PMXI_Plugin::PREFIX, '%') . '%', '', strtolower(get_class($this)))) . '/error.php';
|
|
if (is_file(PMXI_Plugin::ROOT_DIR . '/views/' . $viewPathRel)) { // if calling controller class has specific error view
|
|
$this->render($viewPathRel);
|
|
} else { // render default error view
|
|
$this->render('controller/error.php');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Display list of warnings
|
|
*
|
|
* @param string|array|WP_Error[optional] $msgs
|
|
*/
|
|
protected function warning($msgs = NULL) {
|
|
if (is_null($msgs)) {
|
|
$msgs = $this->warnings;
|
|
}
|
|
if (is_wp_error($msgs)) {
|
|
unset($msgs->errors['root-element-validation']);
|
|
$msgs = $msgs->get_error_messages();
|
|
}
|
|
if ( ! is_array($msgs)) {
|
|
$msgs = array($msgs);
|
|
}
|
|
$this->data['warnings'] = $msgs;
|
|
|
|
$viewPathRel = str_replace('_', '/', preg_replace('%^' . preg_quote(PMXI_Plugin::PREFIX, '%') . '%', '', strtolower(get_class($this)))) . '/warning.php';
|
|
if (is_file(PMXI_Plugin::ROOT_DIR . '/views/' . $viewPathRel)) { // if calling controller class has specific error view
|
|
$this->render($viewPathRel);
|
|
} else { // render default error view
|
|
$this->render('controller/warning.php');
|
|
}
|
|
}
|
|
|
|
}
|
|
|