タグ付けされた質問 「model」

モデルには、Magentoモジュールのビジネスロジックのほとんどが含まれています

4
抽象モデルの非推奨の保存およびロードメソッド
Magento 2リポジトリの開発ブランチでは、メソッドloadとsavefrom Magento\Framework\Model\AbstractModelクラスが非推奨になっていることがわかります。 しかし、コアには、このクラスを拡張してandを使用する膨大な数のクラスがsaveありloadます。 エンティティのCRUD部分に独自のモジュールを作成するとき、コアモジュールと同じガイドラインに従います。 しかし、これらのメソッドは非推奨であるため、将来に備えたいと思います。 それらの代わりに何を使うべきですか?または、他の何かを拡張する必要がありますか?

3
Magento 2でカスタムモジュールのサービスコントラクトを実装する方法
この記事で見られるように:非推奨に保存し、抽象モデルの負荷メソッドsaveとloadメソッドはMagentoの2に廃止されましたが、分岐を開発しています。 したがって、CRUDエンティティを処理するサービスコントラクトを実装することをお勧めします。 カスタムモジュールエンティティのサービスコントラクトを実装するために必要なステップバイステッププロセスは何ですか? NB:私のCRUDモデルには数千のメソッドが存在する可能性があることを知っています。ここに記載されているように、明らかなメソッドを求めています:http : //devdocs.magento.com/guides/v2.0/extension-dev-guide /service-contracts/design-patterns.html: get save getList delete deleteById

