Joomla.it Forum
Non solo Joomla... => Sviluppo => : lellucc 09 Aug 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 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 = 1 - $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_text, 0, 149); ?></td>
</tr>
<?php
$k = 1 - $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
<?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->execute( JRequest::getVar( 'task' ) );
$controller->redirect();
?>
controller.php
<?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
-
se lo metti nel form dell'amministrazione usa "media"...
nel file xml:
<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 (http://docs.joomla.org/Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!1.6_-_Part_01)
ciao, Jonx
-
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.
-
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
-
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?
-
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
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
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
-
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...
-
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
-
dunque, ho fatto dei passetti avanti
ho creato un nuovo bottone nella toolbar
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 ?
-
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ì:
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:
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]
-
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.
-
-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
-
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
-
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
-
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...
-
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
-
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.
-
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
-
secondo me stai operando un pò male...
mi spieghi bene cosa vuoi fare???
non è chiaro... se è come ho capito io tu vuoi (esempio)
tabella 1:
id oggetto immagine idcategoria
tabella 2:
id categoria idoggetto
tabella 3:
id idcategoria idoggetto
mi sembra inutile... non capisco...
-
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.
-
allora devo individuare la funzione che salva i dati nel db...
io non lo farei...
la funzione che salva nel db prende un array e salva nella tabella indicata in "table" il valore nella colonna corrispondente alla chiave... ciò appartiene al core... non la toccherei... puoi cercare un modo per fargli scrivere su + tabelle... o puoi scriverti tu una funzione alternativa...
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.
punto primo... se vuoi un gestore di eventi ti consiglio xcal, l'ho scritto io :) è open e puoi implementarlo come ti pare... ti supporto io (quindi disponibilità e lingua italiano) ora sto già lavorando al 2.0 ed ho circa 100 download al giorno della versione 1.0.2Fix... dagli un occhiata almeno...
punto secondo... non esiste il metodo che pensi... non è corretto...
-"l'incrocio" è inutile... basta fare una ricerca %like% con sql al momento della stampa dell'evento, una 3° tabella occupa inutilmente il db e non velocizza affatto le operazioni
-dovresti creare 2 form, uno per inserire nuovi tag nella tabella dei tag ed uno per sscrivere un nuovo evento, aggiungendo un campo tag che si relazioni con la tabella ma che non scriva nello stesso momento.
quando passerai ad inserire la googlemap con la location dell'evento o a creare il calendario dimmelo ;P
ciao, Jonx
-
puoi cercare un modo per fargli scrivere su + tabelle... o puoi scriverti tu una funzione alternativa...
--------------------------------------------------------
more tables ...more components :) ... come dice Amy
M.
-
puoi cercare un modo per fargli scrivere su + tabelle... o puoi scriverti tu una funzione alternativa...
--------------------------------------------------------
more tables ...more components :) ... come dice Amy
M.
io sono d'accordo con te...
-
ma no non devo fare un clone di xcal, il mio è un componente per la gestione di eventi storici
esiste già per joomla 1.5 ma lo devo portare su joomla 1.7 perchè tra le altre cose me lo chiedono gli utenti.
lo sviluppo principalmente per me perchè mi serve per uno dei miei siti e mi piace l'idea di avere un componente che fa esattamente e solo quello che mi serve. In più è un'ottima palestra per imparare a sviluppare.
-
grazie mau, non so perchè ma mi sa che l'idea d iavere un pulsante che triggeri una serie di funzioni mie e poi salvi mi sembra la soluzione più complicata ma migliore... però devo capire chi cavolo è che salva i dati nel db... cioè qual'è la funzione che dopo il bind prende i dati e li inserisce... anche perchè è quella che dovrò richiamare dopo aver fatto tutti i passaggi di cui abbiamo parlato fin'ora.
-
ok...
allora fa come ti ho detto... e come dice Mau ed Amy... e il mondo intero ;D
crea una nuova view (tag) con il suo form per aggiungerle...
poi crea la colonna "tags" nella tab degli eventi...
crea l'input "tags" dove li scriverai tutti e il sistema scriverà nella colonna tags (puoi confrontarli con quelli già inseriti in tags e cancellare gli inesistenti)
poi al momento della stampa con sql fai una ricerca %like% e cacci tutti gli eventi con determinati tag
ps. Mau non ti ha detto quello...
-
io sono d'accordo con te...
------------------------------------
con lei, non con me..... è abbastanza assurdo secondo me, soprattutto perchè è una marea di codice inutile, conviene fare con un proprio metodo... ma anche in qs caso ti infili in un sacco di cose che riflettono questo problema e devi risolvere con "tricks" ... alla fine scegli scontento il modo da lei suggerito ma per un'estensione un po complessa, diciamo equivalente a contents ... fai il conto dei files che devi implementare...
M.
... però devo capire chi cavolo è che salva i dati nel db...
------------------------------
il CRUD
-
grazie, faccio alcune prove
vediamo che ne esce...
-
ps. anche per eventi storici la geolocalizzazione sarebbe molto interessante... magari con una google map personalizzata nei colori per essere in stile un pò più "vecchio"... se ti interessa ti aiuto io a farlo :) quando ci arriverai ;P
-
grazie jon, ci penserò senz'altro (sono mesi che smacchino con le api di google al lavoro magari le faccio fruttare) nel caso ti avviso. ma prima è essenziale risolvere questi piccoli 'casini'.
una cosa di cui sono molto orgoglioso del mio componente è che puoi effettuare la ricerca su youtube ed inserire il video senza mai lasciare il backend, idem per le immagini che puoi cercare (nella versione per j1.5) tramite google image selezionarla e salvarla senza neanche doverla scaricare.
purtroppo google ha dismesso le api per image search, funzioneranno fino a dicembre. quindi per questo nuovo componente mi appoggio a bing.. che in tutta onestà... non è proprio il massimo come motore di ricerca. ma serve allo scopo.
-
google non fa nulla per caso... vedrai che uscirà qualcosa per le immagini... altrimenti puoi effettuare una normale ricerca...
-
dunque.. non vi inalberate se sto sbagliando strada ma ho deciso di metterci un pò più di tempo e capire meglio alcune cose.
quando premo il pulsante Save viene richiamata una funzione che sta all'interno del core di joomla
posso però farne un override creando la mia funzione save e mettendola all'interno del mio controller infatti una volta creata questa funzione
function save(){
$array = JRequest::get('post');
if (!isset($array['image'])) {
$file = JRequest::getVar('jform', null, 'files', 'array');
$fileUrl = upload($file);
$array['image'] = $fileUrl;
}
}
l'immagine viene caricata ma al momento il codice non salva il nome del file nel db.
caricata l'immagine, vengo rimandato su una pagina del backend dove non vedo assolutamente nulla e noto che nell'indirizzo della stessa, manca il pezzo &view=event
se lo aggiungo a mano ritorno al mio form dove ovviamente i dati non sono cambiati.ho trovato un thread però per la 1.5 dove mi pare di capire che vada fatto un override anche della funzione display.. però non so se è corretto anche per la 1.6 in ogni caso ho provato ma non ha funzionato.
suggerimenti?
-
continuo a scrivere che magari torna utile
ora la funzione è
function save($array='', $ignore='', $order_filter=''){
$array = JRequest::get('post');
if (!isset($array['image'])) {
$file = JRequest::getVar('jform', null, 'files', 'array');
$fileUrl = upload($file);
$array['image'] = $fileUrl;
}
return parent::save();
}
e funziona perfettamente.. escluso per il nome dell'immagine che non viene passato