Back to top

Autore Topic: JQuery in componente  (Letto 16055 volte)

mau_develop

  • Visitatore
JQuery in componente
« il: 17 Nov 2010, 14:10:08 »
Il discorso vale un po' per qualsiasi plugin JQuery. Offrono effetti molto avanzati agli script e sono semplici da usare.

Quindi... usiamoli! Vediamo un esempio con le google maps

Un ambiente test
----------------
lo costruiamo velocemente in qs modo:
* creiamo la cartella com_maps in /administrator/components, contenente due files: admin.maps.php e il solito index.html, entrambi praticamente vuoti, con dentro qs codice: <html><body bgcolor="#FFFFFF"></body></html>

* creiamo la cartella com_maps in /components (frontend), contenente:
- il manifesto maps.xml -------------------------------
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE install SYSTEM "http://dev.joomla.org/xml/1.5/component-install.dtd">
<install type="component" version="1.5.0">
   <name>Nome che hai messo nel db</name>
   <!-- opzionali -->
   <creationDate>17-11-2010</creationDate>
   <author>Spazioalchimia</author>
   <authorEmail>rebelot@spazioalchimia.it</authorEmail>
   <authorUrl>http://www.spazioalchimia.it</authorUrl>
   <copyright>Fanne ciò che vuoi</copyright>
   <license>Licenza</license>
   <version>Vers 0.0</version>
   <description>Le mie mappe</description>

</install>


- l'entry maps.php -------------------------------
<?php
defined('_JEXEC') or die('Restricted access');
require_once (JPATH_COMPONENT.DS.'controller.php');
// se avete un css decommentate sotto (di default si chiama... default)
#JHTML::_('stylesheet', 'default.css', 'components/com_maps/');

$controller = new MapsController();
$controller->execute( JRequest::getWord( 'task') );
$controller->redirect();

?>

- il controller controller.php -------------------------------
<?php
jimport('joomla.application.component.controller');

class MapsController extends JController{
   function display(){
      parent::display();
   }
}
?>

- la cartella views contenente una cartella che chiamerete maps contenete a sua volta:
il file view.html.php -------------------------------
<?php
jimport( 'joomla.application.component.view');

class MapsViewMaps extends JView{

   function display($tpl = null) {
      $apikey="INSERITE LA VOSTRA APIKEY, necessaria registrazione google";
      $document =& JFactory::getDocument();
      $document->addScript('http://maps.google.com/maps?file=api&amp;v=2&amp;key='.$apikey);
      $document->addScript(JURI::root(true).'/components/com_maps/assets/js/jquery-1.4.4.min.js');
      $document->addScript(JURI::root(true).'/components/com_maps/assets/js/jquery.gmap-1.1.0-min.js');

      parent::display($tpl);
   }
}
?>

la cartella del template che chiamerete come da standard tmpl, contenente:
un file default.php ------------------
<?php
defined('_JEXEC') or die('Restricted access');
?>
<script type="text/javascript">
$(function() {
    $("#map").gMap();
});
</script>

<div id="map"></div>

Io ho l'abitudine di fare una cartella che chiamo assets che contiene css e script in ulteriori cartelle css e js. Gli script sopra sono impostati in qs modo, quindi se seguite il mio modo bene, altrimenti occhio alle path!
Nella cartella js metto i due script jquery e gmap che trovate rispettivamente:
http://jquery.com/
http://gmap.nurtext.de/examples.html

* installiamo da db il componente inserendo in jos_components una riga con valorizzati qs parametri:
nome -> Quello che volete, link -> option=com_maps (il nome della cartella componente), option -> com_maps
- creiamo la cartella in cui sviluppare com_maps

Ecco fatto! Basta creare un menu e linkarlo alla view e avete la vostra mappa google.
Non vi basta? volete di più? ... io vi ho risolto il problema "Joomla" voi ora andate quì
http://gmap.nurtext.de/examples.html leggetevi un po di documentazione e implementate ciò che volete.
Volete dinamicizzare i dati? come farli arrivare con l'mvc fino alla view per valorizzare lo script?

beh... manca un model,... mancano le chiamate a model e view nel controller... ci vuole poco, oppure se è un banale query potete farla anche nella view, creando un oggetto visibile poi nel template...

Per gli sfaticati in allegato ci sono i files ... ma io coglierei l'occasione per imparare un po' a pasticciare con joomla.
IL PACCHETTO NON E' INSTALLABILE AUTOMATICAMENTE

M.

