Magento 2:コレクションの別の方法の取得フィールド


8

私はMagento 2にこのヘルパークラスを持っています:

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    protected $_countryFactory;

    public function __construct(
         \Magento\Directory\Model\CountryFactory $countryFactory
    )
    {
         $this->_countryFactory = $countryFactory;
    }

    public function getCountryIsoCode($country = 'US')
    {
          $country = $this->_countryFactory->create()->getCollection();
          $country->addFieldToFilter('country_id', array('eq' => country));

          $countryCode = $country->getFirstItem()->getIso3Code());
          $countryCode2 = $country->getFirstItem()->getData('iso3_code'));

          // $countryCode => null
          // $countryCode2 => 'USA'

          return $countryCode;
     }
}

関数getCountryIsoCode()には、パラメーター( 'US')の例があります。getIso3Code()が機能しないの
はなぜですか。代わりに、getData()は完全に機能します。

Magento2では、「データベーステーブルフィールドを取得するためのPHPマジック関数」はもうありませんか?
私のコードに何か問題がありますか?

回答:


7

問題は3名前にあります。
私はテストしたばかりで、マジックゲッターは名前に数字を使用するとうまく機能しません。
メソッドgetIso3Codeが存在しないため、代わりに、__callで定義されているメソッドが呼び出されMagento\Framework\DataObjectます。一部はこのようになります。
get

$key = $this->_underscore(substr($method, 3));
$index = isset($args[0]) ? $args[0] : null;
return $this->getData($key, $index);

_underscore必要なデータキーにメソッド名を変換します。
ここに重要な行があります。

$result = strtolower(trim(preg_replace('/([A-Z]|[0-9]+)/', "_$1", $name), '_'));

私はこのコードをhttp://phpfiddle.org/で実行しました

$name = 'iso3_code';
echo strtolower(trim(preg_replace('/([A-Z]|[0-9]+)/', "_$1", $name), '_'));

そして、驚いたことに、それは示したiso_3_codeが、あなたは期待したiso3_code


今回はあなたを倒しました:-)
Rajeev K Tomy

2
うん。よくやった。私はすでにあなたの答えを+1しました。
マリウス

9

Magento 2はget / setマジックメソッドも使用しません。それらの魔法を見たいなら。これを試してください:

$countryId = $country->getFirstItem()->getCountryId();
echo $countryId;

これによりcountry_id、コードに従って最初のオブジェクトの値が出力されます。

だから今問題は呼び出しで何が起こったかですgetIso3Code()。さて、ここにひねりがあります。Magentoのマジックゲッターは、この呼び出しをiso_3_code明らかに未定義として解釈するためnull、結果として得られます。

Magentoがこの呼び出しをこのように扱う理由は、Magentoがpreg_replace()内部でメソッドを使用して、使用しているマジックゲッターから実際のコードを取得するためです。つまり、を呼び出すとgetCountryId()、Magentoには、探している実際のコードをトレースする内部ロジックがありますcountry_id。この同じgetIso3Code()番号の発生により、同じ内部ロジックが失敗し3ます。

したがって、この特定のケースでは、getData('iso3_code')call を使用することをお勧めします。

それがあなたに明確な絵を与えることを願っています。

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