problema gestione immagini

ciao,

ho un pannellino per la gestione di testo e img.

il problema è nella parte della gestione img...mi spiego meglio.

lo script è stato creato per la gestione di una sola lingua. adesso però devo per forza aggiungere un altra lingua e mi trovo con dei problemi di gestione appunto delle immagini.

la parte di script interessata:

function modifyProduct()
{
   $productId   = (int)$_GET['productId'];
        $catId         = $_POST['cboCategory'];
        $name         = $_POST['txtName'];
      $description = $_POST['text'];
   $images = uploadProductImage('fleImage', SRV_ROOT . 'images/product/');

   $mainImage = $images['image'];
   $thumbnail = $images['thumbnail'];

   // if uploading a new image
   // remove old image
   if ($mainImage != '') {
      _deleteImage($productId);

      $mainImage = "'$mainImage'";
      $thumbnail = "'$thumbnail'";
   } else {
      // if we're not updating the image
      // make sure the old path remain the same
      // in the database
      $mainImage = 'prj_image';
      $thumbnail = 'prj_thumbnail';
   }

   $sql   = "UPDATE tbl_project
             SET cat_id = $catId, prj_name = '$name', prj_description = '$description',
               prj_image = $mainImage, prj_thumbnail = $thumbnail
           WHERE prj_id = $productId";

   $result = dbQuery($sql)or die(mysql_error());

   header('Location: index.php');
}

dai commenti mi sembra abbastanza chiaro su come funziona.

la funzione  uploadProductImage() ho visto che serve solo per creare l'immagine e la thumb quindi non dovrebbe c'entrare con il discorso.

Come dicevo, adesso dovrei aggiungere un'ulteriore lingua.

quindi ricevo da form le $var dei campi input nello stesso modo:

$productId   = (int)$_GET['productId'];
           $catId         = $_POST['cboCategory'];
           $name_fr         = $_POST['txtName_fr'];
         $description_fr = $_POST['text_fr'];
      $images = uploadProductImage('fleImage_fr', SRV_ROOT . 'images/product/');

   $mainImage_fr = $images['image'];
   $thumbnail_fr = $images['thumbnail'];

ho pensato di fare copia del codice e incollarlo dentro la funzione "modifyProduct()" ma succede un casino, cioè se modifico un' immagine, mi elimina l'altra e viceversa...

come posso fare?

ho pensato di utilizzare un if/elseif ma ho peggiorato la situazione.

grazie

grazie

grazie :'(

inviato 10 anni fa
iTek
iTek
1
X 0 X

Hai modificato la tabella del database, aggiungiendo i nuovi campi? Hai modificato la query di UPDATE per conemplare i nuovi campi?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

si si quello c'è tutto!!

$sql_fr   = "UPDATE tbl_project_fr
             SET cat_id = $catId, prj_name_fr = '$name_fr', prj_description_fr = '$description_fr',
               prj_image_fr = $mainImage_fr  , prj_thumbnail_fr = $thumbnail_fr
           WHERE prj_id = $productId";

   $result = dbQuery($sql_fr)or die(mysql_error());

per l'inserimento delle immagini tutto funziona.

è nella modifica ( o eliminazione ) delle immagini che ho il problema.

ho provato a fare una cosa del genere, ma come dicevo se modifico un' immagine, mi elimina l'altra e viceversa...

<?php
function modifyProduct()
{
   $productId   = (int)$_GET['productId'];
   $catId         = $_POST['cboCategory'];
   $name         = $_POST['txtName'];
      $description = $_POST['text'];
   $images = uploadProductImage('fleImage', SRV_ROOT . 'images/product/');

   $mainImage = $images['image'];
   $thumbnail = $images['thumbnail'];

   // if uploading a new image
   // remove old image
   if ($mainImage != '') {
      _deleteImage($productId);

      $mainImage = "'$mainImage'";
      $thumbnail = "'$thumbnail'";
   } else {
      // if we're not updating the image
      // make sure the old path remain the same
      // in the database
      $mainImage = 'prj_image';
      $thumbnail = 'prj_thumbnail';
   }

   $sql   = "UPDATE tbl_project
             SET cat_id = $catId, prj_name = '$name', prj_description = '$description',
               prj_image = $mainImage, prj_thumbnail = $thumbnail
           WHERE prj_id = $productId";

   $result = dbQuery($sql)or die(mysql_error());


//       ***** FRANCESE *****

   $productId   = (int)$_GET['productId'];
   $catId         = $_POST['cboCategory'];
   $name_fr         = $_POST['txtName_fr'];
      $description_fr = $_POST['text_fr'];
   $images = uploadProductImage('fleImage_fr', SRV_ROOT . 'images/product/');

   $mainImage_fr = $images['image'];
   $thumbnail_fr = $images['thumbnail'];

   // if uploading a new image
   // remove old image
   if ($mainImage_fr != '') {
      _deleteImage($productId);

      $mainImage_fr = "'$mainImage_fr'";
      $thumbnail_fr = "'$thumbnail_fr'";
   } else {
      // if we're not updating the image
      // make sure the old path remain the same
      // in the database
      $mainImage_fr = 'prj_image_fr';
      $thumbnail_fr = 'prj_thumbnail_fr';
   }

   $sql_fr   = "UPDATE tbl_project_fr
             SET cat_id = $catId, prj_name_fr = '$name_fr', prj_description_fr = '$description_fr',
               prj_image_fr = $mainImage_fr  , prj_thumbnail_fr = $thumbnail_fr
           WHERE prj_id = $productId";

   $result = dbQuery($sql_fr)or die(mysql_error());


   header('Location: index.php');
}
?>
risposto 10 anni fa
iTek
iTek
1
X 0 X