EDIT[1]: la pagina di documentazione del plugin gmap è giusto per capire la base, la vostra visualizzazione è implementabile anche con tutti qs parametri:
http://code.google.com/intl/en-US/apis/maps/documentation/javascript/v2/reference.html

EDIT[2]:  ...io ho fatto un componente perchè ho poi altre mire... ma nulla vieta di farci un modulo, praticamente è quasi la stessa cosa visto che tutto viene fatto nella view. Basta prendere un tutorial sui moduli e copiare il cod.

EDIT[3]: I più attenti si saranno accorti che qs link:
$document->addScript('http://maps.google.com/maps?file=api&amp;v=2&amp;key='.$apikey);
porta ad una v2 dichiarata obsoleta ....

EDIT[4] La versione 3 delle api NON richiede key e ha molte features in più nonchè il suporto per Iphone.
Basta che sostituiate il plugin (non jquery) con questo:
http://googlemaps.mayzes.org/

EDIT[5]: ... si ma che palle ste mappe son tutte uguali..... :) n'è vero! guarda quì che belle!
http://www.41latitude.com/post/1268734799/google-styled-maps

EDIT[6] Ettipareva non ci fosse il tool :)  http://gmaps-samples-v3.googlecode.com/svn/trunk/styledmaps/wizard/index.html



[allegato eliminato da un amministratore]
« Ultima modifica: 17 Nov 2010, 22:07:36 da mau_develop »

mau_develop

  • Visitatore
Re:JQuery in componente
« Risposta #1 il: 17 Nov 2010, 19:55:30 »
Vabbene avete avuto ben 5 ore e sarete ormai stanchi ed avete sperimentato lo sperimentabile, differenziamo un po la cosa...

... e se io non volessi JQuery? ... e tolgo pure la key .... e ho anche streetview! .... oddddio ha anche la compatibilità con l'Iphone!   ma che goduria :)

Se non vogliamo Jquery ci dobbiamo linkare direttamente alle api e aggiungere noi uno script.
Il file che modifichiamo è la view.maps.php:

<?php
jimport( 'joomla.application.component.view');

class MapsViewMaps extends JView{

   function display($tpl = null) {
      $document =& JFactory::getDocument();
      $document->addScript('http://maps.google.com/maps/api/js?sensor=true');

      $document->addScriptDeclaration("window.onload = function() {
         var latlng = new google.maps.LatLng(-34.397, 150.644);
         var myOptions = {
            zoom: 8,
            center: latlng,
             mapTypeId: google.maps.MapTypeId.ROADMAP
         };
         var map = new google.maps.Map(document.getElementById('map'),myOptions);
           }
          ");

      parent::display($tpl);

   }

}
?>

dove questo:

var latlng = new google.maps.LatLng(-34.397, 150.644);
var myOptions = {
   zoom: 8,
   center: latlng,
   mapTypeId: google.maps.MapTypeId.ROADMAP
}

sarà la parte che si potrà valorizzare dinamicamente o usarla così staticamente.

le altre classi applicabili:  http://code.google.com/intl/en-US/apis/maps/documentation/javascript/

il file default nella cartella tmpl conterrà solo qs righe:
<?php // no direct access
defined('_JEXEC') or die('Restricted access');
?>
  <div id="map" style="width:100%; height:500px"></div>

M.
« Ultima modifica: 17 Nov 2010, 22:07:03 da mau_develop »

mau_develop

  • Visitatore
Re:JQuery in componente
« Risposta #2 il: 18 Nov 2010, 12:21:25 »
La terza puntata è la naturale evoluzione, la dinamicità.
Non si può seguire questi thread leggendo quà e là, anche se non sembra :) hanno un percorso logico fatto di passi successivi.

Per questo esempio utilizzo la v3 delle api di google, credo sia la più avanzata ora come ora.
Riepilogando un'attimo, abbiamo visto il nostro componente funzionare con gmaps (JQuery) che purtroppo era rimasta ad un uso della v2, un successivo articolo che ci "liberava" di JQuery e della Key, ora vediamo il primo esempio ma con un plugin JQuery che supporta le api v3 , già accennato negli edit del primo post che per chiarezza riporto:
 La versione 3 delle api NON richiede key e ha molte features in più nonchè il suporto per Iphone.
Basta che sostituiate il plugin (non gli script jquery) con questo: http://googlemaps.mayzes.org/

mettiamolo accanto a quello precedente nella cartella js in assets

