ホームページ  >  記事  >  バックエンド開発  >  Magento 開発ノート 5_PHP チュートリアル

Magento 開発ノート 5_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:07:28939ブラウズ

迅速に反復するプロジェクトでは、開発データベースと実稼働 (ライブネットワーク) データベースの同期を確保する方法が頭の痛い問題です。 Magento は、リソース移行バージョンを作成するためのシステムを提供しており、開発プロセス中に常に遭遇するこの問題に対処するのに役立ちます。 www.2cto.com

前回はウェブログ投稿モデルを作成しました。今回はCREATE TABLEを直接実行します。モジュールのセットアップ リソースを作成し、このリソースによってテーブルが作成されます。インストールされたモジュールをアップグレードするアップグレード スクリプトも作成します。全体的に
1. 設定に SetupResource を追加します
2.リソースクラスファイルを作成します
3. インストーラースクリプトを作成します
4. アップグレードスクリプトを作成します
セットアップリソースを追加
セクションに次の
を追加します。
core_setup
タグは、SetupResource を一意に表すために使用されます。通常、modelname_setup の使用が推奨されます。モジュールの Pachagename_Modulename は、XStarX_Weblog タグの下に含める必要があります。最後に、XStarX_Weblog_Model_Resource_Mysql4_Setup には、作成するセットアップ リソース クラスの名前を含める必要があります。基本的なスクリプトの場合、独自のクラスを作成する必要はありませんが、そうすることで後で柔軟性が高まります。
設定を追加した後、キャッシュをクリアしてMagentoサイトをロードすると、何か異常なことがわかります
致命的なエラー: クラス 'XStarX_Weblog_Model_Resource_Mysql4_Setup' が
に見つかりません
Magento は、config で宣言したクラスをインスタンス化しようとしましたが、見つかりませんでした。 app/code/local/XStarX/Weblog/Model/Resource/Mysql4/Setup.php のようなクラス ファイルを作成する必要があります
classXStarX_Weblog_Model_Resource_Mysql4_Setup extendsMage_Core_Model_Resource_Setup { }
ここで Magento Web サイトをリロードすると、例外が消えます。
インストールスクリプトを作成する
次に、インストールスクリプトを作成します。スクリプトには前の CREATETABLE ステートメントが含まれています。
まず、config.xmlを見てください
<バージョン>0.1.0
モジュール>
この部分は構成ファイル内で必要であり、モジュールをマークし、バージョンも示します。インストール スクリプトはバージョンに基づいている必要があります。次の場所にファイルを作成します
app/code/local/XStarX/Weblog/sql/weblog_setup/mysql4-install-0.1.0.php
echo 'このアップグレードの実行: '.get_class($this)."n
n";
die(「とりあえず終了」);
パスの weblog_setup 部分は、config.xml ファイル と一致します。 0.1.0 の部分はモジュールのバージョンと一致します。キャッシュをクリアしてページをロードすると、
が表示されます
このアップグレードの実行:Alanstormdotcom_Weblog_Model_Resource_Mysql4_Setup 一旦終了します ...
これは、更新スクリプトが実行されたことを意味します。最終的には SQL 更新ファイルをここに配置しますが、今はセットアップ メカニズムに焦点を当てます。 die ステートメントを削除します。
echo 'このアップグレードを実行しています:'.get_class($this)."n
n";
ページをリロードすると、ページの最初の部分にアップグレード メッセージが表示されます。リロードすると、ページは通常の状態に戻ります。セットアップは一度しか行われないためです。常にセットアップすることは不可能です。
インストールスクリプトを作成する
MagenoSetup リソースを使用すると、インストール スクリプトとアップグレード スクリプトを配置するだけで、システムがそれらを自動的に実行します。これにより、システム内のデータ移行スクリプトを一度だけ維持できるようになります。
データベースクライアントを使用して core_resroucetable を表示します
mysql> core_resource から * を選択します。
+-------------------------+-----------+ |code ---------- --------+-----+
|管理者通知セットアップ 1.0.0 |
| 0.7.1 |
| アマゾンペイメント_セットアップ |
| 0.8.1 |
| バックアップセットアップ
| バンドルセットアップ 0.1.7 |
| カタログインデックス_セットアップ
| カタログ在庫_セットアップ |
| カタログルール_セットアップ |
| カタログ検索_セットアップ
| 0.7.69 |
| 0.9.3 |
| クロノペイ_セットアップ |
| 0.7.8 |
| コンパイラ_セットアップ
|連絡先セットアップ 0.8.0 |
| コアセットアップ 0.8.13 |
| 0.7.1 |
| 顧客セットアップ 0.8.11 |
| サイバーマットセットアップ 0.1.0 |
| サイバーソースセットアップ 0.7.0 |
| 0.7.4 |
| ディレクトリセットアップ 0.8.5 |
| ダウンロード可能なセットアップ
| 0.7.13 |
| 0.1.0 |
| 0.1.1 |
| ギフトメッセージのセットアップ |0.7.2 |
| グーグルアナリティクスセットアップ 0.1.0 |
| 0.1.1 |
| 0.7.3 |
| グーグルオプティマイザー_セットアップ |
| 0.1.0 |
| 0.7.6 |
| ニュースレター_セットアップ
| 0.8.10 |
| ペイボックスセットアップ 0.1.3 |
| ペイゲートセットアップ 0.7.0 |
| 支払い_セットアップ
| paypaluk_setup | 0.7.0 |  
| paypal_setup | 0.7.2 |  
|ポールセットアップ | 0.7.2 |  
| productalert_setup | 0.7.2 |  
| protx_setup | 0.1.0 |  
|評価設定 | 0.7.2 |  
| reports_setup | 0.7.7 |  
| review_setup | 0.7.4 |  
| salesrule_setup | 0.7.7 |  
| sales_setup | 0.9.38 |  
| sendfriend_setup | 0.7.2 |  
| Shipping_setup | 0.7.0 |  
| sitemap_setup | 0.7.2 |  
| Strikeiron_setup | 0.9.1 |  
| tag_setup | 0.7.2 |  
| Tax_setup | 0.7.8 |  
| usa_setup | 0.7.0 | 
| weblog_setup | 0.1.0 |  
| weee_setup | 0.13 |  
| wishlist_setup | 0.7.4 | 
+---------------------------+----------+ 59 行セット (0.00 秒)
このテーブルには、すべてのインストールモジュールのリストと、対応するバージョンが含まれています。
| weblog_setup | 0.1.0 |  
これは、Magento が再実行の必要がないことをどのように認識するかです。すべてが成功した場合は、ページが追加されます。
DELETE from core_resource where code = 'weblog_setup';
その後删除对应のテーブル
ドロップテーブル blog_posts; 
次にセットアップ脚本里增加
$インストーラー = $this; 
$installer->startSetup(); 
$installer->run("
テーブルの作成 `{
$installer->getTable('weblog/blogpost')}`(
`blogpost_id`int(11) NOT NULL auto_increment,
`タイトル`テキスト、
「投稿」テキスト、
`date`datetime デフォルトは NULL、
`timestamp`timestamp NOT NULL デフォルト CURRENT_TIMESTAMP, PRIMARY KEY (`blogpost_id`) )
ENGINE=InnoDBDEFAULT CHARSET=utf8;      
INSERTINTO `{$installer->getTable('weblog/blogpost')}` VALUES (1,'My NewTitle','これはブログ投稿です','2009-07-01 00:00:00',' 2009-07-02 23:12:30');         ");
$インストーラー->endSetup();
キャッシュを削除し、ページを追加すると、新しく作成されたブログ投稿を閲覧でき、データが 1 件あります。
创建設置脚本---问题
上面のインストールは可能ではありません会那么顺利、在magento1.7下面会报错
Mage_Eav_Exception: テーブルを作成できません: module_entity
决呢をどのように解決しますか?
createEntityTables() メソッドをデバッグします、结尾で見ることができます
$connection->beginTransaction(); try { foreach ($tables as $tableName => $table) { $connection->createTable($table);     } $connection->commit(); catch (Exception $e) { Zend_Debug::dump($e->getMessage());    $connection->rollBack();    throw Mage::Exception('Mage_Eav', Mage::helper('eav')->__('テーブルを作成できません: %s', $tableName)); }
查看最下層错误:UserError: DDL ステートメントはトランザクションでは許可されません
その後跟进コミット関数
/** * DDL クエリの場合はトランザクション レベルを確認します * * @param string|Zend_Db_Select $sql * @throws Zend_Db_Adapter_Exception  */ protected function _checkDdlTransaction($sql) { if (is_string($sql) && $this->getTransactionLevel() > 0) { $startSql = strto lower(substr(ltrim($sql) 、0、3));         if (in_array($startSql, $this->_ddlRoutines)) { trigger_error(Varien_Db_Adapter_Interface::ERROR_DDL_MESSAGE, E_USER_ERROR);         } } }
Mysql は DDL トランザクションをサポートしていません。
したがって、app/code/local/{CompanyName}/{ModuleName}/Setup/Helper.php里重写createEntityTableメソッド
{ ... /**         * エラーの問題のため、トランザクション コードを削除しました。          */ //$connection->beginTransaction();         try { foreach ($tables as $tableName => $table) { $connection->createTable($table);             } $connection->commit();        catch (Exception $e) { //$connection->rollBack();            throw Mage::Exception('Mage_Eav', Mage::helper('eav')->__('テーブルを作成できません: %s', $tableName));        } } }
その後深刻な問題が発生します。
セットアップ脚本断面分析
让我们一行一行の解释。最初
$インストーラー = $this; 
各インストール スクリプトはすべて SetResource クラスから実行されます (つまり、私が上で作成したものです)。これは、画面内の $this 参照がこの種の参照であることを意味します。必要でない限り、コア システムでのインストール スクリプトの大部分が実行されます。これは $this 命名の未インストーラーです、これも同様です。
次来我们看了二つの方法
$installer->startSetup(); 
//...
$インストーラー->endSetup(); 
如果查看Mage_Core_Model_Resource_Setup类(目录app/code/core/Mage/Core/Resource/Setup.php)、次の内容を閲覧できます
パブリック関数 startSetup()
{
$this->_conn->multi_query("
SET SQL_MODE=''; 
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO'; ");
$this を返します。     
}
パブリック関数 endSetup()
{
$this->_conn->multi_query("
SET SQL_MODE=IFNULL(@OLD_SQL_MODE,'');
SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS,0); ");
$これを返します。
}
ついに実行します
$インストーラー->実行(...);
これはデータベースの作成を含む SQL を受け入れます。セミコロンで区切るだけで、任意のクエリを定義できます。同時にこちらにも注目してください
$installer->getTable('ウェブログ/ブログ投稿')
getTable メソッドを使用すると、Magento モデル URI を渡して、そのテーブル名を取得できます。必要がない場合は、この方法を使用してください。 Mage_Core_Model_Resource_Setup クラスには、多くの便利なヘルパー メソッドが含まれています。最も効果的な学習方法は、Magento コアのインストーラー スクリプトを学習することです。
モジュールのアップグレード
上記はデータテーブルを初期化する方法を説明しましたが、既存のインクフレグランスの構造を変更するにはどうすればよいでしょうか? Magento のセットアップ リソースは、スクリプトを自動的に実行してモジュールをアップグレードできるようにするシンプルなバージョン戦略をサポートしています。
Magento がインストール スクリプトを実行すると、別のインストール スクリプトは再度実行されません。この時点で、アップグレード スクリプトを作成する必要があります。アップグレード スクリプトはインストール スクリプトとよく似ていますが、いくつかの重要な違いがあります。
まず、次の場所にスクリプトを作成します。
XStarX/Weblog/sql/weblog_setup/mysql4-upgrade-0.1.0-0.2.0.php
echo 'システムのバージョン番号の更新を避けるために、アップグレード スクリプト (mysql4-upgrade-0.1.0-0.2.0.php) をテストし、実行を停止します
';
死ぬ();
アップグレード スクリプトとインストール スクリプトは同じディレクトリにありますが、少し異なります。まず、ファイル名に upgrade が含まれている必要があります。次に、「-」で区切られた 2 つのバージョン番号が必要です。 1 つ目はアップグレードのソース バージョンで、2 つ目はアップグレードのターゲット バージョンです。
キャッシュをクリアした後、ページは再読み込みされますが、この時点ではスクリプトは実行されません。アップグレードをトリガーするには、config.xml のバージョン情報を更新する必要があります
モジュール>
新しいバージョン番号を書き込んだ後、キャッシュをクリアして Web サイトをロードすると、出力が表示されます。この時点で注意が必要な重要な点がもう 1 つあるため、急いでこの手順を実行しないでください。同じディレクトリに別のファイルを作成しましょう
XStarX/Weblog/sql/weblog_setup/mysql4-upgrade-0.1.0-0.1.5.php
echo 'アップグレード スクリプト (mysql4-upgrade-0.1.0-0.1.5.php) をテストしていますが、実行は停止していません
';
この時、キャッシュをクリアしてページを読み込むと、2つの情報が表示されます。 Magento はバージョン番号情報が変更されたことを検出すると、すべての実行可能なスクリプトを実行してモジュールを更新します。 0.1.5 バージョンを作成していないにもかかわらず、Magento はアップグレード スクリプトを認識し、それを実行しようとします。スクリプトは通常、低位から高位の順序で実行されます。以下のデータはこれを説明します
mysql> select * from core_resource where code = 'weblog_setup';
| コード | +--------------+--------+
| ウェブログ_セットアップ | +--------------+-------+
セット内の 1 行 (0.00 秒)
データシートのバージョンは 1.5 であることがわかります。これは、1.0 から 1.5 にアップグレードしましたが、1.0 から 2.0 へのアップグレードを実行していないためです。さて、この重要な問題を説明した後、本題に戻りましょう。スクリプトに戻り、まずアップグレード スクリプト 0.1.0-0.2.0 を変更します
$インストーラー = $this
;
$インストーラー->startSetup();
$installer->run("
ALTER TABLE `{$installer->getTable('weblog/blogpost')}`
投稿テキストを変更します ");
$インストーラー->endSetup();
die(「なぜこれがここにあるのかはすぐにわかります」);
ページを更新しても何も起こりません。アップグレード スクリプトが実行されないのはなぜですか?
1.weblog_setup リソースはバージョン 0.1.0 です
2. モジュールを 0.2.0 にアップグレードしたいです
3. Magento はアップグレード モジュールを認識し、実行するスクリプトは 0.1.0-0.1.5 と 0.1.0-0.2.0 の 2 つあります
4. Magento はキューをロードして実行します
5. Magento は 0.1.0 から 0.1.5 までのスクリプトを実行します
6. Weblog_setup リソースは 0.1.5 になりました
7. Magento は 0.1.0 から 0.2.0 までのスクリプトを実行し、実行が停止します
8. 次のページがロードされると、Magento は weblog_set がバージョン 0.1.5 であることを認識しますが、0.1.5 以降に実行されたスクリプトは認識されません (以前のスクリプトは 0.1.0 から開始されました)
正しい方法は次のとおりです、ファイル名を変更します
mysql4-upgrade-0.1.0-0.1.5.php #これは 0.1.0 から 0.1.5 になります
mysql4-upgrade-0.1.5-0.2.0.php #これは 0.1.5 から 0.2.0 になります
Magento は一度ロードされると 2 つのアップグレードを完了できます。 core_resource テーブルの情報をクリアして、最終テストを完了できます
core_resource セットのバージョン = '0.1.0' を更新します (コード = 'weblog_setup')。
Magento は設定ファイルに基づいてアップグレードを実行するため、共同開発中のスクリプトの追加には注意してください。

http://www.bkjia.com/PHPjc/477854.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477854.html技術記事迅速に反復されるプロジェクトでは、開発データベースと実稼働 (ライブ ネットワーク) データベースの同期を確保する方法が頭の痛い問題です。 Magento は、リソースの移行バージョンを作成するためのシステムを提供します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:phpize FAQ_PHP チュートリアル次の記事:phpize FAQ_PHP チュートリアル

関連記事

続きを見る