Penso che il problema sia nella funzione _deleteImage($productId). L'hai modificata? Dovresti fare in modo che tale funzione accetti un ulteriore parametro per sapere quale immagine cancellare.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

anche quello l'ho fatto, ma non so se nella maniera corretta.

inizialmente la funzione _deleteImage($productId) era così:

<?php
function _deleteImage($productId)
{
   // we will return the status
   // whether the image deleted successfully ***** ITALIANO ********
   $deleted = false;

   $sql = "SELECT prj_image, prj_thumbnail
          FROM tbl_project
         WHERE prj_id = $productId";
   $result = dbQuery($sql) or die('Cannot delete product image. ' . mysql_error());

   if (dbNumRows($result)) {
      $row = dbFetchAssoc($result);
      extract($row);

      if ($prj_image && $prj_thumbnail) {
         // remove the image file
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_image");
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_thumbnail");
      }
   }

   return $deleted;
}
?>

Poi l'ho modificato così:

<?php
function _deleteImage($productId)
{
   // we will return the status
   // whether the image deleted successfully ***** ITALIANO ********
   $deleted = false;

   $sql = "SELECT prj_image, prj_thumbnail
          FROM tbl_project
         WHERE prj_id = $productId";
   $result = dbQuery($sql) or die('Cannot delete product image. ' . mysql_error());

   if (dbNumRows($result)) {
      $row = dbFetchAssoc($result);
      extract($row);

      if ($prj_image && $prj_thumbnail) {
         // remove the image file
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_image");
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_thumbnail");
      }
   }

//     ************************ FRANCESE ****************
$sql_fr = "SELECT prj_image_fr, prj_thumbnail_fr
           FROM tbl_project_fr
         WHERE prj_id = $productId";
   $result_fr = dbQuery($sql_fr) or die('Cannot delete product image. ' . mysql_error());

   if (dbNumRows($result_fr)) {
      $row_fr = dbFetchAssoc($result_fr);
      extract($row_fr);

      if ($prj_image_fr && $prj_thumbnail_fr) {
         // remove the image file
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_image_fr");
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_thumbnail_fr");
      }
   }

   return $deleted;
}
?>
risposto 10 anni fa
iTek
iTek
1
X 0 X

Così non va bene, ti conviene prendere la funzione originale e clonarne una nuova (_deleteImage_fr) che, similmente a quanto hai fatto per il codice interno, si occupi di cancellare le immafini per l'altra l'ingua.

Puo nella modifyProduct() chiamerai all'inizio la _deleteImage e poi la _deleteImage_fr.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Così non va bene, ti conviene prendere la funzione originale e clonarne una nuova (_deleteImage_fr) 

infatti, nel frattempo ci ero arrivato... ;D e funziona. o meglio, funziona la modifica ( sostituzione ) dell'immagine, ma non ancora l'eliminazione; se ne cancello una me le cancella tutte....

più tardi ci do un occhiata...manca poco ormai ;)

risposto 10 anni fa
iTek
iTek
1
X 0 X

rieccomi.

come dicevo ho ancora il problema che quando elimino un immagine, elimino anche l'altra.

allora ho provato a mettere un if, ma non funziona ancora bene. cioè se elimino la 1a immagine  funziona, mentre se cerco di eliminare la 2a, mi elimina la 1a e rimane la 2a. >:(

la funzione:

<?php
function deleteImage()
{
   if (isset($_GET['productId']) && (int)$_GET['productId'] > 0) {
      $productId = (int)$_GET['productId'];
   } else {
      header('Location: index.php');
   }

if ($deleted = _deleteImage($productId)) {

   // update the image and thumbnail name in the database ITALIANO
   $sql = "UPDATE tbl_project
         SET prj_image = '', prj_thumbnail = ''
         WHERE prj_id = $productId";
   dbQuery($sql)or die(mysql_error());

} else {

$deleted_fr = _deleteImage_fr($productId);

// update the image and thumbnail name in the database  FRANCESE
   $sql_fr = "UPDATE tbl_project_fr
         SET prj_image_fr = '', prj_thumbnail_fr = ''
         WHERE prj_id = $productId";
   dbQuery($sql_fr)or die(mysql_error());
}

   header("Location: index.php?view=modify&productId=$productId");
}?>
risposto 10 anni fa
iTek
iTek
1
X 0 X

Nella funzione vedo che non dici quale delle 2 immagini devi eliminare, secondo me devi solo fare un paio di aggiunte, tipo:

<?php
function deleteImage(bool $lang)
{
   if (isset($_GET['productId']) && (int)$_GET['productId'] > 0) {
      $productId = (int)$_GET['productId'];
   } else {
      header('Location: index.php');
   }

// $lang = TRUE cancella italiano
// $lang = false cancella francese
if ($lang) {
  if ($deleted = _deleteImage($productId)) {

    // update the image and thumbnail name in the database ITALIANO
    $sql = "UPDATE tbl_project
          SET prj_image = '', prj_thumbnail = ''
          WHERE prj_id = $productId";
    dbQuery($sql)or die(mysql_error());
  }
 } 



else {
  //ho aggiunto anche qui il controllo come avevi messo sopra
  if ($deleted_fr = _deleteImage_fr($productId)){

    // update the image and thumbnail name in the database  FRANCESE
      $sql_fr = "UPDATE tbl_project_fr
           SET prj_image_fr = '', prj_thumbnail_fr = ''
           WHERE prj_id = $productId";
      dbQuery($sql_fr)or die(mysql_error());
    }
  
}
   header("Location: index.php?view=modify&productId=$productId");
}?>

Con il parametro $lang dici quale immagine devi eliminare, per entrambe basta chiamare la funzione 2 volte, in più ho aggiunto il controllo sull'esito della imozione dell'immagine anche per la seconda lingua (come per la prima).

Ma, tanto per essere sicuro, a seconda della lingua le immagini sono diverse?

Edit: avevo dimenticato una graffa! ;)

