Creare un nuovo repository per Composer

Per il corretto funzionamento di progetti php è necessario, normalmente, adoperare librerie esterne.

Per farlo si utilizza sovente composer.

Questo è un gestore di dipendenze di librerie che consente di indicare quali librerie utilizzare e il programma composer le scaricherà in automatico dal proprio repository.

Le librerie vengono indicate in un file chiamato composer.json.

Un esempio di questo file è il seguente, utilizzato in un progetto con yii2:

{
    "name": "yiisoft/yii2-app-advanced",
    "description": "Yii 2 Advanced Project Template",
    "keywords": ["yii2", "framework", "advanced", "project template"],
    "homepage": "https://www.yiiframework.com/",
    "type": "project",
    "license": "BSD-3-Clause",
    "support": {
        "issues": "https://github.com/yiisoft/yii2/issues?state=open",
        "forum": "https://www.yiiframework.com/forum/",
        "wiki": "https://www.yiiframework.com/wiki/",
        "irc": "irc://irc.freenode.net/yii",
        "source": "https://github.com/yiisoft/yii2"
    },
    "minimum-stability": "stable",
    "require": {
        "php": ">=7.4.0",
        "yiisoft/yii2": "~2.0.45",
        "yiisoft/yii2-bootstrap5": "~2.0.2",
        "yiisoft/yii2-symfonymailer": "~2.0.3",
        "yiisoft/yii2-jui": "~2.0.0",
        "pzavoli71/yii2-widget-datetimepicker": "*",
        "yiisoft/yii2-bootstrap5": "@dev"
    },
    "require-dev": {
        "yiisoft/yii2-debug": "~2.1.0",
        "yiisoft/yii2-gii": "~2.2.0",
        "yiisoft/yii2-faker": "~2.0.0",
        "phpunit/phpunit": "~9.5.0",
        "codeception/codeception": "^5.0.0 || ^4.0",
        "codeception/lib-innerbrowser": "^3.0 || ^1.1",
        "codeception/module-asserts": "^3.0 || ^1.1",
        "codeception/module-yii2": "^1.1",
        "codeception/module-filesystem": "^2.0 || ^1.1",
        "codeception/verify": "^2.2",
        "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4",
        "yiisoft/yii2-jui": "~2.0.0",
        "pzavoli71/yii2-widget-datetimepicker": "dev-master",   
        "kartik-v/yii2-datecontrol": "dev-master",
        "kartik-v/yii2-widgets": "@dev",
        "kartik-v/yii2-widget-datepicker": "dev-master",
        "twbs/bootstrap-icons":"*" ,        
        "yiisoft/yii2-bootstrap5": "@dev"
    },
    "autoload-dev": {
        "psr-4": {
            "common\\tests\\": ["common/tests/", "common/tests/_support"],
            "backend\\tests\\": ["backend/tests/", "backend/tests/_support"],
            "frontend\\tests\\": ["frontend/tests/", "frontend/tests/_support"]
        }
    },
    "config": {
        "allow-plugins": {
            "yiisoft/yii2-composer" : true
        },
        "process-timeout": 1800,
        "fxp-asset": {
            "enabled": false
        }
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://asset-packagist.org"
        }
    ]
}

La parte più importante è quella indicata con “require” che contiene l’elenco delle librerie con le relative versioni.

Può capitare di dover utilizzare una libreria non fornita, oppure di doverne utilizzare una modificata da una libreria esistente.

Composer preleva le librerie da progetti github, pertanto se si deve modificare una libreria già esistente è necessario effettuarne un fork.

Nel repository github corrispondente è necessario inserire un file denominato composer.json, così fatto:

