Commit 70e718ea authored by Sylvain's avatar Sylvain

Ajout du service

parent 16e543dd
{
"name": "goldenscarab/modulus-service-field",
"description": "An helper to create html forms easily",
"require": {
"php": ">=7.1.3"
},
"license": "MIT",
"authors": [
{
"name": "Goldenscarab",
"email": "web@goldenscarab.fr"
}
],
"autoload": {
"psr-4": {
"Goldenscarab\\Modulus\\Service\\Field\\": "src/"
},
"files": [
]
},
"minimum-stability": "dev",
"prefer-stable": true,
"extra": {
"branch-alias": {
"dev-master": "3.2-dev"
},
"laravel": {
"providers": [
"Goldenscarab\\Modulus\\Service\\Field\\FieldServiceProvider"
],
"aliases": {
"Debugbar": "Goldenscarab\\Modulus\\Service\\Field\\Facade\\Field"
}
}
},
"require-dev": {
"laravel/framework": "5.5.x"
}
}
# Service Field
## Utilisation minimale
### Input
```php
// Exemple
{!! Field::input([
'label' => 'Champs text',
'name' => 'my_field_name'
]) !!}
```
### Select
```php
// Exemple
{!! Field::select([
'label' => 'Menu déroulant',
'name' => 'my_field_name',
'options' => [
1 => 'Item 1',
2 => 'Item 2'
]
]) !!}
```
### Textarea
```php
// Exemple
{!! Field::textarea([
'label' => 'Zone de texte',
'name' => 'my-field'
]) !!}
```
### Checkbox
```php
// Exemple
{!! Field::checkbox([
'label' => 'Menu déroulant',
'name' => 'my_field_name',
'options' => 'options' => [
1 => 'Item 1',
2 => 'Item 2'
]
]) !!}
```
### Radio
```php
// Exemple
{!! Field::radio([
'label' => 'Menu déroulant',
'name' => 'my_field_name',
'options' => 'options' => [
1 => 'Item 1',
2 => 'Item 2'
]
]) !!}
```
### Honeypot
```php
// Exemple
{!! Field::honeypot() !!}
```
### Range
```php
// Exemple
{!! Field::range([
'label' => 'Zoom',
'name' => 'zoom',
]) !!}
```
### Toggle
```php
{!! Field::toggle([
'label' => 'Toggle',
'name' => 'toggle',
'datas' => [
'on' => 'Actif',
'off' => 'Inactif',
'toggle' => 'toggle'
]
]) !!}
```
### Vidéo
```php
{!! Field::video([
'label' => 'Vidéo',
'name' => 'video',
'value' => $item->video,
]) !!}
```
### Image
```php
{!! Field::image([
'label' => 'Champs image',
'name' => 'my_field_image',
]) !!}
```
### PDF
```php
{!! Field::pdf([
'label' => 'Champs pdf',
'name' => 'my_field_pdf',
]) !!}
```
### Fichier
```php
{!! Field::file([
'label' => 'Uploader',
'name' => 'csv',
]) !!}
```
### Par page
```php
{!! Field::perpage() !!}
```
### Recherche
```php
{!! Field::search() !!}
```
### Visibilité / Statut
```php
{!! Field::publish($item->status) !!}
```
### Code source
```php
{!! Field::code([
'label' => 'Contenu',
'name' => 'content',
'value' => $item->content,
'style' => 'min-height: 400px;',
'is_required' => true,
'datas' => array(
'language' => 'html',
'readonly' => 'false',
'beautiful' => 'false',
)
]) !!}
```
## Utilisation avancée
### Input
```php
// Exemple
{!! Field::input([
'label' => 'Champs text',
'name' => 'my_field_name',
'value' => $item->my_field_name,
'size' => 'sm',
'placeholder' => 'ex : mon texte',
'is_required' => true,
]) !!}
```
### Select
Affichage simple
```php
// Exemple
{!! Field::select([
'label' => 'Menu déroulant',
'name' => 'my_field_name',
'value' => $item->my_field_name,
'placeholder' => 'Choisir ...',
'is_required' => true,
'options' => [
'collect' => $collection,
'value' => 'nom_champs_valeur',
'text' => 'nom_champs_texte',
]
]) !!}
```
Affichage avancé
```php
// Exemple 1
{!! Field::select([
'label' => 'Menu déroulant',
'name' => 'my_field_name',
'value' => $item->my_field_name,
'placeholder' => 'Choisir ...',
'size' => 'sm',
'is_required' => true,
'options' => [
'collect' => $collection,
'value' => 'id',
'text' => ['code', 'libelle'],
'callback' => 'strtoupper',
'template' => 'Code : %s Libellé : %s',
'datas' => ['attr' => 'id']
]
]) !!}
// Exemple 2 avec des groupes
{!! Field::select([
'label' => 'Menu déroulant',
'name' => 'my_field_name',
'value' => $item->my_field_name,
'placeholder' => 'Choisir ...',
'size' => 'sm',
'is_required' => true,
'options' => [
'Groupe 1' => [
23 => 'Élement 23',
24 => 'Élement 24',
25 => 'Élement 25',
],
'Groupe 2' => [
26 => 'Élement 26',
27 => 'Élement 27',
28 => 'Élement 28',
]
]
]) !!}
```
### Textarea
```php
// Exemple
{!! Field::textarea([
'label' => 'Zone de texte',
'name' => 'my-field',
'class' => 'text-success',
'value' => 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. ',
'rows' => 8,
'prefix' => '<i class="fa fa-tag"></i>',
'is_required' => true,
]) !!}
```
### Checkbox
```php
// Exemple
{!! Field::checkbox([
'label' => 'Choix multiple',
'name' => 'my_field_name',
'values' => [2, 3],
'class' => 'checkbox-xl',
//'is_inline' => true,
'options' => [
1 => 'Item 1',
2 => 'Item 2',
3 => 'Item 3'
]
]) !!}
```
### Radio
```php
// Exemple
{!! Field::radio([
'label' => 'Choix unique',
'name' => 'my_field_name',
'value' => 2,
'is_inline' => true,
'options' => [
1 => 'Item 1',
2 => 'Item 2',
3 => 'Item 3'
]
]) !!}
```
### Range
```php
// Exemple
{!! Field::range([
'label' => 'Zoom',
'name' => 'zoom',
'min' => 0,
'max' => 20,
]) !!}
```
### Toggle
```php
{!! Field::toggle([
'label' => 'Toggle',
'name' => 'toggle',
'value' => 1,
'datas' => [
'on' => 'Actif',
'off' => 'Inactif',
'onstyle' => 'success',
'offstyle' => 'danger',
'toggle' => 'toggle',
'width' => '75',
'size' => 'xs'
]
]) !!}
```
### Image
```php
{!! Field::image([
'label' => 'Champs image',
'name' => 'my_field_image',
'value' => $item->my_field_image,
'placeholder' => 'ex: /upload/folder/image.png',
'suffix' => '<i class="fa fa-file-image-o mr-2"></i> Choisir une image',
'is_required' => true,
]) !!}
```
### Vidéo
```php
{!! Field::video([
'label' => 'Champs video',
'name' => 'my_field_video',
'value' => $item->my_field_video,
'placeholder' => 'ex: /upload/folder/video.mp4',
'suffix' => '<i class="fa fa-file-video-o mr-2"></i> Choisir une vidéo',
'is_required' => true,
]) !!}
```
### PDF
```php
{!! Field::pdf([
'label' => 'Champs pdf',
'name' => 'my_field_pdf',
'value' => $item->my_field_pdf,
'placeholder' => 'ex: /upload/folder/file.pdf',
'suffix' => '<i class="fa fa-file-pdf-o mr-2"></i> Choisir un PDF',
'is_required' => true,
]) !!}
```
### Fichier
```php
{!! Field::file([
'label' => 'Uploader',
'name' => 'csv',
'prefix' => 'Fichier',
'placeholder' => 'Aucun fichier choisi'
]) !!}
```
## Les paramètres
| Param | Type | Defaut | Description |
| --------------- |----------| -------|----------------------------------------|
| id | string | null | Attribut *id* du champs |
| type | string | null | Attribut *text* d'un champs input |
| label | string | null | Etiquette du champs |
| name | string | null | Attribut *name* du champs |
| value | string | null | Valeur du champs |
| class | string | null | Attribut *class* du champs |
| prefix | string | null | Texte dans partie gauche du champs |
| suffix | string | null | Texte dans partie droite du champs |
| placeholder | string | null | Texte visible avant la saisie |
| help | string | null | Message d'aide sous le champs |
| indice | mixte | null | Passe le champs en mode tableau |
| style | string | null | Attribut *style* du champs |
| rows | integer | null | Attribut *rows* d'un champs select |
| min | integer | null | Limite maximal pour un champs digital |
| max | integer | null | Limite minimal pour un champs digital |
| size | string | null | Taille du champs (sm | lg) |
| is_required | boolean | false | Rend le champs obligatoire |
| is_inline | boolean | false | Affichage du champs en mode ligne |
| is_multiple | boolean | false | Select en mode multiple |
| is_autocomplete | boolean | false | Active l'autocompletion |
| is_disabled | boolean | false | Desactive le champs |
| is_readonly | boolean | false | Champt en lecture seule |
| popover | array | [] | Ajoute un icone d'information |
| datas | array | [] | Ajoute des attributs data-... |
| options | array | [] | Liste des options d'un champs select |
| values | array | [] | Liste des valeurs d'une champs multi |
| attributes | array | [] | Liste des attributs supplémentaires |
## Exemples
### Champs input
```php
// Nom
{!! Field::input([
'label' => 'Nom',
'name' => 'name',
'type' => 'text',
'prefix' => '<i class="fa fa-user"></i>',
'is_required' => true,
'placeholder' => "ex : Martin",
'value' => $item->name
]) !!}
// Email
{!! Field::input([
'label' => 'Email',
'name' => 'email',
'type' => 'email',
'prefix' => '<i class="fa fa-envelope"></i>',
'is_required' => true,
'placeholder' => "ex : user@mail.tld",
'help' => 'Votre email sera utilisé comme identifiant',
'value' => $item->email
]) !!}
// Téléphone
{!! Field::input([
'label' => 'Téléphone',
'name' => 'phone',
'type' => 'tel',
'prefix' => '<i class="fa fa-phone"></i>',
'placeholder' => "ex : 0102030405",
'value' => $item->phone
]) !!}
// Adresse
{!! Field::input([
'label' => 'Adresse',
'name' => 'address',
'type' => 'text',
'prefix' => '<i class="fa fa-map-marker"></i>',
'placeholder' => "ex : 247, Rue des jardin",
'value' => $item->address
]) !!}
// Couleur
{!! Field::input([
'label' => 'Couleur',
'name' => 'color',
'type' => 'color',
'prefix' => '<i class="fa fa-paint-brush"></i>',
'value' => $item->color
]) !!}
// Date
{!! Field::input([
'label' => 'Date',
'name' => 'date',
'value' => $item->date,
'class' => 'datepicker',
'prefix' => '<i class="fa fa-calendar"></i>',
]) !!}
```
### Champs select
```php
// Publié
{!! Field::select([
'label' => 'Publié',
'name' => 'published',
'prefix' => '<i class="fa fa-globe"></i>',
'value' => $item->published
'options' => [
0 => 'Brouillon',
1 => 'En ligne'
]
]) !!}
// Civilité
{!! Field::select([
'label' => 'Civilité',
'name' => 'civility',
'value' => $item->civility,
'placeholder' => "Choisir...",
'options' => [
0 => 'Monsieur',
1 => 'Madame',
2 => 'Mademoiselle'
]
]) !!}
// Choix d'une ville avec possibilité de filtrage des valeurs affichées sur attribut data (hide|show)
{!! Field::select([
'label' => 'Ville',
'name' => 'city_id',
'value' => $item->city_id,
'placeholder' => "Choisir une ville...",
'options' => [
'collect' => $villes,
'value' => 'id',
'text' => ['departement.zipcode', 'name'], // Utilisation des relations
'template' => '%s - %s',
'datas' => [
'departement' => 'departement.department_code', // Utilisation des relations
'region' => 'region.name',
]
]
]) !!}
// Choix de catégories ( multiple choix )
{!! Field::select([
'label' => 'Catégorie',
'name' => 'categories',
'values' => $item->categories()->pluck('id')->toArray(), // Multi valeurs
'class' => 'select2',
'is_multiple' => true,
'options' => [
'collect' => $categories,
'value' => 'id',
'text' => 'title',
]
]) !!}
```
### Champs textarea
```php
// Champs contenu Wysiwyg
{!! Field::textarea([
'label' => 'Contenu',
'name' => 'content',
'value' => $item->content,
'class' => 'text-editor',
'rows' => 15,
'popover' => [
'placement' => 'right',
'title' => 'Le contenu',
'content' => "Le contenu est le coeur de l'article. Grâce à l'éditeur vous pouvez formater le rendu selon votre goût."
]
]) !!}
// Champs commentaire
{!! Field::textarea([
'label' => 'Commentaire',
'name' => 'comment',
'value' => $item->comment,
'rows' => 3,
]) !!}
```
## Possibilitiées d'un champs
Voici un exemple montrant les possibilités d'un champs input
```php
{!! Field::input([
'id' => 'total-final',
'type' => 'text',
'label' => 'Total',
'name' => 'total',
'value' => 23.4,
'class' => 'text-danger',
'prefix' => '<i class="fa fa-money"></i>',
'suffix' => '€',
'placeholder' => "123,30",
'help' => 'Taxe comprise',
'indice' => 1,
'style' => 'background-color: #c3c3c3;',
'attributes' => [
'onchange' => 'console.log("change")',
'title' => [
'source' => $data_source,
'template' => '%s - %s',
'attributes' => ['type.id', 'type.label'],
'callback' => 'ucfirst'
]
],
'datas' => [
'type' => 'column',
'reference' => [
'source' => $data_source,
'template' => '%s-%s',
'attributes' => ['type.id', 'type.code'],
'callback' => 'ucfirst'
]
],
'is_inline' => true,
'is_disabled' => true,
'is_readonly' => true,
'is_required' => true,
'is_autocomplete' => true,
'is_autofocus' => true,
'popover' => [
'placement' => 'right',
'title' => 'Information',
'content' => "Le montant est calculé selon les éléments communiqué. Il peux néanmoins variée suivant d'autre facteurs non pris en compte"
],
]) !!}
```
Exemple de filtre dans une liste
```php
{!! Field::select([
'name' => 'role',
'value' => Request::get('role'),
'class' => 'form-control-sm w-100',
'placeholder' => '-- Rôles --',
'attributes' => ['onchange' => "document.getElementById('filter-form').submit();"],
'options' => [
'collect' => $roles,
'value' => 'id',
'text' => 'display_name',
]
]) !!}
```
<?php
namespace Goldenscarab\Modulus\Service\Field\Compose;
use stdClass;
use \Illuminate\Support\HtmlString;
class Field2Bt4
{
private $type;
private $label;
private $id;
private $class;
private $name;
private $value;
private $placeholder;
private $prefix;
private $suffix;
private $help;
private $indice;
private $style;
private $rows;
private $min;
private $max;
private $size;
private $is_multiple;
private $is_autocomplete;
private $is_autofocus;
private $is_disabled;
private $is_required;
private $is_readonly;
private $is_inline;
private $_datas;
private $_values;
private $_options;
private $_popover;
private $_attributes;
public function __construct($attrs = [])
{
$this->setAttrs($attrs);
}
/**
* Retourne le rendu du champs Code avec ses paramètres
* @return string Le rendu du champs
*/
public function renderCodeEditor():string
{
$template = '<div id="editor-%s" class="code-editor"%s>%s</div>' . PHP_EOL;
$template .= '<textarea id="%s" name="%s" style="display: none;">%s</textarea>';
$this->_datas['target'] = '#' . $this->id;
$render = vsprintf($template, [
$this->id,
$this->renderFieldAttrs(['style']),
e($this->getValue()),
$this->id,
$this->name,
e($this->getValue()),
]);
return $render;
}
/**
* Retourne le rendu du champs File avec ses paramètres
* @return string Le rendu du champs
*/
public function renderFile(): string
{
$template = '<div class="custom-file">' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' <label class="custom-file-label" for="%s">%s</label>' . PHP_EOL;
$template .= ' <script type="text/javascript">' . PHP_EOL;
$template .= ' document.getElementById(\'%s\').addEventListener(\'change\', function(e) {' . PHP_EOL;
$template .= ' if (e.target.files[0]) {' . PHP_EOL;
$template .= ' var fileName = e.target.files[0].name;' . PHP_EOL;
$template .= ' var nextSibling = e.target.nextElementSibling;' . PHP_EOL;
$template .= ' nextSibling.innerText = fileName' . PHP_EOL;
$template .= ' }' . PHP_EOL;
$template .= ' });' . PHP_EOL;
$template .= ' </script>' . PHP_EOL;
$template .= '</div>';
$this->class = str_replace('form-control', 'custom-file-input', $this->class);
$this->type = 'file';
$render = vsprintf($template, [
$this->renderInput(),
$this->id,
$this->placeholder,
$this->id,
]);
return $render;
}
/**
* Retourne le rendu du champs PDF avec ses paramètres
* @return string Le rendu du champs
*/
public function renderPdf(): string
{
$template = '<div class="input-group">' . PHP_EOL;
$template .= ' <div class="input-group-prepend">' . PHP_EOL;
$template .= ' <div class="input-group-text text-danger">' . PHP_EOL;
$template .= ' <i class="fa fa-file-pdf-o" aria-hidden="true"></i>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' <div class="input-group-append">' . PHP_EOL;
$template .= ' <button class="btn btn-outline-secondary popupfinder" type="button" id="btn-%s" data-field="%s" data-mimes="%s">' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' </button>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= '</div>';
$render = vsprintf($template, [
$this->renderInput(),
$this->id,
'#' . $this->id,
'application/pdf',
$this->suffix ?? '<i class="fa fa-file-pdf-o mr-2"></i>Choisir PDF'
]);
$this->prefix = null;
$this->suffix = null;
return $render;
}
/**
* Retourne le rendu du champs Video avec ses paramètres
* @return string Le rendu du champs
*/
public function renderVideo(): string
{
$template = '<div class="input-group">' . PHP_EOL;
$template .= ' <div class="input-group-prepend">' . PHP_EOL;
$template .= ' <div class="input-group-text">' . PHP_EOL;
$template .= ' <i class="fa fa-video-camera" aria-hidden="true"></i>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' <div class="input-group-append">' . PHP_EOL;
$template .= ' <button class="btn btn-outline-secondary popupfinder" type="button" id="btn-%s" data-field="%s" data-mimes="%s">' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' </button>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= '</div>';
$render = vsprintf($template, [
$this->renderInput(),
$this->id,
'#' . $this->id,
'video',
$this->suffix ?? '<i class="fa fa-file-video-o mr-2"></i>Choisir vidéo'
]);
$this->prefix = null;
$this->suffix = null;
return $render;
}
/**
* Retourne le rendu du champs Image avec ses paramètres
* @return string Le rendu du champs
*/
public function renderImage(): string
{
$template = '<div class="input-group img-group">' . PHP_EOL;
$template .= ' <div class="input-group-prepend">' . PHP_EOL;
$template .= ' <img id="thumb-%s" class="image-thumb" src="%s" alt="thumb">' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' <div class="input-group-append">' . PHP_EOL;
$template .= ' <button class="btn btn-outline-secondary popupfinder" type="button" id="btn-%s" data-thumb="%s" data-field="%s" data-mimes="%s">' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' </button>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= '</div>';
$render = vsprintf($template, [
$this->id,
empty($this->getValue()) ? url('images/default.svg') : url($this->getValue()),
$this->renderInput(),
$this->id,
'#thumb-' . $this->id,
'#' . $this->id,
'image',
$this->suffix ?? '<i class="fa fa-picture-o mr-2"></i>Choisir image'
]);
$this->prefix = null;
$this->suffix = null;
return $render;
}
/**
* Retourne le rendu du champs Toogle avec ses paramètres
* @return string Le rendu du champs toggle
*/
public function renderToggle(): string
{
$availables = ['id', 'class', 'name', 'is_disabled', 'is_required', 'is_readonly', 'style'];
$template = '<div class="toogle">' . PHP_EOL;
$template .= ' <input type="checkbox" value="1" %s%s />' . PHP_EOL;
$template .= '</div>';
$render = vsprintf($template, [
$this->renderFieldAttrs($availables),
$this->getValue() == 1 ? ' checked' : ''
]);
return $render;
}
/**
* Retourne le rendu du champs radio avec ses paramètres
* @return string Le rendu du champs radio
*/
public function renderRadio(): string
{
$this->is_multiple = false;
$this->class = str_replace('form-control', 'form-check-input', $this->class);
return $this->renderCheckedOptions('radio');
}
/**
* Retourne le rendu du champs checkbox avec ses paramètres
* @return string Le rendu du champs checkbox
*/
public function renderCheckbox(): string
{
$this->is_multiple = count($this->_options) > 1;
$this->class = str_replace('form-control', 'form-check-input', $this->class);
return $this->renderCheckedOptions('checkbox');
}
/**
* Retourne le rendu du champs range avec ses paramètres
* @return string Le rendu du champs range
*/
public function renderRange(): string
{
$availables = ['id', 'class', 'name', 'value', 'min', 'max', 'is_disabled', 'ris_equired', 'is_readonly', 'style'];
$functionName = camel_case($this->name) . 'ShowValue';
$template = '<input type="range" %s oninput="%s(this.value)" />' . PHP_EOL;
$template .= '<span id="%s">%s&nbsp;</span>'. PHP_EOL;
$template .= '<script type="text/javascript">' . PHP_EOL;
$template .= ' function %s(newValue) {' . PHP_EOL;
$template .= ' document.getElementById("%s").innerHTML=newValue;' . PHP_EOL;
$template .= ' }' . PHP_EOL;
$template .= '</script>';
$render = vsprintf($template, [
$this->renderFieldAttrs($availables),
$functionName,
$this->id . '-value',
$this->value,
$functionName,
$this->id . '-value'
]);
return $render;
}
/**
* Retourne le rendu de 2 champs pot de miel (my-name & my-time)
* @return string Le rendu des 2 champs pot de miel
*/
public function renderHoneypot(): string
{
$template = "";
$template .= '<div class="d-none">' . PHP_EOL;
$template .= ' <input type="text" name="my-name" value="%s" />' . PHP_EOL;
$template .= ' <input type="text" name="my-time" value="%s" />' . PHP_EOL;
$template .= '</div>';
$render = vsprintf($template, [
null,
encrypt(time())
]);
return $render;
}
/**
* Retourne le rendu du champs textarea avec ses paramètres
* @return string Le rendu du champs textarea
*/
public function renderTextarea(): string
{
$availables = ['id', 'class', 'name', 'placeholder', 'is_autocomplete', 'is_autofocus', 'is_disabled', 'is_required', 'is_readonly', 'rows', 'style'];
$template = '<textarea %s>%s</textarea>';
$render = vsprintf($template, [
$this->renderFieldAttrs($availables),
str_replace("\r\n", '[CR]', $this->getValue())
]);
return $render;
}
/**
* Retourne le rendu du champs select avec ses paramètres;
* @return string Le rendu du champs select
*/
public function renderSelect(): string
{
$availables = ['id', 'class', 'name', 'is_multiple', 'is_disabled', 'is_required', 'is_readonly', 'style'];
$template = '<select %s>' . PHP_EOL;
$template .= '%s';
$template .= '</select>';
$render = vsprintf($template, [
$this->renderFieldAttrs($availables),
$this->renderIndent($this->renderOptions(), 1),
]);
return $render;
}
/**
* Retourne le rendu du champs input avec ses paramètres;
* @return string Le rendu du champs input
*/
public function renderInput(): string
{
$availables = ['id', 'type', 'class', 'name', 'value', 'placeholder', 'is_autocomplete', 'is_autofocus', 'is_disabled', 'is_required', 'is_readonly', 'style'];
$template = '<input %s />';
if (is_null($this->type)) {
$this->type = 'text';
}
$render = sprintf($template, $this->renderFieldAttrs($availables));
return $render;
}
/**
* Retourne le rendu d'un champs avec son environnement
* @param string $renderField Le rendu du champs
* @return string Le rendu de l'environnement du champs
*/
public function renderWrapFieldEnvironment(string $renderField, $noindentfield = false): string
{
$render = $renderField;
$template = '';
$templateInline = '<div class="form-group row">' . PHP_EOL;
$templateInline .= '%s%s';
$templateInline .= ' <div class="col-sm-10">' . PHP_EOL;
$templateInline .= '%s';
$templateInline .= ' </div>' . PHP_EOL;
$templateInline .= '</div>' . PHP_EOL;
$templateClassic = '<div class="form-group">' . PHP_EOL;
$templateClassic .= '%s%s' ;
$templateClassic .= '%s';
$templateClassic .= '</div>' . PHP_EOL;
$templatePrefix = '<div class="input-group%s">'. PHP_EOL;
$templatePrefix .= '%s%s%s';
$templatePrefix .= '</div>'. PHP_EOL;
// Si prefixe ou suffixe
if (!empty($this->prefix) || !empty($this->suffix)) {
$class_size = empty($this->size) ? '' : ' input-group-' . $this->size;
$render = vsprintf($templatePrefix, [
$class_size,
$this->renderIndent($this->renderPrefix(), 1),
$this->renderIndent($render, $noindentfield ? 0 : 1),
$this->renderIndent($this->renderSuffix(), 1),
]);
}
// Ajout des messages
$render .= $this->renderHelp() . $this->renderValidationMessage();
// Affichage en mode inline
if ($this->is_inline && ($this->type != 'checkbox' || $this->type != 'radio')) {
$render = $this->renderIndent($render, $noindentfield ? 0 : 2);
$render = vsprintf($templateInline, [
$this->renderIndent($this->renderLabel(), 1),
$this->renderIndent($this->renderPopover(), 1),
$render,
]);
} else {
$render = $this->renderIndent($render, $noindentfield ? 0 : 1);
$render = vsprintf($templateClassic, [
$this->renderIndent($this->renderLabel(), 1),
$this->renderIndent($this->renderPopover(), 1),
$render,
]);
}
return $render;
}
/**
* Retourne le rendu d'une chaine de caractère en HTML
* @param String $string La chains de caractères à traiter
* @return String Le rendu HTML
*/
public function renderHTML($string): HtmlString
{
return new HtmlString($string);
}
/**
* Retourne le rendu de la partie aide d'un champs (sous le champs)
* @return string Le rendu de la partie aide
*/
private function renderHelp(): string
{
$render = '';
if (!empty($this->help)) {
$template = '<small class="form-text text-muted text-right mt-0">%s</small>' . PHP_EOL;
$render = sprintf($template, $this->help);
}
return $render;
}
/**
* Retoune le rendu de la partie prefixe du champs
* @return string Le rendu du prefixe
*/
private function renderPrefix(): string
{
$render = '';
if (!empty($this->prefix)) {
$template = '<div class="input-group-prepend">' . PHP_EOL;
if (preg_match('/<button.*/', $this->prefix)) {
$template .= ' %s' . PHP_EOL;
} else {
$template .= ' <div class="input-group-text">%s</div>' . PHP_EOL;
}
$template .= '</div>' . PHP_EOL;
$render = sprintf($template, $this->prefix);
}
return $render;
}
/**
* Retourne le rendu de la partie suffixe du champs
* @return string Le rendu du suffixe
*/
private function renderSuffix(): string
{
$render = '';
if (!empty($this->suffix)) {
$template = '<div class="input-group-append">' . PHP_EOL;
if (preg_match('/<button.*/', $this->suffix)) {
$template .= ' %s' . PHP_EOL;
} else {
$template .= ' <div class="input-group-text">%s</div>' . PHP_EOL;
}
$template .= '</div>' . PHP_EOL;
$render = sprintf($template, $this->suffix);
}
return $render;
}
/**
* Retourne le rendu de la popover (description du champs)
* @return string Le rendu de la popover
*/
private function renderPopover(): string
{
$render = '';
if (!empty($this->_popover)) {
$template = '<span class="text-info popup-help" data-toggle="popover" data-placement="%s" title="%s" data-content="%s">' . PHP_EOL;
$template .= ' <i class="fa fa-info-circle"></i>' . PHP_EOL;
$template .= '</span>' . PHP_EOL;
$render = vsprintf($template, [
data_get($this->_popover, 'placement', 'right'),
data_get($this->_popover, 'title', 'Informations'),
data_get($this->_popover, 'content'),
]);
}
return $render;
}
/**
* Retourne le rendu du label du champs
* @return string Le rendu du label
*/
private function renderLabel(): string
{
$render = '';
$class = '';
if ($this->is_required) {
$class .= 'required';
}
if ($this->is_inline && ($this->type != 'checkbox' || $this->type != 'radio')) {
$class .= 'col-sm-2';
}
if (!empty($this->label)) {
$template = '<label for="%s"%s>%s</label>' . PHP_EOL;
$render = vsprintf($template, [
$this->id,
strlen($class) > 0 ? ' class="' . $class . '"' : '',
$this->label
]);
}
return $render;
}
/**
* Rendu d'optiond de type checked
*
* @param string $type type de champs à rendre
* @return string Le rendu du champs
*/
private function renderCheckedOptions(string $type = 'checkbox')
{
$availables = ['id', 'class', 'name', 'value', 'is_disabled', 'is_required', 'is_readonly', 'style'];
$template = '<div class="form-check%s%s">' . PHP_EOL;
$template .= ' <input type="%s" %s%s%s/>' . PHP_EOL;
$template .= ' <label class="form-check-label" for="%s">%s</label>' . PHP_EOL;
$template .= '</div>' . PHP_EOL;
$render = "";
$current_value = old($this->name, $this->is_multiple ? $this->_values : $this->value);
$options = $this->optionsModeling();
foreach ($options as $option) {
// Gestion de la valeur
$this->value = $option->getOptionValue();
if (is_array($current_value)) {
$checked = in_array($this->value, $current_value);
} else {
$checked = $this->value == $current_value;
}
// Gestion des ID
if (!is_bool($this->indice)) {
$this->id = str_slug($this->name . '-' . $this->indice . '-' . $this->value);
} else {
$this->id = str_slug($this->name . '-' . $this->value);
}
$render .= vsprintf($template, [
$this->is_disabled ? ' disabled' : '',
$this->is_inline ? ' form-check-inline' : '',
$type,
$this->renderFieldAttrs($availables),
$option->getDatasRender(),
$checked ? ' checked' : '',
$this->id,
$option->getOptionLabel()
]);
}
return $render;
}
/**
* Modélisation des options
* Collection d'Option modélisées
*/
private function optionsModeling()
{
$options = collect();
if (is_array($this->_options)) {
$this->checkOptionsValue();
if (isset($this->_options['collect'])) {
foreach ($this->_options['collect'] as $key => $item) {
$option = new Option();
$option->setSource($item);
$option->setLabelParam(data_get($this->_options, 'text'));
$option->setValueParam(data_get($this->_options, 'value'));
$option->setDatas(data_get($this->_options, 'datas'));
$option->setClass(data_get($this->_options, 'class'));
$option->setTemplate(data_get($this->_options, 'template'));
$option->setCallback(data_get($this->_options, 'callback'));
$option->setAttributes(data_get($this->_options, 'attributes'));
$options->push($option);
}
} else {
foreach ($this->_options as $key => $item) {
$option = new Option();
$option->setSource([$key => $item]);
$options->push($option);
}
}
}
return $options;
}
/**
* Retourne le rendu d'options d'un menu déroulant select
* @return string Le rendu des options
*/
private function renderOptions(): string
{
$render = '';
$template = '<option value="%s"%s>%s</option>' . PHP_EOL;
$template_group = '<optgroup label="%s">%s</optgroup>' . PHP_EOL;
$default = '<option value=""' . ($this->is_required ? ' disabled hidden' : '') . ' selected >%s</option>' . PHP_EOL;
if (!is_null($this->placeholder)) {
$render = sprintf($default, $this->placeholder);
}
// Détection d'une collection source
if (isset($this->_options['collect'])) {
$this->checkOptionsValue();
foreach ($this->_options['collect'] as $key => $item) {
$attrs = "";
// L'élément courant correspond à la valeur du champs
$field_name = is_int($this->indice) ? $this->name . '.' . $this->indice : $this->name;
$field_value = old($field_name, $this->is_multiple ? $this->_values : $this->value);
$item_value = data_get($item, $this->_options['value']);
// Attributs data-*
if (isset($this->_options['datas']) && is_array($this->_options['datas'])) {
foreach ($this->_options['datas'] as $name => $value) {
$attrs .= $this->renderDatas([$name => data_get($item, $value)]);
}
$attrs = ' ' . trim($attrs);
}
if ((is_array($field_value) && in_array($item_value, $field_value)) ||
(!is_array($field_value) && strval($field_value) === strval($item_value))) {
$attrs .= ' selected';
}
$text = data_get($this->_options, 'text');
$callback = data_get($this->_options, 'callback');
// Gestion d'un template
if (isset($this->_options['template'])) {
// 1ère passe : ajout d'un template pour l'affichage du texte de l'option
$render .= vsprintf($template, [
data_get($item, $this->_options['value']),
$attrs,
$this->objectToString($this->_options['template'], $text, $callback, $item)
]);
} else {
$render .= vsprintf($template, [
data_get($item, $this->_options['value']),
$attrs,
$this->objectToString(null, $text, $callback, $item)
]);
}
}
} else {
foreach ($this->_options as $value => $text) {
$opt_group = '';
// Cas d'un sous niveau
if (is_array($text)) {
foreach ($text as $value_ => $text_) {
if (empty($this->name)) {
$attrs = strval($this->value) === strval($value_) ? ' selected' : '';
} else {
$attrs = strval(old($this->name, $this->value)) === strval($value_) ? ' selected' : '';
}
$opt_group .= vsprintf($template, [
$value_,
$attrs,
$text_
]);
}
$render .= vsprintf($template_group, [
$value,
$opt_group
]);
} else {
if (empty($this->name)) {
$attrs = strval($this->value) === strval($value) ? ' selected' : '';
} else {
$attrs = strval(old($this->name, $this->value)) === strval($value) ? ' selected' : '';
}
$render .= vsprintf($template, [
$value,
$attrs,
$text
]);
}
}
}
return $render;
}
/**
* Retourne le rendu d'un message d'erreur de validation
* @return string Le rendu du message
*/
private function renderValidationMessage()
{
$errors = session('errors', collect());
$render = null;
if ($errors->has($this->name)) {
$template = '<div class="invalid-feedback">%s</div>' . PHP_EOL;
$render = sprintf($template, $errors->first($this->name));
}
return $render;
}
/**
* Retourne le rendu des attributs d'un champs
* @param array $availables Liste des attributs pouvant composer le champs
* @return string Le rendu des attributs
*/
private function renderFieldAttrs(array $availables, $fixvalue = false): string
{
$attrs = get_object_vars($this);
$render = '';
$template = '%s="%s" ';
$except_empty_attr = ['value'];
foreach ($attrs as $attr => $value) {
// On traite uniquement les attributs autorisés
if (!in_array($attr, ['label', 'prefix', 'suffix'])) {
// On ne traite pas les attributs avec une valeur vide
if (!in_array($attr, $except_empty_attr) && empty($value)) {
continue;
}
// Traitement des cas particuliers
switch ($attr) {
case 'value':
if ($fixvalue) {
$val = $this->value;
} else {
$val = $this->getValue();
}
break;
case 'class':
$val = $this->getClasses();
break;
case 'name' :
$val = $value;
// Mode indice
if (!is_null($this->indice)) {
$val .= '['. ($this->indice !== true ? $this->indice : '') .']';
}
if ($this->is_multiple) {
$val .= '[]';
}
break;
default:
if (is_bool($value)) {
$val = $value;
} else {
$val = $this->getDataValue($value);
}
break;
}
if ($value === true) {
$render .= $attr . ' ';
} else if ($value != false) {
$render .= vsprintf($template, [$attr, $val]);
}
}
}
// Attributs supplémentaires
if (!is_null($this->_attributes) && is_array($this->_attributes)) {
foreach ($this->_attributes as $attr => $value) {
if (is_array($value)) {
$value_ = $this->objectToString(
data_get($value, 'template'),
data_get($value, 'attributes'),
data_get($value, 'callback'),
data_get($value, 'source')
);
} else {
$value_ = $value;
}
$render .= vsprintf($template, [$attr, $value_]);
}
}
// Ajout des datas
//$render .= $this->renderDatas($this->_datas);
return trim($render);
}
/**
* Retourne le rendu avec indentation d'un texte
* @param string $text Le texte à traiter
* @param Integer $nb Le nombre d'indentation à appliquer
* @return string Le rendu avec indentation
*/
private function renderIndent($text, $nb): string
{
$indent = ' ';
$render = '';
$real_indent = '';
for ($i = 1; $i <= $nb; $i++) {
$real_indent .= $indent;
}
$lines = explode(PHP_EOL, $text);
foreach ($lines as $line) {
if (!empty($line)) {
$render .= $real_indent . $line . PHP_EOL;
}
}
return $render;
}
/**
* Retourne le rendu des attributs datas
* @param array $datas La liste des attributs data
* @return string Le rendu avec les attributs data
*/
// protected function renderDatas($datas): string
// {
// $render = '';
// if (!empty($datas) && is_array($datas)) {
// $template = 'data-%s="%s" ';
// foreach ($datas as $name => $value) {
// if (is_array($value)) {
// $value_ = $this->objectToString(
// data_get($value, 'template'),
// data_get($value, 'attributes'),
// data_get($value, 'callback'),
// data_get($value, 'source')
// );
// } else {
// $value_ = $value;
// }
// $render .= vsprintf($template, [$name, $value_]);
// }
// }
// return $render;
// }
/**
* Retourne la liste de toutes les classes du champs
* @return string Les classes du champs
*/
private function getClasses(): string
{
$classes = $this->class . ' ' . $this->getValidationClass();
// Si une taille est spécifiée
if (!empty($this->size)) {
// Aucun préfixe ou suffixe
if (empty($this->prefix) && empty($this->suffix)) {
$classes .= ' ' . 'form-control-' . $this->size;
}
}
return trim($classes);
}
/**
* Retourne la classe Bootstrap de validation du champs
* @return string La classe
*/
private function getValidationClass()
{
$errors = session('errors', collect());
$class = null;
if ($errors->has($this->name)) {
$class = 'is-invalid';
} else if (!is_null($this->name) && !is_null(old($this->name))) {
$class = 'is-valid';
}
return $class;
}
/**
* Vérifie la cohérence de l'attribut Options
* @return void
*/
private function checkOptionsValue()
{
if (isset($this->_options['collect'])) {
// Exceptions sur les paramètres
if (is_array($this->_options['text']) && empty($this->_options['template'])) {
throw new \InvalidArgumentException("Le paramètre options['template'] doit être présent lorsque options['text'] est un tableau");
}
if (isset($this->_options['template']) && !is_array($this->_options['text'])) {
throw new \InvalidArgumentException("Le paramètre options['text'] doit être un tableau lorsque options['template'] est présent");
}
}
}
/**
* Retourne une valeur depuis old ou l'attribut
* @return string La valeur
*/
private function getValue()
{
$name = $this->name;
if (is_null($name)) {
return ;
}
if (!is_null($this->indice)) {
$name .= '.' . $this->indice;
}
return old($name, $this->getDataValue($this->value));
}
/**
* Retourne le rendu d'un template avec une liste de noms de colonnes
* @param string $template Le template servant au rendu
* @param string|array $display Le ou les noms de colonnes
* @param string $callback Fonction à appliquer sur la résultante
* @param Mix $item Objet source des donnés à afficher
* @param Mix $item Suppression des tags
* @return string Le rendu
*/
// protected function objectToString($template = null, $displays = null, $callback = null, $item, $strip = false)
// {
// // Création du texte à afficher
// $datas = [];
// // Convertion en tableau si besoin
// if (!is_iterable($displays)) {
// $displays = [$displays];
// }
// // Traitement du tableau de valeur à afficher
// foreach ($displays as $key => $display) {
// $data = mixte_get($item, $display);
// // Callback array
// if (is_array($callback) && isset($callback[$key]) && !is_null($callback[$key])) {
// $data = $callback[$key]($data);
// }
// $datas[] = $strip ? strip_tags($data) : $data;
// }
// // Traitement des % seuls pour éviter les conflits
// if (!empty($template)) {
// $template = preg_replace('/(%)[^0-9sd.\']/i', '%%"', $template);
// }
// // Traitement template & callback
// if (is_string($callback)) {
// if (empty($template)) {
// $string = call_user_func_array($callback, $datas);
// } else {
// $string = vsprintf($template, $datas);
// $string = $callback($string);
// }
// } else if (!empty($template)) {
// $string = vsprintf($template, $datas);
// } else {
// $string = $datas[0];
// }
// return $string;
// }
/**
* Retourne le rendu d'attributs avec leur valeur
* @param array $attrs Les attributs avec la colonne de l'object conteant la valeur
* @param Object $item Object contenant la valeur de l'attribut
* @return string Le rendu des attributs avec leur valeur
*/
private function renderAttributes($attrs = [], $source = null): string
{
$render = '';
if (is_iterable($attrs)) {
$template = ' %s="%s"';
foreach ($attrs as $name => $data) {
if (is_null($source) || !is_array($data)) {
$value = $data;
} else if (is_array($data)) {
$value = $this->getDataValue($data, $source);
}
$render .= vsprintf($template, [$name, $value]);
}
}
return $render;
}
/**
* Vérifier la validité d'un paramètre condition
* @param array|null $condition La condition si elle est disponible
* @param Objet $datas Les données dans lesquelles aller chercher la valeur à controler
* @return bollean True si la condition est valide, sinon false
*/
private function checkCondition($condition, $datas): string
{
$data = mixte_get($datas, mixte_get($condition, 'key'));
$value = mixte_get($condition, 'value');
$operator = mixte_get($condition, 'operator');
$default = true;
switch ($operator) {
case '==' :
$validated = $data == $value ? true : false;
break;
case '>' :
$validated = $data > $value ? true : false;
break;
case '<' :
$validated = $data < $value ? true : false;
break;
case '!=' :
$validated = $data != $value ? true : false;
break;
case '<=' :
$validated = $data <= $value ? true : false;
break;
case '>=' :
$validated = $data >= $value ? true : false;
break;
default :
$validated = $default;
}
return $validated;
}
/**
* Récupération d'une valeur en fonction de sa composition
* @param Mixed $value array pour une valeur dynamique ou string|int|float|bool pour une valeur statique
* @param Object $datas Objet dans lequel aller chercher la valeur si dynamique
* @param boolean $strip Supprimer les balises HTML dela valeur résultante
* @return Mixed La valeur
*/
private function getDataValue($value, $datas = null, $strip = false)
{
$_value = null;
if (is_array($value)) {
// Si le tableau n'est pas de type associatif ['my-key'] devient ['key' => 'my-key']
if(array_keys($value) === range(0, count($value) - 1) && count($value) == 1) {
$value = ['key' => $value[0]];
}
$condition = data_get($value, 'condition');
if ($this->checkCondition($condition, $datas)) {
$_value = $this->dynamicFormatedValue(
data_get($value, 'template'),
data_get($value, 'key'),
data_get($value, 'value'),
data_get($value, 'callback'),
$datas,
$strip,
);
}
} else {
$_value = $value;
}
return $_value;
}
/**
* Retourne le rendu formaté d'une valeur dynamique
* @param string $template Le template servant au formatage
* @param string|array $keys Le ou les nom de colonnes
* @param Mix $default Valeur par défaut
* @param string $callback Fonction callback à appeler pour traiter la valeur
* @param Mix $source Objet source pour récupérer la valeur dynamique
* @param boolean $strip Supprimer les balises HTML
* @return string Le rendu
*/
private function dynamicFormatedValue($template = null, $keys = null, $default = null, $callback = null, $source, $strip = false)
{
// Création du texte à afficher
$datas = [];
// Convertion en tableau si besoin
if (!is_iterable($keys) && !is_null($keys)) {
$keys = [$keys];
// Traitement du tableau de valeur à afficher
foreach ($keys as $key => $column) {
$data = mixte_get($source, $column, $default);
// Callback array
if (is_array($callback) && isset($callback[$key]) && !is_null($callback[$key])) {
$data = $callback[$key]($data);
}
$datas[] = $strip ? strip_tags($data) : $data;
}
} else {
if (!is_iterable($default)) {
$datas[] = $default;
} else {
$datas = $default;
}
}
// Traitement des % seuls pour éviter les conflits
if (!empty($template)) {
$template = preg_replace('/(%)[^0-9sd.\']/i', '%%"', $template);
}
// Traitement template & callback
if (is_string($callback)) {
if (empty($template)) {
$string = call_user_func_array($callback, $datas);
} else {
$string = vsprintf($template, $datas);
$string = $callback($string);
}
} else if (!empty($template)) {
$string = vsprintf($template, $datas);
} else {
$string = $datas[0];
}
return $string;
}
/**
* Mise à jour des attributs depuis le tableau passé en paramètre
* @param Array $attrs Liste des attributs à traiter
* @return void
*/
private function setAttrs($attrs)
{
$this->resetAttrs();
if (is_null($attrs)) {
return ;
}
// Liste des attributs autorisés
$attrs_available = array_map(function ($val) {
return trim($val, '_');
}, array_keys(get_object_vars($this)));
// Traitement des attributs
if (is_array($attrs)) {
foreach ($attrs as $attr => $value) {
//if (in_array($attr, $attrs_available)) {
//if (is_array($value)) {
//$this->{'_' . $attr} = $value;
//} else {
$this->{$attr} = $value;
//}
//} else {
//throw new \InvalidArgumentException("Le paramètre [" . $attr . "] n'est pas pris en charge");
//}
}
} else {
throw new \InvalidArgumentException("Type de paramètre invalide. Attendu : Tableau");
}
// Traitement de l'ID
if (is_null($this->id)) {
$this->id = 'field-' . $this->name;
}
if (!is_null($this->indice)) {
$this->id = $this->id . '-' . $this->indice;
}
$this->id = str_slug($this->id);
// Traitement de la classe
$this->class = 'form-control ' . $this->class;
$this->class = trim($this->class);
// Traitement sur la valeur
if (is_null($this->value)) {
$this->value = '';
}
// Traitement sur la taille
if (!empty($this->size) && !in_array($this->size, ['sm', 'lg'])) {
throw new \InvalidArgumentException("La valeur pour le paramètre « size » est invalide");
}
}
/**
* Réinitialisation des attributs de constructions
* @return void
*/
private function resetAttrs()
{
$attrs = array_keys(get_object_vars($this));
foreach ($attrs as $attr) {
if (preg_match('/^_.*/', $attr)) {
$this->{$attr} = [];
} else if (preg_match('/^is_.*/', $attr)) {
$this->{$attr} = false;
} else {
$this->{$attr} = null;
}
}
}
}
<?php
namespace Goldenscarab\Modulus\Service\Field\Compose;
use \Illuminate\Support\HtmlString;
class FieldBt4
{
private $type;
private $label;
private $id;
private $class;
private $name;
private $value;
private $placeholder;
private $prefix;
private $suffix;
private $help;
private $indice;
private $style;
private $rows;
private $min;
private $max;
private $size;
private $is_multiple;
private $is_autocomplete;
private $is_autofocus;
private $is_disabled;
private $is_required;
private $is_readonly;
private $is_inline;
private $_datas;
private $_values;
private $_options;
private $_popover;
private $_attributes;
public function __construct($attrs = [])
{
$this->setAttrs($attrs);
}
/**
* Retourne le rendu du champs Code avec ses paramètres
* @return string Le rendu du champs
*/
public function renderCodeEditor():string
{
$template = '<div id="editor-%s" class="code-editor"%s>%s</div>' . PHP_EOL;
$template .= '<textarea id="%s" name="%s" style="display: none;">%s</textarea>';
$this->_datas['target'] = '#' . $this->id;
$render = vsprintf($template, [
$this->id,
$this->renderFieldAttrs(['style']),
e($this->getValue()),
$this->id,
$this->name,
e($this->getValue()),
]);
return $render;
}
/**
* Retourne le rendu du champs File avec ses paramètres
* @return string Le rendu du champs
*/
public function renderFile(): string
{
$template = '<div class="custom-file">' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' <label class="custom-file-label" for="%s">%s</label>' . PHP_EOL;
$template .= ' <script type="text/javascript">' . PHP_EOL;
$template .= ' document.getElementById(\'%s\').addEventListener(\'change\', function(e) {' . PHP_EOL;
$template .= ' if (e.target.files[0]) {' . PHP_EOL;
$template .= ' var fileName = e.target.files[0].name;' . PHP_EOL;
$template .= ' var nextSibling = e.target.nextElementSibling;' . PHP_EOL;
$template .= ' nextSibling.innerText = fileName' . PHP_EOL;
$template .= ' }' . PHP_EOL;
$template .= ' });' . PHP_EOL;
$template .= ' </script>' . PHP_EOL;
$template .= '</div>';
$this->class = str_replace('form-control', 'custom-file-input', $this->class);
$this->type = 'file';
$render = vsprintf($template, [
$this->renderInput(),
$this->id,
$this->placeholder,
$this->id,
]);
return $render;
}
/**
* Retourne le rendu du champs PDF avec ses paramètres
* @return string Le rendu du champs
*/
public function renderPdf(): string
{
$template = '<div class="input-group">' . PHP_EOL;
$template .= ' <div class="input-group-prepend">' . PHP_EOL;
$template .= ' <div class="input-group-text text-danger">' . PHP_EOL;
$template .= ' <i class="fa fa-file-pdf-o" aria-hidden="true"></i>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' <div class="input-group-append">' . PHP_EOL;
$template .= ' <button class="btn btn-outline-secondary popupfinder" type="button" id="btn-%s" data-field="%s" data-mimes="%s">' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' </button>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= '</div>';
$render = vsprintf($template, [
$this->renderInput(),
$this->id,
'#' . $this->id,
'application/pdf',
$this->suffix ?? '<i class="fa fa-file-pdf-o mr-2"></i>Choisir PDF'
]);
$this->prefix = null;
$this->suffix = null;
return $render;
}
/**
* Retourne le rendu du champs Video avec ses paramètres
* @return string Le rendu du champs
*/
public function renderVideo(): string
{
$template = '<div class="input-group">' . PHP_EOL;
$template .= ' <div class="input-group-prepend">' . PHP_EOL;
$template .= ' <div class="input-group-text">' . PHP_EOL;
$template .= ' <i class="fa fa-video-camera" aria-hidden="true"></i>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' <div class="input-group-append">' . PHP_EOL;
$template .= ' <button class="btn btn-outline-secondary popupfinder" type="button" id="btn-%s" data-field="%s" data-mimes="%s">' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' </button>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= '</div>';
$render = vsprintf($template, [
$this->renderInput(),
$this->id,
'#' . $this->id,
'video',
$this->suffix ?? '<i class="fa fa-file-video-o mr-2"></i>Choisir vidéo'
]);
$this->prefix = null;
$this->suffix = null;
return $render;
}
/**
* Retourne le rendu du champs Image avec ses paramètres
* @return string Le rendu du champs
*/
public function renderImage(): string
{
$template = '<div class="input-group img-group">' . PHP_EOL;
$template .= ' <div class="input-group-prepend">' . PHP_EOL;
$template .= ' <img id="thumb-%s" class="image-thumb" src="%s" alt="thumb">' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' <div class="input-group-append">' . PHP_EOL;
$template .= ' <button class="btn btn-outline-secondary popupfinder" type="button" id="btn-%s" data-thumb="%s" data-field="%s" data-mimes="%s">' . PHP_EOL;
$template .= ' %s' . PHP_EOL;
$template .= ' </button>' . PHP_EOL;
$template .= ' </div>' . PHP_EOL;
$template .= '</div>';
$render = vsprintf($template, [
$this->id,
empty($this->getValue()) ? url('images/default.svg') : url($this->getValue()),
$this->renderInput(),
$this->id,
'#thumb-' . $this->id,
'#' . $this->id,
'image',
$this->suffix ?? '<i class="fa fa-picture-o mr-2"></i>Choisir image'
]);
$this->prefix = null;
$this->suffix = null;
return $render;
}
/**
* Retourne le rendu du champs Toogle avec ses paramètres
* @return string Le rendu du champs toggle
*/
public function renderToggle(): string
{
$availables = ['id', 'class', 'name', 'is_disabled', 'is_required', 'is_readonly', 'style'];
$template = '<div class="toogle">' . PHP_EOL;
$template .= ' <input type="checkbox" value="1" %s%s />' . PHP_EOL;
$template .= '</div>';
$render = vsprintf($template, [
$this->renderFieldAttrs($availables),
$this->getValue() == 1 ? ' checked' : ''
]);
return $render;
}
/**
* Retourne le rendu du champs radio avec ses paramètres
* @return string Le rendu du champs radio
*/
public function renderRadio(): string
{
$this->is_multiple = false;
$this->class = str_replace('form-control', 'form-check-input', $this->class);
return $this->renderCheckedOptions('radio');
}
/**
* Retourne le rendu du champs checkbox avec ses paramètres
* @return string Le rendu du champs checkbox
*/
public function renderCheckbox(): string
{
$this->is_multiple = count($this->_options) > 1;
$this->class = str_replace('form-control', 'form-check-input', $this->class);
return $this->renderCheckedOptions('checkbox');
}
/**
* Retourne le rendu du champs range avec ses paramètres
* @return string Le rendu du champs range
*/
public function renderRange(): string
{
$availables = ['id', 'class', 'name', 'value', 'min', 'max', 'is_disabled', 'ris_equired', 'is_readonly', 'style'];
$functionName = camel_case($this->name) . 'ShowValue';
$template = '<input type="range" %s oninput="%s(this.value)" />' . PHP_EOL;
$template .= '<span id="%s">%s&nbsp;</span>'. PHP_EOL;
$template .= '<script type="text/javascript">' . PHP_EOL;
$template .= ' function %s(newValue) {' . PHP_EOL;
$template .= ' document.getElementById("%s").innerHTML=newValue;' . PHP_EOL;
$template .= ' }' . PHP_EOL;
$template .= '</script>';
$render = vsprintf($template, [
$this->renderFieldAttrs($availables),
$functionName,
$this->id . '-value',
$this->value,
$functionName,
$this->id . '-value'
]);
return $render;
}
/**
* Retourne le rendu du champs textarea avec ses paramètres
* @return string Le rendu du champs textarea
*/
public function renderTextarea(): string
{
$availables = ['id', 'class', 'name', 'placeholder', 'is_autocomplete', 'is_autofocus', 'is_disabled', 'is_required', 'is_readonly', 'rows', 'style'];
$template = '<textarea %s>%s</textarea>';
$render = vsprintf($template, [
$this->renderFieldAttrs($availables),
str_replace("\r\n", '[CR]', $this->getValue())
]);
return $render;
}
/**
* Retourne le rendu du champs select avec ses paramètres;
* @return string Le rendu du champs select
*/
public function renderSelect(): string
{
$availables = ['id', 'class', 'name', 'is_multiple', 'is_disabled', 'is_required', 'is_readonly', 'style'];
$template = '<select %s>' . PHP_EOL;
$template .= '%s';
$template .= '</select>';
$render = vsprintf($template, [
$this->renderFieldAttrs($availables),
$this->renderIndent($this->renderOptions(), 1),
]);
return $render;
}
/**
* Retourne le rendu du champs input avec ses paramètres;
* @return string Le rendu du champs input
*/
public function renderInput(): string
{
$availables = ['id', 'type', 'class', 'name', 'value', 'placeholder', 'is_autocomplete', 'is_autofocus', 'is_disabled', 'is_required', 'is_readonly', 'style'];
$template = '<input %s />';
if (is_null($this->type)) {
$this->type = 'text';
}
$render = sprintf($template, $this->renderFieldAttrs($availables));
return $render;
}
/**
* Retourne le rendu d'un champs avec son environnement
* @param string $renderField Le rendu du champs
* @return string Le rendu de l'environnement du champs
*/
public function renderWrapFieldEnvironment(string $renderField, $noindentfield = false): string
{
$render = $renderField;
$template = '';
$templateInline = '<div class="form-group row">' . PHP_EOL;
$templateInline .= '%s%s';
$templateInline .= ' <div class="col-sm-10">' . PHP_EOL;
$templateInline .= '%s';
$templateInline .= ' </div>' . PHP_EOL;
$templateInline .= '</div>' . PHP_EOL;
$templateClassic = '<div class="form-group">' . PHP_EOL;
$templateClassic .= '%s%s' ;
$templateClassic .= '%s';
$templateClassic .= '</div>' . PHP_EOL;
$templatePrefix = '<div class="input-group%s">'. PHP_EOL;
$templatePrefix .= '%s%s%s%s';
$templatePrefix .= '</div>'. PHP_EOL;
// Si prefixe ou suffixe
if (!empty($this->prefix) || !empty($this->suffix)) {
$class_size = empty($this->size) ? '' : ' input-group-' . $this->size;
$render = vsprintf($templatePrefix, [
$class_size,
$this->renderIndent($this->renderPrefix(), 1),
$this->renderIndent($render, $noindentfield ? 0 : 1),
$this->renderIndent($this->renderSuffix(), 1),
$this->renderValidationMessage()
]);
$render .= $this->renderHelp();
} else {
$render .= $this->renderHelp() . $this->renderValidationMessage();
}
// Affichage en mode inline
if ($this->is_inline && ($this->type != 'checkbox' || $this->type != 'radio')) {
$render = $this->renderIndent($render, $noindentfield ? 0 : 2);
$render = vsprintf($templateInline, [
$this->renderIndent($this->renderLabel(), 1),
$this->renderIndent($this->renderPopover(), 1),
$render,
]);
} else {
$render = $this->renderIndent($render, $noindentfield ? 0 : 1);
$render = vsprintf($templateClassic, [
$this->renderIndent($this->renderLabel(), 1),
$this->renderIndent($this->renderPopover(), 1),
$render,
]);
}
return $render;
}
/**
* Retourne le rendu d'une chaine de caractère en HTML
* @param String $string La chains de caractères à traiter
* @return String Le rendu HTML
*/
public function renderHTML($string): HtmlString
{
return new HtmlString($string);
}
/**
* Retourne le rendu de la partie aide d'un champs (sous le champs)
* @return string Le rendu de la partie aide
*/
private function renderHelp(): string
{
$render = '';
if (!empty($this->help)) {
$template = '<small class="form-text text-muted text-right mt-0">%s</small>' . PHP_EOL;
$render = sprintf($template, $this->help);
}
return $render;
}
/**
* Retoune le rendu de la partie prefixe du champs
* @return string Le rendu du prefixe
*/
private function renderPrefix(): string
{
$render = '';
if (!empty($this->prefix)) {
$template = '<div class="input-group-prepend">' . PHP_EOL;
if (preg_match('/<button.*/', $this->prefix)) {
$template .= ' %s' . PHP_EOL;
} else {
$template .= ' <div class="input-group-text">%s</div>' . PHP_EOL;
}
$template .= '</div>' . PHP_EOL;
$render = sprintf($template, $this->prefix);
}
return $render;
}
/**
* Retourne le rendu de la partie suffixe du champs
* @return string Le rendu du suffixe
*/
private function renderSuffix(): string
{
$render = '';
if (!empty($this->suffix)) {
$template = '<div class="input-group-append">' . PHP_EOL;
if (preg_match('/<button.*/', $this->suffix)) {
$template .= ' %s' . PHP_EOL;
} else {
$template .= ' <div class="input-group-text">%s</div>' . PHP_EOL;
}
$template .= '</div>' . PHP_EOL;
$render = sprintf($template, $this->suffix);
}
return $render;
}
/**
* Retourne le rendu de la popover (description du champs)
* @return string Le rendu de la popover
*/
private function renderPopover(): string
{
$render = '';
if (!empty($this->_popover)) {
$template = '<span class="text-info popup-help" data-toggle="popover" data-placement="%s" title="%s" data-content="%s">' . PHP_EOL;
$template .= ' <i class="fa fa-info-circle"></i>' . PHP_EOL;
$template .= '</span>' . PHP_EOL;
$render = vsprintf($template, [
data_get($this->_popover, 'placement', 'right'),
data_get($this->_popover, 'title', 'Informations'),
data_get($this->_popover, 'content'),
]);
}
return $render;
}
/**
* Retourne le rendu du label du champs
* @return string Le rendu du label
*/
private function renderLabel(): string
{
$render = '';
$class = '';
if ($this->is_required) {
$class .= 'required';
}
if ($this->is_inline && ($this->type != 'checkbox' || $this->type != 'radio')) {
$class .= 'col-sm-2';
}
if (!empty($this->label)) {
$template = '<label for="%s"%s>%s</label>' . PHP_EOL;
$render = vsprintf($template, [
$this->id,
strlen($class) > 0 ? ' class="' . $class . '"' : '',
$this->label
]);
}
return $render;
}
/**
* Rendu d'optiond de type checked
*
* @param string $type type de champs à rendre
* @return string Le rendu du champs
*/
private function renderCheckedOptions(string $type = 'checkbox')
{
$availables = ['id', 'class', 'name', 'value', 'is_disabled', 'is_required', 'is_readonly', 'style'];
$template = '<div class="form-check%s%s">' . PHP_EOL;
$template .= ' <input type="%s" %s%s%s/>' . PHP_EOL;
$template .= ' <label class="form-check-label" for="%s">%s</label>' . PHP_EOL;
$template .= '</div>' . PHP_EOL;
$render = "";
$current_value = old($this->name, $this->is_multiple ? $this->_values : $this->value);
$options = $this->optionsModeling();
foreach ($options as $option) {
// Gestion de la valeur
$this->value = $option->getOptionValue();
if (is_array($current_value)) {
$checked = in_array($this->value, $current_value);
} else {
$checked = $this->value == $current_value;
}
// Gestion des ID
if (!is_bool($this->indice)) {
$this->id = str_slug($this->name . '-' . $this->indice . '-' . $this->value);
} else {
$this->id = str_slug($this->name . '-' . $this->value);
}
$render .= vsprintf($template, [
$this->is_disabled ? ' disabled' : '',
$this->is_inline ? ' form-check-inline' : '',
$type,
$this->renderFieldAttrs($availables),
$option->getDatasRender(),
$checked ? ' checked' : '',
$this->id,
$option->getOptionLabel()
]);
}
return $render;
}
/**
* Modélisation des options
* Collection d'Option modélisées
*/
private function optionsModeling()
{
$options = collect();
if (is_array($this->_options)) {
$this->checkOptionsValue();
if (isset($this->_options['collect'])) {
foreach ($this->_options['collect'] as $key => $item) {
$option = new Option();
$option->setSource($item);
$option->setLabelParam(data_get($this->_options, 'text'));
$option->setValueParam(data_get($this->_options, 'value'));
$option->setDatas(data_get($this->_options, 'datas'));
$option->setClass(data_get($this->_options, 'class'));
$option->setTemplate(data_get($this->_options, 'template'));
$option->setCallback(data_get($this->_options, 'callback'));
$option->setAttributes(data_get($this->_options, 'attributes'));
$options->push($option);
}
} else {
foreach ($this->_options as $key => $item) {
$option = new Option();
$option->setSource([$key => $item]);
$options->push($option);
}
}
}
return $options;
}
/**
* Retourne le rendu d'options d'un menu déroulant select
* @return string Le rendu des options
*/
private function renderOptions(): string
{
$render = '';
$template = '<option value="%s"%s>%s</option>' . PHP_EOL;
$template_group = '<optgroup label="%s">%s</optgroup>' . PHP_EOL;
$default = '<option value=""' . ($this->is_required ? ' disabled hidden' : '') . ' selected >%s</option>' . PHP_EOL;
if (!is_null($this->placeholder)) {
$render = sprintf($default, $this->placeholder);
}
// Détection d'une collection source
if (isset($this->_options['collect'])) {
$this->checkOptionsValue();
foreach ($this->_options['collect'] as $key => $item) {
$attrs = "";
// L'élément courant correspond à la valeur du champs
$field_name = is_int($this->indice) ? $this->name . '.' . $this->indice : $this->name;
$field_value = old($field_name, $this->is_multiple ? $this->_values : $this->value);
$item_value = data_get($item, $this->_options['value']);
// Attributs data-*
if (isset($this->_options['datas']) && is_array($this->_options['datas'])) {
foreach ($this->_options['datas'] as $name => $value) {
$attrs .= $this->renderDatas([$name => data_get($item, $value)]);
}
$attrs = ' ' . trim($attrs);
}
if ((is_array($field_value) && in_array($item_value, $field_value)) ||
(!is_array($field_value) && strval($field_value) === strval($item_value))) {
$attrs .= ' selected';
}
$text = data_get($this->_options, 'text');
$callback = data_get($this->_options, 'callback');
// Gestion d'un template
if (isset($this->_options['template'])) {
// 1ère passe : ajout d'un template pour l'affichage du texte de l'option
$render .= vsprintf($template, [
data_get($item, $this->_options['value']),
$attrs,
$this->objectToString($this->_options['template'], $text, $callback, $item)
]);
} else {
$render .= vsprintf($template, [
data_get($item, $this->_options['value']),
$attrs,
$this->objectToString(null, $text, $callback, $item)
]);
}
}
} else {
foreach ($this->_options as $value => $text) {
$opt_group = '';
// Cas d'un sous niveau
if (is_array($text)) {
foreach ($text as $value_ => $text_) {
if (empty($this->name)) {
$attrs = strval($this->value) === strval($value_) ? ' selected' : '';
} else {
$attrs = strval(old($this->name, $this->value)) === strval($value_) ? ' selected' : '';
}
$opt_group .= vsprintf($template, [
$value_,
$attrs,
$text_
]);
}
$render .= vsprintf($template_group, [
$value,
$opt_group
]);
} else {
if (empty($this->name)) {
$attrs = strval($this->value) === strval($value) ? ' selected' : '';
} else {
$attrs = strval(old($this->name, $this->value)) === strval($value) ? ' selected' : '';
}
$render .= vsprintf($template, [
$value,
$attrs,
$text
]);
}
}
}
return $render;
}
/**
* Retourne le rendu d'un message d'erreur de validation
* @return string Le rendu du message
*/
private function renderValidationMessage()
{
$errors = session('errors', collect());
$render = null;
if ($errors->has($this->name)) {
$template = '<div class="invalid-feedback">%s</div>' . PHP_EOL;
$render = sprintf($template, $errors->first($this->name));
}
return $render;
}
/**
* Retourne le rendu des attributs d'un champs
* @param array $availables Liste des attributs pouvant composer le champs
* @return string Le rendu des attributs
*/
private function renderFieldAttrs(array $availables, $fixvalue = false): string
{
$attrs = get_object_vars($this);
$render = '';
$template = '%s="%s" ';
$except_empty_attr = ['value'];
foreach ($attrs as $attr => $value) {
// On traite uniquement les attributs autorisés
if (in_array($attr, $availables)) {
// On ne traite pas les attributs avec une valeur vide
if (!in_array($attr, $except_empty_attr) && empty($value)) {
continue;
}
switch ($attr) {
case 'value':
if ($fixvalue) {
$val = $this->value;
} else {
$val = $this->getValue();
}
break;
case 'class':
$val = $this->getClasses();
break;
case 'name' :
$val = $value;
// Mode indice
if (!is_null($this->indice)) {
$val .= '['. ($this->indice !== true ? $this->indice : '') .']';
}
if ($this->is_multiple) {
$val .= '[]';
}
break;
default:
if (is_bool($value)) {
$attr = str_replace('is_', '', $attr);
$val = str_replace('is_', '', $attr);
} else {
$val = $value;
}
break;
}
$render .= vsprintf($template, [$attr, $val]);
}
}
// Attributs supplémentaires
if (!is_null($this->_attributes) && is_array($this->_attributes)) {
foreach ($this->_attributes as $attr => $value) {
if (is_array($value)) {
$value_ = $this->objectToString(
data_get($value, 'template'),
data_get($value, 'attributes'),
data_get($value, 'callback'),
data_get($value, 'source')
);
} else {
$value_ = $value;
}
$render .= vsprintf($template, [$attr, $value_]);
}
}
// Ajout des datas
$render .= $this->renderDatas($this->_datas);
return trim($render);
}
/**
* Retourne le rendu avec indentation d'un texte
* @param string $text Le texte à traiter
* @param Integer $nb Le nombre d'indentation à appliquer
* @return string Le rendu avec indentation
*/
private function renderIndent($text, $nb): string
{
$indent = ' ';
$render = '';
$real_indent = '';
for ($i = 1; $i <= $nb; $i++) {
$real_indent .= $indent;
}
$lines = explode(PHP_EOL, $text);
foreach ($lines as $line) {
if (!empty($line)) {
$render .= $real_indent . $line . PHP_EOL;
}
}
return $render;
}
/**
* Retourne le rendu des attributs datas
* @param array $datas La liste des attributs data
* @return string Le rendu avec les attributs data
*/
protected function renderDatas($datas): string
{
$render = '';
if (!empty($datas) && is_array($datas)) {
$template = 'data-%s="%s" ';
foreach ($datas as $name => $value) {
if (is_array($value)) {
$value_ = $this->objectToString(
data_get($value, 'template'),
data_get($value, 'attributes'),
data_get($value, 'callback'),
data_get($value, 'source')
);
} else {
$value_ = $value;
}
$render .= vsprintf($template, [$name, $value_]);
}
}
return $render;
}
/**
* Retourne la liste de toutes les classes du champs
* @return string Les classes du champs
*/
private function getClasses(): string
{
$classes = $this->class . ' ' . $this->getValidationClass();
// Si une taille est spécifiée
if (!empty($this->size)) {
// Aucun préfixe ou suffixe
if (empty($this->prefix) && empty($this->suffix)) {
$classes .= ' ' . 'form-control-' . $this->size;
}
}
return trim($classes);
}
/**
* Retourne la classe Bootstrap de validation du champs
* @return string La classe
*/
private function getValidationClass()
{
$errors = session('errors', collect());
$class = null;
if ($errors->has($this->name)) {
$class = 'is-invalid';
} else if (!is_null($this->name) && !is_null(old($this->name))) {
$class = 'is-valid';
}
return $class;
}
/**
* Vérifie la cohérence de l'attribut Options
* @return void
*/
private function checkOptionsValue()
{
if (isset($this->_options['collect'])) {
// Exceptions sur les paramètres
if (is_array($this->_options['text']) && empty($this->_options['template'])) {
throw new \InvalidArgumentException("Le paramètre options['template'] doit être présent lorsque options['text'] est un tableau");
}
if (isset($this->_options['template']) && !is_array($this->_options['text'])) {
throw new \InvalidArgumentException("Le paramètre options['text'] doit être un tableau lorsque options['template'] est présent");
}
}
}
/**
* Retourne une valeur depuis old ou l'attribut
* @return string La valeur
*/
private function getValue()
{
$name = $this->name;
if (is_null($name)) {
return ;
}
if (!is_null($this->indice)) {
$name .= '.' . $this->indice;
}
return old($name, $this->value);
}
/**
* Retourne le rendu d'un template avec une liste de noms de colonnes
* @param string $template Le template servant au rendu
* @param string|array $display Le ou les noms de colonnes
* @param string $callback Fonction à appliquer sur la résultante
* @param Mix $item Objet source des donnés à afficher
* @param Mix $item Suppression des tags
* @return string Le rendu
*/
protected function objectToString($template = null, $displays = null, $callback = null, $item, $strip = false)
{
// Création du texte à afficher
$datas = [];
// Convertion en tableau si besoin
if (!is_iterable($displays)) {
$displays = [$displays];
}
// Traitement du tableau de valeur à afficher
foreach ($displays as $key => $display) {
$data = mixte_get($item, $display);
// Callback array
if (is_array($callback) && isset($callback[$key]) && !is_null($callback[$key])) {
$data = $callback[$key]($data);
}
$datas[] = $strip ? strip_tags($data) : $data;
}
// Traitement des % seuls pour éviter les conflits
if (!empty($template)) {
$template = preg_replace('/(%)[^0-9sd.\']/i', '%%"', $template);
}
// Traitement template & callback
if (is_string($callback)) {
if (empty($template)) {
$string = call_user_func_array($callback, $datas);
} else {
$string = vsprintf($template, $datas);
$string = $callback($string);
}
} else if (!empty($template)) {
$string = vsprintf($template, $datas);
} else {
$string = $datas[0];
}
return $string;
}
/**
* Mise à jour des attributs depuis le tableau passé en paramètre
* @param Array $attrs Liste des attributs à traiter
* @return void
*/
private function setAttrs($attrs)
{
$this->resetAttrs();
if (is_null($attrs)) {
return ;
}
// Liste des attributs autorisés
$attrs_available = array_map(function ($val) {
return trim($val, '_');
}, array_keys(get_object_vars($this)));
// Traitement des attributs
if (is_array($attrs)) {
foreach ($attrs as $attr => $value) {
if (in_array($attr, $attrs_available)) {
if (is_array($value)) {
$this->{'_' . $attr} = $value;
} else {
$this->{$attr} = $value;
}
} else {
throw new \InvalidArgumentException("Le paramètre [" . $attr . "] n'est pas pris en charge");
}
}
} else {
throw new \InvalidArgumentException("Type de paramètre invalide. Attendu : Tableau");
}
// Traitement de l'ID
if (is_null($this->id)) {
$this->id = 'field-' . $this->name;
}
if (!is_null($this->indice)) {
$this->id = $this->id . '-' . $this->indice;
}
$this->id = str_slug($this->id);
// Traitement de la classe
$this->class = 'form-control ' . $this->class;
$this->class = trim($this->class);
// Traitement sur la valeur
if (is_null($this->value)) {
$this->value = '';
}
// Traitement sur la taille
if (!empty($this->size) && !in_array($this->size, ['sm', 'lg'])) {
throw new \InvalidArgumentException("La valeur pour le paramètre « size » est invalide");
}
}
/**
* Réinitialisation des attributs de constructions
* @return void
*/
private function resetAttrs()
{
$attrs = array_keys(get_object_vars($this));
foreach ($attrs as $attr) {
if (preg_match('/^_.*/', $attr)) {
$this->{$attr} = [];
} else if (preg_match('/^is_.*/', $attr)) {
$this->{$attr} = false;
} else {
$this->{$attr} = null;
}
}
}
}
<?php
namespace Goldenscarab\Modulus\Service\Field\Facade;
use Illuminate\Support\Facades\Facade;
class Field extends Facade
{
protected static function getFacadeAccessor()
{
return 'Field';
}
}
<?php
namespace Goldenscarab\Modulus\Service\Field;
use Illuminate\Support\Facades\Request;
use Goldenscarab\Modulus\Service\Field\Compose\FieldBt4;
use Goldenscarab\Modulus\Service\Field\Compose\Field2Bt4;
class Field
{
/**
* Retourne un champs code source
*
* @param array $attrs Attributs du champs
* @return string Le HTML du champs code source
*/
public function code($attrs): string
{
$field = new FieldBt4($attrs);
$code = $field->renderCodeEditor();
$render = $field->renderWrapFieldEnvironment($code, true);
return $field->renderHTML($render);
}
/**
* Retourne un champs select de choix de publication
* @param boolean $status La valeur du champs
* @return string Le HTML du champs de publication
*/
public function publish($status): string
{
$render = $this->select([
'label' => 'Visibilité',
'name' => 'status',
'prefix' => '<i class="fa fa-globe"></i>',
'value' => $status,
'is_required' => true,
'options' => [
0 => 'Brouillon',
1 => 'En ligne'
]
]);
return $render;
}
/**
* Retourne un champs de recherche dans une liste
* @return string Le HTML du champs de recherche
*/
public function search(): string
{
$render = $this->input([
'name' => 'search',
'value' => Request::get('search'),
'class' => 'form-control-sm',
'placeholder' => 'Recherche...',
'suffix' => '<button class="btn btn-outline-secondary btn-sm" type="submit" id="button-search"><i class="fa fa-search"></i></button>',
]);
return $render;
}
/**
* Retourne un champs select pour choisir le nombre d'éléments d'une liste à afficher
* @return string Le HTML du menu déroulant
*/
public function perpage(): string
{
$render = $this->select([
'label' => 'Lignes par page',
'attributes' => ['onchange' => 'return document.location.href = this.value;'],
'value' => Request::fullUrlWithQuery(["perpage" => Request::get('perpage')]),
'class' => 'ml-2',
'placeholder' => 'Choisir...',
'options' => [
Request::fullUrlWithQuery(["perpage" => 10]) => '10',
Request::fullUrlWithQuery(["perpage" => 15]) => '15',
Request::fullUrlWithQuery(["perpage" => 50]) => '50',
Request::fullUrlWithQuery(["perpage" => 100]) => '100',
Request::fullUrlWithQuery(["perpage" => 200]) => '200',
Request::fullUrlWithQuery(["perpage" => 500]) => '500',
Request::fullUrlWithQuery(["perpage" => 1000]) => '1000'
]
]);
return $render;
}
/**
* Retourne un champs file avec son environnement
* @param array $attrs Les attributs du champs
* @return string le HTML du champs et de son environnement
*/
public function file($attrs = []): string
{
$field = new FieldBt4($attrs);
$file = $field->renderFile();
$render = $field->renderWrapFieldEnvironment($file);
return $field->renderHTML($render);
}
/**
* Retourne un champs pdf avec son environnement
* @param array $attrs Les attributs du champs
* @return string le HTML du champs et de son environnement
*/
public function pdf($attrs = []): string
{
$field = new FieldBt4($attrs);
$image = $field->renderPdf();
$render = $field->renderWrapFieldEnvironment($image);
return $field->renderHTML($render);
}
/**
* Retourne un champs video avec son environnement
* @param array $attrs Les attributs du champs
* @return string le HTML du champs et de son environnement
*/
public function video($attrs = []): string
{
$field = new FieldBt4($attrs);
$image = $field->renderVideo();
$render = $field->renderWrapFieldEnvironment($image);
return $field->renderHTML($render);
}
/**
* Retourne un champs image avec son environnement
* @param array $attrs Les attributs du champs
* @return string le HTML du champs et de son environnement
*/
public function image($attrs = []): string
{
$field = new FieldBt4($attrs);
$image = $field->renderImage();
$render = $field->renderWrapFieldEnvironment($image);
return $field->renderHTML($render);
}
/**
* Retourne un champs toggle avec son environnement
* @param array $attrs Les attributs du champs
* @return string Le HTML du champs et de son environnement
*/
public function toggle($attrs = []): string
{
$field = new FieldBt4($attrs);
$toggle = $field->renderToggle();
$render = $field->renderWrapFieldEnvironment($toggle);
return $field->renderHTML($render);
}
/**
* Retourne un champs radio avec son environnement
* @param array $attrs Les attributs du champs
* @return string Le HTML du champs et de son environnement
*/
public function radio($attrs = []): string
{
$field = new FieldBt4($attrs);
$radio = $field->renderRadio();
$render = $field->renderWrapFieldEnvironment($radio);
return $field->renderHTML($render);
}
/**
* Retourne un champs checkbox avec son environnement
* @param array $attrs Les attributs du champs
* @return string Le HTML du champs et de son environnement
*/
public function checkbox($attrs = []): string
{
$field = new FieldBt4($attrs);
$checkbox = $field->renderCheckbox();
$render = $field->renderWrapFieldEnvironment($checkbox);
return $field->renderHTML($render);
}
/**
* Retourne un champs range avec son environnement
* @param array $attrs Les attributs du champs
* @return string Le HTML du champs et de son environnement
*/
public function range($attrs = []): string
{
$field = new FieldBt4($attrs);
$range = $field->renderRange();
$render = $field->renderWrapFieldEnvironment($range);
return $field->renderHTML($render);
}
/**
* Retourne un champs pot de miel avec son environnement
* @return string Le HTML du champs et son environnement
*/
public function honeypot(): string
{
$field = new FieldBt4([
'name' => 'my-name',
'class' => 'd-none'
]);
$input = $field->renderInput();
$render1 = $field->renderWrapFieldEnvironment($input);
$field = new FieldBt4([
'name' => 'my-time',
'class' => 'd-none',
'value' => encrypt(time())
]);
$input = $field->renderInput();
$render2 = $field->renderWrapFieldEnvironment($input);
return $field->renderHTML($render1 . $render2);
}
/**
* Retourne un champs textarea avec son environnement
* @param array $attrs Les attributs du champs
* @return string Le HTML du champs et de son environnement
*/
public function textarea($attrs = []): string
{
$field = new FieldBt4($attrs);
$textarea = $field->renderTextarea();
$render = $field->renderWrapFieldEnvironment($textarea);
return str_replace('[CR]', PHP_EOL, $field->renderHTML($render));
}
/**
* Retourne un champs select avec son environnement
* @param array $attrs Les attributs du champs
* @return string Le HTML du champs et de son environnement
*/
public function select($attrs = []): string
{
$field = new FieldBt4($attrs);
$select = $field->renderSelect();
$render = $field->renderWrapFieldEnvironment($select);
return $field->renderHTML($render);
}
/**
* Retourne un champs input avec son environnement
* @param array $attrs Les attributs du champs
* @return string Le HTML du champs et de son environnement
*/
public function input($attrs = []): string
{
$field = new FieldBt4($attrs);
$input = $field->renderInput();
$render = $field->renderWrapFieldEnvironment($input);
return $field->renderHTML($render);
}
public function input2($attrs = []): string
{
$field = new Field2Bt4($attrs);
$input = $field->renderInput();
$render = $field->renderWrapFieldEnvironment($input);
return $field->renderHTML($render);
}
}
<?php
namespace Goldenscarab\Modulus\Service\Field;
use Illuminate\Support\ServiceProvider;
use Illuminate\Foundation\AliasLoader;
class FieldServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->bind('Field', function() {
return new \Goldenscarab\Modulus\Service\Field\Field;
});
}
}
<?php
namespace Goldenscarab\Modulus\Service\Field;
use \Illuminate\Support\HtmlString;
class Option extends FieldBt4 {
private $is_dynamic;
private $source;
private $label_param;
private $value_param;
private $datas;
private $template;
private $attributes;
private $class;
private $callback;
public function __construct()
{
}
public function setSource($source)
{
$this->source = $source;
}
public function setLabelParam($value)
{
$this->label_param = $value;
}
public function setValueParam($value)
{
$this->value_param = $value;
}
public function setDatas($value)
{
$this->datas = $value;
}
public function setTemplate($value)
{
$this->template = $value;
}
public function setAttributes($value)
{
$this->attributes = $value;
}
public function setClass($value)
{
$this->class = $value;
}
public function setCallback($value)
{
$this->callback = $value;
}
public function getOptionValue()
{
if (is_null($this->value_param)) {
return collect($this->source)->keys()->first();
} else {
return $this->objectToString(
null,
$this->value_param,
$this->callback,
$this->source
);
}
}
public function getOptionLabel()
{
if (is_null($this->label_param)) {
return collect($this->source)->first();
} else {
return $this->objectToString(
$this->template,
$this->label_param,
$this->callback,
$this->source
);
}
}
public function getDatasRender()
{
$render = '';
if (!is_null($this->datas)) {
$render = ' ';
foreach ($this->datas as $attr => $value) {
$render .= $this->renderDatas([$attr => data_get($this->source, $value)]);
}
}
return $render;
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment