⚠ In case you've missed it, we have migrated to our new website, with a brand new forum. For more details about the migration you can read our blog post for website migration. This is an archived forum. ⚠

  •     

profile picture

Duplicate the record



eder

eder
  • profile picture
  • Member

Posted 25 January 2017 - 17:28 PM

Hello,

Is there a possibility of duplicate the record? For example, button duplicate on the "More".

Thanks so much.


chest94

chest94
  • profile picture
  • Member

Posted 01 February 2017 - 15:38 PM

Hi, you can achieve this in the following way (this makes an exact copy of the record, leaving out the id):

 

In your main function (where you generate the crud):

$crud->add_action('Duplicar Actividad', base_url() . '/assets/img/add.png', site_url() . '/objetivos/duplicar/');

And the function "Duplicar":

function duplicar($primary_key) {//gets the primary key of the row you're duplicating

        //Query to the database to get the whole row
        $query = $this->db->get_where('ACTIVIDADES', array('ID_ACTIVIDAD' => $primary_key));

        if ($query->num_rows() > 0) {
            $res = $query->result();
            $row = $res[0];
        }
        
        //puts the data on an array
        $data = array(
            'ID_OBJETIVO_OPERATIVO' => $row->ID_OBJETIVO_OPERATIVO,
            'NOMBRE_ACTIVIDAD' => $row->NOMBRE_ACTIVIDAD,
            'DESCRIPCION_ACTIVIDAD' => $row->DESCRIPCION_ACTIVIDAD,
            'FECHA_INICIO' => $row->FECHA_INICIO,
            'FECHA_FIN' => $row->FECHA_FIN,
            'TIPO_INDICADOR' => $row->TIPO_INDICADOR,
            'DESCRIPCION_INDICADOR' => $row->DESCRIPCION_INDICADOR,
            'FECHA_META' => $row->FECHA_META,
            'VALOR_META' => $row->VALOR_META,
            'PORCENTAJE_META' => $row->PORCENTAJE_META,
            'META_MONETARIA' => $row->META_MONETARIA,
            'MOTIVO_REPROGRAMACION' => $row->MOTIVO_REPROGRAMACION,
            'USUARIO_CREACION' => $row->USUARIO_CREACION,
        );
        
        //insert the data as a new record
        $this->db->insert('ACTIVIDADES', $data);
     
        //redirects to the page you were
        header('location:' . site_url('/objetivos/act_obj/' . $row->ID_OBJETIVO_OPERATIVO));
        exit;
    }

Hope it helps :D


Amit Shah

Amit Shah
  • profile picture
  • Member

Posted 02 February 2017 - 08:32 AM

Well there is a way - but then u need to do some modifications in your library

 

Add The following function

protected function copy_row($state_info) {
		$fields = $this->get_add_fields();
		$types 	= $this->get_field_types();

		$field_values = $this->get_edit_values($state_info->primary_key);
		foreach($fields as $field)
		{
			$fieldName = $field->field_name;
			if(property_exists($field_values,$fieldName)) {
				if($types[$fieldName]->crud_type == 'upload_file') {
					//Make a copy of the same and then assign the new value to the same
					$oldFileName = $field_values->{$fieldName};
					$oldFileName = substr($oldFileName, 6);
					$newFileName = substr(uniqid(),-5).'-'. $oldFileName;
					$sourcePath = $types[$fieldName]->extras->upload_path . DIRECTORY_SEPARATOR . $field_values->{$fieldName};
					$newPath = $types[$fieldName]->extras->upload_path . DIRECTORY_SEPARATOR . $newFileName;
					if(is_file($sourcePath)) {
						copy($sourcePath, $newPath);
						$this->getModel()->set_add_value($field->field_name, $newFileName);
					}
				} else {
					$this->getModel()->set_add_value($field->field_name, $field_values->{$fieldName});
				}
			}
		}
	}

In the following function .. u need to append the following code

public function render() {
......
......
			case 19://copy
				if($this->unset_add)
				{
					throw new Exception('You don\'t have permissions for this operation', 14);
					die();
				}

				if($this->theme === null)
					$this->set_theme($this->default_theme);
				$this->setThemeBasics();

				$this->set_basic_Layout();

				//Set the default values
				$state_info = $this->getStateInfo();
				$this->copy_row($state_info);

				$this->showAddForm();

			break;

}

Need to update the states array in following

class grocery_CRUD_States extends grocery_CRUD_Layout
{
	protected $states = array(
....
....
19  => 'copy'
	);

Append the following code in the following function ..

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

In the following function - u need to change

protected function showAddForm()
{
.....

		$data->buttons			= $this->form_buttons;
		/* NEW */ $data->field_values = $this->get_add_values(null);
.....
		$data->validation_url	= $this->getValidationInsertUrl();
		//$data->input_fields 	= $this->get_add_input_fields();
		/* NEW */ $data->input_fields  = $this->get_add_input_fields($data->field_values);

Replace the function get_add_input_fields with the following

	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];

			$field_value = !empty($field_values) && isset($field_values->{$field->field_name}) ? $field_values->{$field->field_name} : null;
			//Code Changes by Amit Shah - for default field value
			/*
			$field_default_values=$this->get_field_default_values($field->field_name);
			if (! empty($field_default_values) and empty($field_value) ){
				//if $field_info is not set at this point we need to construct one
				if (!isset($field_info)){
					$field_info = (object)array();
				}
				
				$field_info->custom_default=True; //this is what we look for to ensure we only change the behaviour we want to
				$field_info->crud_type=$field_default_values['type'];
				$field_info->type=$field_default_values['type'];
				$field_info->default=$field_default_values['value'];
				$field_info->extras=$field_default_values['value'];
				$field_value=$field_default_values['value'];
			} */
			
			if(!isset($this->callback_add_field[$field->field_name]))
			{
				$field_input = $this->get_field_input($field_info, $field_value);
			}
			else
			{
				$field_input = $field_info;
				$field_input->input = call_user_func($this->callback_add_field[$field->field_name], $field_value, null, $field_info);
				//make our little change
				//allow default field rendering behaviour if user returns false
				//in the callback
				if ($field_input->input === False) {
					$field_input = $this->get_field_input($field_info, $field_value);
				}
			}

			switch ($field_info->crud_type) {
				case 'invisible':
					unset($this->add_fields[$field_num]);
					unset($fields[$field_num]);
					continue;
				break;
				case 'hidden':
					$this->add_hidden_fields[] = $field_input;
					unset($this->add_fields[$field_num]);
					unset($fields[$field_num]);
					continue;
				break;
			}

			$input_fields[$field->field_name] = $field_input;
		}

		return $input_fields;
	}

This changes should help you incorporate a copy function ...

so like we have edit function working with edit/<pk> .... we can have the same with copy/<pk>

or u can say - add a action that calls to the <app_path>/<controller>/<function>/copy

that will anyways add the pk to the link... 

 

In case u stuck somewhere - do let me know so i can update it.. i have used this piece of code nearly a year ago... as it was a requirement from client. But post that i dont remember using it anywhere. But it surely should work for you.

 

Happy GCing :)