Upload – download files

per salvare un file inviato tramite form:

$req->validate([
'file' => 'required|mimes:csv,txt,xlx,xls,pdf,jpg,jpeg|max:2048'
]);
$filePath = $req->file('file')->storeAs('uploads', $fileName, 'public');

il file viene caricato nella cartella:

\storage\app\public\uploads

come definito nel file di configurazione:

\config\filesystems.php

per rendere disponibile il file per il download:

php artisan storage:link

crea un link da public/storage a storage/app/public

come configurato nella sezione links di filesystems.php

il link al file caricato si può generare con:

echo asset('storage/file.txt');

o generare il file come risposta nel controller:

use Illuminate\Support\Facades\Storage;
return Storage::download('file.jpg', $name, $headers);

in questo caso specificando il “nome file” che lo maschera, o forzando diversi headers

Laravel Queue

php artisan queue:table

crea la migration per creare la tabella jobs.

Creare il job worker:

php artisan make:job ProcessTPlinkSendSms

crea il job dentro app/Jobs/ProcessTPlinkSendSms.php

e lo fai partire con:

php artisan queue:work

Per non dover far partire il worker a mano e tenerlo aperto si può installare supervisor:

sudo apt-get install supervisor

e creiamo la configurazione:

cd /etc/supervisor/conf.d

laravel-queue-emails.conf

e ci incolliamo:

[program:yacatechEmailsQueue]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/sites/yacatech/artisan queue:work --queue=emails database --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/sites/yacatech/storage/logs/emails-worker.log
stopwaitsecs=30

E far partire i processi con:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start all
sudo supervirorctl status

Invio SMS da router TP-link

Inviare sms usando questa libreria: https://github.com/plewin/tp-link-modem-router

clona il repository ed entra nella cartella

installa le dipendenze con

sudo npm install -g yarn
yarn install

creiamo il file di configurazione

cp config.example.json src/config.json

e lo andiamo a modificare con i parametri che ci interessano

nano config.json

e infine inviare un sms con:

./sms-send.js numero "messaggio"

mentre per accedere all’interfaccia web:

impostare l’ip sulla config

"api_listen_host": "0.0.0.0",

e lanciare:

./api-bridge.js

per poi accedere da:

http://ip:3000

mandare sms da php

basta chiamare il file passando i parametri richiesti:

$phone = $request->input(‘phone’);
$text = $request->input(‘text’);

$ip = '192.168.1.197';
$login = 'admin';
$password = 'admin';
$output = array();
$result_code = 0;
$return = null;
$js_path = public_path() . "\\tp-link-modem-router-master\\sms-send.js";        
              
$params = "--url=\"http://" .$ip."\"";
$params .= " --login=\"" .$login."\"";
$params .= " --password=\"" .$password."\"";
$command = "node \"".$js_path."\""." ".$params." ".$phone." \"".$text."\"";

if (exec($command, $output , $result_code)==false)          
        {
        return "Error";
        }
        else
        {
            $ret_text = "datetime:".date("Y-m-d H:i:s")."\n";
            $line_cnt = 0;
            foreach ($output as $line)
            {
                $ret_text.="[".$line_cnt."] => ".$line."\n";
                $line_cnt +=1;
            }
            $ret_text.="result_code: ".$result_code;

            return $ret_text;        
        }      

Molti a molti

Per creare un legame molti a molti serve innanzitutto una tabella che leghi i due modelli, quindi vai di

MIGRATION

Schema::create('destination_user', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
        $table->foreignId('destination_id')->constrained()->onUpdate('cascade')->onDelete('cascade');
        $table->timestamps();                                    
        $table->softDeletes();              
    });

quindi aggiorniamo i:

MODEL

class User extends Authenticatable
{
    public function destinations()
    {
        return $this->belongsToMany(Destination::class);
    }
}
class Destination extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

e ora modifichiamo i blade:

CREATE BLADE

<div class="row mb-3" style="display: none" id="destinations_select">
  <label for="destinations_id" class="col-md-4 col-form-label text-md-right">{{ __('Destinations access') }}</label>

<div class="col-md-6">                       
 <select name="destinations_id" id="destinations_id" multiple class="form-select" >    
   @foreach($array['destinations'] as $destination)                                    
     <option value="{{$destination->id}}"  @if ($array['filter']->input('destinations_id') == $destination->id) selected @endif >
      {{ __($destination->name) }}</option>                                    
   @endforeach
 </select> 
</div>
</div> 

EDIT BLADE

<select name="destinations_id[]" id="destinations_id" multiple class="form-select" >    
 @foreach($array['destinations'] as $destination) 
  <option value="{{$destination->id}}" 
     @foreach ($array['user']->destinations->all() as $us_destination)  
        @if ($destination->id == $us_destination->id) selected @endif 
     @endforeach 
  >{{__($destination->name)}}</option> 
 @endforeach 
</select>

STORE CONTROLLER

$user = new User($input);
$user->push();    

UPDATE CONTROLLER

$user->destinations()->sync($input['destinations_id']);

Inviare mail con laravel

creare il mailable in app/Mail con:

php artisan make:mail preRegistration

in content cambiamo la view con una creata da noi:

return new Content(
view: 'preregistrations.mail',
);

nel costruttore definiamo le variabili da “passare” al blade per personalizzare la mail:

public function __construct(
        public \App\Models\Preregistration $preregistration,            
)
{}

aggiungere la mail al controller:

use App\Mail\preRegistration;
use Illuminate\Support\Facades\Mail;

e per inviare:

Mail::to($preregistration->email)->queue(
    (new \App\Mail\preRegistration($preregistration))->afterCommit()
   );

AfterCommit serve per attendere che il record sia salvato/modificato prima di inviare la mail, in modo da inviarla con i dati aggiornati.

Usare queue per accordare l’invio, o send per inviare instantaneamente ( potrebbe rallentare il caricamento della pagina )

Select multiplo

Serve un select con più opzioni selezionabili?

Lato Blade:

<select id="roles" name="role_id[]" multiple class="form-select">
  @foreach($array['roles'] as $role)
  <option value="{{$role->id}}">{{$role->name}}</option>
  @endforeach
</select>

e nel controller:

$user->roles()->sync($request['role_id']);

NTFS errori e ripari

Ho avuto dei problemini col mio hard disk esterno usb formattato in NTFS per poter passare file da ubuntu a Windows.

Proviamo così:

Installare i tool:

sudo apt-get install ntfs-3g

ed eseguire:

sudo ntfsfix /dev/sdb2

l’output è:

Mounting volume... OK
Processing of $MFT and $MFTMirr completed successfully.
Checking the alternate boot sector... OK
NTFS volume version is 3.1.
NTFS partition /dev/sdb2 was processed successfully.

Ma la mia cartella misteriosa ancora non si può rimuovere…

Proviamo con le opzioni per il fix:

sudo ntfsfix -b -d /dev/sdb2
Mounting volume... OK
Processing of $MFT and $MFTMirr completed successfully.
Checking the alternate boot sector... OK
NTFS volume version is 3.1.
Going to un-mark the bad clusters ($BadClus)... No bad clusters...OK
NTFS partition /dev/sdb2 was processed successfully.

niente… la mia cartella resta in un limbo dove non si può nè usare nè cancellare…