{
    "name": "pzavoli71/yii2-widget-datetimepicker",
    "description": "An updated version of kartik-v datetimepicker to enable dd/mm/yyyy hh:ii format datetime",
    "keywords": [
        "yii2",
        "extension",
        "widget",
        "select2",
        "form",
        "datetime",
        "picker",
        "jquery",
        "plugin"
    ],
    "homepage": "https://github.com/pzavoli71/yii2-widget-datetimepicker",
    "type": "yii2-extension",
    "license": "BSD-3-Clause",
    "authors": [
        {
            "name": "Paride Zavoli",
            "email": "paride.zavoli71@gmail.com",
            "homepage": "https://fattodate.org"
        }
    ],
    "require": {
        "kartik-v/yii2-krajee-base": ">=3.0.4"
    },
    "autoload": {
        "psr-4": {
            "kartik\\datetime\\": "src"
        }
    },
    "extra": {
        "branch-alias": {
            "dev-master": "1.5.x-dev"
        }
    }
}

Successivamente si deve caricare il progetto nuovo nel repository di composer che si trova nel sito Packagist.org.

Qui è necessario registrarsi e successivamente premere su https://packagist.org/packages/submit indicando nel campo di testo il path del progetto github che contiene la libreria e il file composer.json.

A quel punto il progetto è pronto per essere utilizzato come libreria.

Creazione progetto yii2

Per la creazione di un nuovo progetto yii2 si può utilizzare il comodo comando composer.

Il problema è che composer funziona, attualmente, con la versione di php fino alla 8.1, pertanto se qualcuno avesse installato la versione più recente, questa non funzionerà per la creazione di un nuovo progetto.

Si può ovviare a questo facendo in modo di lanciare composer con una versione di php precedente.

Per farlo, è sufficiente posizionarsi all’interno del direttorio dove si intende generare il progetto e poi dare il seguente comando:

c:\php\php7.4.33\php.exe c:\ProgramData\ComposerSetup\bin\composer.phar create-project yiisoft/yii2-app-advanced advanced

intendendo che php sia nel direttorio c:\php\php7.4.33.

Questo farà sì che composer usi la versione precedente di php e il tutto funzionerà.

p.s. un comando per aggiornare la versione di composer è il seguente:

composer self-update --1

Per ripristinare composer alla nuova versione:

composer self-update --2

Per creare un progetto secondo nuovi std si può usare come template di progetto il seguente:

composer create-project pzavoli71/yii2-app-advanced -s dev provina

il quale creerà il progetto nel direttorio “provina”.

Una volta eseguito il comando ci si dovrà spostare nel direttorio “provina” e lanciare il seguente comando:

php init

il quale si limiterà a generare alcuni file di servizio che non vengono salvati nel repository (params-local.php, ecc.) che andranno configurati per l’accesso al db,per la e-mail, ecc.

Prima di lanciare il comando che creerà le tabelle di base nel DB è necessario assicurarsi che quando si lancino comandi console, questi non utilizzino parametri legati al WEB. In particolare, è necessario rimuovere il richiamo al main.php dentro al file yii, commentando la relativa riga:

$config = yii\helpers\ArrayHelper::merge(
//require DIR . '/common/config/main.php',
require DIR . '/common/config/main-local.php',
require DIR . '/console/config/main.php',
require DIR . '/console/config/main-local.php'
);

Infatti nel file main.php c’è solitamente il parametro che configura la request, che in modalità console non funziona:

    'request' => [
        'parsers' => [
            'multipart/form-data' => 'yii\web\MultipartFormDataParser'
        ],
    ],

Ora si possono creare le tabelle di base che serviranno per la gestione degli utenti e dei permessi, lanciando il comando:

php yii migrate

il quale si limiterà a cercare comandi nel direttorio console/migrations e li lancerà uno per volta.

Configurare il framework Yii2 in Ubuntu

L’installazione di Yii2 si esegue utilizzando “composer“. Per installare Composer si esegua il seguente comando:

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

In windows si può usare il comodo comando https://getcomposer.org/Composer-Setup.exe

Dopo aver installato composer è preferibile fare l’update:

composer self-update

Il comando per scaricare Yii2 si occupa di creare anche un progetto di base:

composer create-project --prefer-dist yiisoft/yii2-app-basic basic

Se il comando precedente restituisce l’errore che non è installato l’estensione php-dom, si può installare tale estensione con il comando:

sudo apt install php8.0-dom

Allo stesso modo, potrebbe mancare anche l’estensione php-curl, installabile con il seguente comando:

sudo apt install php8.0-curl

Il comando precedente predisporrà un ambiente con il framework Yii all’interno del direttorio basic.

Istruzioni più dettagliate possono essere trovate alla pagina: https://www.yiiframework.com/doc/guide/2.0/en/start-installation

Per verificare se tutto funziona si può usare il comando seguente:

php yii serve

il quale lancia un server WEB minimale che può essere interrogato all’indirizzo http://localhost:8080/

Nella pagina dei contatti raggiungibile dalla home del sito potrebbe presentarsi un problema con una libreria mancante (gd). In tal caso la libreria può essere installata con il seguente comando:

sudo apt install php8.0-gd

e successivamente va abilitata la relativa estensione all’interno del php.ini, scommentando la riga che contiene extension=gd nel file /etc/php/8.0/apache2/php.ini o anche nel file /etc/php/8.0/cli/php.ini.

Se si desidera installare anche il framework jui per i widget in stile jquery ui, si deve lanciare il comando:

composer require --prefer-dist yiisoft/yii2-jui "*"

dall’interno del direttorio basic.

La stessa cosa va fatta per aggiungere le estensioni widgets. Invece di lanciare a mano il comando composer, è sufficiente inserire le seguenti linee all’interno del file basic/composer.json:

    "yiisoft/yii2-bootstrap5": "@dev",
    "yiisoft/yii2-jui": "*",
    "kartik-v/yii2-datecontrol": "@dev",
    "kartik-v/yii2-widgets": "@dev",
    "kartik-v/yii2-widget-datepicker": "dev-master",
    "twbs/bootstrap-icons":"*" 

e lanciare il comando (dal direttorio basic)

composer update

DatePicker utilizza bootstrap 5, che va instanziato con la seguente riga all’interno di basic/config/params.php

'bsVersion' => '5.x'

Va configurato anche il modulo datecontrol, aggiungendo le seguenti righe (dentro web.php) prima di ‘params’ => …

'modules'    => [
    'datecontrol' => [
        'class'          => 'kartik\datecontrol\Module',
        'widgetSettings' => [
            'displaySettings' => [
                kartik\datecontrol\Module::FORMAT_DATE     => 'dd-MM-yyyy',
                kartik\datecontrol\Module::FORMAT_TIME     => 'hh:mm:ss a',
                kartik\datecontrol\Module::FORMAT_DATETIME => 'dd-MM-yyyy hh:mm:ss a',
            ],
            // format settings for saving each date attribute (PHP format example)
            'saveSettings'    => [
                kartik\datecontrol\Module::FORMAT_DATE     => 'php:U', // saves as unix timestamp
                kartik\datecontrol\Module::FORMAT_TIME     => 'php:H:i:s',
                kartik\datecontrol\Module::FORMAT_DATETIME => 'php:Y-m-d H:i:s',
            ],
        ]
    ], 
],    

le quali indicano al sistema quale deve essere la formattazione per i campi Date e DateTime sia in maschera che durante il salvataggio.

Per sicurezza, ho aggiunto, sempre all’interno di web.php, nell’area components le seguenti righe:

    'formatter' => [
       'dateFormat' => 'dd-MM-Y',
       'datetimeFormat' => 'dd-MM-Y H:i:s',
       'timeFormat' => 'H:i:s',

       'locale' => 'it-IT', //your language locale
       'defaultTimeZone' => 'Europe/Rome', // time zone
    ],  

yii2::DatePicker utilizza bootstrap5 e di conseguenza font-awesome5.

Pertanto, per farlo funzionare è necessario inserire nel layout di base delle views (views/layouts/main.php), nella sezione head il seguente link:

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.3.1/css/all.css"/>

A questo punto si possono utilizzare i datepicker di jquery ui all’interno delle pagine, con il seguente comando:

<?= $form->field($model, 'DtCreazione')->widget(DateControl::classname(), [
    'displayFormat' => 'php:d-M-Y H:i:s',
    'type'=>DateControl::FORMAT_DATETIME
    ]); ?>