risposto 10 anni fa
LonelyWolf
modificato 10 anni fa
X 0 X

oppure, come dicevo prima, fare due funzioni delete, una per ciascuna lingua

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

x LonelyWolf:

bool cos'è ? nel manuale non ho trovato bool, ma is_bool e poi mi da un  parse error, unexpected T_STRING, expecting ')' qui: function deleteImage(bool $lang)

ho provato a mettere anche function deleteImage(bool ($lang)) ma il parse error rimane.

in ogni caso, is_bool --  Verifica se una variabile è di tipo boolean

ma se nel caso volessi aggiungere una terza lingua posso utilizzarlo lo stesso? magari con un elseif oppure come dice Gianni devo fare 2 ( + una terza per un eventuale 3a lingua ) funzioni delete?

risposto 10 anni fa
iTek
iTek
1
X 0 X

Hai ragione, l'ho messo così solo per dirti di usare una variabile booleana per scegliere l'immagine da eliminare; se devi avere più lingue usa un'altro tipo di variabile (e adegua l'if ;) ).

Fatta così dipende tutto dal parametro, con più i 2 possibilità è meglio usare uno switch invece che l'if, inoltre se pensi al tedesco serve avere _deleteImage_de($productId) e così via.

Avere più funzioni è più ordinato e comprensibile ma anche più "dispendioso", una funzione sola è meno leggibile.

Se invece come parametro passi per intero it o fr costruisci la sql utilizzandolo (e basta una funzione sola) ma non so come sono fatte _deleteImage_fr($productId)

risposto 10 anni fa
LonelyWolf
X 0 X

forse il metodo più flessibile è quello di passare come parametro alla funzione (unica) il suffisso che stai usando per distinguere le lingue. La funzione inserirà questo suffisso nelle query e in tutti  le istruzioni che ne fanno uso in modo ca cancellare di volta in volta l'immagine corretta:

<?php
function _deleteImage($productId, $sf_lang = '')
{
   // we will return the status
   // whether the image deleted successfully
   $deleted = false;

   $sql = "SELECT prj_image$sf_lang, prj_thumbnail$sf_lang
          FROM tbl_project$sf_lang
         WHERE prj_id = $productId";
   $result = dbQuery($sql) or die('Cannot delete product image. ' . mysql_error());

   if (dbNumRows($result)) {
      $row = dbFetchAssoc($result);
      extract($row);

      $prj_image = ${'prj_image'.$sf_lang};
      $prj_thumbnail = ${'prj_thumbnail'.$sf_lang};
      if($prj_image  && $prj_thumbnail) {
         // remove the image file
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_image");
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_thumbnail");
      }
   }

   return $deleted;
}
?>

la funzione andrà chiamata così:

_deleteImage($productId);

_deleteImage($productId,'_fr');

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ecco, questo intendevo!

Solo che non vedevo function _deleteImage(

Vabbè, se non ci fosse Gianni!

risposto 10 anni fa
LonelyWolf
X 0 X

eh! fate presto voi...io sono un pò in confusione :crazy:

dunque:

devo tenere una funzione unica per  _deleteImage($productId)  e quindi elimino _deleteImage_fr($productId) e modificarla con il codice che hai postato?

ma la variabile $sf_lang = '' rimane vuota?

non ho capito cosa vuoi dire con:

la funzione andrà chiamata così:

_deleteImage($productId);

_deleteImage($productId,'_fr');

scusate cerco di imparare ( non scroccare... ;) )

risposto 10 anni fa
iTek
iTek
1
modificato 10 anni fa
X 0 X

1 - cancelli:  _deleteImage_fr($productId)

2 - modifichi: _deleteImage($productId); diventa _deleteImage($productId,$sf_lang = '');

In questo modo la funzione per cancellare l'immagine è una sola per qualsiasi lingua usi o userai, l'importante è ricordarsi di passare alla funzione non solo l'id del prodotto ma anche l'identificativo della lingua che hai usato per le tabelle ( es: tbl_project_fr ) ecc, cioè:

'' per l'italiano

_fr per il francese

_de per il tedesco (se userai questo)

_en per l'inglese (se userai questo)

e così via

risposto 10 anni fa
LonelyWolf
X 0 X

sono alla deriva... :D

non riesco a passare  il valore di $sf_lang.

