Magento 2: cara berbeda mendapatkan bidang koleksi

8

Saya memiliki kelas pembantu ini di 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;
     }
}

Fungsi getCountryIsoCode () memiliki contoh sebagai parameter ('AS').
Saya tidak mengerti mengapa getIso3Code () tidak berfungsi. Sebaliknya getData () berfungsi dengan sempurna.

Di Magento2 tidak ada lagi "fungsi sulap php untuk mendapatkan bidang tabel basis data" lagi?
Apakah ada yang salah dalam kode saya?

Giuseppe Morelli
sumber

Jawaban:

7

Masalahnya adalah 3dalam nama.
Saya baru saja menguji dan pembuat sihir tidak bermain baik dengan angka dalam nama.
Metode getIso3Codetidak ada, jadi, sebaliknya metode __callini disebut yang didefinisikan dalam Magento\Framework\DataObject.
The getbagian terlihat seperti ini.

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

yang _underscoremengubah nama metode menjadi kunci data yang diperlukan.
Inilah garis yang penting.

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

Saya baru saja menjalankan kode ini di http://phpfiddle.org/ :

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

dan mengejutkan saya itu menunjukkan iso_3_codetetapi Anda harapkan iso3_code.

Marius
sumber
Kali ini aku mengalahkanmu :-)
Rajeev K Tomy
2
Ya. Kerja bagus. Saya sudah memberi +1 jawaban Anda.
Marius
9

No Magento 2 juga menggunakan metode sulap get / set. Jika Anda ingin melihat keajaiban itu. Silakan coba ini:

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

Ini akan menampilkan country_idnilai objek pertama sesuai kode Anda.

Jadi sekarang pertanyaannya adalah apa yang terjadi dengan panggilan itu getIso3Code(). Nah, ini twistnya. Pembuat sihir Magento akan menafsirkan panggilan ini sebagai iso_3_codeyang jelas tidak terdefinisi, maka Anda dapatkan nullhasilnya.

Mengapa Magento memperlakukan panggilan ini dengan cara ini karena, ia menggunakan preg_replace()metode internal untuk mengambil kode asli dari pembuat sihir yang kami gunakan. Ini berarti, ketika Anda menelepon getCountryId(), Magento memiliki logika internal yang akan melacak kode nyata yang Anda cari country_id. Logika internal yang sama ini akan gagal jika terjadi getIso3Code()karena nomor tersebut 3.

Jadi dalam kasus khusus ini, lebih baik menggunakan getData('iso3_code')panggilan.

Semoga itu akan memberi Anda gambaran yang jelas.

Rajeev K Tomy
sumber