Back to top

Autore Topic: [Risolto] Installer script  (Letto 8864 volte)

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
[Risolto] Installer script
« il: 12 Set 2016, 18:08:24 »
Buonasera

Ho questa parte di codice in un file manifest per aggiungere delle cartelle ad un componente:

Codice: [Seleziona]
<fileset>

<files folder="apps-rubrica" target="components/com_datagrill/apps">

<folder>99_Rubrica</folder>

</files>

</fileset>
Che funziona bene aggiungendo la cartella dove mi serve, devo aggiungere però anche alcuni record ad una tabella oltre che creare altre tabelle nello stesso db, così ho preparato un file installer.script.php e modificato la parte di codice sopre che diventa:

Codice: [Seleziona]
<fileset>
<scriptfile>installer.script.php</scriptfile>
<files folder="apps-rubrica" target="components/com_datagrill/apps">
<file>installer.script.php</files>
<folder>99_Rubrica</folder>

</files>

</fileset>

Che però non funziona riportandomi i seguenti errori
Attenzione:
JInstaller: :Install: Non è stato possibile trovare il file di setup XML di Joomla

Errore:
Impossibile trovare pacchetto di installazione

Dove sbaglio?

Grazie della vostra attenzione.

« Ultima modifica: 18 Set 2016, 20:04:19 da tomtomeight »

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Installer script
« Risposta #1 il: 12 Set 2016, 18:35:08 »
<file>installer.script.php</files>

apri un file che chiudi con un files?
mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #2 il: 12 Set 2016, 19:09:40 »
Grazie

Una svista, ho corretto ma adesso mi dice che il file non esiste

JInstaller: :Install: il file non esiste ........./tmp/install_57d6e060c0d8c/apps-rubrica/installer.script.php

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #3 il: 12 Set 2016, 19:22:22 »
Ok era sbagliato il posto ove avevo messo il file, adesso caricando il pkg non mi da nessun errore però non mi esegue il file e non carica tutte le cartelle contenute in 99_Rubrica, All'interno di questa ho quattro cartelle ed un file ma mi ritrovo solo due cartelle ed un file mentre prima (senza aggiunta del file installer) mi caricava tutto.

Offline alexred

  • Fuori controllo
  • *
  • Post: 25672
  • Sesso: Maschio
  • Esperto in ozio relaxed
    • Mostra profilo
Re:Installer script
« Risposta #4 il: 12 Set 2016, 19:25:52 »
Credo che quello che vuoi fare con il tuo installer.script.php sia questo:
<scriptfile>installer.script.php</scriptfile>

e non caricarlo solamente come semplice file, ma eseguirlo all'installazione.

Ma è meglio se di volta in volta alleghi il pacchetto di quello che stai facendo, altrimenti è difficile provare ad aiutarti.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #5 il: 12 Set 2016, 19:39:35 »
Ho infatti messo il file in quei tag ma come faccio a farlo eseguire?
In effetti il file installer.script.php è incompleto ma mi aspettavo o un errore del file o la parziale esecuzione (aggiunta di record ad una tabella).
Allego lo zip del pkg per far capire meglio. ovviamente bisogna caricare prima il componente in beta (ma funzionante) che sta in firma.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #6 il: 12 Set 2016, 19:45:31 »
Aggiungo per chi vuol vedere il tutto funzionante ( componente e applicazione  aggiunta manualmente )

http://www.xataface.it/esempio.html

per modificare invece bisogna loggarsi
http://www.xataface.it/login.html
tester
tester



Offline alexred

  • Fuori controllo
  • *
  • Post: 25672
  • Sesso: Maschio
  • Esperto in ozio relaxed
    • Mostra profilo
Re:Installer script
« Risposta #7 il: 12 Set 2016, 20:36:25 »
lo    installer.script.php  mettilo fuori dal tag fileset,
mettilo appena sotto il tag description

<description>Rubrica Xataface in Joomla</description>
   <scriptfile>installer.script.php</scriptfile>

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #8 il: 12 Set 2016, 20:48:18 »
Grazie Alex ci provo domani per oggi ho chiuso il pc.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #9 il: 13 Set 2016, 19:04:58 »
Buonasera
Nulla anche mettendo come suggerito da Alex non accade nulla, ho pure aggiustato il file installer.script.php che ora è così:

Codice: [Seleziona]
defined ('_JEXEC') or die ('Restricted access');

        $db = JFactory::getDBO();
$query = $db->getQuery(true);
$columns = array('id', 'greeting', 'tables', 'modules', 'languages');
$values = array (99,Rubrica,{"contatti": "Contatti"},{"modules_depselect": "modules/depselect/depselect.php"},{"it": "Italiano"});
$query
->insert($db->quoteName('#__datagrill'))
->columns($db->quoteName($columns))
->values(implode(',', $values));

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

ma non viene eseguito e non aggiorna il db o ritorna qualche errore
Il response però è positivo dopo il caricamento  del pkg.

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Installer script
« Risposta #10 il: 13 Set 2016, 21:34:25 »
perchè il primo array è quotato e il secondo no?

prova con una query banalissima e verifica anche che la tabella non abbia l'autoincrement altrimenti l'id non lo puoi inserire, devi prima modificare lo schema e poi riportarlo all'iniziale una volta inserito il record.

mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #11 il: 13 Set 2016, 21:39:38 »
L'id è autoincrement, come modifico lo schema? Per il secondo array avevo visto su una guida che non veniva quotato e lo avevo modificato togliendo il quote. Ma evidentemente ho sbagliato.

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Installer script
« Risposta #12 il: 14 Set 2016, 13:26:40 »
ma è importante che quell'id sia 99? altrimenti non metterlo e ne assegna lui uno progressivo (che puoi cmq conoscere visto che le query hanno un metodo callback)

E' molto meno problematico usare gli oggetti:

// Create and populate an object.
$profile = new stdClass();
$profile->user_id = 1001;
$profile->profile_key='custom.message';
$profile->profile_value='Inserting a record using insertObject()';
$profile->ordering=1;
// Insert the object into the user profile table.
$result = JFactory::getDbo()->insertObject('#__user_profiles', $profile);

I campi diventano le proprietà dell'oggetto e il valore lo assegni direttamente. le colonne di valori vuoti o 0 vanno comunque inserite dando un valore vuoto o 0

per cambiare l'autoincrement credo basti l'alter table sul campo (poi da riportare allo stato iniziale)
ALTER TABLE tabella CHANGE campo INT(11) NOT NULL
« Ultima modifica: 14 Set 2016, 13:35:39 da MariaElenaBoschi »
mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #13 il: 14 Set 2016, 18:14:50 »
Ciao

Per come è strutturato il componente mi obbliga ad assegnare l'id, spiego meglio.
Il componente datagrill una volta installato non fa nulla, diciamo come chronoforms,  bisogna configurare una nuova applicazione inserendo i dati da  BE. Nome nuova applicazione, dati di connessione del db che può essere anche esterno a joomla, nomi tabelle ed altri valori a completamento, dopodiché il sistema crea le cartelle necessarie a far girare l'applicazione e appunto per il nome lo lega all'id per cui una prima applicazione configurata da BE prende il nome id_nomeapp con conseguente creazione della directory nella directory apps. Ora quello che sto cercando di fare è creare delle applicazioni già pronte e configurate lasciando all'utilizzatore l'inserimento di solo pochissimi dati, quindi devo creare la cartella id_nomeapp oltre a inserire i dati di configurazione nella tabella del db ove vengono memorizzati i dati di configurazione per ogni applicazione. Partendo con id 99 lascio spazio alle eventuali applicazioni presenti e comunque ogni app installata deve avere il nome che inizia con un numero diverso.
Un casino e tanti problemi per cui sto pensando di cambiare approccio, cioè sto pensando di far creare il nome preceduto dall'id direttamente da php nel file installer.script   che prenderebbe il primo id disponibile risolvendo tanti problemi di compatibilità fra le app., in pratica come fa il componente quando si aggiunge un applicazione manualmente. Sto studiando questo nuovo approccio ed un aiuto mi farebbe comodo. Intanto devo riuscire a far eseguire il file installer.script.php al caricamento altrimenti ogni successiva modifica e diverso approccio sarà inutile.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #14 il: 15 Set 2016, 19:58:36 »
Ho cambiato il codice nell'installer.script per tentare un nuovo approccio alla creazione della applicazione pacchettizzata.