presumo di doverlo ricavare dal form dove c'è il link all'eliminazione dell'immagine

<a href="javascript:deleteImage(<?php echo $productId; ?>);">Elimina
    Immagine

ho provato allora ad usare un campo hidden:

<input type="hidden" name="sf_lang" value="_fr" >

ho controllato con print_r($_REQUEST); per vedere cosa ricevo, ma non ricevo nulla, o meglio ricevo solo quello impostato dalla funzione javascript

function deleteImage(productId)
{
   if (confirm('Cancellare questa immagine?')) {
      window.location.href = 'processProduct.php?action=deleteImage&productId=' + productId;
   }
}

il risultato:

Array ( [action] => deleteImage [productId] => 1 [PHPSESSID] => cddfc788f46025055087264c1af8c44d )

non so + cosa fare...

risposto 10 anni fa
iTek
iTek
1
modificato 10 anni fa
X 0 X

Tranquillo  O0 procedi in questo modo:

modifica il link di cancellazione in questo modo:

per l'italiano
<a href="javascript:deleteImage(<?php echo $productId; ?>,'it');">Elimina Immagine</a>

per il francese
<a href="javascript:deleteImage(<?php echo $productId; ?>,'fr');">Elimina Immagine</a>

modifica la funzione javascript in modo che accetti un ulteriore parametro: la lingua:

function deleteImage(productId,lang)
{
   if (confirm('Cancellare questa immagine?')) {
      window.location.href = 'processProduct.php?action=deleteImage&productId=' + productId+'&lang='+lang;
   }
}

A questo punto in PHP per sapere che immagine bisogna cancellare basta verificare il valore di $_GET['lang']

<?php
if($_GET['lang'] == 'it')
   _deleteImage($productId);
elseif($_GET['lang'] == 'fr')
   _deleteImage($productId,'_fr');
?>

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
modificato 10 anni fa
X 0 X

ho fatto le modifiche ( che tra l'altro avevo cercato di fare, sbagliando solo una cosa )

però sempre se controllo con print_r($_GET) quella var non ce l'ho! non viene passata.

ho sempre il solito risultato:

Array ( [action] => deleteImage [productId] => 1 [PHPSESSID] => cddfc788f46025055087264c1af8c44d )
risposto 10 anni fa
iTek
iTek
1
X 0 X

E' strano, come puoi tu stesso verificare ho modificato la funzione javascript in modo che passi nell'URL la lingua da modificare....

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

ho controllato e ricontrollato...non ricevo nulla.

nell'url ( dopo l'invio) ho solo:

.../processProduct.php?action=deleteImage&productId=1

non c'è &lang=it

ci mancava anche questa adesso...

 >:(

EDIT: aspetta che forse ho trovato l'inghippo.....

risposto 10 anni fa
iTek
iTek
1
modificato 10 anni fa
X 0 X

1- Se guardi il sorgente della pagina dal browser, come è composto l'url per la cancellazione?

2 - Prova a cambiare la funzine in modo da visualizzare il percorso, è corretto?

(es:

function deleteImage(productId,lang)
{
   if (confirm(''processProduct.php?action=deleteImage&productId=' + productId+'&lang='+lang')) {
      window.location.href = 'processProduct.php?action=deleteImage&productId=' + productId+'&lang='+lang;
   }
}

Piccola nota:

Se per le immagini in italiano anzichè mettere it lasci un campo vuoto eviti l'if e chiami sempre la funzione così:

_deleteImage($productId,$_GET['lang']);

risposto 10 anni fa
LonelyWolf
X 0 X

ok, ho risolto il problema del passaggio della variabile $lang...praticamente puntava inspiegabilmente a un altro .js...

mi rimane da capire bene la funzione deleteImage() -  NON la funzione _deleteImage($productId) - quella l'abbiamo già vista.

la funzione andrà chiamata così:

_deleteImage($productId);

_deleteImage($productId,'_fr');

non ho capito bene. cioè il codice di quella funzione come rimane?

io ero rimasto alla serie di if e tu avevi suggerito il is_bool, ma poi abbiamo scartato per via della questione se volessi aggiungere un altra lingua.

ti va di spendere 2 parole?

grazie.

risposto 10 anni fa
iTek
iTek
1
X 0 X

Ce l'hai con me? ;) Le spenderei volentieri ma tra 2 minuti stacco!

Cmq non suggerivo di usare is_bool è stata una mia deviazione di programmatore in cui dicevo il tipo di parametro che deve essere passato alla funzione.

Ma se hai già il valore della lingua $lang (che passi con GET) a questo punto prendilo come parametro nella funzione così com'è.

Domani se non è tardi facciamo 4 chicchiere! ;)

risposto 10 anni fa
LonelyWolf
X 0 X

devi usare il codice della funzione che ti ho riportato qui:

http://www.phpnews.it/forum/index.php?topic=1322.msg8624#msg8624

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

allora,

ci sono ancora delle cose abbastanza nebbiose, ma mi sto impegnando :)

ricapitolando:

abbiamo 3 form ( ho deciso di implementare la terza lingua) per la modifica dell'immagine.

ogni form, controllato da js, mi passa la variabile con il suffisso della lingua ( '', '_fr', '_en' ) per sapere di quale immagine e per quale lingua stiamo per eseguire la modifica( sostituzione) o eliminazione.

