タグ付けされた質問 「best-practice」

Magentoのベストプラクティスに関連する質問を示します。

3
Magento:製品属性を更新する最速の方法
大量の属性を更新するための最速かつ信頼性の高い方法を探しています。以下は認識している方法ですが、どちらに行くべきかわかりません。 $store_id = 0; Mage::getSingleton('catalog/product_action')->updateAttributes( array($product_id), array('attribute_code' => $attribute_code), $store_id ); または $product->setData($attribute_code, 1234); $product->getResource()->saveAttribute($product, $attribute_code);

1
Magento 2でconfig.phpを管理する方法
まず第一に、すでに答えられた質問かもしれませんが、私はその主題について何も見つけませんでした。 これは問題ではなく、config.phpMagento 2でファイルを管理する最良の方法についての質問です。 実際、config.phpバージョン管理されていないため(デフォルトではM2 .gitignoreファイル)、リポジトリにありません。問題は、誰かがこのファイルを持たないプロジェクトをインストールするとき、彼はすでにデータベースを持っているのでbin/magento setup:install ...、ファイルを生成するために実行できないことです。ファイルが存在し、モジュールを追加できる場合にのみ、宣言されていないモジュールを追加する ことを認識していますが、プロジェクトを展開またはインストールするたびに起動しないようにしたいと思います。 bin/magento setup:upgradeconfig.phpbin/magento module:enable 私の質問: -削除config.phpし.gitignore、バージョン管理する必要がありますか? -リポジトリに最初に追加して、.gitignore後で追加する必要がありますか? -このファイルを管理する最良の方法は何ですか?

