154 lines
3.7 KiB
PHP
154 lines
3.7 KiB
PHP
|
<?php
|
||
|
namespace ShortPixel;
|
||
|
use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit; // Exit if accessed directly.
|
||
|
}
|
||
|
|
||
|
abstract class Model
|
||
|
{
|
||
|
protected $model = array();
|
||
|
|
||
|
public function getData()
|
||
|
{
|
||
|
$data = array();
|
||
|
foreach($this->model as $item => $options)
|
||
|
{
|
||
|
|
||
|
$data[$item] = $this->{$item};
|
||
|
|
||
|
}
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
public function getModel()
|
||
|
{
|
||
|
return array_keys($this->model); // only the variable names are public.
|
||
|
}
|
||
|
|
||
|
protected function sanitize($name, $value)
|
||
|
{
|
||
|
if (! isset($this->model[$name]))
|
||
|
return null;
|
||
|
|
||
|
// if no sanitize method is set, default to strictest string.
|
||
|
$sanitize = isset($this->model[$name]['s']) ? $this->model[$name]['s'] : 'string';
|
||
|
switch($sanitize)
|
||
|
{
|
||
|
case "string":
|
||
|
$value = $this->sanitizeString($value);
|
||
|
break;
|
||
|
case "int":
|
||
|
$value = $this->sanitizeInteger($value);
|
||
|
break;
|
||
|
case "boolean":
|
||
|
$value = $this->sanitizeBoolean($value);
|
||
|
break;
|
||
|
case 'array':
|
||
|
case 'Array':
|
||
|
$value = $this->sanitizeArray($value);
|
||
|
break;
|
||
|
case 'exception': // for exceptional situations. The data will not be sanitized! Need to do this elsewhere.
|
||
|
return $value;
|
||
|
break;
|
||
|
case 'skip': // skips should not be in any save candidate and not be sanitized.
|
||
|
return null;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return $value;
|
||
|
}
|
||
|
|
||
|
/** Sanitize the passed post data against the model attribute formats.
|
||
|
*
|
||
|
* @param Array $post The Post data
|
||
|
* @param boolean $missing If fields are missing, include them empty in the output
|
||
|
* @return Array Sanitized Post Data
|
||
|
*/
|
||
|
public function getSanitizedData($post, $missing = true)
|
||
|
{
|
||
|
$postData = array();
|
||
|
foreach($post as $name => $value)
|
||
|
{
|
||
|
$name = sanitize_text_field($name);
|
||
|
$value = $this->sanitize($name, $value);
|
||
|
if ($value !== null)
|
||
|
$postData[$name] = $value;
|
||
|
else {
|
||
|
Log::addWarn("Provided field $name not part of model " . get_class() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($missing)
|
||
|
{
|
||
|
$model_fields = $this->getModel();
|
||
|
$post_fields = array_keys($postData);
|
||
|
|
||
|
$missing_fields = array_diff($model_fields, $post_fields);
|
||
|
foreach($missing_fields as $index => $field_name)
|
||
|
{
|
||
|
$field_name = sanitize_text_field($field_name);
|
||
|
$type = $this->getType($field_name);
|
||
|
if ($type === 'boolean')
|
||
|
{
|
||
|
$postData[$field_name] = 0;
|
||
|
}
|
||
|
elseif ($type !== false && $type !== 'skip')
|
||
|
{
|
||
|
$postData[$field_name] = '';
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $postData;
|
||
|
}
|
||
|
|
||
|
|
||
|
public function getType($name)
|
||
|
{
|
||
|
if (! isset($this->model[$name]))
|
||
|
{
|
||
|
return null;
|
||
|
Log::addWarn("Provided field $name not part of model " . get_class() );
|
||
|
}
|
||
|
|
||
|
|
||
|
$type = isset($this->model[$name]['s']) ? $this->model[$name]['s'] : false;
|
||
|
return $type;
|
||
|
}
|
||
|
|
||
|
public function sanitizeString($string)
|
||
|
{
|
||
|
return (string) sanitize_text_field($string);
|
||
|
}
|
||
|
public function sanitizeInteger($int)
|
||
|
{
|
||
|
return intval($int);
|
||
|
}
|
||
|
public function sanitizeBoolean($bool)
|
||
|
{
|
||
|
return ($bool) ? true : false;
|
||
|
}
|
||
|
|
||
|
public function sanitizeArray($array)
|
||
|
{
|
||
|
if (! is_array($array))
|
||
|
{
|
||
|
Log::addWarn('Field is of type Array, but Array not provided');
|
||
|
return null;
|
||
|
}
|
||
|
$new_array = array();
|
||
|
foreach($array as $key => $value)
|
||
|
{
|
||
|
$newkey = $this->sanitizeString($key);
|
||
|
$newval = $this->sanitizeString($value);
|
||
|
$new_array[$newkey] = $newval ;
|
||
|
}
|
||
|
|
||
|
return $new_array;
|
||
|
}
|
||
|
|
||
|
}
|