nella funzione: 

_deleteImage($productId, $sf_lang = '{$_GET["lang"]}')

abbiamo le query di SELECT e le funzioni per l'eliminazione dell'img.

<?php
function _deleteImage($productId, $sf_lang = '{$_GET["lang"]}')
{
   $deleted = false;

   $sql = "SELECT prj_image$sf_lang, prj_thumbnail$sf_lang
          FROM tbl_project$sf_lang
         WHERE prj_id = $productId";
   $result = dbQuery($sql) or die('Cannot delete product image. ' . mysql_error());

   if (dbNumRows($result)) {
      $row = dbFetchAssoc($result);
      extract($row);

      $prj_image = ${'prj_image'.$sf_lang};
      $prj_thumbnail = ${'prj_thumbnail'.$sf_lang};
      if($prj_image  && $prj_thumbnail) {
         // remove the image file
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_image");
         $deleted = @unlink(SRV_ROOT . "images/product/$prj_thumbnail");
      }
   }

   return $deleted;
}
?>

poi abbiamo la funzione function deleteImage() che serve per richiamare la 1a funzione _deleteImage($productId, $sf_lang = '{$_GET["lang"]}')

<?php
function deleteImage()
{
   if (isset($_GET['productId']) && (int)$_GET['productId'] > 0) {
      $productId = (int)$_GET['productId'];
   } else {
      header('Location: index.php');
   }

$deleted = _deleteImage($productId,$_GET['lang']);

   // update the image and thumbnail name in the database ITALIANO
   $sql = "UPDATE tbl_project{$_GET['lang']}
         SET prj_image{$_GET['lang']} = '', prj_thumbnail{$_GET['lang']} = ''
         WHERE prj_id = $productId";
   dbQuery($sql)or die(mysql_error());

   header("Location: index.php?view=modify&productId=$productId");
}
?>

e qui mi perdo un pò....non mi è chiaro come funziona la funzione deleteImage().

cmq ho provato così com'è  il tutto e succede questo:

italiano: modifica/elimina  --> ok

francese e inglese: elimina --> ok

non funziona la modifica per il francese e inglese

adesso vado a letto..ci vedo doppio :D

risposto 10 anni fa
iTek
iTek
1
X 0 X

Ma se non ricordo male la modifica è realizzata dalla funzione modifyProduct() di cui non abbiamo più parlato. Immgino quindi che vadano fatte delle correzioni simili anche a quella funzione.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Allora la funzione deleteImage() controlla che sia passato il productid nel formato corretto, in caso positivo chiama la funzione_deleteImage(pid,lang) che elimina fisicamente l'immagine associata al prodotto ed elimina il riferimento all'immagine nella tabella del db.

Per la modifica, la funzione va corretta così (parto da quella del tuo primo post) mi raccomando controllala xkè scrivo sempre dall'ufficio e devo fare sempre di corsa!:

function modifyProduct()
{
   $productId   = (int)$_GET['productId'];
   
  if (isset($_GET['lang'])) { $lang   = $_GET['lang']; } //se c'è la lingua indicata
   else {$lang   = ''; } //altrimenti x italiano
   
  $catId         = $_POST['cboCategory'];
  $name         = $_POST['txtName'];
  $description = $_POST['text'];
   $images = uploadProductImage('fleImage', SRV_ROOT . 'images/product/');

   $mainImage = $images['image'];
   $thumbnail = $images['thumbnail'];

   // if uploading a new image
   // remove old image
   if ($mainImage != '') {
      _deleteImage($productId, $lang);//aggiunto parametro lingua

      $mainImage = "'$mainImage'";
      $thumbnail = "'$thumbnail'";
   } else {
      // if we're not updating the image
      // make sure the old path remain the same
      // in the database
      $mainImage = 'prj_image';
      $thumbnail = 'prj_thumbnail';
   }
  //aggiungere la lingua alla tabella nella sql
   $sql   = "UPDATE tbl_project$lang
             SET cat_id = $catId, prj_name = '$name', prj_description = '$description',
               prj_image = $mainImage, prj_thumbnail = $thumbnail
           WHERE prj_id = $productId";

   $result = dbQuery($sql)or die(mysql_error());

   header('Location: index.php');

Avendo aggiunto il parametro della lingua andava messo anche in questa funzione, perchè cambiando l'immagine richiamava deleteimage senza specificarlo e quindi non cancellava/aggiornava nella tabella corretta.

Controlla sempre quello che scrivo, per il motivo scritto prima ;)

risposto 10 anni fa
LonelyWolf
X 0 X

buongiorno!

allora ho moficato modifyProduct() in questo modo:

