Get db field value to gc list data

This function is used to set the path for the upload file. I build the path ‘assets/uploads/files/’.date(‘Y’)

I could replace date(‘Y’) with text ‘2021’ . I did that thinking when the year changed , I will create the new folder for the new year but that’s the problem . when I create the new folder with the new year 2022 I lose the connection with files that are saved to folder 2021.

The function set_field_upload creates a link assets/uploads/files/2022 and previous files have saved to 2021 folder. So I have lost connection with previous files because the record has this url assets/uploads/files/2022…this func creates all links on the list with this path …

What I am trying to say though is that you don’t need to lose the folder if this is stored in the database as a row for every entry really :slight_smile:

For example you can use: callback_after_insert to insert in the row to a field the upload_year and use it this way:

if ($crud->getState() === 'add') {
	set_field_upload(‘file_url’,‘assets/uploads/files/’.date(‘Y’));
} else if ($crud->getState() === 'edit') {
        // Take the information that you need from $crud->getStateInfo();
        // and then have a query for that entry. The result will be something like that:
        // $photoYear = $row->upload_year;
        set_field_upload(‘file_url’,‘assets/uploads/files/’ . $photoYear);
}
1 Like

I don’t want to get the folder_year on edit

I want to get it on the list and put it on each link
set_field_upload(‘file_url’,‘assets/uploads/files/’ . $photoYear);

Then you can use the callback_column and do not use the set_field_upload on the list state. For example something like this:

if ($crud->getState() === 'list' || $crud->getState() === 'ajax_list') {
	 $crud->callback_column('file_url', function () {
			return "<a href='/assets/uploads/files/{$row->upload_year}/$value'>$value</a>";	 
	 });
	
} else if ($crud->getState() === 'add') {
	set_field_upload('file_url','assets/uploads/files/'.date('Y'));
} else if ($crud->getState() === 'edit') {
        // Take the information that you need from $crud->getStateInfo();
        // and then have a query for that entry. The result will be something like that:
        // $photoYear = $row->upload_year;
        set_field_upload('file_url','assets/uploads/files/' . $photoYear);
}
1 Like

This is what I was trying to say…

In all cases, if you see it much complicated, keep all your files in a single upload directory, and add the year to the file name…

Example :

‘…/uploads/2021_filename.pdf’

This way, all your files will be in a single directory

1 Like
$state = $crud->getState();
$state_info = $crud->getStateInfo();	
if ( $state === 'list'){
				
				$primary_key = $state_info->primary_key;
}

i wrote this but i get this error !
Severity: Notice

Message: Undefined property: stdClass::$primary_key

Filename: controllers/Documents.php

Line Number: 494

Backtrace:

File: /var/webs/wwweprotocol/www/application/controllers/Documents.php
Line: 494
Function: _error_handler

File: /var/webs/wwweprotocol/www/index.php
Line: 315
Function: require_once

I guess there is no primary key in list state …
It’s in edit state

What are you trying to do?

I try to get the primary key on list mode and get from each row the field folder (eg. 2021)
and define the $folder

set_field_upload('file_url','assets/uploads/files/'.$folder);

Thank you for you help !!

i define this function inside controller
$crud->callback_column('file_url',array($this,'_callback_upload_field'));

and create this

public function _callback_upload_field($value, $row)
{
return “<a href=’”.site_url(‘assets/uploads/files/’.$row->folder_file)."/".$row->file_url."’ target=’_blank’>$row->file_url";
}

ok now !

Thank you !!!

Am glad you were able to fix that…
GroceryCrud is very simple to use once you get used to its structure…

Good luck.

1 Like

Indeed! it is the best framework ! I am going to buy the enterprise edition later which is built with Zend framework !

It was so easy thinking the callback_column ! I have used this function elsewhere!

can I ask another issue with set_field_upload('field', 'path file upload', 'set file types')

I see that inside grocery crud lib there is another argument for this function that defines what file types allowed.
I tried to set a file type(e.g pdf) but is not working.

@cbabekos ,
Please, always include the code that you used… there might be a bug in your code…
That way, someone can help you faster…

Thanks.

I found this on git

and as you can see there is a reference to set_field_upload( 1 argue, 2 argue, there is a 3rd argument)
if you will see inside lib/grocery_crud there is this :

header('Access-Control-Allow-Headers: X-File-Name, X-File-Type, X-File-Size');

			$allowed_files = $this->config->file_upload_allow_file_types;

	                $reg_exp = '';
	                if(!empty($upload_info->allowed_file_types)){
	                    $reg_exp = '/(\\.|\\/)('.$upload_info->allowed_file_types.')$/i';
	                }else{
	                    $reg_exp = '/(\\.|\\/)('.$allowed_files.')$/i';
	                }

			$max_file_size_ui = $this->config->file_upload_max_file_size;
			$max_file_size_bytes = $this->_convert_bytes_ui_to_bytes($max_file_size_ui);

			$options = array(
				'upload_dir' 		=> $upload_info->upload_path.'/',
				'param_name'		=> $this->_unique_field_name($state_info->field_name),
				'upload_url'		=> base_url().$upload_info->upload_path.'/',
				'accept_file_types' => $reg_exp,
				'max_file_size'		=> $max_file_size_bytes
			);

