2011-01-17 2 views
28

Sto provando a creare uno script di installazione per la mia estensione e per qualche motivo non lo script di installazione. L'estensione verrà visualizzata nella tabella core_resource, ma gli attributi che sto tentando di creare non verranno creati.Il mio script di installazione dell'estensione Magento non verrà eseguito

Sono abbastanza sicuro che lo script non è nemmeno stato chiamato perché ho messo un'uscita() all'inizio e il sito correvo bene.

Ecco quello che ho nel mio file di configurazione XML. Questo è collocato all'interno globale -> risorse percorso:

<nie_setup> 
    <setup> 
     <module>Nie_Nie</module> 
    </setup> 
    <connection> 
     <use>core_setup</use> 
    </connection> 
</nie_setup> 

mia installazione script è il seguente:

$installer = $this; 
$setup = new Mage_Eav_Model_Entity_Setup('core_setup'); 
$installer->startSetup(); 

$setup->addAttribute('customer', 'nie_admin', array(
    'input'     => 'text', 
    'type'     => 'text', 
    'backend'    => '', 
    'visible'    => 0, 
    'required'   => 0, 
    'user_defined' => 1, 
)); 

$installer->endSetup(); 

C'è qualcosa di ovvio che mi manca qui che sarebbe la ragione per lo script non verrà eseguito?

+0

Si prega di inviare la posizione del tuo script di installazione –

+0

/app/code/local/Nie/Nie/sql/nie_setup/mysql4-install-0.0.1.php –

+2

Assicurarsi che il caso del nome del modulo all'interno ha lo stesso case come nella configurazione delle risorse. Mi sono imbattuto in questo problema io stesso. –

risposta

67

Lavorate attraverso this article per assicurarvi di non avere fraintendimenti su cosa fanno le risorse di installazione, come funzionano e come è possibile risolverle.

Una volta fatto questo, da tutto ciò che hai detto su questo problema filo Sembra che stai ricevendo la vostra risorsa "installato", ma che lo script di installazione non viene eseguito. La mia ipotesi è che il numero di versione è stato utilizzato nel

//0.0.1 is your version number 
mysql4-install-0.0.1.php 

non corrisponde con la versione del modulo

<modules> 
    <Nie_Nie> 
     <version>?.?.?</version> 
    </Nie_Nie> 
</modules> 

Questi dovrebbero corrispondere per l'esecuzione dello script. I think Magento è abbastanza intelligente da eseguire le versioni precedenti se le trova, ma il codice nelle risorse di installazione è il tipo che è difficile da seguire, quindi mi assicuro sempre che corrispondano.

Indipendentemente da ciò, ecco come puoi vedere quali file (s) Magento sta tentando di eseguire quando si esaurisce la risorsa di installazione. Elimina le voci da core_resource relative al tuo modulo. Svuota la cache.Poi trovare le seguenti posizioni nel classe di installazione

File: app/code/core/Mage/Core/Model/Resource/Setup.php 

protected function _modifyResourceDb($actionType, $fromVersion, $toVersion) 
{ 
    ... 

    $sqlFilesDir = Mage::getModuleDir('sql', $modName).DS.$this->_resourceName;   

    if (!is_dir($sqlFilesDir) || !is_readable($sqlFilesDir)) { 
     return false; 
    } 

    ... 

    $sqlDir->close(); 

    if (empty($arrAvailableFiles)) { 
     return false; 
    } 

    ... 

    $arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles); 
    if (empty($arrModifyFiles)) { 
     return false; 
    } 

e poi modificarli per aggiungere alcune eccezioni di debug temporanee

if (!is_dir($sqlFilesDir) || !is_readable($sqlFilesDir)) { 
     throw new Exception("$sqlFilesDir not found"); 
     return false; 
    } 

    ... 

    if (empty($arrAvailableFiles)) { 
     throw new Exception("No files found to run"); 
     return false; 
    } 

    ... 

    $arrModifyFiles = $this->_getModifySqlFiles($actionType, $fromVersion, $toVersion, $arrAvailableFiles); 
    if (empty($arrModifyFiles)) { 
     throw new Exception("No valid upgrade files found to run for "); 
     return false; 
    } 

    throw new Exception("If you're getting here, we have a file. Remove your exceptions here and place one in your installer to make sure it's the one you think it is."); 

Ricarica la pagina e si otterrà il testo eccezione lamentarsi qualunque Magento non può trova. Questo dovrebbe essere sufficiente per aiutarti a rintracciare quale script di installazione Magento sta cercando di eseguire, ma non riuscendo a trovarlo. Basta ricordarsi di cancellare la riga del modulo in core_resource e cancellare la cache. (Magento cache quali moduli devono verificare la presenza di un installare/aggiornare)

Se questo non funziona, iniziare a scavare nella logica di applyAllDataUpdates e capire perché la classe non è compreso il vostro file di installazione.

+3

I metodi di debug mi hanno detto che avevo il mio script nella directory sbagliata. Grazie mille! Posso continuare a lavorare per un altro giorno! –

+2

