174 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace ShortPixel;
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
|  exit; // Exit if accessed directly.
 | |
| }
 | |
| 
 | |
| use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
 | |
| use ShortPixel\Model\AccessModel as AccessModel;
 | |
| 
 | |
| 
 | |
| class ViewController extends Controller
 | |
| {
 | |
|   protected static $controllers = array();
 | |
| 	protected static $viewsLoaded = array();
 | |
| 
 | |
| 
 | |
|   protected $model; // connected model to load.
 | |
|   protected $template = null; // template name to include when loading.
 | |
| 
 | |
|   protected $data = array(); // data array for usage with databases data and such
 | |
|   protected $postData = array(); // data coming from form posts.
 | |
| 
 | |
|   protected $mapper; // Mapper is array of View Name => Model Name. Convert between the two
 | |
|   protected $is_form_submit = false; // Was the form submitted?
 | |
| 
 | |
|   protected $view; // object to use in the view.
 | |
|   protected $url; // if controller is home to a page, sets the URL here. For redirects and what not.
 | |
| 
 | |
|   protected $form_action = 'sp-action';
 | |
| 
 | |
|   public static function init()
 | |
|   {
 | |
|     foreach (get_declared_classes() as $class) {
 | |
|       if (is_subclass_of($class, 'ShortPixel\Controller') )
 | |
|         self::$controllers[] = $class;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   public function __construct()
 | |
|   {
 | |
| 		parent::__construct();
 | |
|     $this->view = new \stdClass;
 | |
|     // Basic View Construct
 | |
|     $this->view->notices =  null; // Notices of class notice, for everything noticable
 | |
|     $this->view->data = null;  // Data(base), to separate from regular view data
 | |
| 
 | |
|   }
 | |
| 
 | |
| 	public static function getInstance() {
 | |
|     if (is_null(static::$instance)) {
 | |
|         static::$instance = new static;
 | |
|     }
 | |
| 
 | |
|     return static::$instance;
 | |
| }
 | |
| 
 | |
|   /* Check if postData has been submitted.
 | |
|   * This function should always be called at any ACTION function ( load, load_$action etc ).
 | |
|   */
 | |
|   protected function checkPost()
 | |
|   {
 | |
| 
 | |
| 		if(count($_POST) === 0) // no post, nothing to check, return silent.
 | |
| 		{
 | |
| 			return true;
 | |
| 		}
 | |
|     elseif (! isset($_POST['sp-nonce']) || ! wp_verify_nonce( sanitize_key($_POST['sp-nonce']), $this->form_action))
 | |
|     {
 | |
|       Log::addInfo('Check Post fails nonce check, action : ' . $this->form_action, array($_POST) );
 | |
| 			exit('Nonce Failed');
 | |
|       return false;
 | |
|     }
 | |
|     elseif (isset($_POST) && count($_POST) > 0)
 | |
|     {
 | |
|       check_admin_referer( $this->form_action, 'sp-nonce' ); // extra check, when we are wrong here, it dies.
 | |
|      // unset($_POST['sp-nonce']);
 | |
|      // unset($_POST['_wp_http_referer']);
 | |
|       $this->is_form_submit = true;
 | |
|       $this->processPostData($_POST);
 | |
| 
 | |
|     }
 | |
| 		return true;
 | |
| 	}
 | |
| 
 | |
| 	public function access()
 | |
| 	{
 | |
| 		 return AccessModel::getInstance();
 | |
| 	}
 | |
| 
 | |
|   /** Loads a view
 | |
|   *
 | |
|   * @param String View Template in view directory to load. When empty will search for class attribute
 | |
|   */
 | |
|   public function loadView($template = null, $unique = true)
 | |
|   {
 | |
|       // load either param or class template.
 | |
|       $template = (is_null($template)) ? $this->template : $template;
 | |
| 
 | |
|       if (is_null($template) )
 | |
|       {
 | |
|         return false;
 | |
|       }
 | |
|       elseif (strlen(trim($template)) == 0)
 | |
| 			{
 | |
|         return false;
 | |
| 			}
 | |
| 
 | |
| 
 | |
|       $view = $this->view;
 | |
|       $controller = $this;
 | |
| 
 | |
|       $template_path = \wpSPIO()->plugin_path('class/view/' . $template  . '.php');
 | |
|      	if (file_exists($template_path) === false)
 | |
| 			{
 | |
|         Log::addError("View $template could not be found in " . $template_path,
 | |
|         array('class' => get_class($this)));
 | |
|       }
 | |
|       elseif ($unique === false || ! in_array($template, self::$viewsLoaded))
 | |
|       {
 | |
|         include($template_path);
 | |
| 				self::$viewsLoaded[] = $template;
 | |
|       }
 | |
| 
 | |
| 
 | |
|   }
 | |
| 
 | |
|   /** Accepts POST data, maps, checks missing fields, and applies sanitization to it.
 | |
|   * @param array $post POST data
 | |
|   */
 | |
|   protected function processPostData($post)
 | |
|   {
 | |
| 
 | |
|     // If there is something to map, map.
 | |
|     if ($this->mapper && is_array($this->mapper) && count($this->mapper) > 0)
 | |
|     {
 | |
|       foreach($this->mapper as $item => $replace)
 | |
|       {
 | |
|         if ( isset($post[$item]))
 | |
|         {
 | |
|           $post[$replace] = $post[$item];
 | |
|           unset($post[$item]);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (is_null($this->model))
 | |
|     {
 | |
|       foreach($post as $name => $value )
 | |
|       {
 | |
|         $this->postData[sanitize_text_field($name)] = sanitize_text_field($value);
 | |
|         return true;
 | |
|       }
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|       $model = $this->model;
 | |
|       $this->postData = $model->getSanitizedData($post);
 | |
|     }
 | |
| 
 | |
|     return $this->postData;
 | |
| 
 | |
|   }
 | |
| 
 | |
|   /** Sets the URL of the admin page */
 | |
|   public function setControllerURL($url)
 | |
|   {
 | |
|     $this->url = $url;
 | |
|   }
 | |
| 
 | |
| 
 | |
| 
 | |
| } // controller
 |