IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Contingut

Introducció

És un "plugin" o afegit de CodeIgniter que permet crear ràpidament aplicacions CRUD

Llibreries utilitzades

A la versió 1.3.3:

Temes:

Instal·lació

Primer cal instal·lar CodeIgniter. Suposem que seguiu les passes de:

 Instal·lació CodeIgniter

Aleshores la instal·lació es pot fer amb:

$ cd /var/ww/codeigniter
$ sudo wget http://grocery-crud.googlecode.com/files/grocery_CRUD-1.3.3.zip
$ sudo unzip grocery_CRUD-1.3.3.zip 


Recursos

Exemples

Instal·lar les bases de dades

Creeu la base de dades:

$ sudo mysql -p 
> CREATE DATABASE grocerycrud;
> quit

Ompliu la base de dades amb:

/var/www/codeigniter$ sudo mysql --force -p grocerycrud < examples_database.sql

Primer exemple

Se suposa que heu conseguit instal·lar CodeIgniter i GroceryCRUD seguint els passos de:

Grocerycrud#Instal.C2.B7laci.C3.B3

Ara aneu a:

$ cd /var/www/codeigniter

Configurem la base de dades:

$ sudo joe application/config/database.php

I canvieu les línies:

$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'grocerycrud';
$db['default']['password'] = 'grocerycrud';
$db['default']['database'] = 'grocerycrud';

Creem la base de dades:

$ sudo mysql -p
...
mysql> 

Creem la base de dades:

> CREATE DATABASE grocerycrud;

Creem l'usuari i els permisos:

> CREATE USER 'grocerycrud'@'localhost' IDENTIFIED BY 'grocerycrud';
> GRANT ALL PRIVILEGES ON grocerycrud.* TO 'grocerycrud'@'%' WITH GRANT OPTION;
> FLUSH privileges;
> USE grocerycrud;

Ara proveu:

http://localhost/codeigniter/index.php/examples

NOTA: Segurament voleu parar aquí. Tot el següent no cal si heu instal·lat tota la base de dades segons l'apartat anterior:

