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:
// 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
// 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:
// 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:
// 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:
// 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