app | ||
bootstrap | ||
config | ||
database | ||
public | ||
resources | ||
routes | ||
storage | ||
tests | ||
.babelrc | ||
.editorconfig | ||
.env.example | ||
.gitattributes | ||
.gitignore | ||
.laravel-commit | ||
artisan | ||
bower.json | ||
composer.json | ||
composer.lock | ||
gulpfile.js | ||
init.sh | ||
package-lock.json | ||
package.json | ||
phpunit.xml | ||
readme.md | ||
server.php |
Hypothetical Template
The Hypothetical website template
Utilities
Language
The default language is set by the DEFAULT_LANGUAGE
variable in the .env
file. This will be the language used until it is changed, which can be done using the /language/{lang}
route or directly using Language::setSessionLanguage($lang)
where in both cases lang
is the language code for a given language.
In the view, a block of text can be configured with multiple languages using the following syntax:
@lang([
'en' => "This is a sentence",
'fr' => "C'est une phrase"
])
or
{{ Language::select([ 'en' => "This is a sentence", 'fr' => "C'est une phrase" ]) }}
Dashboard
Unless otherwise stated all examples in this section are to be added to app/Http/Controllers/DashboardController.php
.
Adding a Viewable Model to the Dashboard
Viewable List of Rows
First add a function to generate the page:
public function getContact()
{
return view('dashboard.view', [
'heading' => 'Contact Form Submissions',
'model' => 'contact',
'rows' => Contact::getContactSubmissions(),
'cols' => Contact::$dashboard_columns
]);
}
heading
: The title that will appear for this pagemodel
: The model that will be accessed on this pagerows
: A function returning an array containing the data to be shown on this pagecols
: Expects a variable called$dashboard_columns
in the respective model that contains an array:
public static $dashboard_columns = [
[ 'Date', 'created_at' ],
[ 'Name', 'name' ],
[ 'Email', 'email' ],
[ 'Message', 'message' ]
];
Adding an Editable Model to the Dashboard
Editable List of Rows
Editable List for Unsortable Model
public function getShows()
{
return view('dashboard.edit-list', [
'heading' => 'Shows',
'model' => 'shows',
'path' => 'shows-page',
'rows' => Shows::getShowsList(),
'column' => 'title',
'button' => [ 'Email Show', 'Are you sure you want to send an email?', 'Email successfully sent', 'Failed to send email', '/email-show' ],
'sortcol' => false,
'delete' => true,
'create' => true,
'export' => true,
'filter' => true
]);
}
Editable List for Sortable Model
NOTE: Sortable models must have an entry configured in the postReorder
function (details below)
public function getNews()
{
return view('dashboard.edit-list', [
'heading' => 'News',
'model' => 'news',
'rows' => News::getNewsList(),
'column' => 'title',
'button' => [ 'Email Show', 'Are you sure you want to send an email?', 'Email successfully sent', 'Failed to send email', '/email-show' ],
'sortcol' => 'order',
'delete' => false,
'create' => true,
'export' => true,
'filter' => true
]);
}
heading
: The title that will appear for this pagemodel
: The model that will be accessed on this pagepath
: (optional) This can be used to set a different URL path than the default of the model namerows
: A function returning an array containing the data to be shown on this pagecolumn
: The column name in the array that contains the data to display in each row (an array can be used to specify multiple columns)button
: Add a button with a title, confirmation, success and error messages, and a post request path that takes an id and returnssuccess
on successsortcol
: The name of the column containing the sort order orfalse
to disabledelete
: Adelete
button will appear in the list if this is set totrue
create
: Anew
button will appear in the heading if this is set totrue
export
: Anexport
button will appear in the heading if this is set totrue
filter
: An input box will appear below the heading that can filter rows by input if this is set totrue
Editable Item
This function should be named the same as the one above except with Edit
at the end
Editable Item for Unsortable Model
public function getShowsEdit($id = 'new')
{
if ($id != 'new') {
if (Shows::where('id', $id)->exists()) {
$item = Shows::where('id', $id)->first();
} else {
return view('errors.no-such-record');
}
} else {
$item = null;
}
return view('dashboard.edit-item', [
'heading' => 'Shows',
'model' => 'shows',
'id' => $id,
'item' => $item,
'help_text' => '<strong>NOTE:</strong> This is some help text for the current page',
'columns' => [
[ 'name' => 'venue', 'type' => 'text' ],
[ 'name' => 'date', 'type' => 'date' ],
[ 'name' => 'address', 'type' => 'text' ],
[ 'name' => 'phone', 'type' => 'text' ],
[ 'name' => 'website', 'type' => 'text' ],
[ 'name' => 'cover', 'type' => 'text' ],
[ 'name' => 'description', 'type' => 'mkd' ]
]
]);
}
Editable Item for Sortable Model
public function getNewsEdit($id = 'new')
{
if ($id != 'new') {
if (News::where('id', $id)->exists()) {
$item = News::where('id', $id)->first();
} else {
return view('errors.no-such-record');
}
} else {
$item = new News();
$item['order'] = News::count();
}
return view('dashboard.edit-item', [
'heading' => 'News',
'model' => 'news',
'id' => $id,
'item' => $item,
'columns' => News::$dashboard_columns
]);
}
heading
: The title that will appear for this pagemodel
: The model that will be accessed on this pageid
: Always set this to$id
item
: Always set this to$item
help_text
: An optional value that will add a box containing help text above the form if setcolumns
: Expects a variable called$dashboard_columns
in the respective model that contains an array:name
is the name of the column to be editedtype
is the type of column (details below)label
is an optional value that overrides the visible column name
public static $dashboard_columns = [
[ 'name' => 'title', 'type' => 'text', 'label' => 'The Title' ],
[ 'name' => 'iframe', 'type' => 'text' ],
[ 'name' => 'halign', 'type' => 'select', 'options' => [ 'left', 'center', 'right' ] ],
[ 'name' => 'story', 'type' => 'mkd' ],
[ 'label' => 'Header Image', 'name' => 'headerimage', 'type' => 'image' ],
[ 'name' => 'order', 'type' => 'hidden' ]
];
Editable Column Types
The following is a list of possible types
in the columns
array for Editable Items:
text
: Text input field for text datamkd
: Markdown editor for text data containing markdowndate
: Date and time selection tool for date/time dataselect
: Text input via option select with possible options in anoptions
arrayhidden
: Fields that will contain values to pass to the update function but won't appear on the page (this must be used for the sort column)image
: Fields that contain image uploads (name is not part of the database and is instead used in the filename)display
: Displayed information that can't be edited
Edit Item Functionality
Editable models must have an entry in the switch statement of the postEdit
function to make create and edit functionality work:
switch ($request['model']) {
case 'shows':
$item = $id == 'new' ? new Shows : Shows::find($id);
break;
case 'news':
$item = $id == 'new' ? new News : News::find($id);
break;
default:
return 'model-access-fail';
}
Additional Requirement for Sortable Models
Sortable models must have an entry in the switch statement of the postReorder
function to make sorting functionality work:
switch ($request['model']) {
case 'news':
$items = new News();
break;
default:
return 'model-access-fail';
}
Additional Requirements for Image Upload
If the value of imgup
has been set to true
, ensure public/uploads/model_name
exists (where model_name
is the name of the given model) and contains a .gitkeep
that exists in version control.
By default, uploaded images are saved in JPEG format with the value of the id
column of the respective row as its name and .jpg
as its file extension.
When a row is deleted, its respective image will be deleted as well if it exists.
Adding to the Dashboard Menu
Edit the $menu
array in app/Models/DashboardMenu.php
where the first column of each item is the title and the second is either a path, or an array of submenu items.
public static $menu = [
[ 'Contact', 'contact' ],
[ 'Subscriptions', 'subscriptions' ],
[
'Projects', [
[ 'Residential', 'projects-residential' ],
[ 'Commercial', 'projects-commercial' ]
]
]
];
Additional Requirement for Delete Functionality
Editable models with delete
set to true
must have an entry in the switch statement of the deleteDelete
function to make deletion functionality work:
switch ($request['model']) {
case 'shows':
$items = new Shows();
break;
case 'news':
$items = new News();
break;
default:
return 'model-access-fail';
}
Additional Requirement for Export Functionality
Viewable models and editable models with export
set to true
must have an entry in the switch statement of the getExport
function to make the export button work:
switch ($model) {
case 'contact':
$headings = [ 'Date', 'Name', 'Email', 'Message' ];
$items = Contact::select('created_at', 'name', 'email', 'message')->get();
break;
default:
abort(404);
}
$headings
: The visible column names in the same order as the array containing the items to be exported$items
: A function returning an array containing the data to be exported