Dopo un po' ho iniziato a capire le prime cose di come si crea un componente... così sto facendo un componente che è un ibrido tra il tutorial "hello world" e "my_form". In pratica sto cercando di creare un form che mi inserisca dei dati in una tabella e ovviamente mi fermi nel caso abbia già inserito lo stesso dato.
L'errore che mi viene fuori nel momento che invio il "form" è:
Fatal error: Call to a member function store() on a non-object in /****/joomla/components/com_hello/controller.php on line 34
Questo è il controller.php
<?php
/**
* Hello World default controller
*
* @package Joomla.Tutorials
* @subpackage Components
* @link http://dev.joomla.org/component/option,com_jd-wiki/Itemid,31/id,tutorials:components/
* @license GNU/GPL
*/
jimport('joomla.application.component.controller');
/**
* Hello World Component Controller
*
* @package HelloWorld
*/
class HelloController extends JController
{
/**
* Method to display the view
*
* @access public
*/
function display()
{
parent::display();
}
function submit() {
$data = JRequest::getVar('myform', array(), 'post', 'array');
$model =& $this->getModel('myform');
if ($model->store($data)) {
$this->setRedirect(JRoute::_('index.php?option=com_hello', false), JText::_( 'Modulo Inviato con Successo' ));
} else {
$view =& $this->getView('myform', 'html');
$view->setModel($model);
$view->assignRef('data', $data);
$view->display();
}
}
}
?>
Questo è la classe di implementazione JTable
class TableHello extends JTable
{
/**
* Primary Key
*
* @var int
*/
var $id = null;
/**
* @var string
*/
var $greeting = null;
/**
* Constructor
*
* @param object Database connector object
*/
/*function TableHello(& $db) {
parent::__construct('#__hello', 'id', $db);
}
*/
var $cln = null;
var $msg = null;
var $data = null;
function __construct(& $db) {
parent::__construct('#__trn1', 'id', $db);
}
function check() {
if (trim($this->cln) == '') {
$this->setError (JText::_('Inserire il Clan.'));
return false;
}
if (trim($this->msg) == '') {
$this->setError(JText::_('Inserire un messaggio.'));
return false;
}
return true;
}
}
E questa è la classe dove c'è la funzione store()
class HelloModelHello extends JModel
{
/**
* Gets the greeting
* @return string The greeting to be displayed to the user
*/
function getGreeting()
{
$db =& JFactory::getDBO();
$query = 'SELECT * FROM #__users';
$db->setQuery( $query );
$greeting = $db->loadAssocList();
return $greeting;
}
var $form = array(
'name' => 'myform',
'id' => 'myform',
'fields' => array (
array('label'=>'Clan', 'name'=>'myform[cln]','id'=>'cln'),
array('label'=>'Note', 'name'=>'myform[msg]', 'id'=>'msg', 'rows'=>10, 'cols'=>40, 'type'=>'textarea'),
array('name'=>'Invia', 'type'=>'submit'),
array('name'=>'myform[id]', 'id'=>'id', 'value'=>'', 'type'=>'hidden'),
array('name'=>'option', 'value'=>'com_hello', 'type'=>'hidden'),
array('name'=>'task', 'value'=>'submit', 'type'=>'hidden')
)
);
function getForm() {
global $Itemid;
$this->form['fields'][] = array('name'=>'Itemid', 'value'=>$Itemid, 'type'=>'hidden');
return $this->form;
}
function store($data) {
$row =& $this->getTable();
if (!$row->bind($data)) {
JError::raiseWarning(500, $row->getError());
return false;
}
if (!$row->check()) {
JError::raiseWarning(500, $row->getError());
return false;
}
$row->data = date('Y-m-d H:i:s');
if (!$row->store()) {
JError::raiseWarning(500, $row->getError());
return false;
}
return true;
}
}
Fatemi capire perchè non prende sto benedetto oggetto (che mi pare aver capito che sia l'array con i dati da inserire)