Back to top

Autore Topic: Interrogazione database tramite componente [RISOLTO]  (Letto 3091 volte)

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Ciao a tutti, sto sviluppando il mio primo componente per joomla. Ipotizzando che nella tabella che il componente crea automaticamente ci siano già dei dati, come è possibile tramite il model del componente interrogarlo e ricevere ad esempio tutti i record che hanno come "nome" un certo valore?
Sono rimasto a questo codice:
Codice: [Seleziona]
class JTrackingModelJTracking extends JModelItem
{
   protected $information;
    public function getInformation()
   {
      if (!isset($this->information))
      {
         $db =& JFactory::getDBO();
                         /* ED ORA??? */
            }
   }
      return $this->information;
   }
}
Vi ringrazio in anticipo
« Ultima modifica: 14 Mar 2012, 10:32:59 da giovi »

mau_develop

  • Visitatore
Re:Interrogazione database tramite componente
« Risposta #1 il: 10 Mar 2012, 13:14:24 »
ai ai ai.... ti sei infilato nel CRUD di Joomla :):)

... premetto che quello che stai facendo non ti funzionerà... ma continua ugualmente perchè capirai delle cose importanti per sviluppare joomla,... purtroppo per chi inizia esiste solo quel fuorviantissimo com_helloword che inganna poichè sembra che per la 1.5 si faccia in un modo,.. nella >1.6 in un altro... nn è vero, l'esempio del com helloworld per 2.5 (1.6) indica appunto come si può fare molto più semplicemente di prima una lista, un add etc.... ma non tutto in joomla si fa così.

... comunque ..ripeto, continua e continua a postare i dubbi o gli errori che può uscirne un'interessante thread.

come fare le query lo trovi quì: http://docs.joomla.org/How_to_use_the_database_classes_in_your_script

anche se poi ti impianti sicuramente in quel: " tutti i record che hanno come "nome" un certo valore" :):) , quindi ti dico la soluzione supponendo che arrivino un array di id:
..dopo la tua riga...

$query = $db->getQuery(true);
        $query->select('*');
        $query->from('#__tuatabella');
// ora devi costruire il "where" usando il "where in" (mysql no joomla ;) )
// il where in vuole una stringa di valori separati da virgola
// lo fai usando la funz implode di php

$ids = implode(',',$cid);

        $query->where('id IN ('.$ids.')');

        $db->setQuery($query);

        return $db->loadObjectList();

M.

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Interrogazione database tramite componente
« Risposta #2 il: 12 Mar 2012, 12:54:22 »
ciao mau_develop! Ti ringrazio per la tua risposta così rapida ma allo stesso tempo molto completa :)
Il week end mi ha dato modo di fare qualche esperimento ed adattando un po il codice sono arrivato a questo:
Codice: [Seleziona]
$db =& JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('*');
$query->from('#__jtracking');
$searchterm = '123'; //termine di prova da ricercare
$query->where('code = ('.$searchterm.')'); //qui ho usato solo il where, che differenza c'è con il where in? (ammetto la mia completa ignoranza in merito al mysequel!)
$db->setQuery($query);
$this->information = $db->loadObjectList();
Si tratta di un componente che dovrebbe ricercare un codice di "spedizione" (è un componente reversibile quindi quando sarà pronto si potrà decidere di usarlo anche per altri scopi come lo stato di una riparazione, ecc...) e stampare i vari cambiamenti di stato.
la tabella ha più campi: id, codice, data, stato.
Il componente stampa quindi tutti quanti i cambiamenti dello stato dell'operazione nel tempo (un po' come il dovequando delle pt!). Sembra che il codice per ora funzioni.


Ora come ora però sono rimasti 3 interrogativi, che riporto in ordine (arbitrario) di priorità:
- come stampare l'array che ora si trova nella variabile $this->information? Attualmente tramite il print_r stampa qualcosa come:
Codice: [Seleziona]
Array ( [0] => stdClass Object ( [id] => 1 [datetime] => 12011991 [code] => 123456 [status] => spedito ) )c'è qualche alternativa?

