Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 43 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,46 @@
laravel-parsley
===============

Converts FormRequest rules to [Parsley](http://parsleyjs.org/) rules.
Converts [FormRequest](http://laravel.com/docs/5.0/validation#form-request-validation) rules to [Parsley](http://parsleyjs.org/) rules.


## Install

If you have previously set up `LaravelCollective/Html` or `Illuminate/Html` you can remove its service provider from `app/config`

in `app/config` add the following under service providers:

`HappyDemon\LaravelParsley\LaravelParsleyServiceProvider`

If you haven't already, add these facades:

'Form' => 'Collective\Html\FormFacade',
'Html' => 'Collective\Html\HtmlFacade',

## Useage

All that's needed is for you to supply the name of the `FormRequest` in the `request` key when opening a form.

Form::open(['request' => 'YourFormRequestClass'])
Form::model(['request' => 'YourFormRequestClass'])

Lastly you should include parsley's scripts on the page and activate parsley for your form.

easy enough don't you think?

### Validation rules

Implemented| Not implemented |
-----------|-----------------|
required | accepted |
email | after:(date) |
min | before:(date) |
max | before:(date) |
between | date_format |
integer | different |
url | in |
alpha_num | not_in |
alpha_dash| ip_address |
alpha | |
regex | |
confirmed | |
15 changes: 11 additions & 4 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,22 +1,29 @@
{
"name": "idma/laravel-parsley",
"name": "happydemon/laravel-parsley",
"description": "Converts FormRequest rules to Parsley rules",
"keywords": ["laravel", "laravel 5", "parsley", "parsleyjs", "html", "form"],
"keywords": ["laravel", "laravel 5", "parsley", "parsleyjs", "html", "form", "collective"],
"authors": [
{
"name": "idma",
"email": "[email protected]"
},
{
"name": "Maxim 'happyDemon' Kerstens",
"email": "[email protected]"
}
],
"replace": {
"idma/laravel-parsley":"0.*"
},
"require": {
"php": ">=5.4.0",
"illuminate/support": "~5.0",
"illuminate/html": "~5.0",
"laravelcollective/html": "~5.0",
"illuminate/translation" : "~5.0"
},
"autoload": {
"psr-0": {
"Idma\\LaravelParsley": "src/"
"HappyDemon\\LaravelParsley": "src/"
}
},
"config": {
Expand Down
72 changes: 72 additions & 0 deletions resources/assets/parsley-laravel.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
window.ParsleyValidator
.addValidator('after', function (value, requirement) {
var params = requirement.split('|-|');
if(params.length == 1)
{
// is valid date?
var timestamp = Date.parse(value),
minTs = Date.parse(params[0]);

return isNaN(timestamp) ? false : timestamp > minTs;
}
else
{
// A format was given, use momentJS
var timestamp = moment(value, params[1]);
var minTs = moment(params[0], params[1]);

// If it's a valid date
// and the difference in milliseconds is greater than 0
return (timestamp.isValid()) ? timestamp.isAfter(minTs) : false;
}
}, 32)
.addMessage('en', 'after', 'This date should be after %s');
window.ParsleyValidator
.addValidator('before', function (value, requirement) {
var params = requirement.split('|-|');
if(params.length == 1)
{
// is valid date?
var timestamp = Date.parse(value),
maxTs = Date.parse(params[0]);

return isNaN(timestamp) ? false : timestamp < maxTs;
}
else
{
// A format was given, use momentJS
var timestamp = moment(value, params[1]);
var maxTs = moment(params[0], params[1]);

// If it's a valid date
// and the difference in milliseconds is smaller than 0
return (timestamp.isValid()) ? timestamp.isBefore(maxTs) : false;
}
}, 32)
.addMessage('en', 'before', 'This date should be before %s');
window.ParsleyValidator
.addValidator('formatDate', function (value, requirement) {
var d = moment(value,requirement);

return (d == null || !d.isValid());
}, 32)
.addMessage('en', 'formatDate', 'This date should be in this format: "%s"');
window.ParsleyValidator
.addValidator('inList', function (value, requirement) {
var list = requirement.split(',');

return list.indexOf(value) > -1;
}, 32)
.addMessage('en', 'inList', 'The value should be one of the following: "%s"');
window.ParsleyValidator
.addValidator('notInList', function (value, requirement) {
var list = requirement.split(',');

return list.indexOf(value) != -1;
}, 32)
.addMessage('en', 'notInList', 'The value should not be one of the following: "%s"');
window.ParsleyValidator
.addValidator('different', function (value, requirement) {
return $(requirement).val() != value;
}, 32)
.addMessage('en', 'different', 'The value should not be the same as "%s"');
10 changes: 10 additions & 0 deletions src/HappyDemon/LaravelParsley/FormBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace HappyDemon\LaravelParsley;

use Collective\Html\FormBuilder as BaseFormBuilder;

class FormBuilder extends BaseFormBuilder
{
use FormTrait;
}
59 changes: 59 additions & 0 deletions src/HappyDemon/LaravelParsley/FormTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php

namespace HappyDemon\LaravelParsley;


trait FormTrait
{
/**
* @type ParsleyConverter
*/
protected $parsley = null;

/**
* {@inheritdoc}
*/
public function open(array $options = [])
{
$this->reserved[] = 'request';
$this->parsley = new ParsleyConverter(array_get($options, 'request', null));

return parent::open($options);
}

/**
* {@inheritdoc}
*/
public function input($type, $name, $value = null, $options = [])
{
if ($this->parsley != null)
{
$options = array_merge($options, $this->parsley->getFieldRules($name));
}

return parent::input($type, $name, $value, $options);
}

/**
* {@inheritdoc}
*/
public function textarea($name, $value = null, $options = [])
{
if ($this->parsley != null)
{
$options = array_merge($options, $this->parsley->getFieldRules($name));
}

return parent::textarea($name, $value, $options);
}

public function select($name, $list = [], $selected = null, $options = [])
{
if ($this->parsley != null)
{
$options = array_merge($options, $this->parsley->getFieldRules($name));
}

return parent::select($name, $list, $selected, $options);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?php

namespace Idma\LaravelParsley;
namespace HappyDemon\LaravelParsley;

use Illuminate\Html\HtmlServiceProvider;
use Collective\Html\HtmlServiceProvider;

class LaravelParsleyServiceProvider extends HtmlServiceProvider
{
Expand All @@ -11,8 +11,6 @@ class LaravelParsleyServiceProvider extends HtmlServiceProvider
*/
public function register()
{
$this->package('idma/parsley-laravel');

parent::register();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
<?php

namespace Idma\LaravelParsley;
namespace HappyDemon\LaravelParsley;

use Illuminate\Translation\Translator;

class ParsleyConverter {
use \Illuminate\Console\AppNamespaceDetectorTrait;

protected $rules = [];
protected $customAttributes = [];

Expand All @@ -13,9 +15,13 @@ class ParsleyConverter {
*/
protected $translator = null;

public function __construct()
public function __construct($formRequest=null)
{
$formRequest = \View::shared('_ilp_request');
if($formRequest != null && !is_object($formRequest))
{
$class = $this->getAppNamespace() . 'Http\Requests\\'.$formRequest;
$formRequest = new $class;
}

if ($formRequest && method_exists($formRequest, 'rules')) {
$this->rules = $formRequest->rules();
Expand All @@ -31,7 +37,6 @@ public function __construct()
public function getFieldRules($field)
{
$rules = [];

if (isset($this->rules[$field])) {
$rawRules = explode('|', $this->rules[$field]);

Expand All @@ -46,19 +51,26 @@ public function convertRules($attribute, $rules)
$attrs = [];
$message = null;

$date_format = null;

foreach ($rules as $rule) {
list($rule, $params) = explode(':', $rule . ':');

$params = explode(',', str_replace(' ', '', $params));
$params = explode(',', $params);

$parsleyRule = $rule;

$isNumeric = $this->hasNumericRule($rules);
$message = $this->getMessage($attribute, $rule, $rules);

switch ($rule) {
case 'accepted':
case 'required':
break;

case 'email':
$parsleyRule = 'type';
$params = 'email';
break;

case 'min':
Expand Down Expand Up @@ -87,6 +99,11 @@ public function convertRules($attribute, $rules)
$parsleyRule = 'integer';
break;

case 'url':
$parsleyRule = 'type';
$params = 'url';
break;

case 'alpha_num':
$parsleyRule = 'alphanum';
$params = '/^\d[a-zа-яё\-\_]+$/i';
Expand All @@ -111,8 +128,48 @@ public function convertRules($attribute, $rules)
$params = "#{$attribute}_confirmation";
break;

case 'different':
$parsleyRule = 'different';
$message = str_replace(':other', $params[0], $message);
$params = '#'.$params[0];
break;

case 'date_format':
$parsleyRule = 'dateformat';
$replace = [
// Day
'd' => 'DD', 'D' => 'ddd', 'j' => 'D', 'l' => 'DDDD',
'N' => 'E', 'S' => '', 'w' => 'W', 'z' => 'DDD',
// Week
'W' => 'w',
// Month
'F' => 'MMMM', 'm' => 'MM', 'M' => 'MMM', 'n' => 'M', 't' => '',
// Year
'L' => '', 'o' => 'YYYY', 'Y' => 'YYYY', 'y' => 'YY',
// Time
'a' => 'a', 'A' => 'A', 'B' => '', 'g' => 'h', 'G' => 'H',
'h' => 'hh', 'H' => 'HH', 'i' => 'i', 's' => 's', 'u' => ''
];
$params = str_replace(array_keys($replace), array_values($replace), $params[0]);
$date_format = $params;
$message = str_replace(':format', $params, $message);
break;
case 'before':
case 'after':
$params = $params[0];
if($date_format !== null)
{
$params .= '|-|'.$date_format;
}
break;
case 'in':
case 'not_in':
$parsleyRule = camel_case($rule).'List';
$params = implode(',', $params);
break;
default:
$message = null;
break;
}

if ($message) {
Expand All @@ -126,7 +183,6 @@ public function convertRules($attribute, $rules)

$message = null;
}

return $attrs;
}

Expand Down
Loading