Codice: [Seleziona]
defined ('_JEXEC') or die ('Restricted access');

        $db = JFactory::getDBO();
$query = $db->getQuery(true);
$columns = array('greeting', 'tables', 'modules', 'languages');
$values = array('Rubrica','{"contatti": "Contatti"},{"modules_depselect": "modules/depselect/depselect.php"}','{"it": "Italiano"'});
$query
->insert($db->quoteName('#__datagrill'))
->columns($db->quoteName($columns))
->values(implode(',', $values));
       
        $db->setQuery($query);
$db->execute();
        $lastid=LAST_INSERT_ID();
$newappPath=JPATH_COMPONENT_SITE.'/apps/'.urlencode($lastid).'_'.urlencode($greeting);
    if (!file_exists($newappPath))  {
        mkdir($newappPath, 0755, true);
    }
?>

Pur non dandomi nessun errore, dice "file installato correttamente" continua a non popolare il db e non mi crea la cartella ultimoid_Rubrica che dovrebbe essere 2_Rubrica.

Ho solo dubbi circa la classe JPATH_COMPONENT_SITE ma non riesco a capire perché lo script non fa nulla.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #15 il: 17 Set 2016, 16:40:50 »
Rieccomi

Il file installer.script non veniva eseguito per un mio errore nell'indicargli il percorso nel manifest ed anche per degli errori di codice che ho aggiustato
 
Adesso viene eseguita ma mi da un errore alla linea 25.

Codice: [Seleziona]
Parse error: syntax error, unexpected ';', expecting ')'
Codice: [Seleziona]
defined ('_JEXEC') or die ('Restricted access');
class Com_datagrillInstallerScript
{
function preflight($type, $parent)
{
// $parent is the class calling this method
// $type is the type of change (install, update or discover_install)
echo '<p>' . JText::_('COM_datagrill_PREFLIGHT_' . $type . '_TEXT') . '</p>';

        $db = JFactory::getDBO();
$query = $db->getQuery(true);
$columns = array('greeting', 'tables', 'modules', 'languages');
$values = array('Rubrica','&#123;"contatti": "Contatti"&#125;,&#123;"modules_depselect": "modules/depselect/depselect.php"&#125;','&#123;"it": "Italiano"'&#125;);
$query
->insert($db->quoteName('#__datagrill'))
->columns($db->quoteName($columns))
->values(implode(',', $values));    //<----linea 25//
       
        $db->setQuery($query);
$db->execute();
        $lastid=LAST_INSERT_ID();
$newappPath=JPATH_COMPONENT_SITE.'/apps/'.urlencode($lastid).'_'.urlencode($greeting);
    if (!file_exists($newappPath))  {
        mkdir($newappPath, 0755, true);
    }
}
}

Il codice è preso da un esempio della documentazione ufficiale joomla, lì deve esserci ";" perché invece mi segnala errore?




Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Installer script
« Risposta #16 il: 17 Set 2016, 20:00:08 »
non dice che è sbagliato, dice che si aspetta una parentesi di chiusura, probabilmente un errore di escape nell'array sopra
mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #17 il: 17 Set 2016, 20:13:58 »
Sì mi sono accorto che erano salte alcune quote nel cambiare le parentesi graffe col corrispondente codice html ma lo stesso il db non viene aggiornato, ho provato pure con gli oggetti come mi hai suggerito ma lo stesso non popola la tabella.

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Installer script
« Risposta #18 il: 17 Set 2016, 21:04:02 »
class Com_datagrillInstallerScript{

function preflight($type, $parent)
   {

----------------------------------------------------------------
perchè hai fatto una classe? chi costruisce la classe e/o usa i metodi creati? quel metodo è pubblico? le variabili usate all'interno della classe sono definite?
mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #19 il: 17 Set 2016, 22:49:38 »

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Installer script
« Risposta #20 il: 18 Set 2016, 10:11:56 »
la classe è minuscola com_

verifica che la funzione venga usata facendogli stampare un messaggio, se la funzione viene usata l'errore potrebbe essere nella query

mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #21 il: 18 Set 2016, 12:05:24 »
No  anche correggendo la classe col minuscolo ed inserendo un echo non viene eseguito. Il punto è come faccio ad aggiornare un componente aggiungendo delle feature . Ho provato a ripetere la struttura iniziale della estensione aggiungendo solo le cartelle, le tabelle e i record in più ma ottengo che mi inserisce sì le tabelle ed i record nel db (col metodo upgrade nella cartella sql/updates/mysql/) e le cartelle aggiunte ma mi cancella le cartelle esistenti. Dove trovo documentazione su come preparare un pacchetto di upgrade di una estensione?
« Ultima modifica: 18 Set 2016, 12:07:03 da tomtomeight »

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Installer script
« Risposta #22 il: 18 Set 2016, 12:15:36 »
No  anche correggendo la classe col minuscolo ed inserendo un echo non viene eseguito.

prova con un print_r(); seguito da un bel die('sono qui');

quella classe viene (dovrebbe) eseguita dal plugin installer che cerca i trigger/metodi predisposti pre e post flight install ed update e se ci sono li esegue.

Se non funziona questo "meccanismo" c'è un problema

es. se trova prefligt(etc){ die('sono in preflight'); } non può non funzionare, quando nel manifest trova il tag scriptfile esegue il file inserito tra i tag

EDIT:  mi sembra strano tu non veda errori... hai i debug attivato? il Display Errors su on e E_ALL nel php.ini ?

hai provato anche ad usare install invece che preflight?
« Ultima modifica: 18 Set 2016, 13:50:56 da MariaElenaBoschi »
mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #23 il: 18 Set 2016, 18:25:02 »
Finalmente ho ottenuto due risultati, riesco a caricare i file e cartelle senza perdere quelli presenti e riesco a far eseguire lo script, questo solo in parte. Mi popola il db ma non mi crea la cartella

Codice: [Seleziona]
defined('_JEXEC') or die;

/**
 * Installs some files that the installer does not move.
 *
 * @since  1.0
 */
class pkg_RubricaInstallerScript
{
/**
* Copying files
*
* @param   string                     $type   Installation type
* @param   JInstallerAdapterComponent $parent Installation adapter
*
* @return bool False if something happens
*/
public function postflight($type, $parent)
{
// Create the rubrica content type object.
$db    = JFactory::getDbo();

$rubrica = new stdClass();
$rubrica->greeting = 'Rubrica';
$rubrica->tables = '{"contatti": "Contatti"}';
$rubrica->modules = '{"modules_depselect": "modules/depselect/depselect.php"}';
$rubrica->languages = '{"it": "Italiano"}';

// Set the object into the content types table.
$rubrica_Inserted = $db->insertObject('#__datagrill', $rubrica);

$lastid=LAST_INSERT_ID();
$newappPath=JPATH_COMPONENT_SITE.'/apps/'.urlencode($lastid).'_'.urlencode($greeting);
    if (!file_exists($newappPath))  {
        mkdir($newappPath, 0755, true);
    }

$parent->getParent()->setRedirectURL(JRoute::_('index.php?option=com_datagrill&view=installation', false));

return true;
}
}
Ho dovuto agire da package suddividendo le azioni di caricare file e aggiornare db da file  script

però adesso si blocca su questa variabile che dice non è definita
$lastid=LAST_INSERT_ID();

Serve per ottenere il nome della cartella contenente l'applicazione, nello script cerco di creare direttamente la cartella, però poi dovrò modificare perché in pratica la cartella è stata già caricata e quindi dovrò solo rinominarla.

Come ottengo l'ultimo id inserito nella tabella?

Grazie per la pazienza di chi mi sta seguendo

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Installer script
« Risposta #24 il: 18 Set 2016, 18:52:16 »
$db->insertid();

urlencode($greeting); <- questo non capisco cosa sia.

se cerchi un file devi dargli il percorso e il nome del file estensione compresa
« Ultima modifica: 18 Set 2016, 18:58:59 da MariaElenaBoschi »
mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #25 il: 18 Set 2016, 19:21:22 »
Ok con $db->insertid()

urlencode($greeting);  questo è usato nel model dell'applicazione, comunque il nome già è noto avendo caricato la cartella, una volta ottenuto l'id basta rinominare aggiungendo l'id con le istruzioni:

Codice: [Seleziona]
$lastid=$db->insertid();
echo "$lastid";
$oldappPath=JPATH_COMPONENT_SITE.'/apps/'.'99_Rubrica';
$newappPath=JPATH_COMPONENT_SITE.'/apps/'.urlencode($lastid).'_'.'Rubrica';
    if (!file_exists($newappPath))  {
        rename($oldappPath, $newappPath);
    }

però con JPATH_COMPONENT_SITE mi restituisce il path di
/..../.../components/com_installer/apps/99_Rubrica
e quindi non trova la cartella da rinominare, come ottengo il  percorso giusto dell'applicazione?

Offline MariaElenaBoschi

  • Appassionato
  • ***
  • Post: 469
    • Mostra profilo
Re:Installer script
« Risposta #26 il: 18 Set 2016, 19:33:21 »
mancano 2 giorni alla mia prematura dipartita, saluti a tutti, meb.

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
[Risolto] Installer script
« Risposta #27 il: 18 Set 2016, 20:03:37 »
Ok con queste modifiche:
Codice: [Seleziona]
$lastid=$db->insertid();
echo "$lastid";
$oldappPath=JPATH_CONFIGURATION.'/components/com_datagrill/apps/'.'99_Rubrica';
$newappPath=JPATH_CONFIGURATION.'/components/com_datagrill/apps/'.urlencode($lastid).'_'.'Rubrica';
    if (!file_exists($newappPath))  {
        rename($oldappPath, $newappPath);
    }

viene rinominata la cartella.
Adesso restano da risolvere altri problemi, aprirò altra discussione,  questo post lo ritengo risolto e ringrazio vivamente per gli aiuti ricevuti.
Presto pubblicherò il lavoro.

Offline $Red

  • Team Joomla.it
  • Instancabile
  • *******
  • Post: 5351
  • "Bastard Inside"
    • Mostra profilo
Re:[Risolto] Installer script
« Risposta #28 il: 18 Set 2016, 20:12:37 »
Presto pubblicherò il lavoro.
Ciao tomtom, vi ho seguito un pò, a fatica  ;D , ora sono proprio curioso di provare l'estensione  :)

Offline tomtomeight

  • Global Moderator
  • Fuori controllo
  • ********
  • Post: 32046
  • Sesso: Maschio
  • Gli automatismi aiutano ma non insegnano nulla.
    • Mostra profilo
Re:Installer script
« Risposta #29 il: 18 Set 2016, 20:22:07 »
Ciao red

Aggiungo per chi vuol vedere il tutto funzionante ( componente e applicazione  aggiunta manualmente )

http://www.xataface.it/esempio.html

per modificare invece bisogna loggarsi
http://www.xataface.it/login.html
tester
tester

e questa è solo una delle molteplici applicazioni che si possono costruire.

 



Web Design Bolzano Kreatif