web-dev-qa-db-ja.com

Magento拡張機能のインストールスクリプトが実行されない

拡張機能のインストールスクリプトを作成しようとしていますが、何らかの理由でインストールスクリプトが作成されません。拡張機能はcore_resourceテーブルに表示されますが、作成しようとしている属性は作成されません。

最初にexit()を配置し、サイトが正常に実行されたため、スクリプトが呼び出されていないと確信しています。

これが私の構成XMLファイルにあるものです。これは、グローバル->リソースパス内に配置されます。

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

私のインストールスクリプトは次のとおりです。

$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();

スクリプトが実行されない理由となる、ここで見逃している明らかなものはありますか?

30
Josh Pennington

この記事 を順を追って、セットアップリソースが何をするのか、どのように機能するのか、どのようにトラブルシューティングを行うのかについて誤解がないようにしてください。

一度これを行うと、この質問スレッドで言ったことすべてから、リソースが「インストール」されたように聞こえますが、インストールスクリプトは実行されません。私の推測では、あなたが使用したバージョン番号

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

モジュールのバージョンと一致しませんでした

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

スクリプトを実行するには、これらが一致する必要があります。 IthinkMagentoは以前のバージョンが見つかった場合にそれを実行できるほどスマートですが、セットアップリソースのコードは従うのが難しい種類なので、必ず一致するようにしてください。

いずれにせよ、セットアップリソースの実行時にmagentoが実行しようとしているファイルを確認する方法は次のとおりです。モジュールに関連するcore_resourceからエントリを削除します。キャッシュをクリアします。次に、セットアップクラスで次の場所を見つけます。

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;
    }

そして、それらを変更して、一時的なデバッグ例外を追加します

    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.");

ページをリロードすると、Magentoが見つけられないものについて文句を言う例外テキストが表示されます。これで、Magentoが実行しようとしているインストーラースクリプトを見つけることができますが、見つけることができません。 core_resourceでモジュールの行を削除し、キャッシュをクリアすることを忘れないでください。 (マゼンタは、インストール/アップグレードを確認する必要があるモジュールをキャッシュします)

それでもうまくいかない場合は、applyAllDataUpdatesのロジックを掘り下げて、クラスにインストーラーファイルが含まれていない理由を見つけてください。

71
Alan Storm

このエラーを追跡する最も簡単で最も有益な方法は、 setup IDE Magentoをデバッグするために を設定し、mysql4-install-0.0.1.phpにブレークポイントを設定することです。ヒットしない場合は、XML構成に問題があるかどうかがわかりますブレークポイントがヒットする場合は、コードをトレースしてエラーの原因を見つけることができます。

設定に半日かかる場合がありますが、Magentoのライブデバッグは、コードを学習および理解するための最良の方法です。あなた自身を支持して、今投資をしてください。

14
Jonathan Day

この問題が発生したとき、実際にキャッシュを無効にする必要がありました。単にそれをフラッシュしても、何らかの理由で助けにはなりませんでした。

13
Björn Tantau

Magento Knowledgebase に従って、<class>タグの<setup>。このようにして、正しいセットアップモデルが使用されていることを確認し、(それまでになった場合)モデルをインストールスクリプトに渡して、$setup手動で。

インストールスクリプトのファイルパーミッションとそれが入っているディレクトリを確認してください。時々、core_resourcesは、プロセスを開始するのにも役立ちます。

3
clockworkgeek

Magentoで、モジュールがロードされているかどうか、およびそのモジュールのどのバージョンがロードされているかを確認できます。

  1. _app/code/core/Mage/Core/Model/Resource/Setup.php_に移動します
  2. 関数__construct()に移動します
  3. 関数の最後に次を記述します。

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

バージョン番号がロードされているすべてのモジュールがログに記録されます。ここで、モジュールがロードされているかどうかを確認できます。

3
Arvind Bhardwaj

更新スクリプトを実行するには、モジュールのバージョンを1ポイント上に変更する必要があります。

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

このバージョンがcore_resourcesテーブルのリソースバージョンと等しい場合、アップグレードスクリプトは実行されません。また、バージョンはアップグレードスクリプトの名前と一致する必要があります

2
Eugene Tulika

ストアにも同じ問題がありました http://www.looxis.de 使用している拡張子を更新するために、すべてのファイルをFTP経由で転送しましたが、データベースはクリア後に更新されませんでしたキャッシュ。そのため、更新された拡張機能の実行に失敗し、バックエンドにログインできませんでした。

ソリューションを検索すると、このページが見つかりました。

問題は、数週間前に新しいバージョンのモジュールをインストールし、他のモジュールとの競合によりエラーが発生したため、一部のテーブルをデータベースバックアップから部分的に転送し、古いファイルも戻すことでした。すべてが再び機能しました

他の拡張機能と互換性のある(競合が削除された)モジュールを新たに更新しようとしたときに、SQL更新スクリプトは実行されませんでした。

これは、テーブル「core_resources」が原因でした。そこでは、モジュールのバージョン番号は数週間前にインストールした最新バージョンに設定されていました。そのため、magentoは新しい更新が再度実行されたことを認識せず、最新バージョンが既に存在すると想定していました。

手動でバージョン番号を低いバージョンに変更し、ブーム、アップグレードスクリプトが開始され、すべて正常に動作しました!

1
Etienne Renaud

App/etc/modulesファイルを確認し、モジュールの名前が正確であり、コードプールが正確に指定されていることを確認してください。

0
Coolster