Back to top

Autore Topic: Creare view component  (Letto 13301 volte)

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Creare view component
« il: 24 Set 2013, 19:29:50 »
Salve, stavo cercando di far leggere un mio codice php a joomla "convertendolo" in componente.
Ho seguito la guida HelloWorld e sono riuscito a fare leggere la pagina principale. Adesso vorrei far trovare anche le altre pagine , ma non riesco a capire come fare.
in pratica la struttura che ho è questa:

com_coupons
- index.html
- controller.php
- coupons.php
- views/coupons/index.html
- views/coupons/view.html.php
- views/coupons/tmpl/default.php

( tralascio lo script perchè è identico a quello di Helloworld ).

in pratica vorrei aggiungere una sezione tipo

- views/dettaglio/index.html
- views/dettaglio/view.html.php
- views/dettaglio/tmpl/default.php

- views/stampa/index.html
- views/stampa/view.html.php
- views/stampa/tmpl/default.php

ma non so come settare il controller.php o eventuali altre pagine, perchè al momento se provo ad andare sul link index.php?option=com_coupons&view=dettaglio?coupon_id=61 ( per esempio ) mi viene restituito "500 - View non trovato [name, type, prefix]: dettagliocoupon_id61, html, couponsView"

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #1 il: 24 Set 2013, 22:31:25 »
ci sto provando anche stasera, ma non capisco cosa devo fare  :'(

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #2 il: 25 Set 2013, 08:31:09 »
...posso definire il redirect della vista "dettaglio" dentro al controller principale che sta fuori la cartella views? perchè per ora mi redirecta correttamente alla vista di default, che è quella coupons:

codice controller.php
Codice: [Seleziona]
<?php

