marc-leopold/cms/plugins/rainlab/builder/classes/BaseModel.php

131 lines
3.1 KiB
PHP

<?php namespace RainLab\Builder\Classes;
use ValidationException;
use SystemException;
use Validator;
/**
* Base class for Builder models.
*
* Builder models manage various types of records - database metadata objects,
* YAML files, etc.
*
* @package rainlab\builder
* @author Alexey Bobkov, Samuel Georges
*/
abstract class BaseModel
{
/**
* @var boolean This property is used by the system internally.
*/
public $exists = false;
protected $validationRules = [];
protected $validationMessages = [];
protected static $fillable = [];
protected $updatedData = [];
/**
* @var PluginCode The plugin code object the model is associated with.
*/
protected $pluginCodeObj = null;
public function fill(array $attributes)
{
$this->updatedData = [];
foreach ($attributes as $key => $value) {
if (!in_array($key, static::$fillable)) {
continue;
}
$methodName = 'set'.ucfirst($key);
if (method_exists($this, $methodName)) {
$this->$methodName($value);
}
else {
if (is_scalar($value) && strpos($value, ' ') !== false) {
$value = trim($value);
}
$this->$key = $value;
}
$this->updatedData[$key] = $value;
}
}
public function validate()
{
$existingData = [];
foreach (static::$fillable as $field) {
$existingData[$field] = $this->$field;
}
$validation = Validator::make(
array_merge($existingData, $this->updatedData),
$this->validationRules,
$this->validationMessages
);
if ($validation->fails()) {
throw new ValidationException($validation);
}
if (!$this->isNewModel()) {
$this->validateBeforeCreate();
}
}
public function isNewModel()
{
return $this->exists === false;
}
/**
* Sets a string code of a plugin the model is associated with
* @param string $code Specifies the plugin code
*/
public function setPluginCode($code)
{
$this->pluginCodeObj = new PluginCode($code);
}
/**
* Sets a code object of a plugin the model is associated with
* @param PluginCode $obj Specifies the plugin code object
*/
public function setPluginCodeObj($obj)
{
$this->pluginCodeObj = $obj;
}
protected function validateBeforeCreate()
{
}
public function getModelPluginName()
{
$pluginCodeObj = $this->getPluginCodeObj();
$pluginCode = $pluginCodeObj->toCode();
$vector = PluginVector::createFromPluginCode($pluginCode);
if ($vector) {
return $vector->getPluginName();
}
return null;
}
public function getPluginCodeObj()
{
if (!$this->pluginCodeObj) {
throw new SystemException(sprintf('The active plugin is not set in the %s object.', get_class($this)));
}
return $this->pluginCodeObj;
}
}