<?php
function modifyProduct()
{
   $productId   = (int)$_GET['productId'];

  if (isset($_GET['lang'])) { $lang   = $_GET['lang']; } //se c'è la lingua indicata
   else {$lang   = ''; } //altrimenti x italiano

   $catId         = $_POST['cboCategory'];
   $name         = $_POST['txtName'.$lang];
   $description = $_POST['text'.$lang];
   $images = uploadProductImage('fleImage'.$lang, SRV_ROOT . 'images/product/');

    $mainImage = $images['image'];
   $thumbnail = $images['thumbnail'];

    echo $thumbnail; exit;  

   // if uploading a new image
   // remove old image
   if ($mainImage != '') {
      _deleteImage($productId, $lang);//aggiunto parametro lingua

      $mainImage = "'$mainImage'";
      $thumbnail = "'$thumbnail'";
   } else {
      // if we're not updating the image
      // make sure the old path remain the same
      // in the database
      $mainImage = 'prj_image'.$lang;
      $thumbnail = 'prj_thumbnail'.$lang;
   }
  //aggiungere la lingua alla tabella nella sql
   $sql   = "UPDATE tbl_project$lang
             SET cat_id = $catId, prj_name$lang = '$name', prj_description$lang = '$description',
               prj_image$lang = $mainImage, prj_thumbnail$lang = $thumbnail
           WHERE prj_id = $productId";

   $result = dbQuery($sql)or die(mysql_error());

   header('Location: index.php');
}?>

mi esegue la sostituzione dell'immagine solo in italiano.. >:(

ho messo quel 

echo $thumbnail; exit; 

per vedere cosa mi stampa. nel caso dell'immagine in italiano la variabile $thumbnail mi stampa il nome dell'img nuova sostituita, mentre per le altre lingue è vuota.

risposto 10 anni fa
iTek
iTek
1
X 0 X

da dove provengono le variabili  $images['image'] e $images['thumbnail'] ?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

presumo dalla funzione uploadProductImage($inputName, $uploadDir)

<?php
function uploadProductImage($inputName, $uploadDir)
{
   $image     = $_FILES[$inputName];
   $imagePath = '';
   $thumbnailPath = '';

   // if a file is given
   if (trim($image['tmp_name']) != '') {
      $ext = substr(strrchr($image['name'], "."), 1); //$extensions[$image['type']];

      // generate a random new file name to avoid name conflict
      $imagePath = md5(rand() * time()) . ".$ext";

      list($width, $height, $type, $attr) = getimagesize($image['tmp_name']);

      // make sure the image width does not exceed the
      // maximum allowed width
      if (LIMIT_PRODUCT_WIDTH && $width > MAX_PRODUCT_IMAGE_WIDTH) {
         $result    = createThumbnail($image['tmp_name'], $uploadDir . $imagePath, MAX_PRODUCT_IMAGE_WIDTH);
         $imagePath = $result;
      } else {
         $result = move_uploaded_file($image['tmp_name'], $uploadDir . $imagePath);
      }

      if ($result) {
         // create thumbnail
         $thumbnailPath =  md5(rand() * time()) . ".$ext";
         $result = createThumbnail($uploadDir . $imagePath, $uploadDir . $thumbnailPath, THUMBNAIL_WIDTH);

         // create thumbnail failed, delete the image
         if (!$result) {
            unlink($uploadDir . $imagePath);
            $imagePath = $thumbnailPath = '';
         } else {
            $thumbnailPath = $result;
         }
      } else {
         // the product cannot be upload / resized
         $imagePath = $thumbnailPath = '';
      }

   }


   return array('image' => $imagePath, 'thumbnail' => $thumbnailPath);
}?>
risposto 10 anni fa
iTek
iTek
1
X 0 X

Ci sono dei parametri che non so da dove arrivano:

'fleImage'

'thumbnail'

'image'

Ad esempio: 'fleImage' cosa contiene?

Credo sia il nome del file dell'immagine che però non va bene usato così: 'fleImage'.$lang; se contiene immagine.jpg:

 per l'italiano risulta immagine.jpg

 per le altre lingue diventerebbe immagine.jpg_fr e non mi sembra corretto.

Edit:

Ecco è proprio lì il problema, sull'estensione dell'immagine, quando fa l'upload controlla l'estensione e trovando _fr restituisce il vuoto.

risposto 10 anni fa
LonelyWolf
modificato 10 anni fa
X 0 X

ciao,

thumbnail'

'image'

dovrebbero arrivare dalla funzione che ho postato precedentemente, mentre per

'fleImage' è in nome del campo <input>

<input name="fleImage" type="file" id="fleImage" class="box">

fleImage_fr per il francese

fleImage_en per l'inglese

risposto 10 anni fa
iTek
iTek
1
X 0 X

non credo che sia li il problema perchè in fase di uplad dell'immagine nella funzione addProduct() io specifico in

$images = uploadProductImage('fleImage', SRV_ROOT . 'images/product/');

 fleImage_fr

fleImage_en

quindi il problema dev'essere da qualche altra parte.... :'(

risposto 10 anni fa
iTek
iTek
1
X 0 X

Quindi nel form hai un campo file per ogni lingua, così?

<input name="fleImage" type="file" .....

<input name="fleImage_fr" type="file".......

<input name="fleImage_en" type="file".......

Se è così allora $images = uploadProductImage('fleImage'.$lang, SRV_ROOT . 'images/product/'); va bene.

Ma io sono convinto che il problema è dovuto al nome del file nella funzione di upload, ti è possibile inserire degli echo in uploadProductImage per vedere cosa contengono:

$image (all'inizio dopo l'assegnazione)

$imagePath prima di if ($result) ....

risposto 10 anni fa
LonelyWolf
X 0 X

si è così,

infatti mi è venuta un idea.

dato che dal campo file ricevo 3  nomi diversi, potrebbe funzionare se metto una condizione if tipo:

<?php
if ( isset($_POST['fleImage'] )) {

   $images = uploadProductImage('fleImage', SRV_ROOT . 'images/product/');
}

elseif ( isset($_POST['fleImage_fr'] )) {
   $images = uploadProductImage('fleImage_fr', SRV_ROOT . 'images/product/');
}
   else ( isset($_POST['fleImage_en'] )) {
      $images = uploadProductImage('fleImage_en', SRV_ROOT . 'images/product/');
}
?>

solo che mi da un Parse error: parse error, unexpected '{' ::) perchè???

