Really Great!

On Tue, Apr 23, 2013 at 5:48 AM, Fernando Nery Filho <[email protected]>wrote:

> So earlier today I found here in the group that a few people discussed
> this, but I didn't find anyone who actually wrote the code, so I'm sharing
> it so anyone will have something to start.
> jQuery's DataTable is a really powerful tool to exhibit and manipulate
> data in a Table. It is also really quick to implement and have a big and
> extensive API and documentation.
> Check it here: http://www.datatables.net/index
>
>
> Also, I would really like some opinion. Please keep in mind this is my
> first attempt to build a CakePHP application from scratch. haha.
>
>
> So this is what I wanted: combine CakePHP 2.1 JSON and XML views with
> DataTable's Server-side processing so DataTable will handle my Views as
> CakePHP gets the data and sends me through AJAX.
>
> I have it working in 3 parts: My view and the JS script that will tell
> DataTable what to do; the Controller I'm calling in; and the Component that
> will manage passing data variables both ways Cake and DataTable.
>
> *VIEW*
>
> jQuery(document).ready(*function*() {
> $('#tabela_controller').dataTable({
>
> "bProcessing": true,
>
> "bServerSide": true,
>
> "sAjaxSource": "/Controller/index",
>
> "fnServerParams": *function *(aoData) {
>
> aoData.push({"name":"model", "value":"Controller"});
>
> aoData.push({"name":"fields", "value": ["Controller.id", "Controller.name"]
> });
>
> },
>
> "sServerMethod": "POST"
>
> });
> });
>
> <table id="tabela_controller">
>
> <thead>
>
> <tr>
>
> <th class="hidden-480">ID</th>
>
> <th width="70%">Name</th>
>
> </tr>
>
> </thead>
>
> <tbody>
>
> <tr>
>
> <td colspan="2" class="dataTables_empty">Loading from server...</td>
>
> </tr>
>
> </tbody>
>
> </table>
>
>
> *CONTROLLER*
> *
> *
> public function index() {
>
> $this->Genero->recursive = 0;
>
> if ($this->request->is('post')) {
>
> // Load RequestHandler so it will output JSON
>
> $this->RequestHandler->setContent('json', 'application/json');
>
> // Load my Component and transform DataTable request to something Cake
> will read
>
> $this->DataTable = $this->Components->load('DataTable');
>
> $params = $this->DataTable->modelParams($this->request->data);
>
> // Aditional Info for DataTable
>
> $params['iTotal'] = $this->Controller->find('count');
>
> // Does two things: uses $params created by modelParams and uses it to
> transform Cake nested result in something DataTable will read
>
> $json = $this->DataTable->outputView($this->Controller->find('all',
> $params),$params);
>
> $this->set(compact('json'));
>
> }
>
> }
>
>
> *COMPONENT*
> *
> *
> public function modelParams($requestdata) {
>
> $out = array();
>
> // Fields
>
> if (isset($requestdata['fields'])) {
>
> $requestdata['fields'] = explode(",",$requestdata['fields']);
>
> foreach ($requestdata['fields'] as $value) {
>
> $out['fields'][] = $value;
>
> }
>
> }
>
>
> // Paging
>
> if (isset($requestdata['iDisplayStart']) && $requestdata['iDisplayLength']!=
> '-1') {
>
> $out['offset'] = intval($requestdata['iDisplayLength']);
>
> $out['limit'] = intval($requestdata['iDisplayStart']);
>
> unset($requestdata['iDisplayLength']);
>
> unset($requestdata['iDisplayStart']);
>
> }
>
> // Ordering
>
> if (isset($requestdata['iSortCol_0'])) {
>
> for ($i=0; $i < intval($requestdata['iSortingCols']); $i++) {
>
> if ($requestdata['bSortable_'.intval($requestdata['iSortCol_'.$i])] ==
> "true") {
>
> $out['order'][] = $requestdata['fields'][intval($requestdata['iSortCol_'.
> $i])] . ($requestdata['sSortDir_'.$i]==='asc' ? ' ASC' : ' DESC');
>
> }
>
> }
>
> unset($requestdata['iSortCol_0']);
>
> }
>
> // Filtering
>
> if (isset($requestdata['sSearch']) && $requestdata['sSearch'] != "") {
>
> for ( $i=0 ; $i<count($requestdata['fields']); $i++ ) {
>
> $out['conditions'][$requestdata['fields'][$i]] = "'%".$requestdata[
> 'sSearch']."%'";
>
> }
>
> unset($requestdata['sSearch']);
>
> }
>
> // Last Variables
>
> $out['sEcho'] = $requestdata['sEcho'];
>
> $out['model'] = $requestdata['model'];
>
> unset($requestdata);
>
> return $out;
>
> }
>  public function outputView($result,$params) {
>
> // Initial variables
>
> $output = array(
>
> "sEcho" => intval($params['sEcho']),
>
> "iTotalRecords" => $params['iTotal'],
>
> "iTotalDisplayRecords" => count($result),
>
> "aaData" => array()
>
> );
>
> $model = $params['model'];
>
> unset($params['model']);
>
> // Include results
>
> $row = array();
>
> foreach($result as $linha) {
>
> $column = array();
>
> foreach ($linha[$model] as $value) {
>
> $column[] = $value;
>
> }
>
> unset($linha);
>
>
>
> $row[] = $column;
>
> }
>
> unset($result);
>
> $output['aaData'] = $row;
>
> unset($row);
>
> return $output;
>
> }
> *
> *
>
> --
> Like Us on FaceBook https://www.facebook.com/CakePHP
> Find us on Twitter http://twitter.com/CakePHP
>
> ---
> You received this message because you are subscribed to the Google Groups
> "CakePHP" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/cake-php?hl=en.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>

-- 
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

--- 
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/cake-php?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to