/** * Overload render for array data output * * @param \FrenchFrogs\Table\Table\Table $table * @return array */ public function table(Table\Table $table) { // INitilisation du CSV $csv = Writer::createFromFileObject(new \SplTempFileObject()); // gestion des colonne $header = $columns = []; foreach ($table->getColumns() as $index => $column) { // Seule les colonnes Exportable peuvent être exporté if ($column instanceof Exportable) { $columns[$index] = $column; $header[$index] = $column->getLabel(); } } // insertion du header $csv->insertOne(array_values($header)); //@todo mettre en place un streaming pour économiser la memoire // insertion des lignes foreach ($table->getRows() as $row) { $line = []; foreach (array_keys($header) as $index) { $line[] = $columns[$index]->getValue($row); } $csv->insertOne($line); } $csv->output($table->getFilename()); exit; }
/** * Execute strainer * * @param \FrenchFrogs\Table\Table\Table $table * @param array ...$params * @return $this * @throws \Exception */ public function call(\FrenchFrogs\Table\Table\Table $table, ...$params) { if ($this->hasCallable()) { call_user_func_array($this->callable, $params); } else { // verify that source is a query if (!$table->isSourceQueryBuilder()) { throw new \Exception('Table source is not an instance of query builder'); } // recuperation des valeurs $params = explode('#', $params[0]); $e = $this->getElement(); // from if (!empty($params[0])) { $from = $e->setValue($params[0])->getFilteredValue(); $table->getSource()->where($this->getField(), '>=', $from); } // to if (!empty($params[1])) { $to = $e->setValue($params[1])->getFilteredValue(); $to = \Carbon\Carbon::createFromFormat($e->getFormatStore(), $to)->addDay(1)->format($e->getFormatStore()); $table->getSource()->where($this->getField(), '<', $to); } } return $this; }
/** * Overload render for array data output * * @param \FrenchFrogs\Table\Table\Table $table * @return array */ public function table(Table\Table $table) { $data = []; foreach ($table->getRows() as $row) { $line = []; foreach ($table->getColumns() as $name => $column) { $line[] = $column->render((array) $row); } $data[] = $line; } return $data; }
/** * Execute strainer * * @param \FrenchFrogs\Table\Table\Table $table * @param array ...$params * @return $this * @throws \Exception */ public function call(\FrenchFrogs\Table\Table\Table $table, ...$params) { if ($this->hasCallable()) { call_user_func_array($this->callable, $params); } else { // verify that source is a query if (!$table->isSourceQueryBuilder()) { throw new \Exception('Table source is not an instance of query builder'); } $table->getSource()->where($this->getField(), 'LIKE', '%' . $params[0] . '%'); } return $this; }
/** * Datatable render * @param string $route */ public function bootDatatable($route = '/datatable/{token}') { // gestion de la navifgation Ajax Route::get($route, function ($token) { try { $request = request(); // chargement de l'objet $table = FrenchFrogs\Table\Table\Table::load($token); // configuration de la navigation $table->setItemsPerPage(Input::get('length')); $table->setPageFromItemsOffset(Input::get('start')); $table->setRenderer(new FrenchFrogs\Table\Renderer\Remote()); // gestion des reccherches foreach (request()->get('columns') as $c) { if ($c['searchable'] == "true" && $c['search']['value'] != '') { $table->getColumn($c['name'])->getStrainer()->call($table, $c['search']['value']); } } // gestion de la recherche globale $search = $request->get('search'); if (!empty($search['value'])) { $table->search($search['value']); } // gestion du tri $order = $request->get('order'); if (!empty($order)) { if ($table->isSourceQueryBuilder()) { $table->getSource()->orders = []; } foreach ($order as $o) { extract($o); $table->getColumnByIndex($column)->order($dir); } } // recuperation des données $data = []; foreach ($table->render() as $row) { $data[] = array_values($row); } return response()->json(['data' => $data, 'draw' => Input::get('draw'), 'recordsFiltered' => $table->getItemsTotal(), 'recordsTotal' => $table->getItemsTotal()]); } catch (\Exception $e) { //Si on catch une erreur on renvoi une reponse json avec le code 500 return response()->json(['error' => $e->getMessage()], 500); } })->name('datatable'); /** * Gestion de l'export CSV */ Route::get($route . '/export', function ($token) { $table = FrenchFrogs\Table\Table\Table::load($token); $table->setItemsPerPage(5000); $table->toCsv(); })->name('datatable-export'); /** * Gestion de l'edition en remote * */ Route::post($route, function ($token) { $request = request(); $table = FrenchFrogs\Table\Table\Table::load($token); return $table->getColumn($request->get('column'))->remoteProcess($request->get('id'), $request->get('value')); }); }
/** * Render datatable js * * @param \FrenchFrogs\Table\Table\Table $table * @return string */ public function datatable(Table\Table $table) { $options = []; // Is remote loading if ($table->isRemote()) { $table->addClass('datatable-remote'); $table->save(); $options += ['ajax' => ['url' => route('datatable', ['token' => $table->getToken()])], 'processing' => true, 'serverSide' => true, 'pageLength' => $table->getItemsPerPage(), 'deferLoading' => $table->getItemsTotal()]; } //param par default $options += ['searching' => true]; //Param dom datatable $dom = ''; //header dom $dom .= '<"dataTables_wrapper no-footer"<"row"<"col-md-6 col-sm-12"lB>'; // is a search is set if ($table->hasSearch()) { $dom .= '<"col-md-6 col-sm-12"f>'; } $dom .= '>'; //dom table $dom .= '<"table-scrollable"t>'; //footer dom if ($table->hasFooter()) { $dom .= '<"row"<"col-md-5 col-sm-12"i><"col-md-7 col-sm-12"p>>'; } //Set dom $options += ['dom' => $dom]; // columns mamangement $columns = []; $order = []; $index = 0; $search = ''; foreach ($table->getColumns() as $c) { $data = []; /**@var Column\Column $c */ $class = $c->getClasses(); if (!empty($class)) { $data['className'] = trim($class); } // width if ($c->hasWidth()) { $data['width'] = $c->getWidth(); } // other column attribute $data['orderable'] = $c->hasOrder(); $data['searchable'] = $c->hasStrainer(); $data['name'] = $c->getName(); if ($data['searchable'] && !is_null($value = $c->getStrainer()->getValue())) { $value = is_bool($value) ? intval($value) : $value; $search[] = $value; } else { $search[] = null; } // set order for main table if ($c->hasOrderDirection()) { $order[] = [$index, $c->getOrderDirection()]; } // set columns to null if column parameters is empty $columns[] = empty($data) ? null : $data; $index++; } if (!empty($columns)) { $options += ['columns' => $columns]; } // buttons if ($table->hasDatatableButtons()) { $options += ['buttons' => $table->getDatatableButtons()]; } // main order foir the table $options['order'] = $order; js('onload', '#' . $table->getAttribute('id'), 'dtt', $options); // init search configuration - seartchcols doesn't work foreach ($search as $i => $s) { if (is_null($s)) { continue; } js('onload', '#' . $table->getAttribute('id'), 'DataTable().columns(' . $i . ').search', $s); } return ''; }