I need webp image on Opencart 3. It is possible? - image

Is it possible to use webp images in opencart 3? I mean automatic generation.

Not all the browsers accept WEBP image format
but you can type a code to check if the browser accept WEBP format then you will have to make a new images cache and convert the existing images to webp
on the fir dir catalog/model/tool/image.php
add
$image_new_webp = 'cachewebp/' . utf8_substr($filename, 0, utf8_strrpos($filename, '.')) . '-' . (int)$width . 'x' . (int)$height . '.webp';
after this
$image_new = 'cache/'
to check if the browser accept image.webp and to create your new images cache
in the same file: catalog/model/tool/image.php
add this code:
$gd = gd_info();
if ($gd['WebP Support']) {
if (!is_file(DIR_IMAGE . $image_new_webp) || (filectime(DIR_IMAGE . $image_new) > filectime(DIR_IMAGE . $image_new_webp))) {
$path = '';
$directories = explode('/', dirname($image_new_webp));
foreach ($directories as $directory) {
$path = $path . '/' . $directory;
if (!is_dir(DIR_IMAGE . $path)) {
#mkdir(DIR_IMAGE . $path, 0777);
}
}
$image_webp = new Image(DIR_IMAGE . $image_old);
$image_webp->resize($width, $height);
$image_webp->save_webp(DIR_IMAGE . $image_new_webp);
}
}
before this line: $image_new = str_replace(
now you need a function to save the images in new format
on file dir: system/library/image.php
add this function:
public function save_webp($file, $quality = 90) {
if (is_resource($this->image)) {
imagewebp($this->image, $file, $quality);
imagedestroy($this->image);
}
}
before this line: public function save($file, $quality = 90) {
output the webp images format
add this function on file system/library/response.php
public function webpRebuild($output) {
$gd = gd_info();
if ($gd['WebP Support']) {
$uri = '';
if (isset($_SERVER['REQUEST_URI'])) {
$uri = $_SERVER['REQUEST_URI'];
}
if (stripos($uri, 'admin') === false) { // admin is your dashboard url if you have different name jst change it
if (isset($_SERVER['HTTP_ACCEPT']) && isset($_SERVER['HTTP_USER_AGENT'])) {
if( strpos( $_SERVER['HTTP_ACCEPT'], 'image/webp' ) !== false ) {
$re = '/(cache)(.*)(\.jpg|\.png|.jpeg)/U';
$subst = '$1webp$2.webp';
$this->output = preg_replace($re, $subst, $this->output);
}
}
}
}
}
before this line: private function compress($data, $level = 0)
on the same file you have to output the webpRebuild function so add this code:
$this->webpRebuild($this->output);
after this line: $output = $this

Search the OpenCart extension marketplace for "webp":
https://www.opencart.com/index.php?route=marketplace/extension&filter_search=webp
Here are a couple, both free:
https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=36308
https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=34275

The best solution is at Design Cart. The extension generates additional webp images and displays them if the user's browser supports webp. Download.

Related

laravel Backpack Original Image Name

I am using laravel backpack for my site and i need to upload some images, i copy the code from their website and works fine, but i need the original name on the images, i tried some things, but is not working.
public function setImageAttribute($value)
{
$attribute_name = "image";
$disk = "uploads";
$destination_path = 'storage/services/' .date('FY').DIRECTORY_SEPARATOR;
if ($value==null) {
Storage::disk($disk)->delete($this->{$attribute_name});
// set null in the database column
$this->attributes[$attribute_name] = null;
}
if (str_starts_with($value, 'data:image'))
{
$file = $value;
$filename = $this->generateFileName($file, $destination_path);
$image = InterventionImage::make($file)->orientate();
$fullPath = $destination_path.$filename.'.'.$file->getClientOriginalExtension();
$this->attributes[$attribute_name] = $fullPath;
}
protected function generateFileName($file, $destination_path)
{
$filename = basename($file->getClientOriginalName(), '.'.$file->getClientOriginalExtension());
$filename = Str::random(20);
while (Storage::disk('uploads')->exists($destination_path.$filename.'.'.$file->getClientOriginalExtension())) {
$filename = Str::random(20);
}
return $filename;
}
why value alwys take image base64
is there any way to git image original name?
As far as I know, you won't be able to retrieve the filename, as it's always a base64 file. But maybe this work around helps you:
Image fields blade file can be found at:
\vendor\backpack\crud\src\resources\views\crud\fields\image.blade.php
You can overwrite it by making a file on the same name at:
\resources\views\vendor\backpack\crud\fields\image.blade.php
You can change anything there, maybe you can add a hidden input with the file name.

Customise the filename in phpword

Is it possible to customize the filename in phpword when I want to download it?
I want that the file takes the prenoms of the exported row.
My code:
public function edit (Stagiaire $stagiaire)
{
$id = $stagiaire ->id;
$desc1 = Stagiaire::find($id);
$my_template = new \PhpOffice\PhpWord\TemplateProcessor(public_path('templateStagiaire.docx'));
$my_template->setValue('id, $desc->id);
$my_template->setValue('prenoms, $desc->prenoms);
$my_template->setValue('nom, $desc->nom);
$filename = $stagiaire->prenoms;
try{
$my_template->saveAs(storage_path('templateStagiaire.docx'));
}catch (Réception $e){}
return response()->download(storage_path('".$filename.".docx));
}
Need help.
Thanks in advance.
Laravel example for downloading file:
public function edit(Stagiaire $stagiaire, $downloadName = null)
{
$id = $stagiaire->id;
$desc = Stagiaire::find($id);
$my_template = new \PhpOffice\PhpWord\TemplateProcessor(public_path('templateStagiaire.docx'));
$my_template->setValue('id', $desc->id);
$my_template->setValue('prenoms', $desc->prenoms);
$my_template->setValue('nom', $desc->nom);
// save as `prenoms` filename
$filename = $stagiaire->prenoms;
try {
$my_template->saveAs(storage_path("$filename.docx"));
} catch (Reception $e) {
}
// if download name is null, then use filename
$downloadName = $downloadName??$filename;
return response()->download(storage_path("$filename.docx"))
->header('Content-disposition','attachment; filename="'.$downloadName.'"');
}
Similar Laravel example

Intervention\Image\Exception\NotWritableException Can't write image data to path

I'm trying to put a image on a folder than i generate with a timestamp.
This give me the error in the title.
Intervention\Image\Exception\NotWritableException
Can't write image data to path (/Users/me/Sites/test/public/uploads/images/1573905600/title-1.jpg)
This is my code :
$photoPaths = $request->get('photo_paths');
if (isset($photoPaths)){
$photos = explode(';', $photoPaths);
$path = storage_path('tmp/uploads/');
$newPath = public_path('/uploads/images/').strtotime('12:00:00')."/";
$arrayPhoto = array();
foreach($photos as $photo){
$photoPath = $path . $photo;
if (File::exists($photoPath)) {
$newPhotoName = Str::slug($request->get('titre')."-".$i,"-").".jpg";
$newPhotoFullPath = $newPath . $newPhotoName;
$photo = Image::make($photoPath);
// $photo->resize(1400, 1050);
$photo->resize(null, 1050, function ($constraint) {
$constraint->aspectRatio();
$constraint->upsize();
});
$photo->encode('jpg', 85);
if(!Storage::disk('public')->has($newPath)){
Storage::disk('public')->makeDirectory($newPath); //It seems it doesn't work
}
$saved = $photo->save($newPhotoFullPath); //Create the Exception
}
}
}
What i am doing wrong ?
Thanks
check this that this folder is already created or not.
then give it permission to write
sudo chmod -R 666 /public/upload/images //give permission your choice either it 666 or 775 or 777
and
$newPath = public_path('/uploads/images/').strtotime('12:00:00')."/";
if (!file_exists($newPath)) {
mkdir($newPath, 0755);
}
Check out this line of code
$newPhotoName = Str::slug($request->get('titre')."-".$i,"-").".jpg";
is it suppose to be
$newPhotoName = Str::slug($request->get('title')."-".$i,"-").".jpg";
I mean $request->get('title') instead of $request->get('titre').
OR
You can check out your input name from blade against your request validation and also your model fillable if they are same.
I hope this helps.

How to make a utf-8 report?

My report does not write exactly accentuated letters ( french ) , so there are unreadable characters displayed on the report. The runReport.php file is :
<?php
define("ROOT_PATH", "../");
require_once ROOT_PATH . 'config.inc.php';
require_once("java/Java.inc");
class runReport {
function runReport($report, $param, $output) {
$pth = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"];
$path_parts = pathinfo($pth);
$imageURLPrefix = $path_parts['dirname'] ."/images/";
session_start();
$here = getcwd();
$ctx = java_context()->getServletContext();
$birtReportEngine = java("org.eclipse.birt.php.birtengine.BirtEngine")->getBirtEngine($ctx);
java_context()->onShutdown(java("org.eclipse.birt.php.birtengine.BirtEngine")->getShutdownHook());
try{
$thereport = $birtReportEngine->openReportDesign(RP_REPORT.$report);
$task = $birtReportEngine->createRunAndRenderTask($thereport);
$task->setParameterValue("province", new java("java.lang.Integer", read_post_int("province"));
$taskOptions = new java("org.eclipse.birt.report.engine.api.HTMLRenderOption");
$outputStream = new java("java.io.ByteArrayOutputStream");
$taskOptions->setOutputStream($outputStream);
$taskOptions->setOutputFormat("html");
$ih = new java( "org.eclipse.birt.report.engine.api.HTMLServerImageHandler");
$taskOptions->setImageHandler($ih);
$taskOptions->setEnableAgentStyleEngine(true);
$taskOptions->setBaseImageURL($imageURLPrefix . session_id());
$taskOptions->setImageDirectory($here . "/images/" . session_id());
$task->setRenderOption( $taskOptions );
$task->run();
$task->close();
}
catch (JavaException $e) {
echo $e; //"Error Calling BIRT";
}
echo $outputStream;
}
}
?>
So how to make the report support utf-8 encoding ?
Don't know PHP, but this could just be a problem of your encoding HTTP header. What does the HTML source generated by BIRT look like.
Does it contain a <meta charset="xxx"/> tag?
If it does, this should match the Content-Encoding HTTP header (sent by your server, probably settable with PHP).

multi image upload in custom component for joomla

I have tried http://docs.joomla.org/Creating_a_file_uploader_in_your_component but first it shows Error: 500 after some research I have removed code
"'.$session->getName().'" : "'.$session->getId().'",
"format" : "raw"
and error is gone. Now Image is not uploading anywhere (I have set path '/images/' folder) I am confuse in code for uploading image PART 5 where to use this code?
function storeImageFile()
{
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder' );
$path = 'PATH_GOES_HERE'.'designs'.DS;
$folder_permissions = "0755";
$folder_permissions = octdec((int)$folder_permissions);
//create folder if not exists
if (!JFolder::exists($path)){
JFolder::create($path, $folder_permissions);
}
$file = JRequest::getVar('design_images', null, 'files',
$count = count($file['name']);
for($i=0;$i<$count;$i++)
{
//$i is the array position of the $_FILES array
if(empty($file['tmp_name'][$i]))
{
return false;
}
//Clean up filename to get rid of strange characters like spaces etc
$filename = JFile::makeSafe($file['name'][$i]);
//setting source and destination
$temporary_name = $file['tmp_name'][$i];
$filename = str_replace(' ', '_', $file['name'][$i]);
$dest = $path.$filename;
if(JFile::upload($temporary_name, $dest))
{
echo "File Upload Successful";
return true;
}
}
}

Resources