Back to top

Autore Topic: Sviluppo componente from scratch  (Letto 2732 volte)

Offline memma1989

  • Nuovo arrivato
  • *
  • Post: 15
    • Mostra profilo
Sviluppo componente from scratch
« il: 12 Mag 2016, 15:53:36 »
Buongiorno a tutti appassionati di Joomla,


avrei da sottoporvi un quesito piuttosto delicato e complesso; spero di riuscire a spiegarmi al meglio! XD


Sto sviluppando una componente da zero che mi prelevi dei dati dal db e me li spari in output in una tabella; questo è quello che fa, molto ad alto livello.


Il mio problema è capire fino in fondo come muoversi e districarsi tra le mille difficoltà del MVC.


La mia componente la chiameremo sensorsmanager.
Il punto d'entrata della mia componente è, come sempre, il file sensorsmanager.php contenuto nella cartella com_sensorsmanager e così fatto:


Codice: [Seleziona]
// com_sensorsmanager/sensorsmanager.php<?php

// No direct access to this file
defined('_JEXEC') or die('Restricted access');

// Get an instance of the controller prefixed by SensorsManager
$controller JControllerLegacy::getInstance('SensorsManager');
 
// Perform the Request task
$input JFactory::getApplication()->input;
$controller->execute($input->getCmd('task'));
 
// Redirect if set by the controller
$controller->redirect();


In questo file viene creato e quindi chiamato il controller controller.php presente nella cartella com_sensorsmanager


Codice: [Seleziona]
// com_sensorsmanager/controller.php
<?php

// No direct access to this file
defined('_JEXEC') or die('Restricted access');
/**
 * Hello World Component Controller
 *
 * @since  0.0.1
 */
class SensorsManagerController extends JControllerLegacy{

}



A questo punto io non ho capito tecnicamente in che modo e con quali passaggi il controller interagisce con il model e la view al fine di visualizzare questa tabella con dentro questi dati.


Il mio model, contenuto nella cartella com_sensorsmanager/model è questo:
Codice: [Seleziona]


// com_sensorsmanager/model/sensorsmanager.php
<?php 
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
/**
 * Sensors Manager Model
 *
 * @since  0.0.1
 */
class SensorsManagerModelSensorsManager extends JModelItem{
   protected 
$messages;

   function 
getSensors(){
      
$db JFactory::getDbo();
      
$query $db->getQuery(true);

        
/* Query */
      
$query->select(array('fos_sensor.id''nodeId''fos_quantity.name''fos_unit_of_measure.name''fos_node.battery'))
      ->
from($db->quoteName('fos_sensor'))
      ->
join('INNER'$db->quoteName('fos_quantity') . ' ON (' $db->quoteName('fos_sensor.quantityId') . ' = ' $db->quoteName('fos_quantity.id') . ')')
      ->
join('INNER'$db->quoteName('fos_node') . ' ON (' $db->quoteName('fos_sensor.nodeId') . ' = ' $db->quoteName('fos_node.id') . ')')
      ->
join('INNER'$db->quoteName('fos_unit_of_measure') . ' ON (' $db->quoteName('fos_quantity.unitOfMeasureId') . ' = ' $db->quoteName('fos_unit_of_measure.id') . ')')
      ->
order($db->quoteName('fos_sensor.id') . ' ASC');
   
      
/* Reset the query using our newly populated query object */
      
$db->setQuery($query);
   
      
/* Load the results as a list of stdClass objects (see later for more options on retrieving data) */
      
return  $db->loadRowList();
   }

    function 
deleteSensor(){
        
$id intval($_GET['id']);

        
$db JFactory::getDbo();
        
$query $db->getQuery(true);

        
// Deleting row from the DB
        
$conditions = array($db->quoteName('id') . ' = ' $db->quote(intval($id)));
        
$query->delete($db->quoteName('fos_sensor'));
        
$query->where($conditions);

        
$db->setQuery($query);
        
$result $db->execute();
    }

   public function 
getSrs(/*$id = 1*/){
      if (!
is_array($this->messages)){
         
$this->messages = array();
      }

        return 
$this->getSensors();
    }
}


Il file view.html.php contenuto nella cartella com_sensorsmananger/views è il seguente:
Codice: [Seleziona]
// com_sensorsmanager/views/view.html.php
<?php 
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
/**
 * HTML View class for the HelloWorld Component
 *
 * @since  0.0.1
 */
class SensorsManagerViewSensorsManager extends JViewLegacy
{
   
/**
    * Display the Hello World view
    *
    * @param   string  $tpl  The name of the template file to parse; automatically searches through the template paths.
    *
    * @return  void
    */
   
function display($tpl null)
   {

      
// Assign data to the view
      
$this->msg $this->get('Srs');
 
      
// Check for errors.
      
if (count($errors $this->get('Errors')))
      {
         
JLog::add(implode('<br />'$errors), JLog::WARNING'jerror');
 
         return 
false;
      }
 
      
// Display the view
      
parent::display($tpl);
   }
}


Il file default.php contenuto nella cartella com_sensors/views/sensorsmanager/tmpl è questo:
Codice: [Seleziona]
// com_sensorsmanager/views/sensorsmanager/tmpl/default.php
<?php 
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>

<div id="actions">
    <div id='btn_group_container'>
        <div class="btn-group" role="group" aria-label="...">
            <button type="button" class="btn btn-default" data-toggle='tooltip' data-placement='bottom' title='Aggiungi nodo'>
                <span class="glyphicon glyphicon-globe" aria-hidden="true"></span>
            </button>
            <button type="button" id="add-sensor-button" class="btn btn-default" data-toggle='tooltip' data-placement='bottom' title='Aggiungi sensore'>
                <span class="glyphicon glyphicon-scale" aria-hidden="true"></span>
            </button>
            <button type='button' class='btn btn-default' id = "delete-node-button" data-toggle='tooltip' data-placement='bottom' title='Cancella nodo'>
                <span class='glyphicon glyphicon-minus' aria-hidden='true'></span>
            </button>
        </div>
    </div>
</div>
<div class="table-responsive">
    <table class="table" id="sensors-table">
        <tr>
            <th>Id sensore</th>
            <th>Id nodo</th>
            <th>Grandezza misurata</th>
            <th>Unità di misura</th>
            <th>Batteria</th>
            <th>Azioni</th>
        </tr>
        <?php
            $sensors 
$this->msg;

            foreach(
$sensors as $sensor){
                echo 
"<tr>
                    <td class=\"td-table\">"
.$sensor['0']."</td>
                    <td>"
.$sensor['1']."</td>
                    <td>"
.$sensor['2']."</td>
                    <td>"
.$sensor['3']."</td>
                    <td>"
.$sensor['4']."</td>
                    <td>
                        <div class=\"btn-group\" role=\"group\" aria-label=\"...\">
                            <button type=\"button\" class=\"btn btn-default delete-btn\" data-toggle=\"tooltip\" data-placement=\"bottom\" title=\"Cancella sensore\">
                                <span class=\"glyphicon glyphicon-remove\" aria-hidden=\"true\"></span>
                            </button>
                        <>
                    </td>
                </tr>"
;
            }
        
?>

    </table>
</div>


La primissima cosa è capire come interagiscono tra di loro tutti questi piccoli pezzettini.
Inoltre vorrei chiarirmi come fare se una volta volessi chiamarmi un model diverso per esempio per eliminare dei dati dal database anzichè prelevarli. 


Ringrazio di cuore anticipatamente tutti quelli disponibili a capire il mio problema e a guidarmi in questo labirinto.


Buon pomeriggio


Giulia

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Sviluppo componente from scratch
« Risposta #1 il: 12 Mag 2016, 21:48:11 »
è un po' complicato spiegarlo semplicemente diciamo che di default viene cercato quel model, in realtà nel controller puoi usare il model che vuoi.
Nel tuo caso non ti serve creare un nuovo model basta un metodo nel model esistente

Ma conosci la programmazione ad oggetti in php?
Prova anche a guardare cosa fa il CRUD di Joomla
mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline memma1989

  • Nuovo arrivato
  • *
  • Post: 15
    • Mostra profilo
Re:Sviluppo componente from scratch
« Risposta #2 il: 12 Mag 2016, 21:54:07 »
Non ho mai prpgrammato ad oggetti con php ma a prescindere sì ,conosco la programmazione ad oggetti.

Il mio problema è che come dici tu vengono chiamate cose di default ed è proprio per questo motivo che non capisco bene il giro che viene fatto  ;D

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Sviluppo componente from scratch
« Risposta #3 il: 13 Mag 2016, 13:00:10 »
se noti, le tue classi, sono tutte estensioni di altre classi probabilmente usando un ide di sviluppo tipo netbeans riesci a tenere meglio sott'occhio ciò che succede e dove succede.

se guardi ad esempio come funziona un componente per la vecchia piattaforma che trovi sulla 1.5 fai meno confusione poichè non era stato ancora sviluppato il proxi al model e quindi dovevi istanziarlo nel controller.

comunque la base è qs http://www.joomla.it/articoli-della-community/4190-il-modello-mvc-in-joomla.html
mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline memma1989

  • Nuovo arrivato
  • *
  • Post: 15
    • Mostra profilo
Re:Sviluppo componente from scratch
« Risposta #4 il: 13 Mag 2016, 13:37:25 »
Ti ringrazio molto, queste due o tre cose che mi hai detto sono state illuminanti  ;D

 



Web Design Bolzano Kreatif