286 lines
9.5 KiB
PHP
286 lines
9.5 KiB
PHP
<?php
|
|
|
|
// error_reporting(E_ALL);
|
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Http\Request;
|
|
|
|
if (! function_exists('process_datatable')) {
|
|
/**
|
|
* @param string $model_fullname full model class name. like: Spatie\Permission\Models\Role
|
|
* @param array $fields List of allowed fields to be queried.
|
|
* @param string $query query builder instance.
|
|
* @param string $relation model's relation name (if has any relation). notic: this param is not table's name but it is the name of the method in model class which describes model foreign relations.
|
|
*/
|
|
function processDataTable(Request $request, $model_fullname, array $fields=[], $query = '', string $relation = null)
|
|
{
|
|
if (!empty($model_fullname)) {
|
|
$data = new $model_fullname();
|
|
} elseif (!empty($query)) {
|
|
$data = $query;
|
|
} else {
|
|
return [
|
|
'status' => 500,
|
|
'message' => 'bad method invokation.'
|
|
];
|
|
}
|
|
|
|
if (!requestIsValid($request, $fields)) {
|
|
return [
|
|
'status' => 403,
|
|
'message' => 'access to the requested resource is forbidden',
|
|
];
|
|
}
|
|
|
|
$columns = getColumns($request);
|
|
|
|
$recordsTotal = $data->count();
|
|
$recordsFiltered = $recordsTotal;
|
|
|
|
$limit = $request->input('length');
|
|
$start = $request->input('start');
|
|
// $order = $columns[$request->input('order.0.column')]['name']['name'];
|
|
|
|
|
|
// $dir = $request->input('order.0.dir');
|
|
|
|
// create searchable fields array
|
|
$search_fields = [];
|
|
$is_searchable = false;
|
|
|
|
foreach ($columns as $key => $value) {
|
|
$name_array = $columns[$key]['name'];
|
|
$rel = null;
|
|
|
|
if ($request->input('columns.'.$key.'.searchable') == 'true') {
|
|
$arr = array(
|
|
'value' => $request->input('columns.'.$key.'.search.value'),
|
|
'type' => $columns[$key]['name']['type'],
|
|
);
|
|
|
|
$field = $columns[$key]['name']['name'];
|
|
|
|
$search_fields[$field] = $arr;
|
|
$is_searchable = true;
|
|
}
|
|
}
|
|
|
|
foreach ($search_fields as $field => $attributes) {
|
|
if (isset($attributes['value'])) {
|
|
$value = $attributes['value'];
|
|
|
|
if ($attributes['type'] == 'text') {
|
|
$data = $data->where($field, 'LIKE', "%${value}%");
|
|
} elseif ($attributes['type'] == 'between') {
|
|
$date_values = explode('&', $value);
|
|
$date_values[0] .= " 00:00:00";
|
|
$date_values[1] .= " 23:59:59";
|
|
$data = $data->whereBetween($field, $date_values);
|
|
} elseif ($attributes['type'] == 'between_time') {
|
|
$times = explode('_', $value);
|
|
$data = $data->where(function ($query) use ($times, $field) {
|
|
foreach ($times as $idx => $time_values) {
|
|
$time_values = explode('&', $time_values);
|
|
if ($idx == 0) {
|
|
$query = $query->whereBetween($field, $time_values);
|
|
} else {
|
|
$query = $query->orWhereBetween($field, $time_values);
|
|
}
|
|
}
|
|
});
|
|
} elseif ($attributes['type'] == 'select') {
|
|
$data = $data->where($field, "${value}");
|
|
}
|
|
|
|
// following types have been added for making finance table serverside.
|
|
elseif ($attributes['type'] == 'is_null') {
|
|
$data = $value ? $data->whereNull($field) : $data->whereNotNull($field);
|
|
}
|
|
|
|
elseif ($attributes['type'] == 'date_between') {
|
|
$data = $data->whereBetween($field, explode('&', $value));
|
|
}
|
|
|
|
elseif ($attributes['type'] == 'multi_select') {
|
|
$data = $data->whereIn($field, explode(',', $value));
|
|
}
|
|
|
|
// useful when we want to get rows of a table where have related data in another table with specific condition.
|
|
elseif ($attributes['type'] == 'relation.multi_select') {
|
|
|
|
if(!$relation){
|
|
return [
|
|
'status' => 500,
|
|
'message' => 'bad method invokation.'
|
|
];
|
|
}
|
|
|
|
$data = $data->whereHas($relation, function ($query) use ($field, $value) {
|
|
$query->whereIn($field, explode(',', $value));
|
|
});
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach ($request->order as $key => $orderList) {
|
|
|
|
$order = $columns[$orderList['column']]['name']['name'];
|
|
$dir = $orderList['dir'];
|
|
|
|
$data = $data->orderBy($order, $dir);
|
|
}
|
|
|
|
$recordsFiltered = $data->count();
|
|
$data = $data->offset($start)
|
|
->limit($limit)
|
|
// ->orderBy($order, $dir)
|
|
->get();
|
|
|
|
return [
|
|
'status' => 200,
|
|
'draw' => $request->draw,
|
|
'recordsTotal' => $recordsTotal,
|
|
'recordsFiltered' => $recordsFiltered,
|
|
'data' => $data
|
|
];
|
|
}
|
|
}
|
|
|
|
if (! function_exists('getColumns')) {
|
|
function getColumns(Request $request)
|
|
{
|
|
// $columns = [];
|
|
// foreach ($request->columns as $col) {
|
|
// $columns[] = $col;
|
|
// }
|
|
|
|
return $request->columns;
|
|
}
|
|
}
|
|
|
|
if (!function_exists('requestIsValid')) {
|
|
function requestIsValid(Request $request, array $fields)
|
|
{
|
|
$columns = getColumns($request);
|
|
|
|
// check column names
|
|
foreach ($columns as $key => $value) {
|
|
$colName = $columns[$key]['name']['name'];
|
|
$colType = $columns[$key]['name']['type'];
|
|
|
|
// do nothing if column is optional
|
|
if (!in_array($colName, $fields) && $colType != 'option') {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// check order name
|
|
$orderName = $columns[$request->input('order.0.column')]['name']['name'];
|
|
if (!in_array($orderName, $fields)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (!function_exists('makeSelectQuery')) {
|
|
function makeSelectQuery(array $fields, array $aliases)
|
|
{
|
|
$select = '';
|
|
for ($i = 0; $i < count($fields); $i++) {
|
|
if ($aliases[$i]) {
|
|
$select .= $fields[$i]. ' as '. $aliases[$i];
|
|
} else {
|
|
$select .= $fields[$i];
|
|
}
|
|
|
|
if ($i != count($fields) - 1) {
|
|
$select .= ', ';
|
|
}
|
|
}
|
|
|
|
return $select;
|
|
}
|
|
}
|
|
|
|
if (!function_exists('setAxisTypeFa')) {
|
|
function setAxisTypeFa(int $axis_type)
|
|
{
|
|
if ($axis_type == '1') {
|
|
$axis_type_fa = 'آزادراه';
|
|
} elseif ($axis_type == '2') {
|
|
$axis_type_fa = 'بزرگراه';
|
|
} elseif ($axis_type == '3') {
|
|
$axis_type_fa = 'اصلی';
|
|
} elseif ($axis_type == '4') {
|
|
$axis_type_fa = 'فرعی';
|
|
}
|
|
|
|
return $axis_type_fa;
|
|
}
|
|
}
|
|
|
|
if (!function_exists('get_way_id_from_nominatim')) {
|
|
function get_way_id_from_nominatim($lat, $lng)
|
|
{
|
|
$url = "https://testmap.141.ir/nominatim/reverse?format=jsonv2&lat=".$lat."&lon=".$lng."&zoom=16&addressdetails=16";
|
|
$arrContextOptions=array(
|
|
"ssl"=>array(
|
|
"verify_peer"=>false,
|
|
"verify_peer_name"=>false,
|
|
),
|
|
);
|
|
|
|
$result = file_get_contents($url, false, stream_context_create($arrContextOptions));
|
|
$result = json_decode($result);
|
|
if (isset($result->osm_type)) {
|
|
if ($result->osm_type == 'way') {
|
|
return $result->osm_id;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if (!function_exists('findCityFromGeoJson')) {
|
|
function findCityFromGeoJson($lat, $lon)
|
|
{
|
|
$file_contents = file_get_contents(storage_path('cities-geojson.json'));
|
|
|
|
$contents_array = json_decode($file_contents, true);
|
|
$cities = $contents_array['features'];
|
|
|
|
$city_idx = false;
|
|
foreach ($cities as $idx => $city) {
|
|
// dd($city['geometry']['coordinates'][0]);
|
|
if (is_in_polygon($city['geometry']['coordinates'][0], $lat, $lon)) {
|
|
$city_idx = $idx;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// dd($cities[$city_idx]);
|
|
|
|
return $city_idx ? $cities[$city_idx]['properties'] : false;
|
|
}
|
|
}
|
|
|
|
if (!function_exists('is_in_polygon')) {
|
|
function is_in_polygon($vertices, $latitude_y, $longitude_x)
|
|
{
|
|
$i = $j = $c = 0;
|
|
$points_polygon = count($vertices);
|
|
|
|
for ($i = 0, $j = $points_polygon - 1 ; $i < $points_polygon; $j = $i++) {
|
|
if ((($vertices[$i][1] > $latitude_y != ($vertices[$j][1] > $latitude_y)) &&
|
|
($longitude_x < ($vertices[$j][0] - $vertices[$i][0]) * ($latitude_y - $vertices[$i][1]) / ($vertices[$j][1] - $vertices[$i][1]) + $vertices[$i][0]))) {
|
|
$c = !$c;
|
|
}
|
|
}
|
|
|
|
return $c;
|
|
}
|
|
}
|