<commit_before># Menu Package for Laravel

[![Latest Version on Packagist][ico-version]][link-packagist]
[![Build Status][ico-travis]][link-travis]
[![Coverage Status][ico-scrutinizer]][link-scrutinizer]
[![Circle CI][ico-circle]](https://circleci.com/gh/code4interactive/menu/tree/master)
[![Total Downloads][ico-downloads]][link-downloads]


## Install

Via Composer

``` bash
composer require code4interactive/menu
php artisan vendor:publish --provider="Code4\Menu\MenuServiceProvider"
```

## Usage



Komponent obsługujący formularze pozwala uprościć kod HTML oraz kodowanie związane z repopulacją pól np. przy edycji.

Definiowanie formularza zaczyna się od pliku konfiguracyjnego w formacie YAML. Może od znajdować się w dowolnym miejscu w katalogu app/.

Ścieżka używana w przykładach poniżej: **app/Sciezka/Do/Pliku/editUser.yml**


```
#!yaml
email:
  type: email
  attributes:
    class: form-control
    placeholder: Adres email

password:
  type: password
  attributes:
    class: form-control
    placeholder: Hasło
    autocomplete: off

role:
  name: role[]
  type: select
  attributes:
    class: form-control chosen-select m-b
    multiple:
    data-placeholder: Wybierz role ...
  options:
    el1: opis1
    el2: opis2
    el3: opis3
  option-keys: [id, name]
```

Następnie w kontrolerze należy utworzyć instancję klasy C4Form wskazując plik konfiguracyjny:


```
#!php
<?php
$form = new C4Form('Sciezka/Do/Pliku/editUser');
//LUB
$form = new C4Form();
$form->load('Sciezka/Do/Pliku/editUser');
```

C4Form jest resolvowany przez IoC Laravela więc można go zainicjalizować przekazując go np. w parametrze metody kontrolera:


```
#!php
<?php
public function edit(C4Form $form)
{
   $form->load('Sciezka/Do/Pliku/editUser');
}
```
Mając instancjonowany obiekt klasy C4Form możemy na nim wykonywać modyfikacje wskazane w opisach elementów. Np. ustalanie opcji elementu select. Pierwsze wywołanie get() na obiekcie powoduje utworzenie i zapamiętanie wewnątrz obiektu instancji żądanego elementu. Np:

```
#!php
<?php
$form = new C4Form();
$form->load('Sciezka/Do/Pliku/editUser');
$form->get('role')->options(['wartosc1'=>'opis 1', 'wartosc2'=>'opis 2']);
```


Kolejnym krokiem jest przekazanie obiektu do widoku a następnie wyświetlanie pól w kodzie HTML:

```
#!html

<div class="form-group">
  <label class="col-lg-2 control-label">Email</label>
  <div class="col-lg-10">{!!$form->get('email')!!}</div>
</div>
```


## Plik konfiguracyjny ##

```
#!yaml
email:                         //ID pola
  id: form-email
  name: form-email
  type: email
  value: <EMAIL>
  attributes:
    class: form-control
    placeholder: Adres email
```

ID pola musi być unikalne dla pliku konfiguracyjnego ponieważ służy do odwoływania się do tego pola. Pozostałe ustawienia:

 - id: ID elementu HTML (jeżeli nie zostanie ustawione użyte będzie ID pola)

 - name: Name elementu (jeżeli nie zostanie ustawione użyte będzie ID pola)

 - type: typ elementu html. Lista typów na dole strony.

 - value: domyślna wartość pola (jeżeli jest typu bool - zostanie przekonwertowane przy renderingu pola do (string) czyli "1" dla true i "0" dla false)

 - attributes: Sekcja atrybutów elementu. W ramach tej sekcji można dodawać dowolną ilość atrybutów które zostaną wyświetlone w znaczniku html w formie klucz="wartosc" lub sam "klucz". Np:

```
#!yaml
test:
  type: select
  attributes:
    class: form-control chosen-select
    multiple:
    data-placeholder: Wybierz role ...
```
zostanie wyświetlone jako:

```
#!html
<select id="test" name="test" class="form-control chosen-select" multiple="" data-placeholder="Wybierz role ...">
```




<commit_msg>Updated readme (not finished)<commit_after># Menu Package for Laravel

[![Latest Version on Packagist][ico-version]][link-packagist]
[![Build Status][ico-travis]][link-travis]
[![Coverage Status][ico-scrutinizer]][link-scrutinizer]
[![Circle CI][ico-circle]](https://circleci.com/gh/code4interactive/menu/tree/master)
[![Total Downloads][ico-downloads]][link-downloads]


## Install

Via Composer

``` bash
composer require code4interactive/menu
php artisan vendor:publish --provider="Code4\Menu\MenuServiceProvider"
```

## Usage


Komponent obsługujący formularze pozwala uprościć kod HTML oraz kodowanie związane z repopulacją pól np. przy edycji.

Definiowanie formularza zaczyna się od pliku konfiguracyjnego w formacie YAML. Może od znajdować się w dowolnym miejscu w katalogu app/.

Ścieżka używana w przykładach poniżej: **app/Sciezka/Do/Pliku/editUser.yml**


```
#!yaml
email:
  type: email
  roles: required
  attributes:
    class: form-control
    placeholder: Adres email

password:
  type: password
  attributes:
    class: form-control
    placeholder: <PASSWORD>ło
    autocomplete: off

role:
  name: role[]
  type: select
  attributes:
    class: form-control chosen-select m-b
    multiple:
    data-placeholder: Wybierz role ...
  options:
    el1: opis1
    el2: opis2
    el3: opis3
  option-keys: [id, name]
```

### Objekt ###

Formularz tworzymy przez stworzenie własnej klasy dziedziczącej po AbstractForm. 
Pozwala to na konfigurację dodatkowych opcji związanych nazewnictwem pól, konfiguracją własnych walidatorów itp. 


```
#!php

<?php

use Code4\Forms\AbstractForm;

class CreateUserForm extends AbstractForm {

    public function __construct() {
        parent::__construct();
        $this->loadFromConfigYaml('Sciezka/Do/Pliku/editUser.yml');
    }

}

```

Dla prostych formularzy, możemy utworzyć 'inline' obiekt z AbstractForm:

```
#!php

<?php
  $form = new AbstractForm();
  $form->loadFromConfigYaml('Sciezka/Do/Pliku/editUser.yml');
  
  if (!$form->validate($request)) {
    return $form->response();
  }
  
```


Dla bardzo prostych formularzy z polami utworzonymi recznie w widoku nie trzeba tworzyć pliku konfiguracyjnego:

```
#!php

<?php
  $form = new AbstractForm();
  if (!$form->validate($request, ['email' => 'required', 'password' => 'required'])) {
    return $form->response();
  }
  
```



### Widok ###
```
#!html

<div class="form-group">
  <label class="col-lg-2 control-label">Email</label>
  <div class="col-lg-10">{!!$form->get('email')!!}</div>
</div>
```


## Plik konfiguracyjny ##

```
#!yaml
email:
  id: form-email
  name: form-email
  type: email
  value: <EMAIL>
  rules: required|min:10
  attributes:
    class: form-control
    placeholder: Adres email
```

ID pola musi być unikalne dla pliku konfiguracyjnego ponieważ służy do odwoływania się do tego pola. Pozostałe ustawienia:

 - id: ID elementu HTML 

 - name: Name elementu (jeżeli nie zostanie ustawione użyte będzie ID pola)

 - type: typ elementu html. Lista typów na dole strony.

 - value: domyślna wartość pola (jeżeli jest typu bool - zostanie przekonwertowane przy renderingu pola do (string) czyli "1" dla true i "0" dla false)

 - attributes: Sekcja atrybutów elementu. W ramach tej sekcji można dodawać dowolną ilość atrybutów które zostaną wyświetlone w znaczniku html w formie klucz="wartosc" lub sam "klucz". Np:

```
#!yaml
test:
  type: select
  attributes:
    class: form-control chosen-select
    multiple:
    data-placeholder: Wybierz role ...
```
zostanie wyświetlone jako:

```
#!html
<select name="test" class="form-control chosen-select" multiple="" data-placeholder="Wybierz role ...">
```





{'fraction_non_alphanumeric': 0.12337395590853074, 'fraction_numerical': 0.005751061207722854, 'mean_word_length': 4.250898634076204, 'pattern_counts': {'":': 0, '<': 26, '<?xml version=': 0, '>': 37, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 6, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5114915', 'n_tokens_mistral': 2796, 'n_tokens_neox': 2805, 'n_words': 717}