5
Magento2:CSSファイルを変更するためのベストプラクティス
cssファイルを変更したいpub/static/frontend/Magento/luma/en_US/css/styles-l.css。 最初、このファイルはpub / staticフォルダーに存在せず、 vendor/magento/theme-frontend-blank/web/css/styles-l.less (it's styles-l.less) を使用して静的コンテンツを展開するとphp bin/magento setup:static-content:deploy、それに関連するpub / staticに2つのファイルが作成されます。 1. pub/static/frontend/Magento/luma/en_US/css/styles-l.less 2. pub/static/frontend/Magento/luma/en_US/css/styles-l.css 私は支援を受けた開発者であり、モジュールの開発中にpub / staticに存在するものはすべて削除する傾向があります(.htaccessを除く)。だから私には、直接変更するのに最適なオプションではないようですpub/static/frontend/Magento/luma/en_US/css/styles-l.css。 その場合、上記のCSSファイルを変更するためのベストプラクティスは何ですか? 1.変更するpub/static/frontend/Magento/luma/en_US/css/styles-l.lessか、または 2.pub/static(開発中に)すべてを削除できるという理解が間違っているためpub/static/frontend/Magento/luma/en_US/css/styles-l.css、変更する必要があり、削除しないでください。

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ファイルでモデルクラスをインスタンス化するのは正しいですか? そうでない場合、この機能を実現する最良の方法は何でしょうか?つまり、どのファイルを編集するのが良いのか、どのクラスを追加するのが良いのか、どこですか?ヘルパー? 少し例を挙げてください。または、どのファイルを編集するほうが良いかを教えてください。

1
tryブロックとcatchブロックの両方に同じコードを配置する正当な理由はありますか?
ファイル:app/code/core/Mage/Adminhtml/Block/Widget/Grid/Column/Renderer/Datetime.phpでは、render()メソッド内で、tryブロックとcatchブロックの両方でまったく同じコードが実行されているようです。例外はまったく処理されません。私はこのようなコードを書く理由(もしあれば)を知りたいです: try { $data = Mage::app()->getLocale() ->date($data, Varien_Date::DATETIME_INTERNAL_FORMAT)->toString($format); } catch (Exception $e) { $data = Mage::app()->getLocale() ->date($data, Varien_Date::DATETIME_INTERNAL_FORMAT)->toString($format); }

1
大量のアクションでループの保存を回避する
CMSページの場合と同様のインライン編集アクションを含む独自のCRUDモジュールを作成しました。 すべてが正常に動作しますが、EcgM2標準で phpsnifferを実行すると、次の警告が表示されます。 ループで検出されたモデルLSDメソッドsave() どうすればこれを回避できますか? 注:上記のリンクされたコアファイルを「スニッフィング」すると、同じ警告が表示されます。 ここにexecute誰かがそれを必要とする場合の私の方法があります。しかし、それはCMSページコントローラーからのものと非常に似ています public function execute() { /** @var \Magento\Framework\Controller\Result\Json $resultJson */ $resultJson = $this->jsonFactory->create(); $error = false; $messages = []; $postItems = $this->getRequest()->getParam('items', []); if (!($this->getRequest()->getParam('isAjax') && count($postItems))) { return $resultJson->setData([ 'messages' => [__('Please correct the data sent.')], 'error' => true, ]); } foreach (array_keys($postItems) …

3
Magento 2でAJAXを使用してHTMLをレンダリングする方法
Magento 2でAJAXを介してHTMLをレンダリングする最良の方法を見つけようとしています。 方法1:レイアウトなしでコントローラーを使用する ファイル Foo/Bar/Controller/Popin/Content.php <?php namespace Foo\Bar\Controller\Popin; use Magento\Framework\App\Action\Action; use Magento\Framework\App\Action\Context; /** * Class Content */ class Content extends Action { /** * Content constructor. * * @param Context $context */ public function __construct( Context $context ) { parent::__construct($context); } /** * */ public function execute() { /** @var …

3
getExtensionAttributes()を実装する正しい方法
拡張可能なEAVモデルを実装するための正しい方法は何かと思っていました。 私はその中を見るMagento\Catalog\Model\Product方法は、getExtensionAttributes()次のように実装されています。 public function getExtensionAttributes() { $extensionAttributes = $this->_getExtensionAttributes(); if (!$extensionAttributes) { return $this->extensionAttributesFactory->create('Magento\Catalog\Api\Data\ProductInterface'); } return $extensionAttributes; } しかし、顧客モデルやカテゴリモデルなど、他のモデルでは public function getExtensionAttributes() { return $this->_getExtensionAttributes(); } これは、extension_attributesキーが以前に設定されていない場合、NULLの結果になる可能性があります。 実用的には、最初の方を好みます。これによりMagento\Framework\Api\ExtensionAttributesInterface、モデルがインスタンス化されたばかりの場合でも、常にのインスタンスを確実に取得できます。 しかし、なぜそれが他のモジュールで使用されないのですか?カスタマーモジュールに表示されるデータモデルの新しい分離に反対ですか?もしそうなら、拡張属性をどのように初期化するべきですか?

4
製品属性を結合するためのベストプラクティス
製品リファレンスを含むカスタムテーブルがありますproduct_id。次に、バックエンドグリッドに製品情報(SKU、名前)を表示したいのですが、これを行うためのベストプラクティスが何なのかわかりません。 SKU次のように私の推測は次のとおりです。 $collection->join( 'catalog/product', 'product_id=`catalog/product`.entity_id', array('product_sku' => 'sku') ) ( 私のグリッドブロッククラスのメソッドからのコード_prepareCollection() ) しかし、製品名はどうですか?これは、catalog_product_entity_varcharにあります。私の理解では、独自のリソースモデルとコレクションがベースになってMage_Eav_Model_Entity_Collection_Abstractいる場合は、のようなメソッドを使用できるため、簡単に入手できますjoinAttribute。しかし、私のモデルは単純なテーブルに基づいており、そこから拡張されてMage_Core_Model_Resource_Db_Collection_Abstractおり、joinAttribute利用できる方法はありません。 この場合、製品名を取得する最良の方法は何ですか? あなたの時間と助けをありがとう:-) 更新: より正確には、リソースモデルとコレクションについて話していました。次のようないくつかの属性を持つ単純なフラットテーブルと一致します。 entity_id product_id created_at user_id 私の意図は、いくつかの統計を表示するバックエンドにグリッドを配置することです。 ProductSku Count(ProductSku) MAX(created_at) 私の知る限り、これを行うための最善の方法は、グリッドブロッククラスを使用することであり、実行するメソッドは_prepareCollection()です。 私の方法は次のようになります: protected function _prepareCollection() { // Get and set our collection for the grid $collection = Mage::getResourceModel($this->_getCollectionClass()); $collection ->join( 'catalog/product', 'product_id=`catalog/product`.entity_id', array('product_sku' => 'sku') …


3
ECGコンプライアンス:方法
以下のようなものがあるcoding standardためMagentoの1と呼ばれます、ECG使用すべきではない、多くの物事は避けるべきどこかの方法が。 コードで「エラー」または「警告」をスローするすべてのケースをカバーするリストを作成してみましょう。 以下に、考えられるすべての警告のリストを示します。私はこの投稿を定期的に更新し、与えられた回答と投票された回答へのリンクを追加します。 注意:回答の重複を避けてください;) ダウンロード:https : //github.com/magento-ecg/coding-standard ECGスニフ クラス Mysql4 Mysql4クラスは廃止されました。 リソースモデルを書き換えるときに非推奨の「Mysql4」クラスを処理する方法 リソースフォルダーをMysql4からResourceに変更すると、Magento 1.9モジュールが奇妙に壊れる オブジェクトのインスタンス化 Magentoでは、オブジェクトの直接インスタンス化(クラス%s)は推奨されていません。 protected $disallowedClassPrefixes = array( 'Mage_', 'Enterprise_', ); ... PHP 後藤 gotoの使用はお勧めしません。 ... 名前空間 "'。$ exceptionClassName。'"クラスの名前空間が指定されていません。 ... プライベートクラスメンバー プライベートクラスメンバーが検出されました。 ... Var プライベートクラスメンバーが検出されました。 ... パフォーマンス コレクション数 Magentoデータコレクションの不要な読み込み。代わりにgetSize()メソッドを使用してください。 コレクションにアイテムがあるかどうかを確認するにはどうすればよいですか? FetchAll fetchAll()は、大きなデータセットの場合、メモリ効率が悪い場合があります。 ... GetFirstItem getFirstItem()は、コレクションのロード結果を1つのアイテムに制限しません。 GetFirstItem- https: …

2
(モデル)リライトを適切に無効にする方法
特定のMagentoコアクラスを書き換えるサードパーティの拡張機能があります。ブロック、ヘルパー、モデルのいずれでもかまいませんが、この場合はモデルです。今、私はこの書き換えが悪いことに遭遇し、サードパーティの拡張機能を変更せずに無効にしたいと思います。したがって、サードパーティの拡張機能に依存するカスタム拡張機能を記述します。サードパーティの書き換えを無効にする最良の方法は何ですか?安全に考えられるのは、サードパーティの書き換えの代わりに使用されるカスタムの書き換えを定義することです。 <global> <models> <custom_extension> <class>Custom_Extension_Model</class> </custom_extension> <mage_core> <rewrite> <sth>Custom_Extension_Model_Sth</sth> </rewrite> </mage_core> </models> </global> Sth.php、クラスはMageクラスから直接拡張されているため、サードパーティによる書き換えを無効にします。 class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth { } これは機能しますが、あまり気分が良くありません。オブザーバーについて考えると、それらをに設定することにより、config.xmlを介してのみオブザーバーを無効にすることができますdisabled。このようなことは書き換えで可能ですか?私は以下を使用しようとしましたが、うまくいきました: <global> <models> <mage_core> <rewrite> <sth></sth> </rewrite> </mage_core> </models> </global> しかし、それは安全ですか?すべてのバージョンで機能しますか?私はそれを野生で見たことがないので、私は尋ねています。

5
私が開発した拡張機能とインターフェースするサードパーティのライブラリからの.php、.js、.html、.cssファイルをどこに置きますか?
たとえば、オープンソースのグラフ作成パッケージや画像ギャラリーなど、拡張機能自体の一部ではないものにインターフェイスするMagento拡張機能を開発したいとします。(拡張機能とは別に)ダウンロードすると、サードパーティのlibは、すべての.php、.js、.html、および.cssをまとめた独自の単一の.zipで提供されます。 私の拡張機能をサードパーティのlibと一緒にインストールしたい貧しいサイト所有者に配置しますか?元のサードパーティの.zipを分離して、.jsを/ jsに、.phpを/ libに配置する負担になります。 / skinなどのcss? または、ダウンロードしたままの状態で簡単に解凍して処理できるサードパーティの.zipについて、一般に受け入れられている「ダンピンググラウンド」はありますか?

3
Magento 1:エンティティを削除するためのパフォーマンス最適化
現在、パフォーマンスに関していくつかのモジュールを改善しようとしています。 コレクションでのメソッドの使用法を知っている方もいるかもしれません。これは、製品を直接ループするのを回避するのに非常に役立ちます。walk() さらに、@ Vinaiのおかげで、コレクションdelete()メソッドを使用することもできます。 しかし、Magento 1のネイティブファイルは、これらの方法のいずれかを使用して削除するとは限らないことに気づきました。 私が見てきた最悪のコードの一つがあるmassDelete()からメソッドapp/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.phpどこの製品は、削除前のループでロードされます。 foreach ($productIds as $productId) { $product = Mage::getSingleton('catalog/product')->load($productId); Mage::dispatchEvent('catalog_controller_product_delete', array('product' => $product)); $product->delete(); } そこで、パフォーマンステストをいくつか行い、ロギングの呼び出しをいくつか追加して、100製品の削除にかかった時間とメモリ使用量を確認しました。 テスト1:walkメソッド 上記に貼り付けた元のコードを次のコードに置き換えました。 $collection = Mage::getResourceModel('catalog/product_collection') ->addAttributeToSelect('entity_id') ->addIdFilter($productIds) ->walk('delete'); そして私の結果は私のくだらない開発サーバーで次のとおりです(10回のテストに基づく平均): 元のコード:19.97秒、15.84MB使用 カスタムコード:17.12秒、15.45MB使用 したがって、100個の製品を削除すると、私のカスタムコードは3秒速くなり、使用するメモリは0.4MB少なくなります。 テスト2:コレクションdelete()メソッドの使用 元のコードを次のコードに置き換えました: $collection = Mage::getResourceModel('catalog/product_collection') ->addAttributeToSelect('entity_id') ->addIdFilter($productIds) ->delete(); そしてここで吹き飛ばされた心は結果です: 元のコード:19.97秒、15.84MB使用 カスタムコード:1.24秒、6.34MB使用 したがって、100個の製品を削除すると、私のカスタムコードは18秒速くなり、使用するメモリは9MB少なくなります。 コメントで述べたように、このメソッドはMagentoイベント(ロード後、削除後)も、インデックス/キャッシュフラッシュもトリガーしないようです。 質問 だから私の質問は:Magentoコアチームがループで製品をロードするのではなくwalk('delete')、コレクションdelete()メソッドを使用しない理由がありますか? 主な目標は、モジュール開発の場合は、そのようなキーポイントに注意することがある:1を使用することはできませんいずれかの特定の例があるwalk/収集delete()方法は? …

2
モジュールがあるときにテーマを使用する理由
カスタムモジュール内にファイルを追加しました Vendor/Theme/view/layout/default.xml カスタムモジュールのテンプレート/ブロック/レイアウトでサイトのグローバルテンプレートの多くをオーバーライドするために使用しています。またview/web、そのモジュールのディレクトリにある独自のグローバルスタイルをアタッチしています。 代わりにこれにテーマを使用する必要がありますか?あるデザインパターンに対して他のデザインパターンについて良い議論はありますか?例えば。app/design以上を使用してapp/code?

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