defined
('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class 
CouponsController extends JController
{


codice coupons.php
Codice: [Seleziona]
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import joomla controller library
jimport('joomla.application.component.controller');
 
// Get an instance of the controller prefixed by HelloWorld
$controller JController::getInstance('coupons');
 
// Perform the Request task
$input JFactory::getApplication()->input;
$controller->execute($input->getCmd('task'));
 
// Redirect if set by the controller
$controller->redirect();



codice views/coupons/view.html.php
Codice: [Seleziona]
<?php

defined
('_JEXEC') or die('Restricted access');
 
jimport('joomla.application.component.view');


class 
CouponsViewCoupons extends JView
{
       
        function 
display($tpl null
        {
                
$this->msg 'coupons';
                
parent::display($tpl);
        } 
        

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #3 il: 27 Set 2013, 08:12:15 »
nessun aiuto?  :-[

Offline j3n4

  • Esploratore
  • **
  • Post: 77
  • Sesso: Maschio
  • We are Borg
    • Mostra profilo
Re:Creare view component
« Risposta #4 il: 27 Set 2013, 10:48:09 »
Ciao,
scusami se non entro in dettaglio ma sto incasinatissimo, comunque si. Si fa dal controller.
In base alle richieste che riceve ti gira verso la view appropriata.

Tieni d'occhio il nome delle classi che crei, se sono sbagliati non funziona e impazzisci per capire il motivo.

Ciao
We are BORG

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #5 il: 27 Set 2013, 14:01:58 »
grazie mille per la risposta !! adesso ho inquadrato il raggio d'azione ! :D quindi in pratica per indirizzare correttamente alla cartella views/dettaglio devo aggiungere in controller.php oltre alla classe CouponsController, una nuova classe? Ed all'interno come me la gioco? :D

esempio:
Codice: [Seleziona]
<?php

defined
('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class 
CouponsController extends JController
{

}

class 
CouponsDettaglioController extends JController
{

}






Offline j3n4

  • Esploratore
  • **
  • Post: 77
  • Sesso: Maschio
  • We are Borg
    • Mostra profilo
Re:Creare view component
« Risposta #6 il: 27 Set 2013, 19:01:26 »
Non sviluppo componenti tutti i giorni, dovrei riaprire il codice di qualche componente che ho già smanettato per ricordarmi bene, ma credo di ricordare che non serve fare un controller per ogni classe ( a meno che non ti serva proprio). Puoi dirottare le richeste alle varie view usando questo codice nel controller:

Codice: [Seleziona]
$controller->execute( JRequest::getCmd('task') );
// Redirect if set by the controller
$controller->redirect();
We are BORG

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #7 il: 27 Set 2013, 19:12:11 »
ok, capito ! quindi lo tolgo da coupons.php e lo metto in controller.php? perchè il codice che hai descritto è già presente in questo file:

situazione attuale

- controller.php
Codice: [Seleziona]
<?php

defined
('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class 
CouponsController extends JController
{




- coupons.php
Codice: [Seleziona]
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import joomla controller library
jimport('joomla.application.component.controller');
 
// Get an instance of the controller prefixed by HelloWorld
$controller JController::getInstance('coupons');
 
// Perform the Request task
$input JFactory::getApplication()->input;
$controller->execute($input->getCmd('task'));
 
// Redirect if set by the controller
$controller->redirect();

Offline j3n4

  • Esploratore
  • **
  • Post: 77
  • Sesso: Maschio
  • We are Borg
    • Mostra profilo
Re:Creare view component
« Risposta #8 il: 27 Set 2013, 23:21:08 »
Nel Controller:

Codice: [Seleziona]
function display()
    {       
    // set default view if not set
        $input = JFactory::getApplication()->input;
        $input->set('view', $input->getCmd('view', 'coupons'));
        // call parent behavior
        parent::display($cachable);
    }

Dentro coupons.php:
Codice: [Seleziona]
// import joomla controller library
jimport('joomla.application.component.controller');
$controller = JController::getInstance('coupons');
// Get the task
$jinput = JFactory::getApplication()->input;
$task = $jinput->get('task', "", 'STR' );
// Perform the Request task
$controller->execute($task);
// Redirect if set by the controller
$controller->redirect();

Credo che così ti dovrebbe funzionare.
Se intanto ti funziona poi vediamo come scriverlo un pochino meglio.

Ciao
We are BORG

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #9 il: 28 Set 2013, 13:05:17 »
grazie !!!! ho appena fatto una prova : ma nada :(
all indirizzo index.php?option=com_coupons&view=dettaglio?coupon_id=63 mi restituisce 500 - View non trovato [name, type, prefix]: dettagliocoupon_id63, html, couponsView

adesso ho:

controller.php
Codice: [Seleziona]
<?php

defined
('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class 
CouponsController extends JController
{
    


function 
display()
    {       
    
// set default view if not set
        
$input JFactory::getApplication()->input;
        
$input->set('view'$input->getCmd('view''coupons'));
        
// call parent behavior
        
parent::display($cachable);
    }

coupons.php
Codice: [Seleziona]
<?php
/// import joomla controller library
jimport('joomla.application.component.controller');
$controller JController::getInstance('coupons');
// Get the task
$jinput JFactory::getApplication()->input;
$task $jinput->get('task'""'STR' );
// Perform the Request task
$controller->execute($task);
// Redirect if set by the controller
$controller->redirect();

views/dettaglio/view.html.php
Codice: [Seleziona]
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla view library
jimport('joomla.application.component.view');
 
/**
 * HTML View class for the HelloWorld Component
 */

class CouponsViewDettaglio extends JView
{
        
// Overwriting JView display method
        
function display($tpl null
        {
                
$this->msg 'dettaglio';
                
parent::display($tpl);
        } 
        
}


Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Creare view component
« Risposta #10 il: 28 Set 2013, 13:34:58 »
Nel controller devi aggiungere una seconda funzione per una seconda vista
Codice: [Seleziona]

function view2() {
 $model = $this->getModel('view2');
 $view =&
$this->getView('view2', 'html');
codice

  $data=$model->getView2();
  $view->assignRef('data',
$data);
  $view->setModel($model);
  $view->display('view2');
}
Poi nel model richiami la seconda vista con
Codice: [Seleziona]

function getView2(){

codice

}
non so se ho mancato qualcosa

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #11 il: 28 Set 2013, 14:56:20 »
niente...mi sa che non ci stia capendo più nulla, non ho mai lavorato con i componenti joomla :(

adesso ho

controller.php
Codice: [Seleziona]
<?php

defined
('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class 
CouponsController extends JController
{
    
    function 
display()
    {       
    
// set default view if not set
        
$input JFactory::getApplication()->input;
        
$input->set('view'$input->getCmd('view''coupons'));
        
// call parent behavior
        
parent::display($cachable);
    }
    
    
    function 
view2() { 
 
$model $this->getModel('view2');
 
$view =& 
$this->getView('view2''html');

  
$data=$model->getView2();
  
$view->assignRef('data'$data);
  
$view->setModel($model);
  
$view->display('view2');

coupons.php
Codice: [Seleziona]
<?php
/// import joomla controller library
jimport('joomla.application.component.controller');
$controller JController::getInstance('coupons');
// Get the task
$jinput JFactory::getApplication()->input;
$task $jinput->get('task'""'STR' );
// Perform the Request task
$controller->execute($task);
// Redirect if set by the controller
$controller->redirect();

views/dettaglio/view.html.php
Codice: [Seleziona]
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla view library
jimport('joomla.application.component.view');
 
/**
 * HTML View class for the HelloWorld Component
 */

class CouponsViewDettaglio extends JView
{
        
// Overwriting JView display method
        
function view2($tpl null
        {
                
$this->msg 'dettaglio';
                
parent::display($tpl);
        } 
        
        
        
}

   
}



Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Creare view component
« Risposta #12 il: 28 Set 2013, 16:35:35 »
Il mio era un esempio, non devi mettere view2 ma il nome che hai dato alla tua view, il naming è importante e se non lo rispetti non funge e poi al posto di dove ho scritto codice devi mettere il tuo codice della funzione.

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #13 il: 28 Set 2013, 18:09:58 »
ho provato a cambiare come dici tu...niente :( per caso hai uno zip con tutti i files di esempio? :)

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Creare view component
« Risposta #14 il: 28 Set 2013, 19:04:34 »
Quel codice l'ho predo da un mio componente, puoi fare lo stesso sbirciando il codice di qualsiasi componente che abbia più di due view. Devi conentrarti sulla struttura e non sul codice che esegue la funzione, quello se sbagliato ti rende un errore.

Offline j3n4

  • Esploratore
  • **
  • Post: 77
  • Sesso: Maschio
  • We are Borg
    • Mostra profilo
Re:Creare view component
« Risposta #15 il: 28 Set 2013, 20:01:09 »
A me pare ovvio che non ti funziona.
Se seguivi una guida facevamo prima.
Comunque... supponiamo che per il momento stiamo sviluppando una parte del backend, tu avrai:
Una cartella che si chiama: com_coupon
Dentro sta cartella c'è una cartella che si chiama: admin
dentro admin c'è: controller.php e coupon.php con il codice che ti ho dato io prima.
ORA, sempre dentro la cartella admin hai anche una cartella che si chiama: views
Dentro questa cartella DEVE esserci per forza di cose una cartella che si chiama: coupons
Se non c'è o chiami una view con il nome sbagliato o diverso ovviamente ti darà errore 500 e così via.
Dentro la cartella coupons ci sono i seguenti files: index.html (vuoto), view.html.php e una directory che si chiama tmpl.
Il file view.html.php contiene questo codice:
Codice: [Seleziona]
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
 
// import Joomla view library
jimport('joomla.application.component.view');

class 
couponsViewCoupons extends JView
{
function 
display($tpl null
        {
//Qui il codice chiama il template
parent::display($tpl);        
        }
}
 
Poi, dentro tmpl, c'è un altro index.html (vuoto) e default.php e ci metti il codice che ti pare.
E così ti funziona per forza.
Poi se necessiti di avere più view, fai come ti ha consigliato il buon tomtomeight, ma ricordati che ogni view è dentro una sua cartella.
Avevo dimenticato di dire che oltre tutto questo, sempre nella cartella admin c'è anche una cartella che si chiama: models
Dentro models c'è un file che si chiama: coupons.php (questo ti serve per fare le connessioni al DB e le varie query).
Giusto a titolo di esempio ti appiccico il codice che uso io:
Codice: [Seleziona]
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import the Joomla modellist library
jimport('joomla.application.component.modellist');

class 
CouponsModelCoupons extends JModelList
{

protected function 
getListQuery()
        {
}
}

Non dimenticare mai di inserire gli index.html vuoti in tutte le cartelle.
« Ultima modifica: 28 Set 2013, 20:06:23 da j3n4 »
We are BORG

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #16 il: 28 Set 2013, 22:21:28 »
grazie per le risposte !!! devo fare una precisazione però: la "prima" vista funziona, è la seconda che non riesco a farla vedere. E comunque prima di chiedere aiuto ho seguito questa guida http://docs.joomla.org/J2.5:Developing_a_MVC_Component/Adding_a_view_to_the_site_part con cui appunto ero riuscito a fare funzionare la vista di default, ma a me serviva farne funzionare una aggiuntiva, cosa che ancora non sono riuscito a fare  :-[

Offline j3n4

  • Esploratore
  • **
  • Post: 77
  • Sesso: Maschio
  • We are Borg
    • Mostra profilo
Re:Creare view component
« Risposta #17 il: 29 Set 2013, 11:15:53 »
Premetto che non eccello in raffinatezza... ciò è dovuto al fatto che seguo molti progetti e zero aiuti.
Quindi sono più orientato a fare le cose in modo che funzionino piuttosto che renderle belle  e perfette. Adesso ti do un altra parte di codice molto ruspante ma che funziona al 100%.
Ma quando chiedi qualcosa o manifesti un problema cerca di essere più specifico possibile altrimenti non capisco bene dove ti intoppi e stiamo a parlare giorni senza concludere.

Probabilmente tu stai scrivendo il componente non dalla parte admin ma dalla parte site, quindi dentro la cartella del tuo componente adesso avrai due cartelle: admin e site.
Dentro site abbiamo i soliti files php: index.html (vuoto), controller.php e coupons.php.
Il codice che di solito uso dentro il controller è questo:
Codice: [Seleziona]
<?php
defined
'_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');


class 
CouponsController extends JController{
function 
display()
    {       
    
$viewName JRequest::getCmd'view'$this->getName() );
        
parent::display();
    }


Nel copons.php scrivi:
Codice: [Seleziona]
<?php
defined
('_JEXEC') or die('Restricted access');
// import joomla controller library
jimport('joomla.application.component.controller');
$controller JController::getInstance('Coupons');
$controller->execute(JRequest::getCmd('task'));
$controller->redirect();

Adesso supponiamo tu abbia due cartelle dentro view: coupons e search
Una è quella di default per il tuo componente e l'altra una ricerca (poi adatti il codice anche ad altre, questo è solo un esempio).

dentro coupons, c'è il solito file view.htm.php e tutto il resto che ti ho già detto nell'altro post, nel codice scrivi:
Codice: [Seleziona]
<?php
defined
'_JEXEC' ) or die( 'Restricted access' );
jimport'joomla.application.component.view');
class 
CouponsViewCoupons extends JView
{
     function 
display($tpl null
        {
//Se hai una directory models e fai eseguire una query al db la metti qui così
$model =& $this->getModel();
//Altrimenti lasci solo la chiamata al template
            
parent::display($tpl);
        }
}

E questo funziona come già ti stava funzionando l'altro, ora passiamo a una seconda view search.php (che ti interessa di più):
Codice: [Seleziona]
<?php
defined
'_JEXEC' ) or die( 'Restricted access' );
jimport'joomla.application.component.view');

class 
CouponsViewSearch extends JView
{
     function 
display($tpl null
        {
            
$model =& $this->getModel();
            
parent::display($tpl);
        }
}
Come vedi è sempre la solita pappa, cambiano solo i nomi.
Prova così, vedrai che funziona al 100%.

Inoltre, per concludere gli esempi, se ti necessita creare una voce di menù che punta direttamente alla view search, devi inserire un file dentro tmpl che si chiama: default.xml
Il codice che uso io è questo:
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<metadata>
    <layout title="COM_COUPONS_COUPONS_VIEW_DEFAULT_SEARCH">
        <message>COM_COUPONS_COUPONS_VIEW_DEFAULT_SEARCH_DESC</message>
    </layout>
</metadata>
Le scritte in maiuscolo verranno tradotte dal file della lingua, ma questa è un altra puntata.

Il componente va compresso, deinstallato e reinstallato, se hai un editor "fico"  (tipo netbeans), dopo che hai installato il componente e ti sta funzionando puoi dargli i settaggi FTP ed editare le tue modifiche direttamente sul sito in produzione. Fai molto prima e secondo me è una gran figata.
Mi dico sempre che dovrei scrivere una guida su come fare, ma il mio dannatissimo tempo scorre più in fretta del vostro :D

Ciao
We are BORG

Offline elnigno82

  • Nuovo arrivato
  • *
  • Post: 35
    • Mostra profilo
Re:Creare view component
« Risposta #18 il: 30 Set 2013, 10:15:39 »
grazie mille a tutti per i consigli, siete stati gentilissimi e pazienti !!! finalmente adesso habemus dettaglio view !!! non ho seguito la procedura precisa ( vedi compattazione component in zip e caricamento ) poiche il lato admin o l inizializzazione del database al momento non mi serve, pero adesso la vista si vede !!  :D uniche due domandine:
1 al caricamento della vista mi appare per tre volte la scritta "Errore nel caricamento del componente: com_coupons, 1"...quali possono essere le cause?
2 come si puo fare ricoscere una variabile passata tramite url? ( esempio index.php?option=com_coupons&view=dettaglio?coupon_id=100 )

grazie  :P

Offline j3n4

  • Esploratore
  • **
  • Post: 77
  • Sesso: Maschio
  • We are Borg
    • Mostra profilo
Re:Creare view component
« Risposta #19 il: 30 Set 2013, 11:50:48 »
Lo zip va installato perchè ti registra il componente, probabilmente l'errore che ti compare è dovuto a quello.
Ora che sei finalmente partito e ti funziona per quanto riguarda il passaggio delle variabili e tutto il resto, ti consiglio di leggere la documentazione di joomla è tutto scritto lì.

In bocca al lupo
Saluti
We are BORG

 



Web Design Bolzano Kreatif