1
あいまいな列名を持つwhere句の競合
このための少しのコンテキスト。(グリッドを介して)注文のエクスポート機能を拡張して、列を増やしたい。エクスポート用の新しいグリッドと、元のモデルを拡張する新しいコレクションモデルを追加するモジュールを作成しました。これは_beforeLoad()関数を使用するため、必要なテーブルを結合できます。 私が抱えている問題は、グリッドからフィルターが追加されると(increment_id、注文日など)、これによって追加されるwhere句がテーブルの前に付かないため、あいまいな列名の問題が発生することです。たとえば、increment_idでは、where句に問題があります。 SELECT `main_table`.*, `sales`.`total_qty_ordered`, `sales`.`entity_id` AS `order_id`, `sagepay`.`vendor_tx_code` FROM `sales_flat_order_grid` AS `main_table` LEFT JOIN `sales_flat_order` AS `sales` ON main_table.increment_id = sales.increment_id LEFT JOIN `sagepaysuite_transaction` AS `sagepay` ON order_id = sagepay.order_id WHERE (increment_id LIKE '%100000261%') GROUP BY `main_table`.`entity_id` このwhere句は、_addColumnFilterToCollection()関数で他のテーブルに結合する前に追加されます protected function _addColumnFilterToCollection($column) { if ($this->getCollection()) { $field = ( $column->getFilterIndex() …
28 export  model 

2
パフォーマンスの最適化のために、モデルレイヤーのどの部分をバイパスできるか
私は現在、非常に単純なスキーマ(約5フィールド)を持つデータベーステーブルの場合、ローカル開発環境(SSDドライブ)で、毎秒〜50挿入未満の速度で新しいレコードを挿入していることを確認しています-これは関連するテーブルにデータを入力するモデルのオブザーバーはいません。 ダイレクトSQLを使用すると、かなりの改善が見られます-1800挿入/秒。モデルのパフォーマンスを最適化することを考えていますが、もちろん、Magentoコアが提供する優れた安定性と柔軟性をすべて失いたくありません。 誰かが以前にこのルートを行ったことがあるかどうか、そしてモデル層のコンポーネントに関して、パフォーマンスを大幅に向上させる比較的安全にバイパスできる簡単な勝利があるかどうか疑問に思っています。 次のようなもの: クラス名解決 イベントの保存前後 イベントの発送 取引 等 更新:嘘をつきました。実際には、オブザーバーまたはafterSave()から発せられる追加のクエリがいくつかあり、データベースクエリログを調べたときに見ました。完全に単純なエンティティに対するベンチマークでは、実際にはMagentoモデルで最大300行/秒が得られます。MySQLのオーバーヘッドのみがトランザクションです。

3
サービス契約よりも$ model-> load()を好む理由はありますか?
Magento 2のモジュール間で作業する好ましい方法は、サービスコントラクトを使用することです。 したがって、製品をロードする場合は、製品リポジトリを使用します。 $product = $productRepository->getById($id); これは、契約によりのインスタンスを返しますMagento\Catalog\Api\Data\ProductInterface。 しかし、代わりに古い方法を使用して、ドメイン層を直接呼び出すこともできます。 $product = $productFactory->create()->load($id); これが必要または有用になるケースはありますか? devdocsの発言(ハイライト追加): モジュールは別のモジュールを直接呼び出すことができます。この密結合ソリューションは、ほとんどの状況では推奨されませんが、避けられない場合があります。 [...] 別のモジュールのドメイン層コードを呼び出すための戦略は、システムの固有の構成とニーズに大きく依存します。 ソース:http : //devdocs.magento.com/guides/v2.0/architecture/archi_perspectives/domain_layer.html また、関連する質問に対するコメントは次のように述べています。 リポジトリを使用すると、製品データモデル(Api/Data/Product)が得られます。これは、縮約されたDTOに変換された製品モデルです。考慮すべきこと しかし、私が見る限り、オブジェクトは通常の条件下で同じであり、phpDocごとの戻り値の型が異なるだけです(Magento\Catalog\Api\Data\ProductInterface/ Magento\Catalog\Model\Product)

3
Magento2のIdentityInterfaceとは
Magento 2の多くのモデルが実装していることがわかりますMagento\Framework\DataObject\IdentityInterface。 このインターフェイスには、メソッドgetIdentities の実装が通常返される単一のメソッドがありますreturn [self::CACHE_TAG . '_' . $this->getId()];。 例はここにあります これは何のために使われますか?

2
Magento 2でカスタムモデルを読み込む最良の方法
正しい方法を見つけることは私にとって困難だったので、以下であなたが私が作ったベストプラクティスを見つけることができました。楽しんで、必要に応じて英語を修正し、私が間違っていると言ってください。:) 編集: ...そして、私はいくつかの面で間違っていたことがわかりました。だから、ラファエルの答えが私をもっと理解するのを助けてから、元の投稿を更新しました。彼に感謝! 以下で使用される概念: これらの概念に慣れていれば、以下のコードと説明を理解しやすくなります。 インジェクションの依存関係($this->variableコード内のすべての変数がインジェクトされるため) サービス契約とリポジトリ 工場 コンテキスト: より多くのコンテキストを持つために、モジュールが正しく構築されていると想像してください: 方法を含むブロッククラスCustomBlock getCustomModel($id)、 このメソッドは、paramで渡されたIDに基づいてCustomModelオブジェクトを返します。 CustomModelタイプは、モデルに対応します \Vendor\Module\Model\CustomModel このモデルには、そのリソースモデル(\Vendor\Module\Model\ResourceModel\CustomModel)が付属しています およびそのリポジトリ(\Vendor\Module\Model\CustomModelRepository)を使用します。 質問: すべてがCustomModelオブジェクトをロードできるようにするベストプラクティスは何ですか? load()このメソッドは廃止されているため、CustomModelオブジェクトからを使用することはできません。 良い習慣は、CustomModelサービス契約を使用する必要があることです。サービスコントラクトは、データインターフェイス(CustomModelInterfaceなど)とサービスインターフェイス(CustomModelRepositoryInterfaceなど)です。だから私のブロックは次のようになります: / ** @var SlideRepositoryInterface * / 保護された$ slideRepository; / ** * CustomBlockコンストラクター * ... * @param CustomModelRepositoryInterface $ customModelRepository * ... * / パブリック関数__construct( ... CustomModelRepositoryInterface $ customModelRepository ... …

1
多対多の関係を作成するためのMagento 2のベストプラクティスの方法は何ですか?
私はコアを見渡して、モデル間の多対多の関係のいくつかの例を見てきましたが、これに関する明確な答えを見ることができません。 例として、新しいモデルを作成し、既存の製品テーブルと多対多の関係を持ちたいとします。 新しいモデル-Stockistがあり、2つのテーブルを作成します。1つはStockist名を格納し、もう1つは製品との多対多の関係を格納します。 セットアップクラスの短縮バージョン: $table = $setup->getConnection() ->newTable($installer->getTable('stockist')) ->addColumn('stockist_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true], 'Stockist Id') ->addColumn('name', \Magento\Framework\DB\Ddl\Table::TYPE_TEXT, null, ['nullable' => false], 'Stockist Name'); $table = $installer->getConnection() ->newTable($installer->getTable('stockist_product')) ->addColumn( 'entity_id', \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER, null, ['identity' => true, 'nullable' => false, 'primary' => true], …

1
Zend FrameworkのSQLモデルを使用する場合のSQLインジェクションの脆弱性
テーブルを結合するとき、Zend FrameworkのSQLモデルを使用します。例として、実際のコードを変更しましたが、ポイントが得られると思います。 $this->getSelect()->join( array('sections' => $sectionsTableName), 'main_table.banner_id = pages.banner_id', array() ) ->where("sections.section= '$section' OR sections.section = '0' OR (sections.section = '6' AND ? LIKE main_table.url)",$url) ->group('main_table.banner_id'); ページはajaxでロードされ、$ sectionパラメーターはGETパラメーター(www.example.com/controllerName/index/display/3?paremeter1=example&section=www.example2.com)として送信されます。 誰かが次のようなことを実行した場合の問題は次のとおりです。 www.example.com/controllerName/index/display/3?paremeter1=example&url=(SELECT 3630 FROM(SELECT COUNT(*),CONCAT(0x7170786a71,(SELECT (ELT(3630=3630,1))),0x717a716b71,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) このようにして、ユーザーはデータベース全体をダンプできます。データは表示されませんが、SQLはダンプを実行するため、SQLのオーバーロードが発生する可能性があります。 質問: そのようなシナリオを防ぐ最良の方法は何ですか? 今、私は以前の顧客を心配しています。このコードを使用すると、テーブルの更新や変更など、さらにリスクの高いアクションを実行できますか?DELETEがsql構文エラーを生成するように、SELECT以外のステートメントをsubselect内に配置できないためだと思います。私は正しいですか? 更新: 私の例は、$セクションの周りに記号があり、したがって注入を行うことができないため、SQL注入の適切な図ではありません。とにかく、これは整数値を期待するとき、および整数入力をフィルタリングしないときに可能です。以下の私のコメントをご覧ください。

3
効率的なコレクションの呼び出し、フィルタリング、読み込み
現在、foreachループ内にネストされている多くのコレクションを再利用しています。これらのことをいくつかのレベルに上げることは可能ですか?現在Imは、51k +エンティティを持つコレクションを何度もリロードすることを余儀なくされており、これにより物事が非常に遅くなります。具体的には、キットインベントリコレクション。 <?php class Codespace_Module_Helper_Item extends other_one{ function functionOne($collection){ ... $data = $collection->getData(); foreach($data as $item){ $this->_functionTwo($item); } ... } function _functionTwo($item){ $model = Mage::getModel('catalog/product'); $id = $model->getIdBySku($item['sku']); $inventoryStatus = Mage::getResourceSingleton('catalog/product')->getAttributeRawValue($id, 'product_inventory_status', 1); $invStatus = $model->getResource()->getAttribute('product_inventory_status')->getSource()->getOptionText($inventoryStatus); if ($invStatus && $id) { if ($invStatus !== 'Z') { $stockItem = Mage::getModel('cataloginventory/stock_item'); $stockItem->setData(array()); …


4
Magento-カスタム(非eav)モデル、複数フィールドによるロード
カスタムモデルとリソースモデルがあります。複数のフィールドを使用してモデルの単一インスタンスをロードしたい。 モデルには次のフィールドがあります。 id tag_name custom_name group_name idではなくtag_name、custom_name、およびgroup_nameに基づいてこのモデルをロードします。 現在、各フィールドにコレクションとaddFilterを使用しています。これは機能しますが、Magentoにこのタイプのことに対する標準的な戦略があるのではないかと思いましたか? 編集 コアmagentoはこのシナリオではコレクションを使用しないようですが、代わりにリソースモデルで直接SQLクエリを使用します。 この例は次のとおりです。 loadByAccountAndDate() に Mage_Paypal_Model_Resource_Report_Settlement コレクションがより簡潔な方法であると思われるときに、書かれるコードの量の点で、これには理由があります magentoがこのように選択する理由がわかりません
15 collection  model 


1
MagentoのORMを使用して特定のIDフィールドを挿入する
MagentoのシンプルなORM(Mage_Core_Model_AbstractおよびMage_Core_Model_Resource_Abstract)を使用して、特定の主キーを持つモデル行を挿入する方法はありますか? たとえば、空のMagentoシステムに対して次を実行した場合 Mage::getModel('core/website')->setData(array ( 'website_id' => 2, 'code' => 'foo', 'name' => 'Main Website', 'sort_order' => 0, 'default_group_id' => 1, 'is_default' => 1, )); core_websiteテーブルに新しいエントリが追加される予定です。ただし、Magentoはここで静かに何もしません。 リソースを掘り下げると、データベースリソースクラスでこれに違反しているように見えます #File: app/code/core/Mage/Core/Model/Resource/Db/Abstract.php if (!is_null($object->getId()) && (!$this->_useIsObjectNew || !$object->isObjectNew())) { //update stuff here } else { //insert stuff here } モデルにはidがあり(つまり、特定のIDを挿入しています)、_useIsObjectNewハードコーディングがfalseになっているため、保存要求は常にinsertパスにルーティングされます。 デフォルトのMagentoモデルで強制的に挿入する方法はありますか?(書き換え/クラス置換なし)。 はい、生のSQLはオプションですが、イベント機能は失われます。
14 model 

4
phtmlテンプレートでgetModelクラスをインスタンス化するのは良いですか?
これは、Magentoの優れたプログラミング慣行に関する質問です。 製品を関連製品とともにサムネイルで(カテゴリ製品リストに)表示する必要があります。だから私はmypackage/mytheme/template/catalog/product/list.phtmlこのようなもので編集しました <?php $related=$_product->getRelatedProductIds(); if(count($related)>0){ echo '<div class="a'.$ap.'"></div>'; echo '<div class="li_p"><ul>'; foreach($related as $rela){ $rela_nom=Mage::getModel('catalog/product')->load($rela); echo '<li><a href="'.$rela_nom->getProductUrl().'"> <img src="'.$this->helper('catalog/image')->init($rela_nom, 'small_image')->resize(20).'" width="20" height="20"> </a><li>'; } echo '</ul></div>'; } ?> そして、それは非常にうまく機能します。 しかし、私の質問は次のとおりです。phtmlファイルでモデルクラスをインスタンス化するのは正しいですか? そうでない場合、この機能を実現する最良の方法は何でしょうか?つまり、どのファイルを編集するのが良いのか、どのクラスを追加するのが良いのか、どこですか?ヘルパー? 少し例を挙げてください。または、どのファイルを編集するほうが良いかを教えてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.