LaraKnife Kochbuch

Aus Vokabulabor
Zur Navigation springen Zur Suche springen

Links

Laraknife

Zielsetzung

Kleine Tipps zur Verwendung von LaraKnife.

Moduländerungen

In den Beispielen wird das Modul Notes verwendet.

Zusätzliches Attribut

Es soll das Attribut "info" ergänzt werden:

Zu tun:

  • Datenbank erweitern:
php artisan make:migration add_notes_info --table=notes

Die entstehende Datei bearbeiten:

public function up()
{
    Schema::table('notes', function ($table) {
        $table->string("info");
    });
}
php artisan migrate
  • Model erweitern:
    • app/Models/Note.php: in $fillable eintragen
  • Views erweitern:
    • Feld eventuell in index.blade.php eintragen
    • Feld in create.blade.php eintragen
    • Feld in edit.blade.php eintragen
    • Feld in show.blade.php eintragen
  • NoteController anpassen:
    • function create() und edit() und show(): ... $fields = [ ... 'info' => ...];
    • function index():
      • Wenn ein Filter dazukommt: $fields = [ ... 'info' => ...]
      • Wenn bei einem gemeinsamen Suchfilter auch diese Spalte durchsucht werden soll:
        • ViewHelper::addConditionPattern($conditions, $parameters, 'title,body,info,', 'text');
      • Wenn ein Combobox als Filter dazukommt:
        • ViewHelper::addConditionComparism($conditions, $parameters, 'category_scope', 'category');
        • $optionsCategory = SProperty::optionsByScope('category', $fields['category'], 'all');
        • return view('note.index', [... optionsCategory ... ]);

Registerblatt-Seite

  • Controller.edit()
$context = new ContextLaraKnife($request, null, $note);
$navigationTabInfo = ViewHelperLocal::getNavigationTabInfo('note-edit', 0, $note->id);
$rc = view('note.edit', [
  'context' => $context,
...
  'navTabsInfo' => $navigationTabInfo
]);
  • view/note/edit.blade.php
@extends('layouts.backend')

@section('content')
    <form id="note-edit" action="/note-update/{{ $context->model->id }}" method="POST">
        @csrf
        <x-laraknife.panels.standard title="{{ __('Change of a Note') }}" fieldset="false">
            <x-laraknife.layout.nav-tabs :info="$navTabsInfo" fieldset="true">
                <x-laraknife.forms.combobox position="first" name="category_scope" label="Category" :options="$optionsCategory"
                    value="{{ $context->valueOf('category_scope') }}" width2="4" />
...
            </x-laraknife.layout.nav-tabs>
        </x-laraknife.panels.edit>
    </form>
@endsection
  • ViewHelperLocal.php:
public static function getNavigationTabInfo(string $name, int $indexActive, 
  int $referenceId = 0): ?NavigationTabs
{
  $rc = null;
  switch ($name) {
     case 'note-edit':
        $rc = new NavigationTabs(["Properties;/note-edit/$referenceId",
            "Documents;/note-index_documents/$referenceId"
        ], $indexActive);
        break;
      default:
        break;
  }
  return $rc;
}

Email verschicken

  • neu: resources/views/mails/note-notification.blade.php
    • Hier werden Variablen ($from ...) definiert, die als Map in EmailHelper::sendMail() übergeben werden (siehe unten).
<p>{{ __('Hello')}} {{ $name }}, </p>
<p>{{__('The responsibility has been transferred to you')}} ({{ $from }}).<br/>
<a href="{{$link}}">{{$link}}</a></p>
<hr>
<h3>{{$title}}</h3>
<p>{{$contents}}
</p>
  • neu: app/Mail/NoteNotification.php:
    • Die obige note-notifacation.blade.php-Datei wird mittels ... view: 'mails.note-notification' eingebunden
    • Variablen können verwendet werden: $this->snippets['title'] referenziert den Eintrag aus obiger Map
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;
class NoteNotification extends Mailable
{
    use Queueable, SerializesModels;
    private string $link;
    /**
     * Create a new message instance.
     */
    public function __construct(array $snippets)
    {
        $this->snippets = $snippets;
    }
    /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: __('Responsibility changed') . ': ' . $this->snippets['title'],
        );
    }
    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        return new Content(
            view: 'mails.note-notification',
            with: $this->snippets
        );
    }
    /**
     * Get the attachments for the message.
     *
     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
     */
    public function attachments(): array
    {
        return [];
    }
}
  • app/Helpers/EmailHelper (Anpassung):
public static function sendMail(string $name, string $to, array $snippets)
  {
    switch ($name) {
    ...
    case 'note.notification':
      Mail::to($to)->send(new NoteNotification($snippets));
      break;
    default:
      break;
    }
}
  • Anwendung
    • Hier müssen die obigen Variablen als Map übergeben werden
private function sendEmail(int $userId, Note $note){
  $user = User::find($userId);
  EmailHelper::sendMail('note.notification', $user->email, ['name' => $user->name, 'title' => $note->title, 'contents' => $note->body, 
   'from' => auth()->user()->name, 'link' => ViewHelper::buildLink("/note-edit/$note->id")]);
}