Back to top

Autore Topic: image upload in componente  (Letto 10763 volte)

Offline lellucc

  • Nuovo arrivato
  • *
  • Post: 3
    • Mostra profilo
image upload in componente
« il: 09 Ago 2011, 14:14:53 »
Salve, mi sono messo da poco allo sviluppo di un componente. Vorrei mettere un image uploader dentro il mio componente com_reviews. Quello che fa già è creare delle recensioni su un ristorante. vorrei associare un immagine alla recensione con
jfile::upload. In rete ho trovato un pò di esempi ma non sono comunque riuscito a risolvere il problema. Il codice è il seguente:admin.reviews.html.php
Codice: [Seleziona]
defined( '_JEXEC' ) or die( 'Restricted access' );


class HTML_reviews
{
   function editReview( $row, $lists, $option )
   {
      $editor =& JFactory::getEditor();
      JHTML::_('behavior.calendar');
      ?>
      <form action="index.php" method="post"
             name="adminForm" id="adminForm">
      <fieldset class="adminform">
      <legend>Details</legend>
      <table class="admintable">
      <tr>
        <td width="100" align="right" class="key">
         Name:
        </td>
        <td>
         <input class="text_area" type="text" name="name"
            id="name" size="50" maxlength="250"
            value="<?php echo $row->name;?>" />
        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Address:
        </td>
        <td>
         <input class="text_area" type="text" name="address"
            id="address" size="50" maxlength="250"
            value="<?php echo $row->address;?>" />
        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Reservations:
        </td>
        <td>
         <?php 
         
echo $lists['reservations'];
         
?>

        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Quicktake:
        </td>
        <td>
         <?php 
         
echo $editor->display'quicktake',    $row->quicktake 
                             
'100%''150''40''5' ) ; 
         
?>

        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Review:
        </td>
        <td>
         <?php 
         
echo $editor->display'review',  $row->review 
                            
'100%''250''40''10' ) ; 
         
?>

        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Notes:
        </td>
        <td>
         <textarea class="text_area" cols="20" rows="4"
            name="notes" id="notes" style="width:500px"><?php echo 
            
$row->notes?>
</textarea>
        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Smoking:
        </td>
        <td>
         <?php 
         
echo $lists['smoking']; 
         
?>

        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Credit Cards:
        </td>
        <td>
         <input class="text_area" type="text" name="credit_cards"
            id="credit_cards" size="50" maxlength="250"
            value="<?php echo $row->credit_cards;?>" />
        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Cuisine:
        </td>
        <td>
         <input class="text_area" type="text" name="cuisine"
            id="cuisine" size="31" maxlength="31"
            value="<?php echo $row->cuisine;?>" />
        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Average Dinner Price:
        </td>
        <td>
         $<input class="text_area" type="text"
             name="avg_dinner_price"
             id="avg_dinner_price" size="5" maxlength="3"
             value="<?php echo $row->avg_dinner_price;?>" />
        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Review Date:
        </td>
        <td>
         <?php echo JHTML::calendar($row->review_date'review_date''review_date'); ?>
        </td>
      </tr>
      <tr>
        <td width="100" align="right" class="key">
         Published:
        </td>
        <td>
         <?php 
         
echo $lists['published']; 
         
?>

        </td>
      </tr>
      </table>
      </fieldset>
      <input type="hidden" name="id" value="<?php echo $row->id?>" />
      <input type="hidden" name="option" value="<?php echo $option;?>" />
      <input type="hidden" name="task" value="" />
      <?php echo JHTML::_'form.token' ); ?>
      </form>
      <?php 
   
}
   
   function 
showReviews$option, &$rows, &$pageNav 
   { 
     
?>

     <form action="index.php" method="post" name="adminForm">
     <table class="adminlist">
       <thead>
         <tr>
           <th width="20">
             <input type="checkbox" name="toggle"
                  value="" onclick="checkAll(<?php echo 
                  
count$rows ); ?>
);" />
           </th>
           <th class="title">Name</th>
           <th width="15%">Address</th>
           <th width="10%">Reservations</th>
           <th width="10%">Cuisine</th>
           <th width="10%">Credit Cards</th>
           <th width="5%" nowrap="nowrap">Published</th>
         </tr>
       </thead>
       <?php
      jimport
('joomla.filter.output');
       
