public function index() { if (!Auth::check()) { return LoginController::getIndex(); } LoginController::updateUserPermissions(); //why not # Trail Trail::clear(); $tables = array_where(config('center.tables'), function ($key, $value) { return !$value->hidden && LoginController::checkPermission($value->name, 'view'); }); $groups = $objects = []; foreach ($tables as $table) { $latest = DB::table($table->name)->leftJoin(config('center.db.users') . ' as u2', $table->name . '.updated_by', '=', 'u2.id')->select('u2.name as updated_name', $table->name . '.updated_at')->orderBy($table->name . '.updated_at', 'desc')->first(); if (!isset($groups[$table->list_grouping])) { $groups[$table->list_grouping] = []; } $groups[$table->list_grouping][] = (object) ['title' => $table->title, 'list_grouping' => $table->list_grouping, 'link' => action('\\LeftRight\\Center\\Controllers\\RowController@index', $table->name), 'updated_name' => isset($latest->updated_name) ? $latest->updated_name : '', 'updated_at' => isset($latest->updated_at) ? $latest->updated_at : '', 'count' => number_format(DB::table($table->name)->count())]; } foreach ($groups as $group) { $objects = array_merge($objects, $group); } $table = new Table(); $table->rows($objects); $table->column('title', 'string', trans('center::site.table')); $table->column('count', 'integer', trans('center::site.count')); $table->column('updated_name', 'updated_name', trans('center::site.updated_name')); $table->column('updated_at', 'updated_at', trans('center::site.updated_at')); $table->groupBy('list_grouping'); $table = $table->draw('tables'); return view('center::tables.index', compact('table')); }
public function index($table_name, $linked_field = false, $linked_row = false) { # Get info about the object $table = config('center.tables.' . $table_name); //dd($table); # Trail if (!$linked_field) { Trail::clear(); } # Security -- todo hidden? if (!isset($table->name)) { return redirect()->action('\\LeftRight\\Center\\Controllers\\TableController@index')->with('error', trans('center::site.table_does_not_exist')); } elseif (!LoginController::checkPermission($table->name, 'view')) { if ($linked_field && $linked_row) { return false; } return redirect()->action('\\LeftRight\\Center\\Controllers\\TableController@index')->with('error', trans('center::site.no_permissions_view')); } # Custom index? //if ($table->index) return call_user_func($table->index); # Start query $rows = DB::table($table->name); # Table columns $columns = []; # Build select statement $rows->select([$table->name . '.id']); foreach ($table->list as $field) { if ($field == $linked_field) { continue; } $field = $table->fields->{$field}; if ($field->type == 'checkboxes') { $rows->addSelect(DB::raw('(SELECT GROUP_CONCAT(' . $field->source . '.' . self::listColumn($field->source) . ' SEPARATOR ", ") FROM ' . $field->source . ' JOIN ' . $field->name . ' ON ' . $field->source . '.id = ' . $field->name . '.' . self::formatKeyColumn($field->source) . ' WHERE ' . $field->name . '.' . self::formatKeyColumn($table->name) . ' = ' . $table->name . '.id ORDER BY ' . $field->source . '.' . self::listColumn($field->source) . ') AS ' . $field->name)); } elseif ($field->type == 'image') { $rows->leftJoin(config('center.db.files'), $table->name . '.' . $field->name, '=', config('center.db.files') . '.id')->addSelect(config('center.db.files') . '.url AS ' . $field->name . '_url'); } elseif (in_array($field->type, ['select', 'user'])) { $rows->leftJoin($field->source, $field->name, '=', $field->source . '.id')->addSelect($field->source . '.' . self::listColumn($field->source) . ' AS ' . $field->name); } else { //normal, selectable field $rows->addSelect($table->name . '.' . $field->name); } //add to table columns $columns[] = $field; } # Handle group-by fields $table->nested = false; if (!empty($table->group_by)) { if (strpos($table->group_by, '::')) { list($object, $method) = explode('::', $table->group_by); if (class_exists($object)) { //call arbitrary user function $rows = call_user_func($table->group_by, $rows); } } else { $grouped_table = config('center.tables.' . $table->fields->{$table->group_by}->source); $grouped_field = self::listColumn($grouped_table->name); if ($grouped_table->name == $table->name) { //nested object $table->nested = true; } else { # Include group_by_field in resultset foreach ($grouped_table->order_by as $order_by => $direction) { $rows->orderBy($order_by, $direction); } $rows->leftJoin($grouped_table->name, $table->name . '.' . $table->fields->{$table->group_by}->name, '=', $grouped_table->name . '.id'); $rows->addSelect($grouped_table->name . '.' . $grouped_field . ' as group'); } } } # If linked, limit scope to just the linked row if ($linked_field && $linked_row) { $rows->where($table->name . '.' . $linked_field, $linked_row); } # Set the order and direction foreach ($table->order_by as $order_by => $direction) { $rows->orderBy($order_by, $direction); } # Soft deletes? if (isset($table->fields->deleted_at)) { $rows->addSelect($table->name . '.deleted_at'); } $searching = false; # Text search? if ($table->search && Request::has('search')) { $searching = true; $rows->where(function ($query) use($table) { foreach ($table->search as $field) { $query->orWhere($table->name . '.' . $field, 'LIKE', '%' . Request::input('search') . '%'); } }); } # Filter search? foreach ($table->filters as $filter) { if (Request::has($filter)) { $searching = true; $rows->where($table->name . '.' . $filter, Request::input($filter)); } } # Run query and save it to a variable $rows = $rows->paginate(50); # Set URLs on each instance if (LoginController::checkPermission($table->name, 'edit')) { foreach ($rows as &$row) { $row->link = action('\\LeftRight\\Center\\Controllers\\RowController@edit', [$table->name, $row->id, $linked_field, $linked_row]); $row->delete = action('\\LeftRight\\Center\\Controllers\\RowController@delete', [$table->name, $row->id]); } } else { foreach ($rows as &$row) { $row->link = action('\\LeftRight\\Center\\Controllers\\RowController@pdf', [$table->name, $row->id]); } } # If it's a nested object, nest-ify the resultset if ($table->nested) { $list = array(); foreach ($rows as &$row) { $row->children = array(); if (empty($row->{$grouped_field->name})) { //$grouped_field->name is for ex parent_id $list[] = $row; } elseif (self::nestedNodeExists($list, $row->{$grouped_field->name}, $row)) { //attached child to parent node } else { //an error occurred; a parent should exist but is not yet present } } $rows = $list; } # Search filters for the sidebar $filters = []; foreach ($table->filters as $filter) { if ($table->fields->{$filter}->type == 'us_state') { $filters[$filter] = ['' => $table->fields->{$filter}->title] + trans('center::site.us_states'); } elseif ($table->fields->{$filter}->type == 'country') { $filters[$filter] = ['' => $table->fields->{$filter}->title] + trans('center::site.countries'); } else { $related_table = config('center.tables.' . $table->fields->{$filter}->source); $options = DB::table($related_table->name); foreach ($related_table->order_by as $column => $direction) { $options->orderBy($column, $direction); } $options->whereIn('id', DB::table($table->name)->distinct()->lists($filter)); $options = $options->lists(self::listColumn($related_table), 'id'); $filters[$filter] = ['' => $related_table->title] + $options; } } $return = compact('table', 'columns', 'rows', 'filters', 'searching', 'linked_field', 'linked_row'); # Return array to edit() if ($linked_field && $linked_row) { return $return; } # Return HTML view return view('center::rows.index', $return); }