prendiamo il nostro file view.html.php e facciamo le necessarie modifiche:------------------------------

   function display($tpl = null) {

      $mapdata =& $this->get('mapdata');

      $document =& JFactory::getDocument();
      $document->addScript('http://maps.google.com/maps/api/js?sensor=true');
      $document->addScript(JURI::root(true).'/components/com_para/assets/js/jquery-1.4.4.min.js');
      $document->addScript(JURI::root(true).'/components/com_para/assets/js/jquery.googlemaps1.01.js');
      $document->addScriptDeclaration("document.ready = function() { $mapdata; }");

      parent::display($tpl);

   }

cosa ho fatto?

ho tolto la key, ho modificato lo script che chiama le api, ho cambiato il link al plugin di JQuery jquery.googlemaps1.01.js, il nuovo che abbiamo messo in /js, ho aggiunto la dichiarazione dello script che creerà la mia mappa nel tag div map in tmpl/default.php
e poi ho aggiunto la riga che mi "recupera" i dati dinamici $mapdata =& $this->get('mapdata');
Come si fa lo vediamo subito:

Innanzitutto dobbiamo aggiungere nella root del ns componente una cartella /models contenente un model che io ho chiamato geo.php:--------------------------------

<?php
defined('_JEXEC') or die();
jimport('joomla.application.component.model');

class MapsModelGeo extends JModel {
   function __construct(){
      parent::__construct();
   }

   function getMapdata(){

      // Quì potete fare una qury i cui risultati valorizzeranno lo script sotto
      //   $db =& JFactory::getDBO();
      //   $query = 'SELECT * FROM #######;

               // per ora mi limito a mettere valori fissi
                return "
      var latlng = new google.maps.LatLng(-34.397, 150.644);
      var myOptions = {
      zoom: 8,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
      };
      var map = new google.maps.Map(document.getElementById('map'),myOptions);";
      }
   
}

?>

Il metodo che mi permette di recuperare i valori sarà quindi getMapdata();

Nell'mvc quello che si occupa di definire la view il model e di restituirli alla visualizzazione è il controller, quindi andrò ad implementare il mio controller:

class MapsController extends JController{
            function display(){
            $view =& $this->getView(maps, 'html');
            $model = $this->getModel('geo');
            $mapdata = $model->getMapdata();
            $view->assignRef('mapdata', $mapdata);
            $view->setModel($model);
            $view->display();
                                }

}


M.
« Ultima modifica: 18 Nov 2010, 12:23:41 da mau_develop »

Offline tampe125

  • Appassionato
  • ***
  • Post: 366
    • Mostra profilo
Re:JQuery in componente
« Risposta #3 il: 18 Nov 2010, 16:37:36 »
come sempre offri un monte di spunti interessanti :D

solo una cosa:
ma formattare un minimo il testo?  :o

non l'ho testato, ma utilizzando jQuery, non ti da' problemi di compatibilità con Mootools?
ho provato un paio di volte a utilizzare tutti e due i framework ma ho sempre avuto problemi, anche con la modalità noConflict.

a te è filato tutto liscio?
www.fabbricabinaria.it
Soluzioni originali ad esigenze quotidiane

mau_develop

  • Visitatore
Re:JQuery in componente
« Risposta #4 il: 18 Nov 2010, 18:10:23 »
sarebbe bello avere il codecitation che risparmierebbe molto nell'impaginazione, il problema è l'indentazione coi tab....mmmhh potrei appoggiarmi a un nopaste... mo vedo.

Mootools da frontend l'ho tolto, non mi serviva, non ho grande ajax e quel poco lo gestisco in altro modo.

cmq mi era capitato ma col no conflict era andato tutto a posto, ricordo anche che avevo dovuto giocare col spostare soprao sotto uno dei due...

Cmq. visto che continuano a chiedere tutorial, a lamentarsi che chi sa non divulga , inventarsi mille mastruzzi per far le cose etc...  mi aspettavo più interesse .... si vede che in realtà non sono bisogni ma sono lamentele alla luna :) , capita nei momenti di noia.

Tutti quelli che cercano calendari, prenotazioni, effetti spaziali... JQuery è una miniera e quasi a portata di niubbo, una volta imparato il meccanismo poi lo script che ci includi (puoi anche metterli tutti) sono un po' fatti tuoi... ;)

M.

Offline kassandra

  • Esploratore
  • **
  • Post: 60
  • Sesso: Femmina
    • Mostra profilo
Re:JQuery in componente
« Risposta #5 il: 02 Dic 2010, 14:45:49 »
Tutti quelli che cercano calendari, prenotazioni, effetti spaziali... JQuery è una miniera e quasi a portata di niubbo, una volta imparato il meccanismo poi lo script che ci includi (puoi anche metterli tutti) sono un po' fatti tuoi... ;)