I executeu el SQL:

 CREATE TABLE IF NOT EXISTS `employees` (
  `employeeNumber` int(11) NOT NULL AUTO_INCREMENT,
  `lastName` varchar(50) NOT NULL,
  `firstName` varchar(50) NOT NULL,
  `extension` varchar(10) NOT NULL,
  `email` varchar(100) NOT NULL,
  `officeCode` varchar(10) NOT NULL,
  `file_url` varchar(250) CHARACTER SET utf8 NOT NULL,
  `jobTitle` varchar(50) NOT NULL,
  PRIMARY KEY (`employeeNumber`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1703 ;
 
 
INSERT INTO `employees` (`employeeNumber`, `lastName`, `firstName`, `extension`, `email`, `officeCode`, `file_url`, `jobTitle`) VALUES
(1002, 'Murphy', 'Diane', 'x5800', 'dmurphy@classicmodelcars.com', '1', '', 'President'),
(1056, 'Patterson', 'Mary', 'x4611', 'mpatterso@classicmodelcars.com', '1', '', 'VP Sales'),
(1076, 'Firrelli', 'Jeff', 'x9273', 'jfirrelli@classicmodelcars.com', '1', '', 'VP Marketing'),
(1088, 'Patterson', 'William', 'x4871', 'wpatterson@classicmodelcars.com', '6', '', 'Sales Manager (APAC)'),
(1102, 'Bondur', 'Gerard', 'x5408', 'gbondur@classicmodelcars.com', '4', 'pdftest.pdf', 'Sale Manager (EMEA)'),
(1143, 'Bow', 'Anthony', 'x5428', 'abow@classicmodelcars.com', '1', '', 'Sales Manager (NA)'),
(1165, 'Jennings', 'Leslie', 'x3291', 'ljennings@classicmodelcars.com', '1', '', 'Sales Rep'),
(1166, 'Thompson', 'Leslie', 'x4065', 'lthompson@classicmodelcars.com', '1', '', 'Sales Rep'),
(1188, 'Firrelli', 'Julie', 'x2173', 'jfirrelli@classicmodelcars.com', '2', 'test-2.pdf', 'Sales Rep'),
(1216, 'Patterson', 'Steve', 'x4334', 'spatterson@classicmodelcars.com', '2', '', 'Sales Rep'),
(1286, 'Tseng', 'Foon Yue', 'x2248', 'ftseng@classicmodelcars.com', '3', '', 'Sales Rep'),
(1323, 'Vanauf', 'George', 'x4102', 'gvanauf@classicmodelcars.com', '3', '', 'Sales Rep'),
(1337, 'Bondur', 'Loui', 'x6493', 'lbondur@classicmodelcars.com', '4', '', 'Sales Rep'),
(1370, 'Hernandez', 'Gerard', 'x2028', 'ghernande@classicmodelcars.com', '4', '', 'Sales Rep'),
(1401, 'Castillo', 'Pamela', 'x2759', 'pcastillo@classicmodelcars.com', '4', '', 'Sales Rep'),
(1501, 'Bott', 'Larry', 'x2311', 'lbott@classicmodelcars.com', '7', '', 'Sales Rep'),
(1504, 'Jones', 'Barry', 'x102', 'bjones@classicmodelcars.com', '7', '', 'Sales Rep'),
(1611, 'Fixter', 'Andy', 'x101', 'afixter@classicmodelcars.com', '6', '', 'Sales Rep'),
(1612, 'Marsh', 'Peter', 'x102', 'pmarsh@classicmodelcars.com', '6', '', 'Sales Rep'),
(1619, 'King', 'Tom', 'x103', 'tking@classicmodelcars.com', '6', '', 'Sales Rep'),
(1621, 'Nishi', 'Mami', 'x101', 'mnishi@classicmodelcars.com', '5', '', 'Sales Rep'),
(1625, 'Kato', 'Yoshimi', 'x102', 'ykato@classicmodelcars.com', '5', '', 'Sales Rep'),
(1702, 'Gerard', 'Martin', 'x2312', 'mgerard@classicmodelcars.com', '4', '', 'Sales Rep');

Ara creeu el fitxer controlador:

$ cd /var/www/codeigniter
$ sudo joe application/controllers/main.php


 <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Main extends CI_Controller {

    function __construct()
    {
        parent::__construct();

        $this->load->database();

    }

    public function index()
    {
        echo "<h1>Welcome to the world of Codeigniter</h1>";//Just an example to ensure that we get into the function
        die();
    }
}

/* End of file main.php */
/* Location: ./application/controllers/main.php */

Això carregarà la base de dades. Comprovem que no dona errors carregant el web:

http://localhost/codeigniter/index.php/main

Ara tornem a editar el fitxer:

 $ sudo joe application/controllers/main.php

i que quedi:


<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class Main extends CI_Controller {
 
    function __construct()
    {
        parent::__construct();
 
        /* Standard Libraries of codeigniter are required */
        $this->load->database();
        $this->load->helper('url');
        /* ------------------ */ 
 
        $this->load->library('grocery_CRUD');
 
    }
 
    public function index()
    {
        echo "<h1>Welcome to the world of Codeigniter</h1>";//Just an example to ensure that we get into the function
        die();
    }
 
    public function employees()
    {
        $this->grocery_crud->set_table('employees');
        $output = $this->grocery_crud->render();

        print_r($output);

        die();
    }
}
 
/* End of file main.php */
/* Location: ./application/controllers/main.php */
 

IMPORTANT: El nom de la funció, employees a l'exemple, és important. Ha de coincidir amb el nom d'una taula de la base de dades. Sinó s'utilitza el mètode set_name. Un altre exemple si la taula es digues offices:


 function offices()
 {
    $output = $this->grocery_crud->render();
 
    $this->_example_output($output);
 }


Ara aneu a la URL:

http://localhost/codeigniter/index.php/main/employees

I veureu:

 stdClass Object
 (
     [output] => Your output will appear here....
     [js_files] => Array
         (
             [763b4d272e158bdb8ed5a12a1824c94f494954bd] => http://grocery_crud/public/grocery_crud/themes/datatables/js/jquery-1.6.2.min.js
             [0b677f3fc6fb25b4baf39eb144222116c5b60254] => http://grocery_crud/public/grocery_crud/themes/flexigrid/js/cookies.js
             [ec3ae62b8d5838972e858fe54447bd4bd8d79f88] => http://grocery_crud/public/grocery_crud/themes/flexigrid/js/flexigrid.js
             [2c0ff56d0cbc6f80a5ef9c770d478f0e00c3170d] => http://grocery_crud/public/grocery_crud/themes/flexigrid/js/jquery.form.js
             [474495ff1e895eab81fb8afba4db9b06c15b19af] => http://grocery_crud/public/grocery_crud/themes/flexigrid/js/jquery.numeric.js
         )
  
     [css_files] => Array
         (
             [732b03aa54d124f062757b71e5560acdc5632ba6] => http://grocery_crud/public/grocery_crud/themes/flexigrid/css/flexigrid.css
         )
  
 )

Ja tenim el controlador fet. Ara cal implementar la vista:

$ sudo joe application/views/employes_view.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
 
<?php 
foreach($css_files as $file): ?>
    <link type="text/css" rel="stylesheet" href="<?php echo $file; ?>" />
 
<?php endforeach; ?>
<?php foreach($js_files as $file): ?>
 
    <script src="<?php echo $file; ?>"></script>
<?php endforeach; ?>
 
<style type='text/css'>
body
{
    font-family: Arial;
    font-size: 14px;
}
a {
    color: blue;
    text-decoration: none;
    font-size: 14px;
}
a:hover
{
    text-decoration: underline;
}
</style>
</head>
<body>
<!-- Beginning header -->
    <div>
        <a href='<?php echo site_url('examples/offices_management')?>'>Offices</a> | 
        <a href='<?php echo site_url('examples/employees_management')?>'>Employees</a> |
        <a href='<?php echo site_url('examples/customers_management')?>'>Customers</a> |
        <a href='<?php echo site_url('examples/orders_management')?>'>Orders</a> |
        <a href='<?php echo site_url('examples/products_management')?>'>Products</a> | 
        <a href='<?php echo site_url('examples/film_management')?>'>Films</a>
 
    </div>
<!-- End of header-->
    <div style='height:20px;'></div>  
    <div>
        <?php echo $output; ?>
 
    </div>
<!-- Beginning footer -->
<div>Footer</div>
<!-- End of Footer -->
</body>
</html>

I tornem a editar el controlador:

$ sudo joe application/controllers/main.php

i que quedi:


<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class Main extends CI_Controller {
 
    function __construct()
    {
        parent::__construct();
 
        /* Standard Libraries of codeigniter are required */
        $this->load->database();
        $this->load->helper('url');
        /* ------------------ */ 
 
        $this->load->library('grocery_CRUD');
 
    }
 
    public function index()
    {
        echo "<h1>Welcome to the world of Codeigniter</h1>";//Just an example to ensure that we get into the function
                die();
    }
 
    public function employees()
    {
        $this->grocery_crud->set_table('employees');
        $output = $this->grocery_crud->render();
 
        $this->load->view('employes_view.php',$output);           
    }

}
 
/* End of file main.php */
/* Location: ./application/controllers/main.php */

Ara aneu a la URL:

http://localhost/codeigniter/index.php/main/employees

Està bé no?

Si voleu que no aparegui el nom genèric record utilitzeu el mètode set_subject.

Modificacions bàsiques

Canviar el nom que apareix al boto Add XXX

Cal utilitzar:

 $crud->set_subject('your_subject_name');

S'ha de posar abans del render:

public function employees_example()
    {
        $crud = new grocery_CRUD();
 
        $crud->set_subject('Employee');
        $crud->set_table('employees');
        $output = $crud->render();
 
        $this->_example_output($output);                
    }


Recursos:

Canviar el nom de les columnes que apareixen al llistat

Per defecte el nom de les columnes és el nom del camp de base de dades. Els noms de camps de bases de dades no són normalment User Friendly. Per canviar el nom:

 $crud->display_as('field_name','field_label');

IMPORTANT: El nom del camp és case sensitive. A més compte que per defecte Grocery Crud posa el nom del camp per pantalla amb una inicial majúscula que no teniu per que tenir al nom real del camp a la base de dades

Recursos:

Controlar el que és veu a les llistes i el que es veu als formularis d'edició i afegir

Cal utilitzar els mètodes columns i fields:

 $crud->columns('field_name1','field_name2','field_name3','field_name4');

La única diferència és que columns controla el que es mostra a la llista i fields:

 $crud->fields('field_name1','field_name2','field_name3','field_name4');

El que surt als formularis CRUD.


        $crud = new grocery_CRUD();
 
        $crud->set_table('employees');
        $crud->columns('lastName','firstName','email','jobTitle');
        $crud->fields('lastName','firstName','extension','email','jobTitle');
 
        $output = $crud->render();
 
        $this->_example_output($output);                

Camps obligatoris

Utilitzeu el mètode required_fields:

    $crud->required_fields('city');

Ordenar per...

Utilitzeu:

    $crud->order_by('creditLimit','desc');

Recursos:

Camps ocults

TODO 

Comprovar en quin estat estem (afegir,edició)

function employees_management()
{
    $crud = new grocery_CRUD();
 
    $crud->set_theme('datatables');
    $crud->set_table('employees');
    $crud->set_relation('officeCode','offices','city');
    $crud->display_as('officeCode','Office City');
    $crud->set_subject('Employee');
 
    $output = $crud->render();
 
      $state = $crud->getState();
    $state_info = $crud->getStateInfo();
 
    if($state == 'add')
    {
        //Do your cool stuff here . You don't need any State info you are in add
    }
    elseif($state == 'edit')
    {
        $primary_key = $state_info->primary_key;
        //Do your awesome coding here. 
    }
    else
    {
        $this->_example_output($output);
    }
}


Recursos:

Formularis

Validació. set_rules

set_rules: Utilitzar la llibreria form_validation de CodeIgniter. Per veure una referència:

http://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#rulereference

The set_rules method works exactly with the same way as codeigniter's set_rules method of form_validation library. The only difference is that you will add the set_rules at your grocery_CRUD object. For example:

$crud->set_rules('quantityInStock','Quantity In Stock','integer');

For more you can read the set_rules codeigniter documentation. The cool thing about grocery CRUD is that only with this line of code you will have all the validation messages when a user submits an invalid form.

Customitzar les accions. Callbacks

Un exemple de com customitzar el que es fa abans d'un insert:

$crud->callback_before_insert(array($this,'my_callback'));

Es a dir s'executarà el mètode my_callback abans de fer una inserció de registre a la base de dades.

Exemple de com xifrar paraules de pas abans d'inserir-les a la base de dades

Let's see an example of callback_before_update method:

$crud->callback_before_update(array($this,'encrypt_password_callback'));

and

function encrypt_password_callback($post_array, $primary_key) {
    $this->load->library('encrypt');
 
    //Encrypt password only if is not empty. Else don't change the password to an empty field
    if(!empty($post_array['password']))
    {
        $key = 'super-secret-key';
        $post_array['password'] = $this->encrypt->encode($post_array['password'], $key);
    }
    else
    {
        unset($post_array['password']);
    }
 
  return $post_array;
}

This simply means that before the update we will call the

 $this->encrypt_password_callback($post_array, $primary_key);

where $this is the Controllers $this and $post_array, $primary_key are automatically inserted from the grocery CRUD library.

A exemples hi ha més exemples de callbacks:

Recursos:

Temes

Hi ha dos temes de sèrie:

  • Flexigrid: suporta Ajax. És el tema per defecte.
  • datables: funciona amb Javascript
  • twitter-bootstrap: no està documentat

Es pot establir el tema amb set_theme, un exemple:

$crud->set_theme('datatables');

Cercadors

Estan integrats als temes per defecte. El flexigrid no cerca de forma interactiva, el tema datatables si.

Relacions de bases de dades 1-1, 1-n i n-n

Mostrar dades d'una taula secundaria, 1-n

S'utilitzar el mètode set_relation i display_as per ser coherents. Per exemple, per no mostrar el codi d'oficina, sinó un altre dade com la ciutat:

 function employees_management()
 {
    $crud = new grocery_CRUD();
 
    $crud->set_theme('datatables');
    $crud->set_table('employees');
    $crud->display_as('officeCode','Office City');
    $crud->set_subject('Employee');
 
    $crud->set_relation('officeCode','offices','city');
 
    $output = $crud->render();
 
    $this->_example_output($output);
 }
1-n i n-n

Es pot veure l'exemple de pelis :

http://localhost/codeigniter/index.php/examples/film_management/edit/1

Les relacions 1-n als formularis es converteixen en desplegables de múltiples selecció. Els N-N en dos columnes on es pot afegir-treure

Recursos:

upload de fitxers

NOTA: Està currat! Es poden arrosegar fitxers

Només cal indicar quin és el camp o camps que són fitxers amb el mètode:

 $crud->set_field_upload('file_url','assets/uploads/files');

Oco amb els permisos de la carpeta:

$ sudo ls -la assets/uploads/files/

Per defecte en el meu cas és root. Cal que pugui l'usuari web (normalment www-data o similar) fer canvis a la carpeta:

/var/www/codeigniter$ sudo chown -R  www-data:www-data assets/uploads/files

Recursos:

Idiomes. Localització

Es pot indicar l'idioma a:

$ cd /var/www/codeigniter
$ sudo joe application/config/grocery_crud.php

Poseu:

$config['grocery_crud_default_language']        = 'spanish';
Customitzacions

Es poden fer programant amb els mètodes

set_language

o

set_lang_string

O fer una còpia del fitxer d'idiomai fer-lo a mida.

Afegir un idioma. Català

Cal anar a:

assets/grocery_crud/languages

NOTA: ÉS diferent al que utilitza CodeIgniter, i això és expressament per ser independent

Cal crear un fitxer amb el nom que s'utilitzarà al fitxer application/config/grocery_crud.php, per exemple:

catalan

Es pot copiar un idioma ja existent:

$ cd assets/grocery_crud/languages/
$ sudo cp spanish.php catalan.php

I cal fer la traducció!

Exemples

Afegir paraules de pas a la base de dades (camp de confirmació)

Actualitzar les llistes segons tema (flexigrid/datatables/bootstrap)

Quan hi ha un canvi a la base de dades, cal actualitzar el contingut de les llistes. Segons el tema utilitzat se fa d'una manera o d'un altre.

Per exemple flexigrid té un botó amb el símbol típic d'actualitzar a la part inferior (just després de la paginació i abans del missatge "Mostrant X a Y de Z registres"). Si es fa clic a aquest botó es genera una petició AJax i s'actualitza la taula sense actualitzar tota la resta de la pàgina (evidentment un F5 també refresca la llista però genera una petició HTTP completa).

Per codi es pot forçar l'actualització forçant el clic d'aquest botó, per exemple:

 $('.flexigrid[data-unique-hash='+data_unique_hash+']').find('.ajax_refresh_and_loading').trigger('click');

Fixeu-vos que per evitar conflictes a l'exemple s'utilitza el hash. L'exemple esta extret del fitxer flexigrid-add.js

Estats

L'array d'estats és el següent:

 $states = array(
        0    => 'unknown',
        1    => 'list',
        2    => 'add',
        3    => 'edit',
        4    => 'delete',
        5    => 'insert',
        6    => 'update',
        7    => 'ajax_list',
        8    => 'ajax_list_info',
        9    => 'insert_validation',
        10    => 'update_validation',
        11    => 'upload_file',
        12    => 'delete_file',
        13    => 'ajax_relation',
        14    => 'ajax_relation_n_n',
        15    => 'success',
        16    => 'export',
        17    => 'print',
        18    => 'read'
    );

NOTA: L'estat read s'ha afegit a la versió 1.4

Cal tenir en compte que a l'hora de llistar tenim:

  • estat list:
  • estat ajax_list:
list is the first grid.
ajax_list is only the grid that is called by AJAX, for example if you press the next page button.
ajax_list_info it is just some numeric json data, for example when you press next page button you will have a json  
that looks like this: {"total_results":326

'Recursos:

Controlar l'accés a certs estats

Exemple: user_profile/user_preferences

           $crud = new grocery_CRUD();
            
            $crud->unset_add();
            $crud->unset_delete();
            $crud->unset_list();
//the above ensures the the user is not permitted to do anything but edit
            $crud->unset_back_to_list();
//The above ensures the user is left on the same page after edit / update and have no other actions.
            
//Here was the trick. Identify if the operation was Unknown / List then redirect it the users 
//profile update page
            $state_code = $crud->getState();
            if($state_code == 'unknown' || $state_code == 'list') {
                redirect("users/my_profile/edit/" . $this->user_id);
            }
//Now comes for security. Check if the primary key used for edit is not the same as of the user then
//show him error - do not allow the user to end up editing other users profile            
            $segment_object = $crud->getStateInfo();
            $primary_key = $segment_object->primary_key;
            if($primary_key != $this->user_id) {
                show_error("Sorry you are not authorized to access this page.");
            }

Tipus de camps

Dropdowns (desplegables)

Dependent dropdowns:

$crud = new grocery_CRUD();
$crud->set_table('dd_goods');
$crud->set_relation('goods_country', 'dd_country', 'country_title');
$crud->set_relation('goods_state', 'dd_state', 'state_title');
$crud->set_relation('goods_city', 'dd_city', 'city_title');

$this->load->library('gc_dependent_select');
// settings

$fields = array(

// first field:
'goods_country' => array( // first dropdown name
'table_name' => 'dd_country', // table of country
'title' => 'country_title', // country title
'relate' => null // the first dropdown hasn't a relation
),
// second field
'goods_state' => array( // second dropdown name
'table_name' => 'dd_state', // table of state
'title' => 'state_title', // state title
'id_field' => 'state_id', // table of state: primary key
'relate' => 'country_ids', // table of state:
'data-placeholder' => 'select state' //dropdown's data-placeholder:

),
// third field. same settings
'goods_city' => array(
'table_name' => 'dd_city',
'where' =>"post_code>'167'",  // string. It's an optional parameter.
'order_by'=>"state_title DESC",  // string. It's an optional parameter.
'title' => 'id: {city_id} / city : {city_title}',  // now you can use this format )))
'id_field' => 'city_id',
'relate' => 'state_ids',
'data-placeholder' => 'select city'
)
);

$config = array(
'main_table' => 'dd_goods',
'main_table_primary' => 'goods_id',
"url" => base_url() . __CLASS__ . '/' . __FUNCTION__ . '/', path to method
'ajax_loader' => base_url() . 'ajax-loader.gif' // path to ajax-loader image. It's an optional parameter
'segment_name' =>'Your_segment_name' // It's an optional parameter. by default "get_items"
);
$categories = new gc_dependent_select($crud, $fields, $config);

// first method:
//$output = $categories->render();

// the second method:
$js = $categories->get_js();
$output = $crud->render();
$output->output.= $js;
$this->_example_output($output);

Recursos:

Validacions de formularis a mida: set_rules

Es pot utilitzar la funció set_rules:

$this->grocery_crud->set_rules('username', 'Username','trim|required|xss_clean|callback_username_check');

El funcionament és idèntic a les normes de validació de codeigniter:

http://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#validationrules

Un exemple:

function your_function($operation = null)
{
....
$this->grocery_crud->....
  $this->grocery_crud->set_rules('username', 'Username','trim|required|xss_clean|callback_username_check');
$this->grocery_crud->....
$output = $this->grocery_crud->render();
....
}
public function username_check($str)
{
  $id = $this->uri->segment(4);
  if(!empty($id) && is_numeric($id))
  {
   $username_old = $this->db->where("id",$id)->get('users')->row()->username;
   $this->db->where("username !=",$username_old);
  }
  
  $num_row = $this->db->where('username',$str)->get('users')->num_rows();
  if ($num_row >= 1)
  {
   $this->form_validation->set_message('username_check', 'The username already exists');
   return FALSE;
  }
  else
  {
   return TRUE;
  }
}

Recursos:

Accions a mida

Afegir una acció

Imagecrud i accions a mida

Una opció interessant és utilitzar una acció a mida per lligar GroceryCrud amb imagecrud:

http://www.grocerycrud.com/forums/topic/624-grocery-crud-w-image-crud-to-work-in-ie/
http://www.grocerycrud.com/documentation/options_functions/add_action

TODO

http://www.grocerycrud.com/documentation/options_functions/add_action

Model a mida

Es pot fer una classe model que extengui la classe model per defecte i fer els canvis que pertoquin al model.

 
 class My_Custom_model extends grocery_CRUD_Model 

El codi font de grocery_CRUD_Model es troba disponible i per tant es pot mirar que cal fer o que cal modificar i/o sobreesciure.

 
 $crud->set_model('My_Custom_model');

Recursos:


Exemple 1. Multiselect amb condició where per limitar el nombre de camps mostrats

NOTA: ÉS un exemple juquet ja que Grocery Crud ja suporta posar límita amb clàusules WHERE al mètode set_relation: http://www.grocerycrud.com/documentation/options_functions/set_relation

function employees_management() {    

$crud = new grocery_CRUD();    
$crud->set_theme('datatables');    
$crud->set_table('employees');    // add this line    
$crud->callback_edit_field('officeCode',array($this,'_call_back_offices'));    
$crud->callback_add_field('officeCode',array($this,'_call_back_offices'));    
$crud->display_as('officeCode','Office City');    
$crud->set_subject('Employee');    
$crud->set_relation('officeCode','offices','city');    
$output = $crud->render();    
$this->_example_output($output);}

function _call_back_offices(){    

$this->load->model('user_model'); // your model    
$data = $this->user_model->getYou('offices','officeCode, city', "state = '".$this->session->userdata('state')."'"); // iam using session here    
$hasil ='<select name="officeCode">';    
foreach($data as $x)    {        
	$hasil .='<option value="'.$x->officeCode.'">'.$x->city.'</option>';    
	}    
	return $hasil.'</select>';
}

Al model cal afegir la funció:

function getYou($tablel,$field = '*', $cond ='')  {    
	$this->db->select($field);    
	$this->db->from($tablel);    
	if(!empty($cond)) 
	$this->db->where($cond);    
	return $this->db->get()->result();
	}

REST API

Mostrar els errors/excepcions. Fitxer de log

Al cridar a delete sense id:

http://185.13.76.62/codeigniter/index.php/main/inventory/delete/

Donarà l'error:

$ sudo tail -f /var/log/apache2/error.log
...
[Tue May 21 12:33:29 2013] [error] [client 185.13.76.51] PHP Fatal error:  Uncaught exception 'Exception' with message 'On the state "delete" the Primary key cannot be null' in /var/www/codeigniter/application/libraries/grocery_crud.php:2841\nStack trace:\n#0 /var/www/codeigniter/application/libraries/grocery_crud.php(3895): grocery_CRUD_States->getStateInfo()\n#1 /var/www/codeigniter/application/controllers/main.php(80): grocery_CRUD->render()\n#2  [internal function]: Main->inventory('delete')\n#3 /var/www/codeigniter/system/core/CodeIgniter.php(359): call_user_func_array(Array, Array)\n#4 /var/www/codeigniter/index.php(202): require_once('/var/www/codeig...')\n#5 {main}\n  thrown in /var/www/codeigniter/application/libraries/grocery_crud.php on line 2841

Això està la codi:

	public function getStateInfo()
	{
 case 4:
				if($first_parameter !== null)
				{
					$state_info = (object)array('primary_key' => $first_parameter);
				}	
				else
				{
					throw new Exception('On the state "delete" the Primary key cannot be null',7);
					die();
				}
...

Operacions CRUD

Create

Per fer un insert a la base de dades cal utilitzar la url:

http://185.13.76.62/codeigniter/index.php/main/inventory/insert

Però cal enviar dades amb post sinó donarà l'excepció:

$ sudo tail -f /var/log/apache2/error.log
[Tue May 21 12:36:43 2013] [error] [client 185.13.76.51] PHP Fatal error:  Uncaught exception 'Exception' with message 'On the state "insert" you must have post data' in /var/www/codeigniter/application/libraries/grocery_crud.php:2853\nStack trace:\n#0 /var/www/codeigniter/application/libraries/grocery_crud.php(3895): grocery_CRUD_States->getStateInfo()\n#1 /var/www/codeigniter/application/controllers/main.php(81): grocery_CRUD->render()\n#2 [internal function]: Main->inventory('insert')\n#3 /var/www/codeigniter/system/core/CodeIgniter.php(359): call_user_func_array(Array, Array)\n#4 /var/www/codeigniter/index.php(202): require_once('/var/www/codeig...')\n#5 {main}\n  thrown in /var/www/codeigniter/application/libraries/grocery_crud.php on line 2853

S'utilitza la funció:

 $insert_result = $this->db_insert($state_info);

On $state_info és:

 $state_info = (object)array('unwrapped_data' => $_POST);

és a dir la variable post amb tots els camps a inserir.



Read

Update

Esborrar

Per exborrar un item (per exemple el item amb id 2)

http://185.13.76.62/codeigniter/index.php/main/inventory/delete/2

Tornarà un JSON amb el resultat. Exemple correcte:

{"success":true,"success_message":"

Your data has been successfully deleted from the database.<\/p>"}

Exemple error:

{"success":false,"error_message":"

Your data was not deleted from the database.<\/p>"}

Documentació

Notes per altres plataformes

Relació de codi que fa Grocery Crud dependent de Code Igniter.

Instal·lació

  • Grocery crud és tota una aplicació Code Igniter amb tota la estructura
  • Proposta: Instal·lació com a paquet composer a vendor

Assets:

  • Grocery Crud té una carpeta assets amb tots els JS i CSS que necessita. A pre_render _initialize_variables:
/** Initialize default paths */
$this->default_javascript_path				= $this->default_assets_path.'/js';
$this->default_css_path						= $this->default_assets_path.'/css';
$this->default_texteditor_path 				= $this->default_assets_path.'/texteditor';
$this->default_theme_path					= $this->default_assets_path.'/themes';

Libraries:

S'utilitza la llibreria Form_validation ( [1])

if(defined('CI_VERSION'))
{
	$ci = &get_instance();
	$ci->load->library('Form_validation');

	class grocery_CRUD_Form_validation extends CI_Form_validation{

		public $CI;
		public $_field_data			= array();
		public $_config_rules		= array();
		public $_error_array		= array();
		public $_error_messages		= array();
		public $_error_prefix		= '<p>';
		public $_error_suffix		= '</p>';
		public $error_string		= '';
		public $_safe_form_data		= FALSE;
	}
}

Helpers:

Grocery Crud utilitza helpers de codeigniter: URL i form

protected function _initialize_helpers()
	{
		$ci = &get_instance();

		$ci->load->helper('url');
		$ci->load->helper('form');
	}

El mètodes utilitzats:

site_url
base_url

Configuració

  • Existeix fitxer de configuració config/grocery_crud.php
  • La configuració és llegeix al fitxer llibreria al mètode pre_render que crida el mètode _initialize_variables

Opcions:

  • Agnostic
  • Laravel: també suporta un sistema de fitxers config i hi ha tant un mètode de suport com una Facade per accedir a la configuració

Troubleshooting. Resol·lució de problemes

El fitxer javascript jquery-1.10.2.min.js conté jQuery Migrate 1.2.1

Si observeu el fitxer jquery-1.10.2.min.js de Grocery Crud conté al final insertat:

jQuery Migrate 1.2.1

És important tenir-ho en compte a mi m'ha creat problemes amb select2 al tornar a carregar jquery min múltiples vegades i select2!

Vegeu també

Enllaços externs