231 lines
5.2 KiB
PHP
231 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace Proengsoft\JsValidation\Javascript;
|
|
|
|
use Exception;
|
|
use Illuminate\Contracts\Support\Arrayable;
|
|
use Illuminate\Support\Facades\View;
|
|
use Proengsoft\JsValidation\Exceptions\PropertyNotFoundException;
|
|
|
|
class JavascriptValidator implements Arrayable
|
|
{
|
|
/**
|
|
* Registered validator instance.
|
|
*
|
|
* @var ValidatorHandler
|
|
*/
|
|
protected $validator;
|
|
|
|
/**
|
|
* Selector used in javascript generation.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $selector;
|
|
|
|
/**
|
|
* View that renders Javascript.
|
|
*
|
|
* @var
|
|
*/
|
|
protected $view;
|
|
|
|
/**
|
|
* Enable or disable remote validations.
|
|
*
|
|
* @var bool
|
|
*/
|
|
protected $remote;
|
|
|
|
/**
|
|
* 'ignore' option for jQuery Validation Plugin.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $ignore;
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @param ValidatorHandler $validator
|
|
* @param array $options
|
|
*/
|
|
public function __construct(ValidatorHandler $validator, $options = [])
|
|
{
|
|
$this->validator = $validator;
|
|
$this->setDefaults($options);
|
|
}
|
|
|
|
/**
|
|
* Set default parameters.
|
|
*
|
|
* @param $options
|
|
* @return void
|
|
*/
|
|
protected function setDefaults($options)
|
|
{
|
|
$this->selector = empty($options['selector']) ? 'form' : $options['selector'];
|
|
$this->view = empty($options['view']) ? 'jsvalidation::bootstrap' : $options['view'];
|
|
$this->remote = isset($options['remote']) ? $options['remote'] : true;
|
|
|
|
if (isset($options['ignore'])) {
|
|
$this->ignore = $options['ignore'];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Render the specified view with validator data.
|
|
*
|
|
* @param null|\Illuminate\Contracts\View\View|string $view
|
|
* @param null|string $selector
|
|
* @return string
|
|
*/
|
|
public function render($view = null, $selector = null)
|
|
{
|
|
$this->view($view);
|
|
$this->selector($selector);
|
|
|
|
return View::make($this->view, ['validator' => $this->getViewData()])
|
|
->render();
|
|
}
|
|
|
|
/**
|
|
* Get the view data as an array.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function toArray()
|
|
{
|
|
return $this->getViewData();
|
|
}
|
|
|
|
/**
|
|
* Get the string resulting of render default view.
|
|
*
|
|
* @return string
|
|
*/
|
|
public function __toString()
|
|
{
|
|
try {
|
|
return $this->render();
|
|
} catch (Exception $exception) {
|
|
return trigger_error($exception->__toString(), E_USER_ERROR);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Gets value from view data.
|
|
*
|
|
* @param $name
|
|
* @return string
|
|
*
|
|
* @throws \Proengsoft\JsValidation\Exceptions\PropertyNotFoundException
|
|
*/
|
|
public function __get($name)
|
|
{
|
|
$data = $this->getViewData();
|
|
if (! array_key_exists($name, $data)) {
|
|
throw new PropertyNotFoundException($name, get_class());
|
|
}
|
|
|
|
return $data[$name];
|
|
}
|
|
|
|
/**
|
|
* Gets view data.
|
|
*
|
|
* @return array
|
|
*/
|
|
protected function getViewData()
|
|
{
|
|
$this->validator->setRemote($this->remote);
|
|
$data = $this->validator->validationData();
|
|
$data['selector'] = $this->selector;
|
|
|
|
if (! is_null($this->ignore)) {
|
|
$data['ignore'] = $this->ignore;
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Set the form selector to validate.
|
|
*
|
|
* @param string $selector
|
|
*
|
|
* @deprecated
|
|
*/
|
|
public function setSelector($selector)
|
|
{
|
|
$this->selector = $selector;
|
|
}
|
|
|
|
/**
|
|
* Set the form selector to validate.
|
|
*
|
|
* @param string $selector
|
|
* @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
|
|
*/
|
|
public function selector($selector)
|
|
{
|
|
$this->selector = is_null($selector) ? $this->selector : $selector;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the input selector to ignore for validation.
|
|
*
|
|
* @param string $ignore
|
|
* @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
|
|
*/
|
|
public function ignore($ignore)
|
|
{
|
|
$this->ignore = $ignore;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set the view to render Javascript Validations.
|
|
*
|
|
* @param null|\Illuminate\Contracts\View\View|string $view
|
|
* @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
|
|
*/
|
|
public function view($view)
|
|
{
|
|
$this->view = is_null($view) ? $this->view : $view;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Enables or disables remote validations.
|
|
*
|
|
* @param null|bool $enabled
|
|
* @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
|
|
*/
|
|
public function remote($enabled = true)
|
|
{
|
|
$this->remote = $enabled;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Validate Conditional Validations using Ajax in specified fields.
|
|
*
|
|
* @param string $attribute
|
|
* @param string|array $rules
|
|
* @param null $callback Dummy attribute to make API seamless with Laravel sometimes()
|
|
* @return \Proengsoft\JsValidation\Javascript\JavascriptValidator
|
|
*/
|
|
public function sometimes($attribute, $rules, $callback = null)
|
|
{
|
|
$this->validator->sometimes($attribute, $rules);
|
|
|
|
return $this;
|
|
}
|
|
}
|