Gists for post "Saving time with a CRUD generator for Laravel" on my blog https://stefanomanfredini.info/en/2017/06/saving-time-crud-generator-laravel/
<?php | |
namespace [% namespace %]; | |
use Session; | |
[% use_command_placeholder %] | |
use Illuminate\Support\Str; | |
class [% controller_name %] [% controller_extends %] | |
{ | |
protected $[% model_name %]; // Model Instance | |
[% constructor %] | |
/** | |
* Display a listing of the [% model_name_plural %] . | |
* | |
* @return Illuminate\View\View | |
*/ | |
public function index(Request $request) | |
{ | |
$[% model_name_plural %] = [% model_name_class %]::[% with_relations_for_index %] | |
search($request->get('s')) | |
->type('parameter', $request->get('parameter')) | |
->orderBy($request->get('o','id'),$request->get('d','desc')) | |
->paginate([% models_per_page %]); | |
Session::flash('backUrl', $request->fullUrl()); | |
return view('[% index_view_name %]'[% view_variables_for_index %]); | |
} | |
/** | |
* Show the form for creating a new {{modelName}}. | |
* | |
* @return Illuminate\View\View | |
*/ | |
public function create() | |
{ | |
[% relation_collections %] | |
if (Session::has('backUrl')) { Session::keep('backUrl');} | |
return view('[% create_view_name %]'[% view_variables_for_create %]); | |
} | |
/** | |
* Store a new [% model_name %] in the storage. | |
* | |
* @param [% request_fullname %][% request_variable %] | |
* | |
* @return Illuminate\Http\RedirectResponse | Illuminate\Routing\Redirector | |
*/ | |
public function store([% type_hinted_request_name %]) | |
{ | |
[% call_affirm %] | |
$[% data_variable %] = [% call_get_data %]; //$this->getRequestsData($request); | |
[% on_store_setter %] | |
$this->[% model_name %] = [% model_name_class %]::create( $[% data_variable %] ); | |
$[% data_variable %] = $this->requestDataTranslateOrNew ( $[% data_variable %] ); | |
$this->[% model_name %]->update($[% data_variable %]); | |
Session::flash('success_message', _i('[% model_name_class %] was added!') ); | |
Session::has ( 'backUrl' ) ? $url = Session::get('backUrl') : $url = route('[% index_route_name %]'); | |
return redirect($url); | |
} | |
/** | |
* Display the specified [% model_name %]. | |
* | |
* @param int $id | |
* | |
* @return Illuminate\View\View | |
*/ | |
public function show($id, Request $request) | |
{ | |
$[% model_name %] = [% model_name_class %]::[% with_relations_for_show %]findOrFail($id); | |
Session::flash('backUrl', $request->fullUrl()); | |
return view('[% show_view_name %]'[% view_variables_for_show %]); | |
} | |
/** | |
* Show the form for editing the specified [% model_name %]. | |
* | |
* @param int $id | |
* | |
* @return Illuminate\View\View | |
*/ | |
public function edit($id) | |
{ | |
$[% model_name %] = [% model_name_class %]::findOrFail($id); | |
[% relation_collections %] | |
if (Session::has('backUrl')) { Session::keep('backUrl'); } | |
return view('[% edit_view_name %]'[% view_variables_for_edit %]); | |
} | |
/** | |
* Update the specified [% model_name %] in the storage. | |
* | |
* @param int $id | |
* @param [% request_fullname %][% request_variable %] | |
* | |
* @return Illuminate\Http\RedirectResponse | Illuminate\Routing\Redirector | |
*/ | |
public function update($id, [% type_hinted_request_name %]) | |
{ | |
[% call_affirm %] | |
$[% data_variable %] = [% call_get_data %]; //$this->getRequestsData($request); | |
[% on_update_setter %] | |
$this->[% model_name %] = [% model_name_class %]::findOrFail($id); | |
$[% data_variable %] = $this->requestDataTranslateOrNew($[% data_variable %] ); | |
$this->[% model_name %]->update($[% data_variable %] ); | |
Session::flash('success_message', _i('[% model_name_class %] was updated!')); | |
Session::has ( 'backUrl' ) ? $url = Session::get('backUrl') : $url = route('[% index_route_name %]'); | |
return redirect($url); | |
} | |
/** | |
* Remove the specified [% model_name %] from the storage. | |
* | |
* @param int $id | |
* | |
* @return Illuminate\Http\RedirectResponse | Illuminate\Routing\Redirector | |
*/ | |
public function destroy($id) | |
{ | |
$[% model_name %] = [% model_name_class %]::findOrFail($id); | |
$[% model_name %]->delete(); | |
Session::flash('success_message', _i('[% model_name_class %] was deleted!') ); | |
Session::has ( 'backUrl' ) ? $url = Session::get('backUrl') : $url = route('[% index_route_name %]'); | |
return redirect($url); | |
} | |
[% affirm_method %] | |
[% get_data_method %] | |
[% upload_method %] | |
protected function getTraslatedRequestData(Request $request, $data ) { | |
foreach (config('app.app_languages') as $locale) { | |
foreach ([% model_name_class %]::$translatedFields as $field) { | |
$data[$field .'-'.$locale] = !empty($request->input($field .'-'.$locale)) ? $request->input($field .'-'.$locale) : null; | |
//repeat with other translatable fields | |
} | |
} | |
return $data; | |
} | |
protected function requestDataTranslateOrNew( $data ) { | |
foreach (config('app.app_languages') as $locale => $language) { | |
foreach ($this->[% model_name %]->translatedAttributes as $field) { | |
if(!is_null($data["$field-{$locale}"])) { | |
$this->[% model_name %]->translateOrNew ( $locale )->{$field} = $data["$field-{$locale}"]; | |
} | |
//repeat for other translatable fields | |
} | |
} | |
return $data; | |
} | |
} |
<?php | |
//form-request.stub | |
namespace [% app_name %]\Http\Requests; | |
use Illuminate\Foundation\Http\FormRequest; | |
class [% form_request_class %] extends FormRequest | |
{ | |
/** | |
* Determine if the user is authorized to make this request. | |
* | |
* @return bool | |
*/ | |
public function authorize() | |
{ | |
return true; | |
} | |
public function prepareForValidation () | |
{ | |
$data = $this->all (); | |
//Alter the field values as needed, i.e. $data['whatever'] = .. | |
//$data['slug_en'] = !empty($this->input('slug_en')) ? $this->input('slug_en') : Str::slug($data['title_en']); | |
$this->replace ($data); | |
} | |
/** | |
* Get the validation rules that apply to the request. | |
* | |
* @return array | |
*/ | |
public function rules() | |
{ | |
return [ | |
[% validation_rules %] | |
]; | |
} | |
[% get_data_method %] | |
[% upload_method %] | |
} |
//index.blade.stub | |
@extends('adminlte::page') | |
@section('title') | |
{{ isset([% model_header %]) ? [% model_header %] : _i("[% model_name_plural_cap %]") }} | |
@endsection | |
@section('content_header') | |
{{ isset([% model_header %]) ? [% model_header %] : _i("[% model_name_plural_cap %]") }} | |
@endsection | |
@section('css') | |
@if(config('adminlte.plugins.datatables')) | |
<!-- DataTables --> | |
<link rel="stylesheet" href="//cdn.datatables.net/v/bs/dt-1.10.13/datatables.min.css"> | |
@endif | |
@endsection | |
@section('js') | |
@if(config('adminlte.plugins.datatables')) | |
<!-- DataTables --> | |
<script src="//cdn.datatables.net/v/bs/dt-1.10.13/datatables.min.js"></script> | |
@endif | |
@endsection | |
@section('content') | |
//[..] | |
@endsection |
//From index.blade.stub | |
<table class="table table-striped "> | |
<thead> | |
<tr> | |
[% header_cells %] | |
@include('admin.partials.single_field_translation_index_header') | |
<th></th> | |
</tr> | |
</thead> | |
<tbody> | |
@foreach($[% model_name_plural %] as $[% model_name %]) | |
<tr> | |
[% body_cells %] | |
@include( 'admin.partials.single_field_translation_index_cell', ['current_model' => $[% model_name %], 'field' => 'name'] ) | |
// index.header.cell.blade.php | |
// (add sorting feature to table headers) | |
<th><a href="{!! Request::fullUrlWithQuery ( [ 'o' => '[% field_name %]', 'd' => 'asc' ] ) !!}">{{ _i("[% field_title %]") }}</a></th> | |
// views/admin/partials/single_field_translation_index_header.blade.php | |
@foreach(config( 'app.app_languages' ) as $code => $lang) | |
<th><img src="/images/flags/{{ $code }}.png" alt="{{ strtoupper($code) }}"></th> | |
@endforeach | |
// views/admin/partials/single_field_translation_index_cell.blade.php | |
@foreach(config( 'app.app_languages' ) as $code => $lang) | |
<td> | |
@if($current_model->hasTranslation($code)) | |
{{ $current_model->translate($code)->{$field} }} | |
@endif | |
</td> | |
@endforeach |
//form.blade.stub | |
[% form_fields_html %] | |
{{--Keep one of the following--}} | |
@include('admin.partials.single_field_translation_form_text_input', ['current_model' => isset($[% model_name %]) ? $[% model_name %] : null, 'field' => 'name']) | |
@include('admin.partials.multiple_fields_translation_form_text_input_tabs', | |
['current_model' => isset($[% model_name %]) ? $[% model_name %] : null, | |
'translatable_fields' => \App\Models\[% model_name_class %]::$translatedFields] | |
) | |
// views/admin/partials/multiple_fields_translation_form_text_input_tabs.blade.php | |
// (tabs for showing single language translation fields in a form). | |
// Whether fields are strings or texts is specified in a config file) | |
<div class="col-sm-8 col-sm-offset-2"> | |
<div class="nav-tabs-custom"> | |
<ul class="nav nav-tabs"> | |
<?php $count = 0; ?> | |
@foreach(config( 'app.app_languages' ) as $code => $lang) | |
<li class="@if(!$count)active @endif"> | |
<a href="#tab_{{ $code }}" data-toggle="tab" aria-expanded="@if(!$count++) true @else false @endif"> | |
<img src="/images/flags/{{ $code }}.png"> {{ $code }} | |
</a> | |
</li> | |
@endforeach | |
</ul> | |
<div class="tab-content"> | |
<?php $count = 0; ?> | |
@foreach(config( 'app.app_languages' ) as $code => $lang) | |
<div class="tab-pane @if(!$count++)active @endif" id="tab_{{ $code }}"> | |
<h4> {{ _i($lang) }} </h4> | |
@foreach($translatable_fields as $field) | |
@if( !in_array ( $field, config ('enums.textarea_fields') ) ) | |
<div class="form-group"> | |
<label for="{{$field}}-{{ $code }}" class="control-label col-md-2 col-sm-2 col-xs-12"> | |
{{ _i( \Illuminate\Support\Str::studly($field) ) }} <img src="/images/flags/{{ $code }}.png"> | |
</label> | |
<div class="col-md-10 col-sm-10 col-xs-12"> | |
<input id="{{$field}}-{{ $code }}" class="form-control col-md-7 col-xs-12" name="{{$field}}-{{ $code }}" type="text" value="{{ old($field.'-'.$code, isset($current_model) && isset($current_model->translate($code)->{$field}) ? $current_model->translate($code)->{$field} : null) }}"> | |
</div> | |
</div> | |
@else | |
<div class="form-group"> | |
<label for="{{$field}}-{{ $code }}" class="control-label col-md-2 col-sm-2 col-xs-12"> | |
{{ _i( \Illuminate\Support\Str::studly($field) ) }} <img src="/images/flags/{{ $code }}.png"> | |
</label> | |
<div class="col-md-10 col-sm-10 col-xs-12"> | |
<textarea class="form-control editor" name="{{ $field }}-{{ $code }}" cols="50" rows="10" id="{{ $field }}-{{ $code }}" placeholder="Description">{{ isset($current_model) && isset($current_model->translate($code)->{$field}) ? $current_model->translate($code)->{$field} : null }}</textarea> | |
</div> | |
</div> | |
@endif | |
@endforeach | |
</div> | |
@endforeach | |
</div> | |
</div> | |
</div> | |
// views/admin/partials/single_field_translation_form_text_input.blade.php | |
@foreach(config( 'app.app_languages' ) as $code => $lang) | |
<div class="form-group"> | |
<label for="{{$field}}-{{ $code }}" class="control-label col-md-2 col-sm-2 col-xs-12"> | |
{{ _i( \Illuminate\Support\Str::studly($field) ) }} {{ _i($lang) }} <img src="/images/flags/{{ $code }}.png"> | |
</label> | |
<div class="col-md-10 col-sm-10 col-xs-12"> | |
<input id="{{$field}}-{{ $code }}" class="form-control col-md-7 col-xs-12" name="{{$field}}-{{ $code }}" type="text" value="{{ old($field.'-'.$code, isset($current_model) && isset($current_model->translate($code)->name) ? $current_model->translate($code)->name : null) }}"> | |
</div> | |
</div> | |
@endforeach |
// in show.blade.stub | |
<div class="panel-body"> | |
<dl class="dl-horizontal"> | |
[% table_rows %] | |
{{--Keep one of the following--}} | |
@include('admin.partials.single_field_translation_show', ['current_model' => isset($[% model_name %]) ? $[% model_name %] : null, 'field_label' => 'Name', 'field' => 'name']) | |
@include('admin.partials.multiple_fields_translation_show', ['current_model' => isset($[% model_name %]) ? $[% model_name %] : null, 'translatable_fields' => \App\Models\[% model_name_class %]::$translatedFields ] ) | |
</dl> | |
</div> | |
// views/admin/partials/single_field_translation_show.blade.php | |
@foreach(config( 'app.app_languages' ) as $code => $lang) | |
<dt>{{ _i($field_label) }} {{ _i($lang) }} <img src="/images/flags/{{ $code }}.png"></dt> | |
<dd>{{ isset($current_model) && isset($current_model->translate($code)->{$field}) ? $current_model->translate($code)->{$field} : null }}</dd> | |
@endforeach | |
// views/admin/partials/multiple_fields_translation_show.blade.php | |
<div class="col-sm-10"> | |
<div class="nav-tabs-custom"> | |
<ul class="nav nav-tabs"> | |
<?php $count = 0; ?> | |
@foreach(config( 'app.app_languages' ) as $code => $lang) | |
<li class="@if(!$count)active @endif"> | |
<a href="#tab_{{ $code }}" data-toggle="tab" aria-expanded="@if(!$count++) true @else false @endif"> | |
<img src="/images/flags/{{ $code }}.png"> {{ $code }} | |
</a> | |
</li> | |
@endforeach | |
</ul> | |
<div class="tab-content"> | |
<?php $count = 0; ?> | |
@foreach(config( 'app.app_languages' ) as $code => $lang) | |
<div class="tab-pane @if(!$count++)active @endif" id="tab_{{ $code }}"> | |
<h4> {{ _i($lang) }} </h4> | |
@foreach($translatable_fields as $field_label => $field) | |
<dt>{{ _i($field_label) }} <img src="/images/flags/{{ $code }}.png"></dt> | |
@if( !in_array ( $field, config('enums.textarea_fields'))) | |
<dd>{{ isset($current_model) && isset($current_model->translate($code)->$field) ? $current_model->translate($code)->$field : null }}</dd> | |
@else | |
<dd>{!! isset($current_model) && isset($current_model->translate($code)->$field) ? $current_model->translate($code)->$field : null !!}</dd> | |
@endif | |
@endforeach | |
</div> | |
@endforeach | |
</div> | |
</div> | |
</div> |
<?php | |
//extract from model.stub | |
use Dimsav\Translatable\Translatable; | |
use Illuminate\Database\Eloquent\Model; | |
[% use_soft_delete %] | |
class [% model_name_class %] extends Model | |
{ | |
use Translatable; | |
[% use_soft_delete_trait %] | |
[% time_stamps %] | |
/** | |
* The database table used by the model. | |
* | |
* @var string | |
*/ | |
protected $table = '[% table %]'; | |
[% primary_key %] | |
/** | |
* Attributes that should be mass-assignable. | |
* | |
* @var array | |
*/ | |
protected $fillable = [% fillable %]; | |
/** | |
* The attributes that should be mutated to dates. | |
* | |
* @var array | |
*/ | |
protected $dates = [% dates %]; | |
/** | |
* Property for Translatable - list of tranlsated fields | |
* | |
* @var array | |
*/ | |
public $translatedAttributes = ['name',]; | |
/** | |
* Static list of translatable fields (usually the same | |
* as $translatedAttributes) for use in Controller before | |
* instantiating the model | |
* | |
* @var array | |
*/ | |
public static $translatedFields = ['Name' =>'name']; | |
/** | |
* The relations to eager load on every query. | |
* | |
* @var array | |
*/ | |
// (optionally) | |
protected $with = ['translations']; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment