Jump to content


Most Liked Content


#4286 [updated 24/11/2012] Dependent dropdown (library)

Posted victor on 16 November 2012 - 03:35 PM

Hi all! This is my second library.
If you have a few dependent dropdowns on any page this library for you.
When you made selection in a "Parent" dropdown the library refreshes a "child" dropdown.

Advantage of this library:

  • integration is easily
  • it is not required to change a template
  • it is not required to create a callback function

The library works perfectly with GC v 1.5.x and CI 3.x
_______________________________________

Download here:

v 1.5.1 Attached File  Gc_dependent_select.php   11.36K   2513 downloads

__________________________________________

v 1.2.0 Attached File  gc_dependent_select.php   9.14K   5074 downloads
_______________________________________
v 1.1.1 Attached File  gc_dependent_select.php   6.64K   1264 downloads
_______________________________________
v 1.1.0 Attached File  gc_dependent_select.php   6.34K   1250 downloads
The library v.1.1.0 has a bug!
http://www.grocerycr...t__20#entry4344
_______________________________________

How to use (v. 1.2.0.):
cc.jpg
c.jpg
 


$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);

Note:

You can't use the callback_edit_field and callback_add_field for this field. You can use callback_edit_field and callback_add_field only for the first field

example 2:
schema.jpg


function test()
{
$crud = new grocery_CRUD();
$crud->set_table('zone_allocate_subzone');
$crud->set_relation('category_id', 'category', 'category_name');
$crud->set_relation('subcategory_id', 'sub_category', 'subcategory_name');
$crud->set_relation('zone_id', 'zone', 'zone_name');
$crud->set_relation('subzone_id', 'sub_zone', 'subzone_name');
$this->load->library('gc_dependent_select');

$fields = array(
'category_id' => array(// first dropdown name
'table_name' => 'category', // table of country
'title' => 'country_title', // country title
'relate' => null // the first dropdown hasn't a relation
),
'subcategory_id' => array(// second dropdown name
'table_name' => 'sub_category', // table of state
'title' => 'subcategory_name', // state title
'id_field' => 'id', // table of state: primary key
'relate' => 'category_id', // table of state:
'data-placeholder' => 'Select Subcategory' //dropdown's data-placeholder:
)
);
$config = array(
'main_table' => 'dd_goods',
'main_table_primary' => 'goods_id',
"url" => base_url() . __CLASS__ . '/' . __FUNCTION__ . '/',
);
$categories = new gc_dependent_select($crud, $fields, $config);
$js = $categories->get_js();

$fields2 = array(
'zone_id' => array(// first dropdown name
'table_name' => 'zone', // table of country
'title' => 'country_title', // country title
'relate' => null // the first dropdown hasn't a relation
),
'subzone_id' => array(// second dropdown name
'table_name' => 'sub_zone', // table of state
'title' => 'subzone_name', // state title
'id_field' => 'id', // table of state: primary key
'relate' => 'zone_id', // table of state:
'data-placeholder' => 'Select Subzone' //dropdown's data-placeholder:
)
);
// change the "segment_name"!!!
$config2 = array(
'main_table' => 'dd_goods',
'main_table_primary' => 'goods_id',
"url" => base_url() . __CLASS__ . '/' . __FUNCTION__ . '/',
'segment_name' => "other_name"
);
$categories2 = new gc_dependent_select($crud, $fields2, $config2);
$js2 = $categories2->get_js();

$output = $crud->render();
$output->output.= $js . $js2;

$this->_example_output($output);
}

---------------------------------------------------
P.S. Thanks to web-johnny, thanks to KaBaDaBrA and to me http://www.grocerycr..._DIR#/smile.png .
P.S.S. Code can contain some bugs . If you find a bug - report, please.
Sorry, my English is poor.




#4308 [updated 24/11/2012] Dependent dropdown (library)

Posted web-johnny on 18 November 2012 - 10:51 AM

Hello victor,

your library seems really cool. By the way I changed your Member title to "grocery CRUD Hero" . I hope you like it :D


#7285 Remember to use the CodeIgniter and Grocery CRUD manuals

Posted davidoster on 09 May 2013 - 11:20 AM

Dear all,

 

as you know the current stable version of Grocery CRUD utilizes the wonderfull (and super fast) CodeIgniter framework.

This means that the code is based on this and hence it is good to know a few things about this framework before we start using it.

 

Many questions can be answered just by looking to the manual,

 

so, PLEASE READ THE MANUAL

and the Grocery CRUD's manual also.

 

Following victor's suggestion we include some additional information that might be useful to you.

 

1. Read these tutorials on how to use the developer tools of your browser

- for Internet Explorer, http://msdn.microsof...7(v=vs.85).aspx

- for FireFox, http://www.howtogeek...eveloper-tools/

- for Google Chrome, https://developers.g...eveloper-tools/

(feel free to suggest more tutorials!  :D )

 

2. Use, during development, PHP's error reporting,

error_reporting(E_ALL);

Edited by web-johnny
Also please make sure the the display_errors is set to "On" in your php.ini file (suggested).

display_errors = On

or in your php index.php file add:

ini_set('display_errors', 'On');
 
3. Learn all about CodeIgniter's error handling here: 
 
