Hi master,
I want to ask.
I have a file field that contains upload multiple pdf files as many as 5 files.
I added a custom field to download the five pdf files into a zip file.
with the following code:
function Row_Rendered()
{
// To view properties of field class, use:
//var_dump($this-><FieldName>);
$this->dowload_all->ViewValue = "<i class='fa fa-file-text'></i>";
$error = ""; //error holder
if (isset($_POST["createpdf"])) {
$post = $_POST;
$file_folder = "files/" . $this->file->CurrentValue; // folder to load files
if (extension_loaded("zip")) {
// Checking ZIP extension is available
if (isset($post["file"]) and count($post["file"]) > 0) {
// Checking files are selected
$zip = new ZipArchive(); // Load zip library
$zip_name = time() . ".zip"; // Zip name
if ($zip->open($zip_name, ZIPARCHIVE::CREATE) !== true) {
// Opening zip file to load files
$error .= "* Sorry ZIP creation failed at this time";
}
foreach ($post["file"] as $file) {
$zip->addFile($file_folder . $file); // Adding files into zip
}
$zip->close();
if (file_exists($zip_name)) {
// push to download the zip
header("Content-type: application/zip");
header(
'Content-Disposition: attachment; filename="' .
$zip_name .
'"'
);
readfile($zip_name);
// remove zip file is exists in temp path
unlink($zip_name);
}
} else {
$error .= "* Please select file to zip ";
}
} else {
$error .= "* You dont have ZIP extension";
}
}
}
my code has no errors and doesn’t work, can anyone help me with the solution, or am I putting the code in the wrong place?
Row_Rendered is a server event for the List or View pages, I assume you meant you want to alllow users to download the files previously uploaded in Add or Edit pages.
lissa wrote:
$post = $_POST;
if (isset($post["file"]) and count($post["file"]) > 0) {
The files are already uploaded and saved in the upload path of your field. There is no files in $_POST, you should find your files in the field’s upload folder.
sorry, what I meant was that the file I previously uploaded was a pdf file, when the user wants to download the five pdf files it automatically becomes a zip file
Then your code will output array("files/arsip/document1.pdf,document2.pdf,document3.pdf"). You need to modify your code to add path for each file and return as an array.
the code has successfully archived the zip file, but when you press the save button after executing the zip archive the mouse changes to a bussy icon like the image I attached.
I tried it in the updated row, here is my code:
$list_file_pdf = explode(",", $this->FILE->CurrentValue);
$name_zip = 'files/arsip/arsip_pdf_' . date('YmdHis') . '.zip';
$zip = new ZipArchive();
if ($zip->open($name_zip, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== FALSE) {
foreach ($list_file_pdf as $file_pdf) {
$zip->addFile("files/arsip/".$file_pdf);
}
$zip->close();
header("Content-Disposition: attachment; filename=" . $name_zip);
header("Content-Type: application/zip");
readfile($name_zip);
unlink($name_zip);
} else {
echo "Failed to create ZIP file.";
}
You may want to explain how you trigger your code. You may want to post your complete code. What are you trying to achieve? In which page? Why is there a “Save” button? In your first post you said “added a custom field to download the pdf files into a zip file”? In addition, your code outputs the zip file immediately, it may break the original flow of your page.
what if one of the fields is empty array automatically does not enter its value, only files that have value will be archived zip by array.
i try code like this too complicated and lots of code