risposto 10 anni fa
iTek
iTek
1
X 0 X

In che punto? mi sembrano corrette le { }

Aspetta che devo fare un controllo, poi edito questo post.

risposto 10 anni fa
LonelyWolf
X 0 X

non posso + modificarlo, troppo tardi! :(

Dunque, le graffe mi sembrano a posto, a meno che tu non l'hai scritto scombinando qualche altra perte di codice....

Oppure, mi sembra strano dato che è possibile ma l'alchimia è ancora una scienza sconosciuta sostituisci l'ultimo else con un elseif.

P.S.

Oggi stacco alle 13.30! ;)

risposto 10 anni fa
LonelyWolf
modificato 10 anni fa
X 0 X

l'ho sostituito else con elseif

<?php
function modifyProduct()
{
   $productId   = (int)$_GET['productId'];

  if (isset($_GET['lang'])) { $lang   = $_GET['lang']; } //se c'è la lingua indicata
   else {$lang   = ''; } //altrimenti x italiano

   $catId         = $_POST['cboCategory'];
   $name         = $_POST['txtName'.$lang];
   $description = $_POST['text'.$lang];

   if ( isset($_POST['fleImage'])) {

   $images = uploadProductImage('fleImage', SRV_ROOT . 'images/product/');
}

elseif ( isset($_POST['fleImage_fr'])) {
   $images = uploadProductImage('fleImage_fr', SRV_ROOT . 'images/product/');
}
   elseif ( isset($_POST['fleImage_en'] )) {
      $images = uploadProductImage('fleImage_en', SRV_ROOT . 'images/product/');
}

    $mainImage = $images['image'];
   $thumbnail = $images['thumbnail'];

    echo $thumbnail; exit;

   // if uploading a new image
   // remove old image
   if ($mainImage != '') {
      _deleteImage($productId, $lang);//aggiunto parametro lingua

      $mainImage = "'$mainImage'";
      $thumbnail = "'$thumbnail'";
   } else {
      // if we're not updating the image
      // make sure the old path remain the same
      // in the database
      $mainImage = 'prj_image'.$lang;
      $thumbnail = 'prj_thumbnail'.$lang;
   }
  //aggiungere la lingua alla tabella nella sql
   $sql   = "UPDATE tbl_project$lang
             SET cat_id = $catId, prj_name$lang = '$name', prj_description$lang = '$description',
               prj_image$lang = $mainImage, prj_thumbnail$lang = $thumbnail
           WHERE prj_id = $productId";

   $result = dbQuery($sql)or die(mysql_error());

   header('Location: index.php');
}?>

mi da Notice: Undefined variable: images

su

$mainImage = $images['image'];

$thumbnail = $images['thumbnail'];

sto meditando il suicidio.... :'(

risposto 10 anni fa
iTek
iTek
1
X 0 X

quell'errore avviene perchè non viene richiamata la funzione uploadProductImage, quindi mi viene in mente che non devi usare $_POST ma $_FILES dentro isset.

risposto 10 anni fa
LonelyWolf
X 0 X

ho scoperto perchè non riesco a sostituire le img a a parte quella in italiano.

abbiamo impostato modifyProduct() per ricevere $_GET['lang'], ma il valore è settato solo per l'eliminazione dell' img non per la modifica.

abbiamo inserito nella querystring  js del form

<a href="javascript:deleteImage(<?php echo $productId; ?>,'_fr');">

adesso dovrei trovare il modo per avere quel valore di 'lang' POST o GET non importa dal form

<input name="fleImage_fr" type="file" >

 :buck:

risposto 10 anni fa
iTek
iTek
1
X 0 X

passalo come GET aggiungendolo all'action del form. Oppure lo puoi facilmente scoprire guardando il nome del campo input 'fleImage_fr': sono le ultime tre lettere ;)

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

si ma il form action è unico per tutte e 3 le lingue. come faccio?

risposto 10 anni fa
iTek
iTek
1
X 0 X

riporta la struttura del form che utilizzi per la modifica

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

ti riporto solo quello che riguarda le img:

<form action="processProduct.php?action=modifyProduct&productId=<?php echo $productId; ?>" method="post" enctype="multipart/form-data" name="frmAddProduct" id="frmAddProduct">

// francese

<<td>Immagine</td>
   <td> <input name="fleImage_fr" type="file" id="fleImage_fr" class="box">
<?php
   if ($prj_thumbnail_fr != '') {
?>
    <br />
    <img src="<?php echo WEB_ROOT . PRODUCT_IMAGE_DIR . $prj_thumbnail_fr; ?>"> <a href="javascript:deleteImage(<?php echo $productId; ?>,'_fr');">Elimina
    Immagine</a>
    <?php
   }

la stessa cosa per l'inglese con il suffisso _en, tranne l'italiano che non ha suffisso

e poi il submit