$k 0;
       for (
$i=0$n=count$rows ); $i $n$i++) 
       {
         
$row = &$rows[$i]; 
         
$checked JHTML::_('grid.id'$i$row->id );
         
$published JHTML::_('grid.published'$row$i );
         
$link JFilterOutput::ampReplace'index.php?option=' $option '&task=edit&cid[]='$row->id );
         
?>

         <tr class="<?php echo "row$k"?>">
           <td>
             <?php echo $checked?>
           </td>
           <td>
         <a href="<?php echo $link?>">
             <?php echo $row->name?>[/url]
           </td>
           <td>
             <?php echo $row->address?>
           </td>
           <td>
             <?php echo $row->reservations?>
           </td>
           <td>
             <?php echo $row->cuisine?>
           </td>
           <td>
             <?php echo $row->credit_cards?>
           </td>
           <td align="center">
             <?php echo $published;?>
           </td>
         </tr>
         <?php 
         $k 
$k
       } 
       
?>

      <tfoot>
       <td colspan="7"><?php echo $pageNav->getListFooter(); ?></td>
      </tfoot>
     </table>
     <input type="hidden" name="option" value="<?php echo $option;?>" />
     <input type="hidden" name="task" value="" />
     <input type="hidden" name="boxchecked" value="0" />
     <?php echo JHTML::_'form.token' ); ?>
     </form>
     <?php 
   
}
   
   function 
showComments$option, &$rows, &$pageNav 
   { 
     
?>

     <form action="index.php" method="post" name="adminForm">
     <table class="adminlist">
       <thead>
         <tr>
           <th width="20">
           <input type="checkbox" name="toggle" value="" onclick="checkAll(<?php echo count$rows ); ?>);" />
           </th>
           <th class="title">Review Name</th>
           <th width="15%">Commenter</th>
           <th width="20%">Comment Date</th>
           <th width="30%">Comment</th>
         </tr>
       </thead>
       <?php 
       jimport
('joomla.filter.output'); 
       
$k 0
       for (
$i=0$n=count$rows ); $i $n$i++) { 
         
$row = &$rows[$i]; 
         
$checked JHTML::_('grid.id'$i$row->id ); 
         
$link JFilterOutput::ampReplace'index.php?option=' $option '&task=editComment&cid[]='$row->id ); 
         
?>

            <tr class="<?php echo "row$k"?>">
              <td><?php echo $checked?></td>
              <td><a href="<?php echo $link?>"><?php echo $row->name?>[/url]</td>
              <td><?php echo $row->full_name?></td>
              <td><?php echo JHTML::Date($row->comment_date); ?></td>
              <td><?php echo substr($row->comment_text0149); ?></td>
            </tr>
            <?php 
            $k 
$k
          } 
          
?>

        <tfoot>
          <td colspan="5"><?php echo $pageNav->getListFooter(); ?></td>
        </tfoot>
        </table>
        <input type="hidden" name="option"
                             value="<?php echo $option;?>" />
        <input type="hidden" name="task" value="comments" />
        <input type="hidden" name="boxchecked" value="0" />
        <?php echo JHTML::_'form.token' ); ?>
        </form>
        <?php  
   

   
   function 
editComment ($row$option
   { 
     
JHTML::_('behavior.calendar'); 
     
?>

     <form action="index.php" method="post" name="adminForm" id="adminForm">
       <fieldset class="adminform">
         <legend>Comment</legend>
         <table>
         <tr>
           <td width="100" align="right" class="key">
             Name:
           </td>
           <td>
             <input class="text_area" type="text" name="full_name" id="full_name" size="50" maxlength="250" value="<?php echo $row->full_name;?>" />
           </td>
         </tr>
            <tr>
              <td width="100" align="right" class="key">
                Comment:
              </td>
              <td>
                <textarea class="text_area" cols="20" rows="4" name="comment_text" id="comment_text" style="width:500px"><?php echo $row->comment_text?></textarea>
              </td>
            </tr>
            <tr>
              <td width="100" align="right" class="key">
                Comment Date:
              </td>
              <td>         
              <?php echo JHTML::calendar($row->comment_date'comment_date''comment_date'); ?>
              </td>
            </tr>
            </table>
          </fieldset>
          <input type="hidden" name="id" value="<?php echo $row->id?>" />
          <input type="hidden" name="option" value="<?php echo $option?>" />
          <input type="hidden" name="task" value="" />
         <?php echo JHTML::_'form.token' ); ?>
        </form>
        <?php 
   
}
}
?>


admin.reviews.php
Codice: [Seleziona]
<?php 


defined
'_JEXEC' ) or die( 'Restricted access' ); 


require_once( 
JApplicationHelper::getPath'admin_html' ) ); 


require_once( 
JPATH_COMPONENT.DS.'controller.php' ); 




JTable::addIncludePath(JPATH_COMPONENT.DS.'tables'); 


$controller = new ReviewController( array('default_task' => 'showReviews') ); 
$controller->executeJRequest::getVar'task' ) ); 
$controller->redirect(); 


?>


controller.php


Codice: [Seleziona]
<?php
defined
'_JEXEC' ) or die( 'Restricted access' );


jimport'joomla.application.component.controller' );


class 
ReviewController extends JController 

   function 
__construct$default = array() )
   { 
      
parent::__construct$default ); 
      
$this->registerTask'add' 'edit' ); 
      
$this->registerTask'apply''save' );
      
$this->registerTask'unpublish''publish' );
   }


   function 
edit() 
   { 
      global 
$option


      
$row =& JTable::getInstance('review''Table'); 
      
$cid JRequest::getVar'cid', array(0), '''array' ); 
      
$id $cid[0]; 
      
$row->load($id); 
      
$lists = array(); 
      
$reservations = array( 
        
'0' => array('value' => 'None Taken''text' => 'None Taken'), 
        
'1' => array('value' => 'Accepted''text' => 'Accepted'), 
        
'2' => array('value' => 'Suggested''text' => 'Suggested'), 
        
'3' => array('value' => 'Required''text' => 'Required'), 
      ); 


      
$lists['reservations'] = JHTML::_('select.genericlist'$reservations'reservations''class="inputbox" ''''value''text'$row->reservations ); 
      
$lists['smoking'] = JHTML::_('select.booleanlist''smoking''class="inputbox"'$row->smoking); 
      
$lists['published'] = JHTML::_('select.booleanlist''published''class="inputbox"'$row->published); 


      
HTML_reviews::editReview($row$lists$option); 
   }
 
   function 
save() 
   { 
      global 
$option
      
      
JRequest::checkToken() or die( 'Invalid Token' );
      
      
$row =& JTable::getInstance('review''Table');
   
      if (!
$row->bind(JRequest::get('post'))) { 
         echo 
"<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n"
         exit(); 
      }
      
      
$row->quicktake JRequest::getVar'quicktake''''post''string'JREQUEST_ALLOWRAW );
      
$row->review JRequest::getVar'review''''post''string'JREQUEST_ALLOWRAW );
      
$row->id = (int) $row->id;
      
$row->smoking = (int) $row->smoking;
      
$row->avg_dinner_price = (int) $row->avg_dinner_price;
      
      
$date =& JFactory::getDate($row->review_date);
      
$row->review_date $date->toMySQL();
      
      if (!
$row->store()) { 
         echo 
"<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n"
         exit(); 
      }
      
      switch (
$this->_task)        
      {
         case 
'apply'
            
$msg 'Changes to Review saved'
            
$link 'index.php?option=' $option '&task=edit&cid[]='$row->id
            break;
         
         case 
'save'
         default: 
            
$msg 'Review Saved'
            
$link 'index.php?option=' $option
            break; 
      }
       
      
$this->setRedirect($link$msg); 
   } 


   function 
showReviews() 
   { 
      global 
$option$mainframe;
      
      
$limit JRequest::getVar('limit'$mainframe->getCfg('list_limit')); 
      
$limitstart JRequest::getVar('limitstart'0); 
      
      
$db =& JFactory::getDBO(); 
      
$query "SELECT count(*) FROM #__reviews"
      
$db->setQuery$query ); 
      
$total $db->loadResult(); 
      
      
$query "SELECT * FROM #__reviews"
      
$db->setQuery$query$limitstart$limit ); 
      
$rows $db->loadObjectList(); 
      
      if (
$db->getErrorNum()) { 
         echo 
$db->stderr(); 
         return 
false
      } 
      
      
jimport('joomla.html.pagination'); 
      
      
$pageNav = new JPagination($total$limitstart$limit); 
      
      
HTML_reviews::showReviews$option$rows$pageNav );
   } 


   function 
remove() 
   { 
      global 
$option
      
$cid JRequest::getVar'cid', array(), '''array' ); 
      
$db =& JFactory::getDBO();
       
      if(
count($cid)) 
      { 
         
JArrayHelper::toInteger($cid);
         
$cids implode','$cid ); 
         
$query "DELETE FROM #__reviews WHERE id IN ( $cids )"
         
$db->setQuery$query );
         if (!
$db->query()) { 
            echo 
"<script> alert('".$db->getErrorMsg()."'); window. history.go(-1); </script>\n"
         } 
      }
      
      
$this->setRedirect'index.php?option=' $option ); 
   }
   
   function 
publish() 
   { 
      global 
$option;


      
$cid JRequest::getVar'cid', array(), '''array' ); 
      
      if( 
$this->_task == 'publish'
      { 
         
$publish 1
      } 
      else 
      { 
         
$publish 0
      }
      
      
$reviewTable =& JTable::getInstance('review''Table'); 
      
$reviewTable->publish($cid$publish); 
      
$this->setRedirect'index.php?option=' $option ); 
   }
   
   function 
comments() 
   { 
      global 
$option$mainframe;
      
      
$limit JRequest::getVar('limit'$mainframe->getCfg('list_limit'));
      
$limitstart JRequest::getVar('limitstart'0);
      
      
$db =& JFactory::getDBO(); 
      
$query "SELECT count(*) FROM #__reviews_comments"
      
$db->setQuery$query ); 
      
$total $db->loadResult(); 
      
      
$query "SELECT c.*, r.name FROM #__reviews_comments AS c LEFT JOIN #__reviews AS r ON r.id = c.review_id "
      
$db->setQuery$query$limitstart$limit ); 
      
$rows $db->loadObjectList(); 
      
      if (
$db->getErrorNum()) 
      { 
         echo 
$db->stderr(); 
         return 
false
      }
      
      
jimport('joomla.html.pagination'); 
      
$pageNav = new JPagination($total$limitstart$limit); 
      
HTML_reviews::showComments$option$rows$pageNav ); 
   } 
   
   function 
editComment() 
   { 
      global 
$option


      
$row =& JTable::getInstance('comment''Table'); 
      
$cid JRequest::getVar'cid', array(0), '''array' ); 
      
$id $cid[0]; 
      
$row->load($id); 
      
HTML_reviews::editComment($row$option); 
   }
   
   function 
saveComment() 
   { 
      global 
$option


      
$row =& JTable::getInstance('comment''Table'); 
      
      if (!
$row->bind(JRequest::get('post'))) { 
         echo 
"<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n"
         exit(); 
      }
      
      if (!
$row->store()) { 
         echo 
"<script> alert('".$row->getError()."'); window.history.go(-1); </script>\n"
         exit(); 
      } 
      
      
$this->setRedirect('index.php?option=' $option '&task=comments''Comment changes saved'); 
   }
   
   function 
removeComment() 
   { 
      global 
$option
      
$cid JRequest::getVar'cid', array(), '''array' ); 
      
$db =& JFactory::getDBO(); 


      if(
count($cid)) 
      { 
         
JArrayHelper::toInteger($cid);
         
$cids implode','$cid ); 
         
$query "DELETE FROM #__reviews_comments WHERE id IN ( $cids )"
         
$db->setQuery$query ); 
         
         if (!
$db->query()) { 
            echo 
"<script> alert('".$db->getErrorMsg()."'); window.history.go(-1); </script>\n"
         } 
      } 
      
      
$this->setRedirect'index.php?option=' $option '&task=comments' ); 
   }
}


?>


vi ringrazio anticipatamente per le risposte

Offline jonxduo

  • Appassionato
  • ***
  • Post: 430
    • Mostra profilo
Re:image upload in componente
« Risposta #1 il: 10 Ago 2011, 09:29:54 »
se lo metti nel form dell'amministrazione usa "media"...


nel file xml:
Codice: [Seleziona]
<field
   name="image"
   type="media"
   label="COM_REVIEWS_EDIT_MENU_IMAGE_LABEL"
   description="COM_REVIEWS_EDIT_MENU_IMAGE_DESC"
   size="40"
   class="inputbox"
   required="false"
   default=""
/>


ovvimente "COM_REVIEWS_EDIT_MENU_IMAGE_LABEL" e "COM_REVIEWS_EDIT_MENU_IMAGE_DESC" li tradurrai nel tuo file di lingua...


la cosa importante è type="media" :) provalo... ti stupirà...




ps. non avevo visto i tuoi script... stai lavorando su J1.6??? se è così stai lavorando male...
http://docs.joomla.org/Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!1.6_-_Part_01


ciao, Jonx
« Ultima modifica: 10 Ago 2011, 09:32:50 da jonxduo »

Offline lellucc

  • Nuovo arrivato
  • *
  • Post: 3
    • Mostra profilo
Re:image upload in componente
« Risposta #2 il: 10 Ago 2011, 10:40:33 »
Non ho capito bene.....devo mettere il codice che hai postato su il file xml d'installazione se si dove? io vorrei qualcosa da inserire nel form che ho creato che oltre al titolo le note eccc ti possa fare scegliere l'immagine da caricare su ogni singola recensione e l'url dell'immagine dentro il database per richiamarla e creare una sorta di anteprima tipo questo :


http://imageshack.us/photo/my-images/14/uploadm.png/


Lavoro su j1.5


grazie per la risp.


Offline jonxduo

  • Appassionato
  • ***
  • Post: 430
    • Mostra profilo
Re:image upload in componente
« Risposta #3 il: 10 Ago 2011, 11:04:50 »
Lavoro su j1.5


ops... allora no... le mie istruzioni erano per la 1.6
perchè lavori con la 1.5??? sviluppare per 1.6 o 1.7 è un pò più semplice a mio avviso... e sopratutto ci sono alte probabilità che ciò che sviluppi sarà compatibile con 1.8


comunque... per 1.5 io preferivo scrivermi una mia funzione di upload, non ricordo perché ma facevo così. potrebbe essere una soluzione...


inoltre sviluppare un componente del genere per 1.5 è un pò una perdita di tempo, visto che con K2 fai tutto tranquillamente.


mi è sembrato poi di capire però che tu prevedi un grande afflusso di immagini, considerando che farai recensioni di ristoranti ecc... io ho usato molto le API di flickr per creare album su flickr e stamparli sul mio sito in Joomla, in questo modo il mio spazio rimane libero, il DB lavora meno ed il tutto è più pulito e rapido... sinceramente te lo consiglio.


come ti consiglio di passare a 1.6 o 1.7.. impara a sviluppare per il futuro, ok?  :P


ciao, Jonx

Offline lellucc

  • Nuovo arrivato
  • *
  • Post: 3
    • Mostra profilo
Re:image upload in componente
« Risposta #4 il: 10 Ago 2011, 11:30:26 »
Grazie per il consiglio.... cmq sto cercando di farlo su 1.5 perchè per adesso trovo molto più materiale in rete dato che 1.7 è uscita da poco.


Non volevo utilizzare componenti come k2 o simili perchè oltre alla funzione di recensione devo aggiungere funzionalità al mio componente in futuro, e poi vorrei imparare!




Riguardo alla quantità di immagini saranno al massimo una 30ina non sono tante.

Avevo pensato anch'io di creare una funzione di upload, soltanto non so come richiamarla nel form dato che già sto richiamando la funzione edit per inserire i dati nel form. Non è che mi posteresti un esempio dei tuoi?
« Ultima modifica: 10 Ago 2011, 11:33:30 da lellucc »

Offline urbanspaceman

  • Nuovo arrivato
  • *
  • Post: 48
  • Sesso: Maschio
    • Mostra profilo
Re:image upload in componente
« Risposta #5 il: 10 Ago 2011, 12:42:47 »
ciao, mi inserisco anche io in questa discussione perchè ho un problema analogo ma io sto sviluppando per 1.7

in breve, devo caricare anche io un'immagine. non uso type=media ma type=file
e poi ho una funzione che mi fa l'upload che funziona abbastanza bene.

il problema è che al momento io questa funzione la chiamo prima di fare il bind dei dati del form


qui è dove chiamo la funzione
Codice: [Seleziona]
public function bind($array, $ignore = '')
    {   
       
          //call img upload functions and passing file data
          $imagename=null;
   
          $file = JRequest::getVar('jform', null, 'files', 'array');
                  dump($file);
          if(isset($file)){
            $imagename = uploadImage($file);
          }
       
          if(isset($imagename)){
            $updatearray=array('image' => $imagename);
            $array = array_merge((array)$array, (array)$updatearray);
         
          if (isset($array['params']) && is_array($array['params'])) {
              $registry = new JRegistry();
              $registry->loadArray($array['params']);
              $array['params'] = (string)$registry;
          }

          if (isset($array['metadata']) && is_array($array['metadata'])) {
              $registry = new JRegistry();
              $registry->loadArray($array['metadata']);
              $array['metadata'] = (string)$registry;
          }
        }
        return parent::bind($array, $ignore);       
    }

e questa è la funzione
Codice: [Seleziona]
function uploadImage($file){
    $filename = JFile::makeSafe($file['name']['image']);
    $src = $file['tmp_name']['image'];
    $dest =  JPATH_SITE. DS ."images".DS."com_mycomp". DS .$filename;

    if($filename)
      {
        if ( JFile::upload($src, $dest, false) )
        {
         return $filename;
        }
          }
}

il file viene caricato correttamente nella cartella che dico io images/com_mycomp
però dopo aver salvato, il sistema mi stampa 4 volte il warning: Warning: Failed to move file!

suppongo che l'errore sia nel fatto che al ricaricarsi della pagina per qualche motivo riparte lo script che non trova più nessun file nella tmp di php e quindi mi spara questi errori....

ho come il sospetto che la funzione, anche se fuonzina (perdonatemi il gioco di parole) non vada chiamata all'interno della funzione bind....

qualcuno sa dirmi come operare?
grazie mille.
Francesco



Offline jonxduo

  • Appassionato
  • ***
  • Post: 430
    • Mostra profilo
Re:image upload in componente
« Risposta #6 il: 10 Ago 2011, 13:39:16 »
il file viene caricato correttamente nella cartella che dico io images/com_mycomp
però dopo aver salvato, il sistema mi stampa 4 volte il warning: Warning: Failed to move file!



e certo... se non mi ricordo male la funzione 'bind' viene richiamata in un ciclo... per cui è ovvio... una volta lo trova il file 4 no...


potrei ricordarmi male... appena ho 2 sec controllo...

Offline urbanspaceman

  • Nuovo arrivato
  • *
  • Post: 48
  • Sesso: Maschio
    • Mostra profilo
Re:image upload in componente
« Risposta #7 il: 10 Ago 2011, 13:53:43 »
graziejonxduo, devo quindi individuare il modo corretto.. o meglio il punto corretto in cui chiamare quella funzione.
mi saresti di grande aiuto, l'ossatura del componente è generata con questo http://www.notwebdesign.com/joomla-component-creator/, anche se è in beta è fatto molto bene.

dovrei capire cosa succede quando premo il pulsante di submit, ed inserirmi li in mezzo con la mia funzione prima della chiamata al bind.

ho guardato i vari tutorial che ci sono in rete ma non ne ho cavato nulla.
se hai idee o se qualcuno ne sa di più ...  :o

Offline urbanspaceman

  • Nuovo arrivato
  • *
  • Post: 48
  • Sesso: Maschio
    • Mostra profilo
Re:image upload in componente
« Risposta #8 il: 10 Ago 2011, 17:33:53 »
dunque, ho fatto dei passetti avanti
ho creato un nuovo bottone nella toolbar
Codice: [Seleziona]
JToolBarHelper::custom('event.customApply', 'save.png', 'save_f2.png', 'JTOOLBAR_CUSTOM', false);
con questo chiamo una mia funzione che sta nel controller, questa funzione carica il file e dopo dovrebbe fare il bind... come se avessi premuto il salva originale.

mentre invece al momento mi riporta al backend senza visualizzarmi nulla..... (il file viene caricato)

come posso fare per fargli fare il bind? c'è un modo per dire alla mia funzione nel controller : esegui il bind che sta nel file /tables/event.php ?

Offline jonxduo

  • Appassionato
  • ***
  • Post: 430
    • Mostra profilo
Re:image upload in componente
« Risposta #9 il: 10 Ago 2011, 17:44:08 »
ok ok fatto...


@urbanspaceman
non ho mai detto che bind fosse la funzione sbagliata... è quella giusta...
solo bisogna dargli i giusti "controlli"... e dovresti dare una pulita al codice...


fai così:
Codice: [Seleziona]
public function bind($array, $ignore = '')
{
      if (!isset($array['file'])) {
         echo'ok';
         $file = JRequest::getVar('jform', null, 'files', 'array');
         $fileUrl = $this->upload($file);
         $array['file'] = $fileUrl;
      }
}


ed ecco la funzione upload:
Codice: [Seleziona]
function upload ($file){
      $filename = JFile::makeSafe($file['name']['file']);
      if($filename!=''){
         echo 'filename';
         $src = $file['tmp_name']['file'];
         $dest =  JPATH_SITE. DS ."images".DS."com_mycomp". DS .$filename;


         if ( JFile::upload($src, $dest, false) ){
            echo 'upload';
            return 'images/com_mycomp/'.$filename;
         }
      }
}


funzionerà...[/code]
« Ultima modifica: 10 Ago 2011, 17:47:31 da jonxduo »

Offline urbanspaceman

  • Nuovo arrivato
  • *
  • Post: 48
  • Sesso: Maschio
    • Mostra profilo
Re:image upload in componente
« Risposta #10 il: 10 Ago 2011, 19:09:25 »
ciao e grazie per la risposta, con una piccola modifica ha funzionato subito. sei stato molto gentile.

se posso ti faccio 2 domande, giusto per capire meglio lo sviluppo dei componenti

-la tua soluzione funziona bene ma la via che stavo seguendo espandendo il controller poteva andar bene comunque o era una strada sbagliata?

-nel tuo esempio, insieme al nome del file durante il salvataggio agganci anche il path images/com_mycom/image.jpg
è conveniente fare così o salvare solo il nome del file e gestire il percorso nel codice?

facendo come hai fatto tu, in effetti il percorso delle immagini può essere un parametro e quindi cambiare nel tempo... utile per quei provider che limitano il numero di file per cartella...

tu che ne pensi? comunque grazie ancora per l'aiuto.

Offline jonxduo

  • Appassionato
  • ***
  • Post: 430
    • Mostra profilo
Re:image upload in componente
« Risposta #11 il: 10 Ago 2011, 22:03:49 »
-la tua soluzione funziona bene ma la via che stavo seguendo espandendo il controller poteva andar bene comunque o era una strada sbagliata?

probabilmente alla lunga saresti giunto ad una conclusione... ma in maniera decisamente più articolata...

-nel tuo esempio, insieme al nome del file durante il salvataggio agganci anche il path images/com_mycom/image.jpg
è conveniente fare così o salvare solo il nome del file e gestire il percorso nel codice?

Semplice... immagina di voler cambiare la directory un giorno... dovresti cabiare il percorso nella funzione di upload, e poi in tutte le view che stampano l'immagine... in questo modo basta cambiarne una sola, e se lo fai dopo aver inserito 100.000 file... non devi spostarli dato che rimangono memorizzati con il percorso esatto... è la soluzione migliore.

ps. per curiosità... che modifiche hai dovuto fare???

ciao, Jonx

Offline urbanspaceman

  • Nuovo arrivato
  • *
  • Post: 48
  • Sesso: Maschio
    • Mostra profilo
Re:image upload in componente
« Risposta #12 il: 10 Ago 2011, 22:28:23 »
insomma la maniera meno articolata è la migliore! :-)

ma niente, dove hai scritto
$file['name']['file']

ho cambiato con
$file['name']['image']
per allinearl ocol mio form. una cavolatina.

ancora grazie

Offline jonxduo

  • Appassionato
  • ***
  • Post: 430
    • Mostra profilo
Re:image upload in componente
« Risposta #13 il: 11 Ago 2011, 01:30:36 »
beh... apprezzo i ringraziamenti
ma comunque l'avrei affrontato il problema con j1.7
mi serviva anche per il mio xcal 2.0
ho solo anticipato i tempi :)

ciao, Jonx

Offline urbanspaceman

  • Nuovo arrivato
  • *
  • Post: 48
  • Sesso: Maschio
    • Mostra profilo
Re:image upload in componente
« Risposta #14 il: 11 Ago 2011, 11:29:54 »
mi sa che non ho capito come funziona il bind....

ho provato a commentare tutto il contenuto della funzione bind

eccetto il return parent::bind($array, $ignore);

ho provato a salvare il form... e viene salvato comunque...
quindi non ho capito qual'è la funzione che salva i dati del form nel db...



Offline jonxduo

  • Appassionato
  • ***
  • Post: 430
    • Mostra profilo
Re:image upload in componente
« Risposta #15 il: 11 Ago 2011, 11:40:48 »
bind non salva i dati del form nel db...

bind è una funzione di passaggio che potrebbe rimanere vuota...

SCRITTURA:
form -> funzione (prende i dati e li mette in un array) -> bind -> funzione (prende l'array e scrive i dati sul db)

LETTURA:
db->funzione (legge i dati dal bd e li mette in un array) -> bind -> funzione (stampa i valori dell'array come valori del form)

l'array passa per bind... che si propone come filtro per cambiare o modificare i field come vuoi prima della scrittura, e reimpostarli prima della lettura... ti faccio un classico esempio:

SCRITTURA:

       form:                                     bind:                                                  db:
password: ciao -> cripta "ciao" in " 0654c1ad561"->#__pass password=0654c1ad561


LETTURA:

                          db:                                                   bind:                                form:
#__pass password=0654c1ad561-> decripta "0654c1ad561" in "ciao"->password: ciao
« Ultima modifica: 11 Ago 2011, 11:49:17 da jonxduo »

Offline urbanspaceman

  • Nuovo arrivato
  • *
  • Post: 48
  • Sesso: Maschio
    • Mostra profilo
Re:image upload in componente
« Risposta #16 il: 11 Ago 2011, 11:49:00 »
eh no... perchè (doppio salto mortale)
mentre invio il form e carico l'immagine, devo prelevare dei tag dal medesimo form e metterli con gli opportuni controlli
dentro un'altra tabella da qui recupero id del tag e id dell'evento e li inserisco in una terza tabella (per gli incroci). il passaggio riesce, ma mentre i tag vengono inseriti correttamente, gli incroci vengono inseriti 5 volte....

suppongo che il problema sia lo stesso dell'immagine... o simile... a questo punto mi sa che mi tocca scrivermi del codice (no nso come e non so dove) per avere un pulsante custom... che noia.

Offline urbanspaceman

  • Nuovo arrivato
  • *
  • Post: 48
  • Sesso: Maschio
    • Mostra profilo
Re:image upload in componente
« Risposta #17 il: 11 Ago 2011, 11:54:23 »
ok il funzionamento ora mi è chiaro, diciamo che bind è un filtro.
allora devo individuare la funzione che salva i dati nel db... solo che sono partito da un componente generato dal componente component generator di notwebdesign... che di base funziona ma che devo adattare alle mie esigenze.

il trattamento dei dati mi pare lo faccia il model giusto? quindi model/event.php dovrebbe avere in se il codice che salva il form
io in questo file ho

public function getTable aggancia la tabella
public function getForm legge il form
protected function loadFormData mette i dati della tabella nel form
public function getItem
protected function prepareTable(&$table) prepara i dati prima dell'invio al db

spero di aver inteso correttamente. qui però non ho funzioni che scrivono nel db.. .almeno non mi pare


« Ultima modifica: 11 Ago 2011, 11:56:08 da urbanspaceman »

Offline jonxduo

  • Appassionato
  • ***
  • Post: 430
    • Mostra profilo
Re:image upload in componente
« Risposta #18 il: 11 Ago 2011, 11:57:46 »
secondo me stai operando un pò male...
mi spieghi bene cosa vuoi fare???

non è chiaro... se è come ho capito io tu vuoi (esempio)

Codice: [Seleziona]
tabella 1:
id   oggetto   immagine   idcategoria

tabella 2:
id   categoria   idoggetto

tabella 3:
id   idcategoria   idoggetto

mi sembra inutile... non capisco...

Offline urbanspaceman

  • Nuovo arrivato
  • *
  • Post: 48
  • Sesso: Maschio
    • Mostra profilo
Re:image upload in componente
« Risposta #19 il: 11 Ago 2011, 12:01:12 »
no no allora, io ho 3 tabelle

eventi
tags
tags_x_eventi

ogni volta che inserisco un evento, inserisco anche i suoi tag che però vanno in un'altra tabella (tags) che contiene solo l'id del tag e il nome.  in una terza tabella inserisco l'id dell'evento e l'id del tag associato. se inserisco un tag che già esiste mi basta solo inserire un nuovo incrocio nella tabella tags_x_eventi cos' non ho doppioni.

 



Web Design Bolzano Kreatif