4. Are you sure that you are using the latest stable version of grocery CRUD? Did you know that the latest code on github is under development and it is not suggested to be used to production mode? Edited by web-johnny
 
5. Remember to smile  :) . All the support of the forum is for free and people try to help, so keep that in mind and please respect any given answer. Edited by web-johnny
 

 

Thank you! Keep on supporting this great software!




#6865 Filter relation using third table

Posted davidoster on 15 April 2013 - 09:19 PM

To be honest I find it easier to build a new model and just say,

/* sample code */

//mymodel.php under application/models
<?php
class mymodel extends CI_Model  {
	
	function __construct()
	{
		parent::__construct();
		$this->load->database();
	}

        public function get_activities_by_year($table, $year)
	{
		$this->db->select('id, year, description');
		$this->db->where('year', $year);
                $this->db->order_by('id desc');
		return $this->db->get($table);
	}


}

//controller.php
...
$this->load->model('mymodel');
$activities = $this->mymodel->get_activities_by_year("activities","2013");
foreach ($activities->result() as $row)
{
 $myarray[$row->id] .= $row->description;
}
$this->grocery_crud->field_type('interest_for','multiselect',$myarray);
...



#6790 Simple dependant dropdown extension

Posted ricardomduarte on 10 April 2013 - 10:34 AM

Hi all,

 

First of all thanks the GC guys for this magnific piece of software. I love it's simplicity and neatness.

 

I'd like to share with you a short extension I built to allow dependant dropboxes to be declared easily and in the same fashion that we declare the grocery CRUD model:

 

Dependant drop downs:

 

Say we have an address table that has both country and state fields and we want to enforce that the state dropdown only shows states from the selected country.

 

Using the ajax_grocery_CRUD.php library (copy the attached file Attached File  ajax_grocery_crud.php   6.76K   2571 downloads to the application\libraries folder), we would be writting the following php code:

 

      
       
function addresses_management()
{
            $this->load->library('grocery_CRUD');
            $this->load->library('ajax_grocery_CRUD');

//create ajax_grocery_CRUD instead of grocery_CRUD. This extends the functionality with the set_relation_dependency method keeping all original functionality as well
            $crud = new ajax_grocery_CRUD();

//this is the default grocery CRUD model declaration
            $crud->set_table('address');
            $crud->set_relation('ad_country_id','country','c_name');
            $crud->set_relation('ad_state_id','state','s_name');

//this is the specific line that specifies the relation.
// 'ad_state_id' is the field (drop down) that depends on the field 'ad_country_id' (also drop down).
// 's_country_id' is the foreign key field on the state table that specifies state's country
            $crud->set_relation_dependency('ad_state_id','ad_country_id','s_country_id');

            $output = $crud->render();
            $this->_example_output($output);
}

 

 

The SQL table definition for this example would be:

 

CREATE TABLE country ( 
     c_id INT PRIMARY KEY,
     c_name VARCHAR(50)
);

CREATE TABLE state ( 
     s_id INT PRIMARY KEY,
     s_name VARCHAR(50),
     s_country_id INT,
     FOREIGN KEY (`s_country_id`) REFERENCES `country` (`c_id`)
);

CREATE TABLE address ( 
     ad_id INT PRIMARY KEY,
     ad_country_id INT,
     ad_state_id INT,
     FOREIGN KEY (`ad_country_id`) REFERENCES `country` (`c_id`),
     FOREIGN KEY (`ad_state_id`) REFERENCES `state` (`s_id`)
);

 

 

 

Dependant date filtering:

 

The source filed that provides the value to filter the dependent field can also be a date. I use it for of an agenda where I have a large set of 'performances' (musical shows) which I want to select on another table ('highlights') based on an input date. 
 
function highlights_management()
{
	$crud = new ajax_grocery_CRUD();

	$crud->set_table('highlight');
	$crud->columns('date','performance_id');


	$crud->set_relation('performance_id','performance','name');

	$crud->set_relation('image_id','image','name','category_id IN (2,3,4)');

//'eventDate' is the field on the performance table that indicates the date of the performance
// The drop down will list only the performances that happen on the selected date
	$crud->set_relation_dependency('performance_id','date','eventDate');

	$output = $crud->render();

	$this->_example_output($output);

}

 

Table highlights has both date (date) and performance_id (foreign key for performance table) fields.

Table performance table has a date field that is used to filter the performances to show on the dropdown.

 

 

I hope this may be useful for anyone else.

Keep up the good work GC people!




#6059 How to pass extra data on a grocery crud view

Posted silva96 on 27 February 2013 - 02:31 PM

I would suggest what I do always with views, Use a template with header, content, footer. (after the theory I'll explain how to use it with grocery crud)

 

first: The template: (template.php)

 

<?php
$this->load->view('includes/header');
$this->load->view($content_view);
$this->load->view('includes/footer');

 

With this, we have a standard template.

 

To load a view, use this code:

 

class Users enxtends CI_Controller {
//any controller...
  public function login(){ //any function...
    $data['content_view']='users/login';
    $this->load->view('template',$data);

  }

This way, you are loading a view within a template, passing extra data to the template (second parameter $data).

 

With this logic, you don't need to change grocery-crud's core, try this instead:

 

Header: include crud's styles and javascripts. (includes/header.php)

 

<?php 
if(isset($css_files)){
      foreach($css_files as $style){
          echo '<link href="'.$style.'" rel="stylesheet"/>';
      }
}
if(isset($js_files)){
      foreach($js_files as $script){
          echo '<script src="'.$script.'" type="text/javascript"></script>';
      }
}

 

crud_content_view: echo the output (crud_content_view.php)

 

<?php echo $output;?>

 

Controller/function (crud_controller.php)

 

 ·
 ·
 ·
$output=$crud->render(); //$output is an object with attributes: js_files,css_files,output
$output->content_view='crud_content_view'; //we add a new attribute called content_view
//because our template loads the view content_view for the content.
//if we want to pass data, try this.
$data=array();
$data['variable1']='variable_value';
$data['variable2']=12;
$data['variable3']=array('subvariable1'=>'value1-1','subariable2'=>'value1-2');
//etc, then assign data to output.
$output->data=$data;
$this->load->view('template',$output);

 

Then to access data in the view try this: (in crud_content_view.php)

 

echo $data['variable1'];
echo $data['variable2'];
foreach($data['variable3'] as $var3){
 echo $var3;
}

 

This is good practice from codeigniter's manual, try to not alter the crud library core.

 

Regards




#2196 CI Modular Extensions - HMVC & Grocery_CRUD

Posted noskov on 07 June 2012 - 09:46 PM

This is a compilation of CodeIgniter, Modular Extentions - HMVC and lovely Grocery_CRUD. Maybe for someone it will be useful :)

First of all download CI and make a fresh instalation. No one likes /index.php/ in the urls, so we add for our project .htaccess file with these lines:
RewriteEngine on
RewriteCond $1 !^(index\.php|robots\.txt|assets)
RewriteRule ^(.*)$ /index.php/$1 [L]

and remove "index.php" from line #54 in our ./application/config/config.php file to have this instruction:
$config['index_page'] = '';

--------------------------------------------------------------------------------

Now we are going to make our CI application modular. Download Modular Extentions - HMVC and put it's content (just "core" and "third_party" folders) to the corresponding CodeIgniters folders.

In the next step create ./application/modules/ folder. Then create ./application/modules/welcome/ folder and create in it ./applications/modules/welcome/controllers/ and ./applications/modules/welcome/views/ folders.

Then move ./application/controllers/welcome.php file to ./application/modules/welcome/controllers/welcome.php. And ./application/views/welcome_message.php file to ./application/modules/welcome/views/welcome_message.php (ughh, sorry for this :wacko:).

Go to the ./application/config/config.php file and add this line to say where our modules are located:
$config['modules_locations'] = array(APPPATH.'modules/' => '../modules/');

Now just change line#28 in welcome.php into this, so our contoller extends MX_Controller and not CI_Controller:
class Welcome extends MX_Controller {

After this, if we see in the browser favorite "Welcome to CodeIgniter!", then everythigs is OK and our CI is modular.

--------------------------------------------------------------------------------

Now go to the grocery_CRUD and download it. Use examples_database.sql for creating your test db. Then put ./assets/ folder along with ./application/ and ./system/ CI-folders.

Create new ./application/modules/grocery_crud/ folder and put into it content of grocery_CRUD ./application/ folder to have structure like this:
./application/

...

/modules/

/grocery_crud/

/config/

/controllers/

/libraries/

/models/

/views/

index.html

/welcome/

...


Since we have HMVC our controllers have to extend MX_Controller. Go to the ./application/modules/grocery_crud/controllers/examples.php file and change line#3 into this:
class Examples extends MX_Controller {

I encoutered the problem: MX_Loader doesn't want to load library if it's name capitilize. So change and the line#11 into:
$this->load->library('grocery_crud');

and add line#12:
$this->load->helper('url');
to load the url_helper for our links.

Then go to the ./application/modules/grocery_crud/views/example.php file and change lines#31-36 into these:
<a href='<?php echo site_url('grocery_crud/examples/customers_management')?>'>Customers</a> |
<a href='<?php echo site_url('grocery_crud/examples/orders_management')?>'>Orders</a> |
<a href='<?php echo site_url('grocery_crud/examples/products_management')?>'>Products</a> |
<a href='<?php echo site_url('grocery_crud/examples/offices_management')?>'>Offices</a> |
<a href='<?php echo site_url('grocery_crud/examples/employees_management')?>'>Employees</a> |
<a href='<?php echo site_url('grocery_crud/examples/film_management')?>'>Films</a>

And the last thing: add ./application/modules/grocery_crud/config/routes.php file with this content:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$route['grocery_crud'] = 'examples';

/* End of file routes.php */
/* Location: ./application/modules/grocery_crud/config/routes.php */
in order to have routing to the examples controller, when we access your_project.com/grocery/

If you can browse your_project.com/grocery_crud and see the index of grocery everything is fine.

Result in .zip archive can be found in ci_hmvc_grocery_crud.

Additional documentation you can find in wiki & docs of CI, Modular Extentions - HMVC and grocery_CRUD.


#1458 [ANSWERED] set_relation and "Add New" button to quick insert.

Posted KaBaDaBrA on 25 April 2012 - 06:08 PM

Aloha!! :D

K well I think I know what you might want - so might have a solution for you. I quickly helped some other guys with a fancybox question, here's how you can do something similar:

1. Download Fancybox: http://fancyapps.com/fancybox/

2. Add this code to the view file (You'll have to change a few of the paths and names etc)


<link rel="stylesheet" href="<?=base_url()?>assets/plugins/fancybox/jquery.fancybox.css?v=2.0.6" type="text/css" media="screen" />
<script type="text/javascript" src="<?=base_url()?>assets/plugins/fancybox/jquery.fancybox.pack.js?v=2.0.6"></script>
<script type="text/javascript">
$(document).ready(function() {
$(".various").fancybox();

//ADD IN A BUTTON TO ADD TO DROPDOWN
$('#countryID_input_box').append('<a href="<?=site_url()?>/examples/quick_add/" class="various fancybox.ajax">Add</a>');
});
</script>

3. Add this code to you controller (Again you will have to make modifications to work with your own code)


function quick_add()
{
  //EDIT BELOW TO ADD YOU SELECT NAME VALUE
  $args = array(
'category_name' => 'select[name="countryID"]'
  );

  $javascript = '
  <script>
  function do_quick_add()
  {
var category_text = $(\'#category_item\').val();
var category_id = $(\''.$args['category_name'].'\').val();

$.post(\''.site_url().'/examples/quick_add_save/\', { categoryID: category_id, category_item: category_text }, function(data) {
//PREPEND DATA TO SELECT BOX
$(\''.$args['category_name'].'\').prepend(\'<option value="\'+data+\'">\'+category_text+\'</option>\');
//REBUILD SELECT BOX
$(\''.$args['category_name'].'\').trigger("liszt:updated");
//DISPLAY SUCCESS MESSAGE
$(\'#category_message\').html(\'Successfully inserted a new category\');
});
  }
  </script>
  ';

  $html = '
  <div style="width: 400px; height: 250px;">
  <div style="padding: 5px;">New Category Name:</div>
  <div style="padding: 5px;"><input type="text" name="category_item" id="category_item"></div>
  <div style="padding: 5px;"><input type="button" value="Add &raquo;" onclick="do_quick_add();"> <span id="category_message"></span></div>
  </div>
  ';

  echo $javascript.$html;
  exit;
}

function quick_add_save()
{
//POST ITEMS
$categoryID = $this->input->post('categoryID', true); //only needed if adding a sub category, can get parent ID
$category_text = $this->input->post('category_item', true);

//SAVE TO DATABASE
$data = array(
'country_title' => $category_text
);
$this->db->insert('country', $data);

return $this->db->insert_id();
}

VOILA!!!! :)

Add to select.PNG

Now you can quickly add to dropdowns without having to leave the page.

If it's not exactly what you want you can use a similar approach by using jquery to modify things...


#9795 PDF version of GroceryCRUD 2.1.4 API and Function list

Posted edramirez on 20 October 2013 - 11:17 PM

Here is a PDF version of the GroceryCRUD for those who may have to develop applications offline.Attached File  grocerycrud API and Functions list.pdf   425.6K   3788 downloads




#9547 How to use Invisible field

Posted davidoster on 21 September 2013 - 10:24 PM

As we grow old we get wiser!

So, in that sense I wanted to point out the use of the invisible field.

When we make for example a callback_before_insert (as the above example code states) we might need to exclude some fields from the add form but still want to pass some value to these fields that will be stored on the database.

 

The solution to this is actually quite simple.

We just use the fields function to state all of the fields that will take part on the insert process and this means also the fields that should not be showing up.

Then in order to "hide" the unwanted fields, hence the ones we want not to be displayed at the form and by hand pass them some value we mask them with the use of the field_type function with the use of the invisible type.

This gets quite handy and easy to use when we want for example to insert some extra data about the record that is saved on the database.

For example when we want to save the date/time of insertion, or if we need to know the user that inserted this record, or if we want to encrypt some sort of information like a password. The possibilites are just endless and the mecanism is there to help us out, straight out of the box!




#7615 Drag and drop for order of items

Posted Amit Shah on 23 May 2013 - 02:48 PM

Well as promised,

 

I have applied the library to the latest build of the grocery crud (pulled from svn).

 

You guys can find the implemented example code for the following at https://github.com/b..._with_drag_drop

 

Well i should really thanks the team up here who have provided me an opportunity to improve my code. Earlier, i ran through with a certain set of assumption that everyone (like i used to do) would be using up id as primary key. I know i was wrong to assume that and had improvised the code over while implementing it with the example on the grocerycruds pre-provided example (products manager)

So i am also attaching the fresh code here along with this post.

 

Hope guys can take the advantage of the application / library to the max.

Attached Files




#486 Right To Left Theme For RTL Languages

Posted Moslem Mansouri on 11 February 2012 - 02:34 PM

Hello to all

Right to left style for RTL languages :

Updated to version 1.3.2
Please download a new file Attached File  RTL.zip   10.64K   1478 downloads

Install:
1 - Please download Attached File  RTL.zip   10.64K   1478 downloads
2  - Extract to "assets\grocery_crud\themes"
3  - Confirm And Replace File And Folder
Good Luck
-----------------------
Admin please add the package to all your friends to enjoy
ThankDear Admin


#381 [EXAMPLE] Password field and password encryption/decryption

Posted web-johnny on 30 January 2012 - 08:55 PM

Hi there,

Great library. I have everything working except:

One of my text fields is a password field. When my user hits update or add, I need to md5 encode the password before updating or inserting into the db.

Can you give an example of how to do this with the appropriate callback?

Also, if I want to decode the password to display to the user, how would I do that?

many thanks!
Bill


Hello Bill,
Believe it or not , I have answer many times this question. But I really don't find ANY example to give you . So I will have a full example of what to do step by step so other people can use this post and help them.

First of all just to mention that it's not a good way to encrypt and decrypt a password. The best way it's just to encrypt your code and if someone wants to just reset his password. Below I have an example of a very simple encryption and decryption. The thing is to get the idea of how to use callbacks and of course you can change it with your needs.


Step 1. Let's do our field a password field . This will be with a simple line of code.
$crud->change_field_type('password_field','password');
So for now we just need to encrypt and decrypt our password. We have to use two callbacks. The first one is the: callback_before_insert and the callback_before_update. A quick way to use the same callback twice is this:
$crud->callback_before_insert(array($this,'encrypt_password_callback'));
$crud->callback_before_update(array($this,'encrypt_password_callback'));
and the callback will be:
function encrypt_password_callback($post_array, $primary_key = null)
{
$this->load->library('encrypt');

$key = 'super-secret-key';
$post_array['password_field'] = $this->encrypt->encode($post_array['password_field'], $key);
return $post_array;
}
.
Now the only thing we need is a callback_edit_field just to decrypt the password. So your callback will be:
$crud->callback_edit_field('password_field',array($this,'decrypt_password_callback'));
and the callback will be:
function decrypt_password_callback($value)
{
$this->load->library('encrypt');
$key = 'super-secret-key';
$decrypted_password = $this->encrypt->decode($value, $key);
return "<input type='password' name='password_field' value='$decrypted_password' />";
}

And of course because I understand that everyone (included me) want just a copy paste I have a full example below:
	public function users(){
		$crud = new grocery_CRUD();
		$crud->set_table('db_user');
		$crud->set_subject('User');
		$crud->required_fields('user_name');
	  
		$crud->columns('user_name','email','real_name','active', 'groups');
		$crud->fields('user_name','email','password','real_name','active', 'groups');
		$crud->change_field_type('password', 'password');
	  
  $crud->callback_before_insert(array($this,'encrypt_password_callback'));
  $crud->callback_before_update(array($this,'encrypt_password_callback'));
	  
  $crud->callback_edit_field('password',array($this,'decrypt_password_callback'));

		$output = $crud->render();
		$this->_example_output($output);
	}

function encrypt_password_callback($post_array, $primary_key = null)
{
  $this->load->library('encrypt');
  $key = 'super-secret-key';
  $post_array['password'] = $this->encrypt->encode($post_array['password'], $key);
  return $post_array;
}

function decrypt_password_callback($value)
{
  $this->load->library('encrypt');
  $key = 'super-secret-key';
  $decrypted_password = $this->encrypt->decode($value, $key);
  return "<input type='password' name='password' value='$decrypted_password' />";
}

I have to mention that the example is not a working example and i just created for this topic so if you find something wrong just send it.


#1945 Default field values (for add form)

Posted Fouzi on 24 May 2012 - 04:13 PM

We can use the default value saved in each field type, this modification require one line code modification

FILE: application/libraries/grocery_crud.php
protected function get_add_input_fields($field_values = null)
{
  $fields = $this->get_add_fields();
  $types  = $this->get_field_types();
  $input_fields = array();

  foreach($fields as $field_num => $field)
  {
   $field_info = $types[$field->field_name];
 
// OLD //    $field_value = !empty($field_values) && isset($field_values->{$field->field_name}) ? $field_values->{$field->field_name} : null;
/* NEW */  $field_value = !empty($field_values) && isset($field_values->{$field->field_name}) ? $field_values->{$field->field_name} : $field_info->default;
 


and when creating your table in SQL, change DEFAULT NULL with DEFAULT your_value

CREATE TABLE `mytable` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(25) DEFAULT NULL,
  `longtext` varchar(255) DEFAULT NULL,
  `icon` varchar(255) DEFAULT NULL,
  `isenabled` tinyint(1) DEFAULT '1',
  PRIMARY KEY (`id`)
) ;

everytime you create a new record, the field 'isenabled' will have 1 (true) as a default value

This can be done also with Database Forge Class
What do you think?


#11516 Dependent Drop Down With Multiselect

Posted larasmith on 31 August 2014 - 07:06 AM

Finally I get this to work! :)  I just hope someone find this solution also useful for them...  :lol:

HERE IS THE SOLUTION:

1. Get dependent items using ajax/jquery:

    Create a CONTROLLER that creates/receives the needed output based on the selected value on the drop down. I placed it on the same file that contains the controller that generates my datagrid. The file name is: "ctrl_gcrud.php"

public function get_funct_by_prog($progID)
	{
	$mysqli = new mysqli("localhost", "USERNAME", "PASSWORD ", "DBNAME");
	$result = $mysqli->query("SELECT * FROM tblfunction WHERE funct_prog_id ='".$progID."'");		

	while($row_funct = mysqli_fetch_array($result))
	{
             echo "<option value='".$row_funct['funct_id']."'>".$row_funct['funct_Name']."</option>";
	}
}

2. Create a callback inside the same controller: "ctrl_gcrud.php". This call back is responsible for the following:

    a. Delete all elements from the multi-select: $("#field-Functions").find("option").remove();

    b. Add new elements in the multi-select: $("#field-Functions").html($response.responseText);

    c. Refresh "choosen select" plugin: $("#field-Functions").trigger("liszt:updated"); and $(".remove-all").trigger("click");

   Here is the code for the working callback:

	function tos_CBae_selFunc()
	{         		
		return '
			<script type="text/javascript">
				$(document).ready(function(){
					$("#secret_field_box").hide();
					$("#field-tos_prog_id").change(function() {
						var progID = $("#field-tos_prog_id").val();  
								$(".remove-all").trigger("click");
							     $.ajax({
							         "url" :  "http://localhost/OCGA/ctrl_gcrud/get_funct_by_prog/"+ progID,      
							         "cache" : true,
							         "beforeSend" : function (){
							              //Show a message
							         },
							         "complete" : function($response, $status){
							             if ($status != "error" && $status != "timeout") {
							             	$("#field-tos_qry").find("option").remove();
							                $("#field-tos_qry").html($response.responseText);
							                $("#field-tos_qry").trigger("liszt:updated");
							                 
							             	$("#field-Functions").find("option").remove();
							                $("#field-Functions").html($response.responseText);
							                $("#field-Functions").trigger("liszt:updated");	
							                $(".remove-all").trigger("click");						                 
							             }
							         },
							         "error" : function ($responseObj){
							             alert("Something went wrong while processing your request.\n\nError => "
							                 + $responseObj.responseText);
							         }
							     }); 
					})	
				})									
			</script>			
			' ;				
	}

3. This is the controller that generates my datagrid: Notice the lines of code that is used to make our callback work.And here is the successful desired output:

	public function tos()
	{	
 		/*Create ajax_grocery_CRUD instead of grocery_CRUD. This extends the functionality with the
 		 field_set_defaults keeping all functionality as well (I extended this to grocery_CRUD)*/
 				
		$crud = new ajax_grocery_CRUD();
		
		// Set theme
		$crud->set_theme('datatables');		

		// Set table name
		$crud->set_table('tbltos'); 
						
		// Set this name instead of 'Record' in prompt
		$crud->set_subject('Table of Specification');
				
		//* These displays custom name instead of field name in columns						
		$crud->display_as('tos_prog_id','Program');
		$crud->display_as('tos_course_DescTitle_id','Descriptive Title');
		$crud->display_as('tos_course_RefNo_id','Reference No.');			
		$crud->display_as('tos_course_Title_id','Title');
		$crud->display_as('tos_lo_name_id','Learning Objective');
		$crud->display_as('tos_topic_name_id','Topic');
		$crud->display_as('tos_sem_id','Semester');
		$crud->display_as('tos_qtype_id','Question Type');
		$crud->display_as('tos_coglvl_id','Cognitive Level');
		$crud->display_as('tos_diffindex_id','Difficulty Index');
		$crud->display_as('tos_encoder_id','Encoder');
		$crud->display_as('tos_reviewed_id','Reviewed');
		$crud->display_as('tos_remarks_id','Remarks');
		$crud->display_as('tos_status_id','Status');
		$crud->display_as('tos_published_id','Published');
		$crud->display_as('tos_PilotTest_id','Pilot Tested');		
		//*	

                // Sets relation with dependent dropdown list (Program->Function)
                $crud->set_relation('tos_prog_id','tblprogram','prog_Name');

   		// Sets function (this must be dependent on the program)
         	$crud->set_relation_n_n('Functions', 'tbltos_funct', 'tblfunction', 'tos_id', 'funct_id', "{funct_Name}", 'priority');

		// This is the set of code for using the callback -*begin ppp
		$f=array'secret','tos_id','tos_assmntype_id','tos_prog_id','Functions','tos_sem_id','tos_qtype_id','tos_remarks_id','tos_reviewed_id','tos_status_id','tos_published_id','tos_PilotTest_id','tos_qry','tos_ctr','tos_need'); $crud->add_fields($f); $crud->edit_fields($f); $crud->callback_add_field('secret',array($this,'tos_CBae_selFunc')); $crud->callback_edit_field('secret',array($this,'tos_CBae_selFunc')); // -*end        

		// Sets dropdown list (Semester)
		$crud->set_relation('tos_sem_id','tblsem','Sem');

		// Sets dropdown list (QType)
		$crud->set_relation('tos_qtype_id','tblqtype','QType');

		// Sets dropdown list (Remarks)
		$crud->set_relation('tos_remarks_id','tblqrem','qrem_Name');

		// Sets dropdown list (Status)
		$crud->set_relation('tos_status_id','tblstatus','status_Name');

		// Sets dropdown list (Reviewed bool)
		$crud->set_relation('tos_reviewed_id','tblbool','bool_value');

		// Sets dropdown list (Published bool) then turn it as default value as text
		$crud->set_relation('tos_published_id','tblbool','bool_value');

		// Sets dropdown list (PilotTest bool) then turn it as default value as text
		$crud->set_relation('tos_PilotTest_id','tblbool','bool_value');

		//Removes the print feature $crud->unset_print();

		//**** These displays the output in the page
		$output = $crud->render();
		$this->_view_output($output);
	}

1sy3qb.jpg

 

Special thanks to the hints provided by none other than the grocery CRUD Hero himself: Sir Victor... It took me almost a month to get it though... I just hope this helps someone too.... This method is also tested working in multiselect created by using this code:

   	$this->db->select('funct_id, funct_Name');
	$results = $this->db->get('tblfunction')->result();
	$funct_multiselect = array();
	foreach ($results as $result) {
    	$funct_multiselect[$result->funct_id] = $result->funct_Name;
	}
	$crud->field_type('tos_qry', 'multiselect', $funct_multiselect); 

Here is what it looks like:

2lsbss5.jpg

 

Happy GCng!  :D




#10354 Codeigniter 2 Cookbook

Posted web-johnny on 15 December 2013 - 02:27 PM

I am proud to announce the Codeigniter 2 Cookbook . I am one of the 4 official reviewers of the book :) . You can see my name at the credits :) :) :) http://packtlib.pack...y/9781782162308 (Go to credits)

 

I know that here is not facebook, but like this post if you are as happy as I am :)

 

Cheers

Johnny

 

 




#5775 Login Screen

Posted davidoster on 15 February 2013 - 12:10 PM

If you use the ion_auth library it has a builtin table of user_groups.

There you create your groups.

Then you create on more table called group_priviledges.

group_priviledges table has id, group_id, description [even a url, or function name] as a list of all the available priviledges.

Then you assign your users to groups.

And you get (via your model) a true false value if the current operation(make an add/delete/update, redirect to x url, or call y function) is allowed for this user(group).

 

You make the system once and then you forget it for ever.

And you have a nice grocery crud interface to add/update all these data!




#4528 Error in Flexigrid search when using relations between 2 tables that contain...

Posted Eran on 30 November 2012 - 10:32 PM

Hi,
I recently moved from using datatables to using flexigrid. After a couple of days I noticed that when I try to use the search feature, the ajax call returns a "500 Internal Server" error.
I started playing with my code and I noticed that when I stop using "set_relation" the search was working again. So I started thinking that maybe the automatically generated SQL query is some how incorrect.
In order to get the actual query sent to the MySQL driver, I added a file_put_content directive at the end of the "_compile_select" function in codeigniter DB_active_rec.php.
The generated SQL query was indeed incorrect. The issue was that the relation is translated into a JOIN. If the joined tables contain fields with the same name, the search query will fail because they both contain the same field and therefor it's ambiguous. This would not happen if the field names would include a table name (e.g. table_name.field_name instead of just field_name).

To make this clearer I'll give you an example:
I have a table called t_deploy_groups. It's SQL schema and data:
--
-- Table structure for table `t_deploy_groups`
--
DROP TABLE IF EXISTS `t_deploy_groups`;
/*!40101 SET @saved_cs_client	 = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t_deploy_groups` (
`dgID` int(11) NOT NULL AUTO_INCREMENT,
`userID` int(11) NOT NULL,
`dgName` varchar(256) NOT NULL,
`dgDescription` varchar(1000) NOT NULL,
`sameAsDG` int(11) DEFAULT NULL,
PRIMARY KEY (`dgID`)
) ENGINE=InnoDB AUTO_INCREMENT=1114 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `t_deploy_groups`
--
LOCK TABLES `t_deploy_groups` WRITE;
/*!40000 ALTER TABLE `t_deploy_groups` DISABLE KEYS */;
INSERT INTO `t_deploy_groups` VALUES (1,1,'Telus','Telus Labs',NULL),(3,1,'T-Mobile','T-Mobile POS',NULL),(67,1,'AT&T','AT&T POS',NULL),(300,1,'QA','Testing & QA',1),(1111,1,'Demo','Playground',NULL);
/*!40000 ALTER TABLE `t_deploy_groups` ENABLE KEYS */;
UNLOCK TABLES;

The sameAsDG field should contain an existing dgID. So when I display this table using grocery crud, I added a set relation on the sameAsDG that will show you the existing names of the existing deploy groups (in this example the relation is from the table onto itself).

My controller code is:
public function deploy_groups() {
$uid = $this->session->userdata('uid');
$crud = new grocery_CRUD();
$crud->set_table('t_deploy_groups')
->set_subject('Deploy Group')
->required_fields('userID', 'dgName', 'dgDescription')
->display_as('dgName', 'Deploy Group Name')
->display_as('dgDescription', 'Deploy Group Description')
->display_as('sameAsDG', 'Use Same Apps As')
->display_as('dgID', 'ID')
->columns('dgID', 'dgName', 'dgDescription', 'sameAsDG')
->fields('dgID', 'dgName', 'dgDescription', 'sameAsDG');
$crud->set_relation('sameAsDG', 't_deploy_groups', 'dgName', "t_deploy_groups.userID = $uid", 'dgName ASC')
->callback_insert(array($this->simon_model, 'deploy_group_insert_callback'))
->callback_after_delete(array($this->simon_model, 'deploy_group_after_delete_callback'))
->where("t_deploy_groups.userID = $uid");
$crud->unset_add()
->unset_edit()
->unset_delete()
->unset_print();
$output = $crud->render();
$output->active = 'deploy_groups';
$this->load->view('deploy_groups.php', $output);
}

In my application the table looks like this:
dg_table_screenshot.png

If you try to search for the word "POS" you would expect to see 2 rows (becuase they are the only ones that contain this word), but you will get all the rows because the ajax search call would fail.

The automatic SQL query used is:
SELECT *
FROM (`t_deploy_groups`)
LEFT JOIN `t_deploy_groups` as ja7d8fa27 ON `ja7d8fa27`.`dgID` = `t_deploy_groups`.`sameAsDG`
WHERE `t_deploy_groups`.`userID` = 1
AND `dgID` LIKE '%POS%'
OR `t_deploy_groups`.`dgName` LIKE '%POS%'
OR `dgDescription` LIKE '%POS%'
OR `ja7d8fa27`.`dgName` LIKE '%POS%'
HAVING `t_deploy_groups`.`userID` = 1

If you try to run this query directly through MySQL you will get: "Error Code: 1052. Column 'dgID' in where clause is ambiguous"

If the field names in the where section would include the table name (t_deploy_groups), this query would be correct.


In order to fix this issue I added the following function to the grocery_CRUD_Model class in the grocery_crud_model.php file:
/**
	 * We use this function to make sure that the format for each field is <table_name>.<field>
	 * @param string $field
	 * @return string
	 */
function long_field_name($field)
{
if ((!is_null($this->table_name)) && (trim($this->table_name) != '') && (strpos($field, '.') === false)) {
	 return "$this->table_name.$field";
} else {
	 return $field;
}
}

This code adds the table name to the field name if it doesn't already exists.

I added a call to this function in the following functions: like() and or_like() (both are in the grocery_crud_model.php file)
function like($field, $match = '', $side = 'both')
{
	 $this->db->like($this->long_field_name($field), $match, $side);
}

function or_like($field, $match = '', $side = 'both')
{
	 $this->db->or_like($this->long_field_name($field), $match, $side);
}

I also changed the _get_field_names_to_search() function from the grocery_crud.php file:
protected function _get_field_names_to_search(array $relation_values)
{
  if(!strstr($relation_values[2],'{'))
	  return $this->_unique_join_name($relation_values[0]).'.'.$relation_values[2];
  else
  {
   $relation_values[2] = ' '.$relation_values[2].' ';
   $temp1 = explode('{',$relation_values[2]);
   unset($temp1[0]);
  
   $field_names_array = array();
   foreach($temp1 as $field)
    list($field_names_array[]) = explode('}',$field);
  
   //New Code - this was added to make sure that relations using more than one field in the
   //$related_title_field paramter, will be using the unique table name infront of the field name 
   foreach ($field_names_array as $key => $field) {
	   $field_names_array[$key] = $this->_unique_join_name($relation_values[0]).'.'.$field;
   }
   return $field_names_array;
  }
}

The change is the additional foreach following the "New Code" comment. This was added to handle a situation where you have a complex $related_title_field (e.g. "{dgID} - {dgName}"). Without this addition these fields might not get the correct table name added to them (happens when your relation is between 2 different tables).  


This fixed the issue for me. And now the Flexigrid search is working in all my views.

You can probably work around this in several other ways (like using a view with unique field names), but this way works for me.
Hope this might help other people that are stuck on the same issue.

Johnny, what do you think about adding something like this to the code?


#3085 set_relation_n_n where clause

Posted goFrendiAsgard on 23 August 2012 - 05:11 AM

I've just add where clause to set_relation_n_n.
Here is the changes: https://github.com/s...d/pull/88/files

Here is the usage example:
$crud->set_relation_n_n('teachers',
				'sch_schoolyear_subject_teacher', 'sch_teacher',
				'schoolyear_subject_id', 'teacher_id',  'name',
						null, array('active'=>1));
Hope it will help someone :)


#10302 Power GroceryCrud

Posted Amit Shah on 08 December 2013 - 07:08 AM

Hi fellow GC forum members,

 

I hereby will like to share my new GC library - updated with 14 new features / enhancements to make it a Power GroceryCrud. With great thanks to Web-Johny to allow me create my new library over his existing one, i hereby share my extended / powered up GC.

 

Please note, i have been a GC developer using flexigrid. So all the changes that go in ... are with flexigrid. Other themes, you wonderful people are free to drop in and come up with your part of contribution to fill up the gaps in other themes. 

 

I have just plucked out the bits and pieces i have been using across all my projects and clubbed into one power pack library. It is not been tested 100% with the new combinations.. but i doubt it should fail as i have tested 80% of it in my last project - all combined.

 

Do update me in case anything crashes / falls out here - i surely will patch it so everyone can take the advantage of the same.

 

Happy GCing :)