hypothetical/app/Models/DashboardModel.php

299 lines
7.6 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Auth;
use App\Traits\Timestamp;
class DashboardModel extends Model
{
use Timestamp;
/*
* The dashboard page type
*
* @var array
*/
public static $dashboard_type = 'view';
/*
* Dashboard heading
*
* @var string
*/
public static $dashboard_heading = null;
/*
* Whether the model can be exported
*
* @var boolean
*/
public static $export = false;
/*
* Whether new rows can be created
*
* @var boolean
*/
public static $create = true;
/*
* Whether new rows can be deleted
*
* @var boolean
*/
public static $delete = true;
/*
* Whether rows can be filtered
*
* @var boolean
*/
public static $filter = true;
/*
* Number of items per page (0 for unlimited)
*
* @var number
*/
public static $items_per_page = 0;
/*
* Query parameters to remember
*
* @var number
*/
public static $valid_query_params = [];
/*
* Dashboard help text
*
* @var string
*/
public static $dashboard_help_text = '';
/*
* Array of columns to display in the dashboard edit list
*
* @var array
*/
public static $dashboard_display = [];
/**
* Whether to allow click-and-drag reordering
*
* @var boolean
*/
public static $dashboard_reorder = false;
/**
* The dashboard sort column
*
* @var array
*/
public static $dashboard_sort_column = 'created_at';
/**
* The dashboard sort direction (only when $dashboard_reorder == false)
*
* @var array
*/
public static $dashboard_sort_direction = 'desc';
/**
* The dashboard button
*
* @var array
*/
public static $dashboard_button = [];
/**
* The dashboard id link
*
* @var array
*/
public static $dashboard_id_link = [];
/**
* Returns the dashboard heading
*
* @return string
*/
public static function getDashboardHeading($model)
{
return static::$dashboard_heading == null ? ucfirst($model) : static::$dashboard_heading;
}
/**
* Returns an array of column 'headings' or 'names'
*
* @return array
*/
public static function getDashboardColumnData($type, $all_columns = true)
{
$column_data = [];
foreach (static::$dashboard_columns as $column) {
if ($all_columns || !array_key_exists('type', $column) || !preg_match('/^(hidden|user|image|file)$/', $column['type'])) {
if ($type == 'headings') {
if (array_key_exists('title', $column)) {
array_push($column_data, $column['title']);
} else {
array_push($column_data, ucfirst($column['name']));
}
} else if ($type == 'names') {
array_push($column_data, $column['name']);
}
}
}
return $column_data;
}
/**
* Performs a search against the columns in $dashboard_display
*
* @return array
*/
public static function searchDisplay($term, $query = null)
{
if (static::$filter) {
$first = true;
if ($query === null) {
$query = self::orderBy(static::$dashboard_sort_column, static::$dashboard_sort_direction);
}
foreach (static::$dashboard_display as $display) {
$type = '';
foreach (static::$dashboard_columns as $column) {
if ($column['name'] === $display) {
$type = $column['type'];
}
}
if ($type !== '' && $type !== 'image') {
if ($first) {
$query->where($display, 'LIKE', '%' . $term . '%');
} else {
$query->orWhere($display, 'LIKE', '%' . $term . '%');
}
$first = false;
}
}
return $query;
} else {
return [];
}
}
/**
* Returns data for the dashboard
*
* @return array
*/
public static function getDashboardData($include_param_display = false)
{
$sort_direction = static::$dashboard_reorder ? 'desc' : static::$dashboard_sort_direction;
$query = self::orderBy(static::$dashboard_sort_column, $sort_direction);
$query_param_display = [];
foreach (static::$dashboard_columns as $column) {
if (array_key_exists('type', $column) && $column['type'] == 'user') {
$query->where($column['name'], Auth::id());
break;
}
}
if (count(static::$valid_query_params) > 0) {
foreach (static::$valid_query_params as $param) {
if (request()->query($param['key'], null) != null) {
if ($include_param_display) {
$query_param_model = 'App\\Models\\' . $param['model'];
$query_param_column = $query_param_model::find(request()->query($param['key']));
if ($query_param_column !== null) {
array_push($query_param_display, [
'title' => $param['title'],
'value' => $query_param_column[$param['display']]
]);
}
}
$query->where($param['column'], request()->query($param['key']));
}
}
}
if (static::$items_per_page === 0) {
$results = $query->get();
} else {
if (static::$filter && request()->query('search', null) != null) {
$query = static::searchDisplay(request()->query('search'), $query);
}
$results = $query->paginate(static::$items_per_page);
}
if ($include_param_display) {
return [
'rows' => $results,
'paramdisplay' => $query_param_display
];
} else {
return $results;
}
}
/**
* Retrieves the current query string containing valid query parameters
*
* @return string
*/
public static function getQueryString()
{
$valid_query_params = static::$valid_query_params;
$string = '';
if (static::$items_per_page !== 0 && static::$filter) {
array_push($valid_query_params, [ 'key' => 'search' ]);
}
foreach ($valid_query_params as $param) {
if (request()->query($param['key'], null) != null) {
if ($string !== '') {
$string .= '&';
}
$string .= $param['key'] . '=' . request()->query($param['key']);
}
}
return $string;
}
/**
* Determines whether a user column exists and whether it matches the current user if it does
*
* @return boolean
*/
public function userCheck() {
$user_check = true;
foreach (static::$dashboard_columns as $column) {
if (array_key_exists('type', $column) && $column['type'] == 'user') {
if ($this->{$column['name']} != Auth::id()) {
$user_check = false;
}
break;
}
}
return $user_check;
}
}