and …

public function set_field_upload($field_name, $upload_dir = ‘’, $allowed_file_types = ‘’)
{
$upload_dir = !empty($upload_dir) && substr($upload_dir,-1,1) == ‘/’
? substr($upload_dir,0,-1)
: $upload_dir;
$upload_dir = !empty($upload_dir) ? $upload_dir : ‘assets/uploads/files’;

  /** Check if the upload Url folder exists. If not then throw an exception **/
  if (!is_dir(FCPATH.$upload_dir)) {
  	throw new Exception("It seems that the folder \"".FCPATH.$upload_dir."\" for the field name
  			\"".$field_name."\" doesn't exists. Please create the folder and try again.");
  }

  $this->upload_fields[$field_name] = (object) array(
  		'field_name' => $field_name,
  		'upload_path' => $upload_dir,
  		'allowed_file_types' => $allowed_file_types,
  		'encrypted_field_name' => $this->_unique_field_name($field_name));
  return $this;

}

the code where i found in the GIT has been written from John Scoumbourdis and reports that allowed file types / per field with set_field_upload now!

I tried to set file type but not working.

i think the above code bypassed from general definition of this :
$config['grocery_crud_file_upload_allow_file_types']='pdf|zip|rar|7z';

any ideas? I want to set individual file types per upload field.

i dont understand !
the function set_upload_field(‘field’,‘assets/files/upload’, ‘pdf’)
but i debug code :

public function set_field_upload($field_name, $upload_dir = ‘’, $allowed_file_types = ‘’)
{
$upload_dir = !empty($upload_dir) && substr($upload_dir,-1,1) == ‘/’
? substr($upload_dir,0,-1)
: $upload_dir;
$upload_dir = !empty($upload_dir) ? $upload_dir : ‘assets/uploads/files’;

  /** Check if the upload Url folder exists. If not then throw an exception **/
  if (!is_dir(FCPATH.$upload_dir)) {
  	throw new Exception("It seems that the folder \"".FCPATH.$upload_dir."\" for the field name
  			\"".$field_name."\" doesn't exists. Please create the folder and try again.");
  }

  $this->upload_fields[$field_name] = (object) array(
  		'field_name' => $field_name,
  		'upload_path' => $upload_dir,
  		'allowed_file_types' => $allowed_file_types,
  		'encrypted_field_name' => $this->_unique_field_name($field_name));
  return $this;

}

the argument ‘pdf’ don’t pushed to $allowed_file_types at the defined function.

why ?

i found a solutions about allowed file types per field !
but i have another problem.

I defined this function :

function _callback_before_upload($files_to_upload,$field_info){

		/*debug code */
		//$_SESSION['pkey'] = $pkey;
		$_SESSION['files_to_upload'] = $files_to_upload;
		$_SESSION['field_name']= $field_info->field_name;
		if($field_info->field_name == 'file_url')
		{

			foreach($files_to_upload as $value) {
	        	$ext = pathinfo($value['name'], PATHINFO_EXTENSION);
	    	}

	    	$allowed_formats = array("pdf");
		    if(in_array($ext,$allowed_formats))
		    {
		        return true;
		    }
		    else
		    {
		        return 'Wrong file type. Only pdf files are allowed! ';    
		    }
		}//if

}

inside this function, I want to get the primary key . how can I get it ?

hello panv,
i have written this code :

                                if ( $state == 'edit') {

				$pkey = $info->primary_key;

				$this->db->where('id', $pkey);
				$q = $this->db->get('docs');
				$r1 = $q->row();

				$p1 = 'assets/uploads/files/'.$r1->folder_file;
				$_SESSION['p']=$p1;
				$crud->set_field_upload('file_url',$p1);				
			//$crud->set_field_upload('file_url',$this->verify_path_callback($path));
				$crud->set_field_upload('zip_file_attach',$p1);
				//$crud->set_field_upload('zip_file_attach','assets/uploads/files/2021');
				//$crud->callback_before_upload(array($this,'_callback_before_upload'));
			}

ignore comments.
I dont understand why $crud->set_field_upload(‘file_url’,$p1) when i try to upload a file , cant get the full path from value $p1 so the function set_field_upload gets only the default path ‘assets/upload/files’.

why ? what is going wrong? the session value is for testing.

I will appreciate it if you answered me!

I am so sorry that I was away for so long. I had to attend to personal issues, and was away from my computer all that time. Please do you still need help in this, so I could look it up ?

Hello panv ,
yes, I didn’t find full solution about this.

I had to attend to other issues from other applications.

I solved it but I have another issue with state == edit

i have opened a new post :

if you can sneak a peek with this … i have posted segments with my code…

thank you in advance.

I think the set_field_upload works serially . it creates the link between file upload and the path of each record.. .