Buongiorno a tutti,
sto sviluppando una componente cercando di mettere in atto l'MVC.
Il mio problema è il seguente sostanzialmente:
non riesco a capire chi chiama chi. Mi spiego meglio: da quanto ho capito è il controller che fa in modo di coordinare model e view.
La mia componente è semplicemente un manager di una serie di dati, quindi deve essere in grado di aggiungere dati al database e di recuperarli per visualizzarli. Per cui, in sostanza, mi ritrovo a dover affrontare due casi:
1. Caso in cui voglio semplicemente visualizzare i dati (quindi quello che farò sarà fare una chiamata al DB per recuperare i dati e poi li visualizzerò tramite la view)
2. Caso in cui voglio aggiungere un dato al database e poi visualizzare tutti i dati nel DB, incluso l'ultimo appena inserito (quindi quello che farò sarà aggiungere il dato al DB e poi recuperare tutti i dati e visualizzarli tramite la view)
Dunque quello di cui ho bisogno io sono due model diversi (quello che aggiunge i dati e quello che li recupera) e la medesima view (quella che uso sia se devo semplicemente visualizzare i dati e quella che uso per visualizzare i dati però arrivando da un model che mi ha appena aggiunto un dato); quindi avrò una view e due model.
Dunque il io codice è il seguente:
controller.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
/**
* Hello World Component Controller
*
* @since 0.0.1
*/
class SensorsManagerController extends JControllerLegacy{
/* Default view */
public function display($cachable = false, $urlparams = Array()){
/*$view = $this->getView('SensorsManager', 'html' );
$model = $this->getModel('SensorsManager');
$view->setModel($model, true );
$view->display();*/
parent::display();
}
public function addedsensor(){
$view = $this->getView('sensorsmanager', 'html' );
$model = $this->getModel('addedsensor');
$view->setModel($model, true );
$view->display();
}
}
models/sensorsmanager.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_sensorsmanager
*
* @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
/**
* Sensors Manager Model
*
* @since 0.0.1
*/
class SensorsManagerModelSensorsManager extends JModelItem{
function retrieveSensorsFromDb(){
$db = JFactory::getDbo();
$query = $db->getQuery(true);
/* Retrieving all sensors in DB */
$query->select(array('fos_sensor.id', 'nodeId', 'fos_sensor.code', 'fos_quantity.name', 'fos_unit_of_measure.name', 'fos_sensor.installationdate', 'fos_sensor.latest_lecture'))
->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();
}
public function getSensors(/*$id = 1*/){
$result = $this->retrieveSensorsFromDb();
return $result;
}
}
models/addedsensor.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_sensorsmanager
*
* @copyright Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
/**
* AddedSensor Model
*
* @since 0.0.1
*/
class SensorsManagerModelAddedSensor extends JModelItem{
function retrieveQuantityIdFromDb($selectedquantity){
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select($db->quoteName('id'));
$query->from($db->quoteName('fos_quantity'));
$query->where($db->quoteName('name') . ' LIKE '. $db->quote($selectedquantity));
$db->setQuery($query);
return $db->loadResult();
}
function addSensorIntoDb($selectedidnode, $selectedcode, $convertedquantityid, $selecteddate){
/* Creating object to insert into Db */
$sensor = new stdClass();
$sensor->code = $selectedcode;
$sensor->nodeId = $selectedidnode;
$sensor->quantityId = $convertedquantityid;
$sensor->installationdate = $selecteddate;
JFactory::getDbo()->insertObject('fos_sensor', $sensor);
}
function retrieveSensorsFromDb(){
$db = JFactory::getDbo();
$query = $db->getQuery(true);
/* Retrieving all sensors in DB */
$query->select(array('fos_sensor.id', 'nodeId', 'code', 'fos_quantity.name', 'fos_unit_of_measure.name', 'fos_sensor.installationdate'))
->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();
}
/* getAddedSensor performs 3 queries:
1. Retrieves quantityId from Db
2. Inserts sensor into Db
3. Retrieves all sensors */
public function getAddedSensor(){
/* Retrieving parameters from POST */
$jinput = JFactory::getApplication()->input;
$selectedidnode = $jinput->getInt('selectnode');
$selectedquantity = $jinput->get('selectquantity');
$selectedcode = $jinput->getInt('selectcode');
$selecteddate = $jinput->get('selectdate');
/* Retrieving quantityId from Db */
$quantityId = $this->retrieveQuantityIdFromDb($selectedquantity);
/* Converting quantityId string to int */
$convertedquantityid = (int)$quantityId;
/* Adding sensor into Db */
$this->addSensorIntoDb($selectedidnode, $selectedcode, $convertedquantityid, $selecteddate);
/* Retrieving all sensors from Db */
$result = $this->retrieveSensorsFromDb();
return $result;
}
}
Tutto funziona come deve, nel senso che quando voglio semplicemente visualizzare i dati me li visualizza e quando voglio prima inserire e poi visualizzare prima inserisce e poi visualizza come deve. L'unico problema è che quando prima aggiungo e poi visualizzo mi esce il seguente errore che non capisco a cosa sia dovuto:
Notice: Undefined index: sensorsmanager in C:\Users\Giulia\Desktop\xampp\htdocs\fostirocinio\libraries\legacy\view\legacy.php on line 429
Qualcuno ha idea di come risolvere?
Secondo voi ha senso settare model e view nel controller come ho fatto io?
Grazie a tutti per l'ascolto
Giulia