niubbo kassandra presente! ... è quel "quasi" che mi preoccupa  ???

per fortuna è già venerdì e il fine settimana si avvicina, così avrò un po' di tempo per studiare, col gatto sulle ginocchia e il computer in braccio. No, meglio il contrario  ;)
ci sedemmo dalla parte del torto, visto che tutti gli altri posti erano occupati

Offline tampe125

  • Appassionato
  • ***
  • Post: 366
    • Mostra profilo
Re:JQuery in componente
« Risposta #6 il: 02 Dic 2010, 15:19:08 »
ehm.. non vorrei traumatizzarti... ma oggi è giovedì (a meno che tu non abiti in australia..)

:D
www.fabbricabinaria.it
Soluzioni originali ad esigenze quotidiane

Offline kassandra

  • Esploratore
  • **
  • Post: 60
  • Sesso: Femmina
    • Mostra profilo
Re:JQuery in componente
« Risposta #7 il: 02 Dic 2010, 15:52:18 »
ops!  :-[
(...i sogni son desideriiii)

ps: sì, mi hai traumatizzato  >:(
mi sa che vado a vivere in Australia
« Ultima modifica: 02 Dic 2010, 15:57:19 da kassandra »
ci sedemmo dalla parte del torto, visto che tutti gli altri posti erano occupati

mau_develop

  • Visitatore
Re:JQuery in componente
« Risposta #8 il: 02 Dic 2010, 17:43:45 »
Se non devi fare cose complicate non è difficile capire

considera il controller come colui che esegue una task, se non viene richiesta esegue il default.

Cosa "esegue"?

esempio prende dati dal post o dalla get  istanzia un model, ne usa un metodo per fare qualcosa, istanzia una view e le passa quello che ha ricevuto dal model ..se...

la view "riceve" i dati e se necessario fa qualcosa di utile al template, altrimenti lascia i dati al template che li visualizzerà

M.

Offline ariess

  • Global Moderator
  • Instancabile
  • ********
  • Post: 4056
  • Sesso: Maschio
    • Mostra profilo
Re:JQuery in componente
« Risposta #9 il: 09 Dic 2010, 16:03:54 »
ciao mau  :)

incuriosito dal tuo post, mi sono messo a studiare le librerie jQuery  e sono rimasto piacevolmente sorpreso dalle potenzialità e facilità di utilizzo.

per fare pratica sto sviluppando un semplice modulo per visualizzare dei feed rss.
ora però mi trovo davavnti un problemino...
dovrei inserire una varibile php all'interno di una funzione jquery

Codice: [Seleziona]
<script type="text/javascript" language="javascript">

   $(document).ready(function(){
   $("#scroll ul>li").truncate(40);
   $('#screen').serialScroll({
   event:'mouseover',
target:'#scroll',
items:'li',
navigation:'#navigation li a',
axis:'xy',
duration:speed,
force:true
  });
   $("a.itemtitle:first").addClass("itemactive");
  $('#navigation>ul>li>a').hover(function () {
$('a.itemactive').removeClass('itemactive');
$(this).addClass('itemactive');
// return false;
});
   });
</script>

alla funzione "truncate" al posto di "40" (numero massimo di caratteri) dovrei inserire la variabile.
ho provato a passare la variabile da php a js in questo modo:
Codice: [Seleziona]
var maxLength = "<?php echo $rd_max_lengh?>";
     
     
      $(document).ready(function(){
      $("#scroll ul>li").truncate(maxLength );

oppure così:

Codice: [Seleziona]
$(document).ready(function(){
      $("#scroll ul>li").truncate(<?php echo $rd_max_lengh?>);

ma entrambi non funzionano  :(
hai qualche suggerimento per la sintassi giusta?

mau_develop

  • Visitatore
Re:JQuery in componente
« Risposta #10 il: 09 Dic 2010, 16:07:56 »
$(document).ready(function(){
      $("#scroll ul>li").truncate( $rd_max_lengh);

così?

M.

Offline tampe125

  • Appassionato
  • ***
  • Post: 366
    • Mostra profilo
Re:JQuery in componente
« Risposta #11 il: 09 Dic 2010, 16:16:06 »
non vorrei dire una stupidaggine, ma il costrutto "ul>li" è accettato da tutti i browser?
mi sembra che sia CSS3 (mi sembra).
forse è quello, prova a fare un cambio, oppure a lanciare lo script usando Chrome o Safari (entrambi supportano i CSS3 quasi completamente)
www.fabbricabinaria.it
Soluzioni originali ad esigenze quotidiane

Offline ariess

  • Global Moderator
  • Instancabile
  • ********
  • Post: 4056
  • Sesso: Maschio
    • Mostra profilo
Re:JQuery in componente
« Risposta #12 il: 09 Dic 2010, 16:22:44 »
$(document).ready(function(){
      $("#scroll ul>li").truncate( $rd_max_lengh);

così?

M.

neanche così funziona... :( la variabile proviene dall'xml del modulo, c'è forse una strada più breve (e semplice) senza passare da PHP?

@tampe125
ho provato a lanciarlo anche con chrome ma il risultato non cambia.
comunque non credo sia quello il problema, perchè se al posto della varibile inserisco un numero intero lo script funziona.

mau_develop

  • Visitatore
Re:JQuery in componente
« Risposta #13 il: 09 Dic 2010, 16:28:57 »
ma se fai un print() della variabile la vedi?

M.

Offline ariess

  • Global Moderator
  • Instancabile
  • ********
  • Post: 4056
  • Sesso: Maschio
    • Mostra profilo
Re:JQuery in componente
« Risposta #14 il: 09 Dic 2010, 16:52:39 »
in effetti non la vedo...
ma se faccio il print di un'altra variabile simile la vedo
ma se fai un print() della variabile la vedi?

M.

infatti la variabile sembrava vuota... poi ho cambiato nome della variabile. ora con il print() la vedo ma la funzione sembra che non la riconosca.

ho provato sia con
 $("#scroll ul>li").truncate($rd_truncate);

sia

var max = "<?php echo $rd_truncate; ?>";
$("#scroll ul>li").truncate(max);

mau_develop

  • Visitatore
Re:JQuery in componente
« Risposta #15 il: 09 Dic 2010, 17:02:15 »
infatti la variabile sembrava vuota...
----------------------------------------------
...non è che era un array? ... in qs caso print_r();

...aspetta... ma l'hai dichiarata? ... nn sono un genio del js anzi :( ... prova così:

var pippo=0;

pippo=<?php echo ...come te la ricavi.. ?>

truncate(pippo)

M

Offline ariess

  • Global Moderator
  • Instancabile
  • ********
  • Post: 4056
  • Sesso: Maschio
    • Mostra profilo
Re:JQuery in componente
« Risposta #16 il: 09 Dic 2010, 17:19:20 »
sì la variabile è dichiarata...

la cosa strana è che ho fatto la stessa cosa con un'altra variabile all'interno dello stesso script e tutto funziona... con il truncate non c'è verso...

Codice: [Seleziona]
<script type="text/javascript" language="javascript">
var max = 0;
max = "<?php echo $rd_truncate?>";
var speed = "<?php echo $rd_speed?>";


   $(document).ready(function(){
   $("#scroll ul>li").truncate(max);
   
   $(#screen).serialScroll({
   event:'mouseover',
target:'#scroll',
items:'li',
navigation:'#navigation li a',
axis:'xy',
duration:speed,
force:true
  });

la variabile php $rd_speed l'ho passata in JS e diventa "speed" che poi ho inserito nella funzione .serialScroll() e funziona a dovere.

essendo "truncate" un plugin di terze parti, è possibile secondo te che non sia stato sviluppato a dovere e per questo non legge le varabili?
(scusa se sparo qualche caxxata, ma di JS ci capisco veramente nulla)

mau_develop

  • Visitatore
Re:JQuery in componente
« Risposta #17 il: 09 Dic 2010, 17:26:08 »
essendo "truncate" un plugin di terze parti,
----------------------------------------------------------
 e ovviamente l'hai incluso...

quando si "assiemano" più plugin jquery capita.. bisogna guardare bene la documentazione perchè di versioni di jquery ce n'è più di joomla!

M.

Offline ariess

  • Global Moderator
  • Instancabile
  • ********
  • Post: 4056
  • Sesso: Maschio
    • Mostra profilo
Re:JQuery in componente
« Risposta #18 il: 09 Dic 2010, 17:31:45 »
si certo l'ho incluso...
e se al posto della variabile metto un numero intero funziona pure... ma con la variabile nisba.

mau_develop

  • Visitatore
Re:JQuery in componente
« Risposta #19 il: 09 Dic 2010, 17:51:07 »
max = "<?php echo $rd_truncate; ?>";   prova senza ""

max = <?php echo $rd_truncate; ?>;

M.

 



Web Design Bolzano Kreatif