<input name="btnModifyProduct" type="button"  value="Modifica Prodotto" onClick="checkAddProductForm();" class="box">

  <input name="btnCancel" type="button"  value="Cancella" onClick="window.location.href='index.php';" class="box">

risposto 10 anni fa
iTek
iTek
1
X 0 X

quindi ogni volta che invii il form mandi al server i path di tutte e tre le immagini?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

si,

che possono essere vuoti, cioè quando  NON  eseguo la modifica dell'immagine, oppure  possono contenere il path della nuova immagine che indendo sostituire.

quello che mi viene in mente ora è che però la funzione modifyProduct() è creata per modificare un'immagine alla volta.

se io volessi modificare 2 img su 3 o tutte e 3 contemporaneamente?

dovrei triplicare il codice all'interno della funzione immagino.....

risposto 10 anni fa
iTek
iTek
1
X 0 X

Quindi la logica è: se è vuoto non modifica il path, altrimenti fa l'update. Giusto? Puoi riportare nuovamente il codice della funzione incriminata?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

gianni,

ho pensato di fare una cosa così:

<?php
$it = $_FILES['fleImage']['name'];
$fr = $_FILES['fleImage_fr']['name'];
$en = $_FILES['fleImage_en']['name'];



if ($it != '') {
  echo " la variabile ITALIANO è settata allora eseguo lo script<br />";
} if ($fr != '') {
      echo " la variabile FRANCESE è settata allora eseguo lo script<br />";
}    if ($en != '')  {
        echo "la variabile INGLESE è settata allora eseguo lo script";
}?>

in pratica, quando sostituisco l'img dal form file, controllo se $_FILES['fleImage']['name'] è settata. se è TRUE allora eseguo lo script per la sostituzione dell'img.

è chiaro che dovrò creare 3 script all'interno della funzione. uno per ogni lingua.

lo script incriminato così come l'avevamo sistemato l'ultima volta:

<?php
function modifyProduct()
{
   $productId   = (int)$_GET['productId'];

  if (isset($_GET['lang'])) { $lang   = $_GET['lang']; } //se c'è la lingua indicata
   else {$lang   = ''; } //altrimenti x italiano

   $catId         = $_POST['cboCategory'];
   $name         = $_POST['txtName'.$lang];
   $description = $_POST['text'.$lang];
   $images = uploadProductImage('fleImage'.$lang, SRV_ROOT . 'images/product/');

    $mainImage = $images['image'];
   $thumbnail = $images['thumbnail'];

    echo $thumbnail; exit;

   // if uploading a new image
   // remove old image
   if ($mainImage != '') {
      _deleteImage($productId, $lang);//aggiunto parametro lingua

      $mainImage = "'$mainImage'";
      $thumbnail = "'$thumbnail'";
   } else {
      // if we're not updating the image
      // make sure the old path remain the same
      // in the database
      $mainImage = 'prj_image'.$lang;
      $thumbnail = 'prj_thumbnail'.$lang;
   }
  //aggiungere la lingua alla tabella nella sql
   $sql   = "UPDATE tbl_project$lang
             SET cat_id = $catId, prj_name$lang = '$name', prj_description$lang = '$description',
               prj_image$lang = $mainImage, prj_thumbnail$lang = $thumbnail
           WHERE prj_id = $productId";

   $result = dbQuery($sql)or die(mysql_error());

   header('Location: index.php');
}?>

sarebbe da togliere la parte iniziale

if (isset($_GET['lang'])) { $lang   = $_GET['lang']; } //se c'è la lingua indicata
   else {$lang   = ''; } //altrimenti x italiano

e iriferimenti a $lang.

cosa ne dici?

lunedì lo provo e poi ci sentiamo :)

risposto 10 anni fa
iTek
iTek
1
X 0 X

 >:(

nella funzione modifyProduct() postata sopra, c'è un altro problema.

<?php
// if uploading a new image
   // remove old image
   if ($mainImage != '') {
      _deleteImage($productId, $sf_lang = '{$_GET["lang"]}')
?>

in pratica come da commenti, prima di sostituire l'immagine, la cancella richiamando la funzione

_deleteImage($productId, $sf_lang = '{$_GET["lang"]}')

ma quel $_GET["lang"] ce l'ho solo quando cancello un immagine e non quando la sostituisco:

<a href="javascript:deleteImage(<?php echo $productId; ?>,'_fr');">

quindi siamo al punto di prima.... :-\

edit: stesso post nella pagina precedente...

risposto 10 anni fa
iTek
iTek
1
modificato 10 anni fa
X 0 X

Non fare il get direttamente nella chiamata alla funzione, controlla prima se arriva da post o get, assegni e poi passi il parametro alla funzione.

Mi sono perso un po' in questi giorni, poi con calma mi rileggo tutto!

risposto 10 anni fa
LonelyWolf
X 0 X

ho risolto mettendo il contenuto della funzione

_deleteImage($productId, $sf_lang = '{$_GET["lang"]}')

direttamente nella funzione modifyProduct() moltiplicato per le 3 lingue e con l' if nel modo che ho scritto sopra...

funziona, non sarà bello da vedere ma sta storia è andata avanti anche troppo. >:(

grazie mille per l'aiuto.

siete stati molto gentili e disponibili  O0

risposto 10 anni fa
iTek
iTek
1
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda