Hello,
hoping all are well, I am happy to share with you the following code.
Please,
Modify file library/grocery_crud.php:
on "grocery_CRUD" Class
public function set_relation($field_name , $related_table, $related_title_field, $where_clause = null, $order_by = null, $default_value=null) { $this->relation[$field_name] = array($field_name, $related_table,$related_title_field, $where_clause, $order_by, $default_value,$this->getState()); return $this; }
Then, on "grocery_CRUD_Layout" class modify the method:
protected function get_relation_input($field_info,$value) { $this->set_css($this->default_css_path.'/jquery_plugins/chosen/chosen.css'); $this->set_js($this->default_javascript_path.'/jquery_plugins/jquery.chosen.min.js'); $this->set_js($this->default_javascript_path.'/jquery_plugins/config/jquery.chosen.config.js'); $ajax_limitation = 10000; $total_rows = $this->get_relation_total_rows($field_info->extras); //Check if we will use ajax for our queries or just clien-side javascript $using_ajax = $total_rows > $ajax_limitation ? true : false; //We will not use it for now. It is not ready yet. Probably we will have this functionality at version 1.4 $using_ajax = false; //If total rows are more than the limitation, use the ajax plugin $ajax_or_not_class = $using_ajax ? 'chosen-select' : 'chosen-select'; $this->_inline_js("var ajax_relation_url = '".$this->getAjaxRelationUrl()."';\n"); $select_title = str_replace('{field_display_as}',$field_info->display_as,$this->l('set_relation_title')); $input = "<select id='field-{$field_info->name}' name='{$field_info->name}' class='$ajax_or_not_class' data-placeholder='$select_title' style='width:300px'>"; $input .= "<option value=''></option>"; if(!$using_ajax) { // Added by chava $state = $field_info->extras[6]; // add|edit| ..etc $default_value = $field_info->extras[5]; if ($state === 'add') $value = $default_value; $options_array = $this->get_relation_array($field_info->extras); foreach($options_array as $option_value => $option) { $selected = !empty($value) && $value == $option_value ? "selected='selected'" : ''; $input .= "<option value='$option_value' $selected >$option</option>"; } } elseif(!empty($value) || (is_numeric($value) && $value == '0') ) //If it's ajax then we only need the selected items and not all the items { $selected_options_array = $this->get_relation_array($field_info->extras, $value); foreach($selected_options_array as $option_value => $option) { $input .= "<option value='$option_value'selected='selected' >$option</option>"; } } $input .= "</select>"; return $input; }
Finally, on your controller, you should use:
public function users() { $this->load->library('grocery_CRUD'); $this->grocery_crud->set_theme('flexigrid'); $this->grocery_crud->set_table('users'); $this->grocery_crud->set_relation('country_id','countries','country_name',null, null, $default_value = 1); // 1 is default country_id $this->grocery_crud->display_as('country_id', 'Country'); $this->grocery_crud->set_subject('Users'); $output = $this->grocery_crud->render(); $this->_example_output($output); } function _example_output($output = null) { $this->load->view('myview',$output); }
For Dropdown Type:
Modify File library/grocery_crud.php:
On "grocery_CRUD" Class, on next method:
public function field_type($field , $type, $extras = null, $default_value = null) { if ($type === 'dropdown') { $extras[0] = $extras; $extras[1] = $default_value; $extras[2] = $this->getState(); } return $this->change_field_type($field , $type, $extras); }
Then, on "grocery_CRUD_Layout" Class
protected function get_dropdown_input($field_info,$value) { $this->set_css($this->default_css_path.'/jquery_plugins/chosen/chosen.css'); $this->set_js($this->default_javascript_path.'/jquery_plugins/jquery.chosen.min.js'); $this->set_js($this->default_javascript_path.'/jquery_plugins/config/jquery.chosen.config.js'); $select_title = str_replace('{field_display_as}',$field_info->display_as,$this->l('set_relation_title')); // added by chava $state = $field_info->extras[2]; // add|edit| ..etc $default_value = $field_info->extras[1]; if ($state === 'add') $value = $default_value; $input = "<select id='field-{$field_info->name}' name='{$field_info->name}' class='chosen-select' data-placeholder='".$select_title."'>"; $options = array('' => '') + $field_info->extras[0]; foreach($options as $option_value => $option_label) { $selected = !empty($value) && $value == $option_value ? "selected='selected'" : ''; $input .= "<option value='$option_value' $selected >$option_label</option>"; } $input .= "</select>"; return $input; }
Finally, On your controller, you should use:
public function test() { $this->load->library('grocery_CRUD'); $this->grocery_crud->set_theme('flexigrid'); $this->grocery_crud->set_table('sales'); $this->grocery_crud->field_type('status','dropdown',array('hold'=>'On Hold', 'done'=>'Done'), $default_value = 'hold'); /* Your code */ $output = $this->grocery_crud->render(); $this->_example_output($output); } function _example_output($output = null) { $this->load->view('myview',$output); }
Thanks.
Regards!
--
Chava