Ottima risposta, Alan. Non pensi che ci dovrebbe essere una modalità rigorosa in cui puoi dire a Magento di lamentarti se tenti di impostare qualcosa e non è impostato correttamente? Aggiorna script, percorsi, temi, ci sono tutti i tipi di cose che sono difficili da configurare per la tua prima volta e sarebbe bello essere in grado di convincere Magento a lamentarsi di te specificatamente quale sia il problema. Penso che un modulo che ha fatto questo sarebbe fantastico. – kalenjordan

+0

Sarei d'accordo con sparcksoft sul fatto che Magento non funzioni in modo così silenzioso, anche una voce in un file di registro sarebbe valsa la pena. Non mi piace ancora come Magento installerà ciecamente tutto ciò che corrisponde senza una sorta di checksum. Inoltre, un consiglio in più non si rende conto che è possibile usare '.sql' invece di' .php' per i file di installazione se si esegue semplicemente SQL raw su aggiornamenti/installazioni. – B00MER

1

si dovrebbe cambiare la versione del modulo di un punto fino, per rendere il vostro script di aggiornamento eseguire.

<modules> 
    <Nie_Nie> 
     <version>1.5.0.0</version> 
    </Nie_Nie> 
</modules> 

Se questa versione è uguale alla versione risorsa da core_resources tavolo script di aggiornamento non verrà eseguito. E la versione dovrebbe corrispondere al nome dello script di aggiornamento

+0

Ho provato a cambiare il numero di versione e non ho eseguito lo script. Ha appena cambiato il numero di versione nella tabella core_resources. –

+0

Alcune domande più ovvie: è il tuo script di aggiornamento all'interno di dir sql/nie_setup? il tuo modulo dir è app/code/local/Nie/Nie? –

+0

Sì. Entrambi si trovano lì. –

3

Come da Magento Knowledgebase si potrebbe provare tra cui un tag <class> nel vostro <setup>. In questo modo è possibile garantire che venga utilizzato il modello di installazione corretto e (se arriva così lontano) passa il modello allo script di installazione, annullando la necessità di creare manualmente un $setup.

Verificare le autorizzazioni del file per lo script di installazione e la directory in cui si trova. A volte trovo che eliminare il record da core_resources aiuta anche a avviare il processo.

+1

+1 al record di eliminazione da core_resources – Populus

12

Il modo più semplice e informativo per individuare questo errore è setup your IDE to debug Magento e impostare un punto di interruzione nel mysql4-install-0.0.1.php. Se il punto di interruzione non viene colpito, allora sai se il problema è nella tua configurazione XML. Se il punto di interruzione viene colpito, è possibile tracciare il codice per trovare la fonte dell'errore.

Potrebbe essere necessaria mezza giornata per l'installazione, ma il debug live di Magento è di gran lunga il modo migliore per imparare e comprendere il codice. Fatti un favore, fai l'investimento ora.

+0

Va notato che il live debugging non è possibile se il code-base utilizza il modulo di ionizzazione della spazzatura IonCube (che molti moduli di terze parti mal progettati richiedono). –

0

Assicurati di controllare il tuo file app/etc/modules, assicurati che il nome del tuo modulo sia accurato e che la codepool sia specificata con precisione.

1

Abbiamo avuto lo stesso problema per il nostro negozio http://www.looxis.de Per aggiornare un'estensione che abbiamo in uso abbiamo trasferito tutti i file tramite FTP, ma il database non si aggiornava da solo dopo aver svuotato la cache. Quindi l'estensione aggiornata non è stata eseguita, non è stato possibile accedere al back-end.

Alla ricerca di una soluzione abbiamo trovato questa pagina.

Il problema era che abbiamo installato una versione più recente del modulo poche settimane prima, che produceva anche errori a causa di un conflitto con altri moduli, quindi abbiamo trasferito parzialmente dal nostro database alcune tabelle di backup e abbiamo anche rimesso i vecchi file. tutto stava funzionando di nuovo,

quando abbiamo provato a aggiornare di recente il modulo, che ora era compatibile con l'altra estensione (il conflitto è stato rimosso) lo script di aggiornamento sql non sarebbe stato eseguito.

Ciò era dovuto alla tabella "core_resources". lì, il numero di versione del modulo era impostato sulla versione più recente che avevamo installato settimane prima - quindi Magento non avrebbe riconosciuto che un nuovo aggiornamento era stato eseguito di nuovo, suppose che la versione più recente fosse già lì.

Abbiamo modificato manualmente il numero di versione in una versione inferiore e boom, lo script di aggiornamento è stato avviato e tutto funzionava correttamente!

5

Quando ho riscontrato questo problema, ho dovuto disabilitare la cache. Lo sciacquare semplicemente non ha aiutato per qualsiasi motivo.

+0

Wow è vero ... inspiegabile anche ... – JonaPkr

+0

spot on mateyyy – surfer190

3

Puoi effettuare check in moduli Magento Pagherei sono caricati e quale versione di quel modulo è caricato:

  1. Vai app/code/core/Mage/Core/Model/Resource/Setup.php
  2. Vai a funzionare __construct()
  3. Alla fine della funzione di scrittura:

    Mage::log($modName); Mage::log($this->_moduleConfig);

Registrerà tutti i moduli caricati con il numero di versione. Qui puoi controllare se il tuo modulo è caricato o meno.