- come passare a questa funzione getCode (definita nel modello) il termine da cercare?

- è possibile contare il numero di caratteri inseriti? ad esempio decido che il codice da cercare è di 7 cifre, come posso accertarlo? esiste una funzione che conta il numero di <caratteri>?Probabilmente sto sbagliando l'impostazione del tutto ma finché sono in tempo è meglio che mi correggiate subito!
« Ultima modifica: 12 Mar 2012, 12:56:04 da giovi »

mau_develop

  • Visitatore
Re:Interrogazione database tramite componente
« Risposta #3 il: 12 Mar 2012, 13:44:42 »
quando dalla vista lista (quella con i checkbox a sx) selezioni un id per poi spedirlo con il form this.form.submit(), viene inviato al POST un array di id, che sia uno o cento, cid[].
Se ne hai spedito uno o vuoi comunque leggere sempre e solo il primo basta che estrai quello con indice 0
$mioid = $cid[0];  ... e con mioid fai la query where.

il where in serve se invece vuoi avere tutti gli id (cid[] ) nella query (dove id=1 and id=7 and id=...bla bla).

se ne estrai uno solo $db->loadObjectList(); è inutile, basta $db->loadObject(); (non ti aspetti una lista di oggetti [db row] come risultato ma un oggetto solo)

Da questo è anche diversa l'estrazione delle righe lette del risultato:
se hai una lista devi scorrerla (foreach o count+ for o while)
se hai un oggetto puoi accedere direttamente $nomeoggetto->namespace

Nel tuo caso mi sembra di capire che devi cercare un codice....
devi decidere se la ricerca la farai con un LIKE, ovvero tutti quelli che contengono la parte che inserisci come ricerca, es:
chiave -> P123 troverai  P1234, AP1234, ASDP1234567

o se fare una ricerca esatta ==   .... se c'è P123 te lo restituirà altrimenti 0 risultati

per fare la verifica della lunghezza ... è un po' complicato se nn hai molta dimestichezza poichè la devi fare aggiungendo al field da verificare i suoi parametri e poi costruire la funzione di verifica js, in pratica qs:
http://docs.joomla.org/Developing_a_Model-View-Controller_%28MVC%29_Component_for_Joomla!2.5_-_Part_11

la funzione php che verifica o meglio restituisce la lunghezza di una stringa è strlen('stringa');
php considera una stringa come un'array di char, quindi è lo stesso fare count('stringa');
js... nn ricordo,...credo strlen...

M.

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Interrogazione database tramite componente
« Risposta #4 il: 12 Mar 2012, 14:14:22 »
Ancora una volta grazie per la celerità nella risposta.
Ho fatto qualche prova modificando a mano il database e sembra che effettivamente i risultati esatti vengano messi nell'oggetto, il problema resta comunque la stampa a video ed il passaggio del termine da cercare.. :(

Questo è il modello (ho tagliato il codice superfluo per non appesantire la discussione):
Codice: [Seleziona]
class JTrackingModelJTracking extends JModelItem
{
protected $information;
  public function getInformation()
{
if (!isset($this->information))
{
$db =& JFactory::getDBO();
$query = $db->getQuery(true);
$query->select('*');
$query->from('#__jtracking');
$searchterm = '123456';
$query->where('code = ('.$searchterm.')');
$db->setQuery($query);
$this->information = $db->loadObjectList();
}
return $this->information;
}

}

Ora come ora $searchterm è definita direttamente nel metodo, e non viene inviata dalla view del componente.. anche perchè sembra non esserci un passaggio di argomenti tramite la chiamata alla funzione che è: this->get('Information');

Come agire in questo caso?

E per la stampa (che appare disordinata)?
« Ultima modifica: 12 Mar 2012, 15:42:00 da giovi »

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Interrogazione database tramite componente
« Risposta #5 il: 12 Mar 2012, 15:58:14 »
Molto ingenuamente ho risolto così uno dei punti: nel metodo sopra definito ho impostato
Codice: [Seleziona]
$searchterm =  $_GET['code'];Quali possono essere le conseguenze negative di questo metodo?

Sarebbe interessante comunque approfondire la questione del $cid (anche perchè sicuramente sarà più appropriata della soluzione che sto adottando!
---

Manca sempre però il problema della stampa degli array. Attualmente ottengo una stampa del $db->loadObjectList(); come questa:
Codice: [Seleziona]
Array (=> stdClass Object ( [id] => 1 [datetime] => 12011991 [code] => 123456 [status] => spedito ) [1] => stdClass Object ( [id] => 7 [datetime] => 12011991 [code] => 123456 [status] => evaso ) [2] => stdClass Object ( [id] => 8 [datetime] => 12011991 [code] => 123456 [status] => stampato ) [3] => stdClass Object ( [id] => 9 [datetime] => 12011991 [code] => 123456 [status] => in stampa ) [4] => stdClass Object ( [id] => 10 [datetime] => 12011991 [code] => 123456 [status] => preso in consegna ) [5] => stdClass Object ( [id] => 11 [datetime] => 12011991 [code] => 123456 [status] => ricevuto ) [6] => stdClass Object ( [id] => 12 [datetime] => 12011991 [code] => 123456 [status] => ritirato ) )Esiste un modo per ritoccarla? Sarebbe sicuramente più comodo per gli utenti visualizzare uno schema più ordinato magari organizzato in div!


PS: piano piano sto iniziando a comprendere ciò che dici ed anche se non lo sto mettendo in pratica direttamente mi è veramente utile![/code]
« Ultima modifica: 12 Mar 2012, 16:01:43 da giovi »

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Interrogazione database tramite componente
« Risposta #6 il: 12 Mar 2012, 16:11:41 »
Tramite questo codice
Codice: [Seleziona]
echo "<  pre>"
print_r( $errors);
echo "<  pre>";
I dati assumono un aspetto un po più umano, ma ancora poco userfriendly: esistono altre soluzioni più o meno pratiche?

(Risultato in allegato)

[allegato eliminato da un amministratore essendo vecchio più di un anno]
« Ultima modifica: 12 Mar 2012, 16:16:18 da giovi »

mau_develop

  • Visitatore
Re:Interrogazione database tramite componente
« Risposta #7 il: 12 Mar 2012, 16:37:38 »
stai seguendo il tutorial com_helloworld?

M.

foreach($this->information as $info){ // scorri gli objects

//ad ogni object accedi al suo namespace con $oggetto->namespace
$id = $info->id;
$code =$info->code;
}

Ora come ora $searchterm è definita direttamente nel metodo, e non viene inviata dalla view del componente.. anche perchè sembra non esserci un passaggio di argomenti tramite la chiamata alla funzione che è: this->get('Information');
-------------------------------------------------------------------------
 non è il model che usa la view ma il controller che le unisce

cid[] lo prendi dal POST con il metodo getVar nel controller
 "scegli" il model da usare e poi usi il suo metodo
scegli la view e gli passi il cid

chiami il metodo display della tua view che ha come parametro il template, se vuoto cerca default.php, se scrivi pippo cerca default_pippo.php nella cartella tmpl nella rispettiva view

Nella buona sostanza ti consiglierei di imparare seguendo quello che vuoi fare dal tutorial per 1.5, tralasciando il resto che è meglio impararlo nella 2.5 che è più semplice.

M.
« Ultima modifica: 12 Mar 2012, 16:52:44 da mau_develop »

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Interrogazione database tramite componente
« Risposta #8 il: 12 Mar 2012, 16:40:07 »
Inizialmente si (infatti mi ha stupito il fatto che lo hai capito subito!), poi ho cominciato a sperimentare un po. Mi conviene passare ad altro? C'è qualche manuale più specifico?

La funzione implode potrebbe fare al caso mio (magari inserendo qualche tag <ul> o <li> qua e la ma appena provo ad usarla il sito perde tutto il template e resta una pagina bianca con qualche messaggio che ho stampato tramite echo :(
Anche un semplice
Codice: [Seleziona]
$results=implode(",", $this->information); // information è l'oggetto con i risultati
echo $results;
produce lo stesso errore
« Ultima modifica: 12 Mar 2012, 16:47:14 da giovi »

Offline jonxduo

  • Appassionato
  • ***
  • Post: 430
    • Mostra profilo
Re:Interrogazione database tramite componente
« Risposta #9 il: 12 Mar 2012, 16:46:44 »
puoi trattarlo come un comunissimo array... e stampare i dati come quando e dove vuoi...


Codice: [Seleziona]
foreach($error as $e){
}


questo è un ciclo che ad ogni passaggio assegna ad $e il valore di un oggetto contenuto nella tua classe ( al primo passaggio $e= $error[0], al secondo $e=$error[1] e così via...)


quindi:
Codice: [Seleziona]

foreach($error as $e){
   echo '<div class="errore">';
   echo 'id:'.$e->id.'<br />';
   echo 'Time:'.date('d-M-Y', $e->datetime).' <br /> ';
   echo 'Codice:'.$e->code.' <br /> ';
   echo 'Stato:'.$e->status.' <br /> ';
   echo '<>';
}

ti stamperà un div per ogni errore ed al suo interno i relativi valori


ps. ho messo tanti echo per farti capire meglio, ma a te ne basta uno.


pps.
http://php.net/manual/en/language.types.array.php
http://php.net/manual/en/language.types.object.php
http://php.net/manual/en/control-structures.foreach.php
« Ultima modifica: 12 Mar 2012, 16:52:24 da jonxduo »

mau_develop

  • Visitatore
Re:Interrogazione database tramite componente
« Risposta #10 il: 12 Mar 2012, 16:54:22 »
azz ho modificato il post sopra, ti ricopio:

foreach($this->information as $info){ // scorri gli objects

//ad ogni object accedi al suo namespace con $oggetto->namespace
$id = $info->id;
$code =$info->code;
}

Ora come ora $searchterm è definita direttamente nel metodo, e non viene inviata dalla view del componente.. anche perchè sembra non esserci un passaggio di argomenti tramite la chiamata alla funzione che è: this->get('Information');
-------------------------------------------------------------------------
 non è il model che usa la view ma il controller che le unisce

cid[] lo prendi dal POST con il metodo getVar nel controller
 "scegli" il model da usare e poi usi il suo metodo
scegli la view e gli passi il cid

chiami il metodo display della tua view che ha come parametro il template, se vuoto cerca default.php, se scrivi pippo cerca default_pippo.php nella cartella tmpl nella rispettiva view

Nella buona sostanza ti consiglierei di imparare seguendo quello che vuoi fare dal tutorial per 1.5, tralasciando il resto che è meglio impararlo nella 2.5 che è più semplice.

M.

Offline giovi

  • Instancabile
  • ******
  • Post: 9835
  • Sesso: Maschio
    • Mostra profilo
Re:Interrogazione database tramite componente
« Risposta #11 il: 12 Mar 2012, 16:59:04 »
Diavolo SI! Funziona :D ragazzi se il progetto va a buon fine (ci sto lavorando a tempo perso sia per impratichirmi un po, sia perché mi sembra ancora non esista un componente simile) posso citarvi nei ringraziamenti? C'è ancora molto da fare (manca tutto il backend) ma il vostro contributo è stato indispensabile per andare avanti, per cui ci terrei a farlo


E vi ringrazio anche qui pubblicamente :)

 



Web Design Bolzano Kreatif