Last active
June 15, 2017 10:03
-
-
Save essemme/76da6e6dd1caabce591cfe50ce81adf9 to your computer and use it in GitHub Desktop.
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/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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 %] | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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