Magento 2: Auf andere Weise Feld einer Sammlung erhalten

8

Ich habe diese Hilfsklasse in 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;
     }
}

Die Funktion getCountryIsoCode () hat ein Beispiel als Parameter ('US').
Ich weiß nicht, warum getIso3Code () nicht funktioniert. Stattdessen funktioniert getData () einwandfrei.

In Magento2 gibt es keine "PHP Magic-Funktion zum Abrufen des Datenbanktabellenfelds" mehr?
Stimmt etwas in meinem Code nicht?

Giuseppe Morelli
quelle

Antworten:

7

Das Problem ist das 3im Namen.
Ich habe es gerade getestet und der Magic Getter spielt nicht gut mit Ziffern im Namen.
Die Methode getIso3Codeexistiert nicht, daher wird die Methode __callaufgerufen, die in definiert ist Magento\Framework\DataObject.
Das getTeil sieht so aus.

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

Das _underscorewandelt den Methodennamen in den benötigten Datenschlüssel um.
Hier ist die Linie, die zählt.

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

Ich habe diesen Code gerade auf http://phpfiddle.org/ ausgeführt :

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

und zu meiner Überraschung zeigte es sich, iso_3_codeaber Sie haben erwartet iso3_code.

Marius
quelle
Diesmal habe ich dich geschlagen :-)
Rajeev K Tomy
2
Ja. Gute Arbeit. Ich habe bereits + 1 Ihre Antwort erhalten.
Marius
9

Kein Magento 2 verwendet auch magische Methoden zum Abrufen / Festlegen. Wenn du diese Magie sehen willst. Bitte versuchen Sie dies:

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

Dadurch wird der country_idWert des ersten Objekts gemäß Ihrem Code ausgegeben .

Nun stellt sich die Frage, was mit dem Anruf passiert getIso3Code(). Nun, hier ist die Wendung. Magentos magischer Getter interpretiert diesen Aufruf als iso_3_codeoffensichtlich undefiniert, daher erhalten Sie nullals Ergebnis.

Warum Magento diesen Aufruf so behandelt, weil es preg_replace()intern eine Methode verwendet , um den echten Code von dem von uns verwendeten Magic Getter abzurufen. Dies bedeutet, dass getCountryId()Magento beim Aufrufen über eine interne Logik verfügt, die den tatsächlichen Code ermittelt, nach dem Sie suchen country_id. Dieselbe interne Logik schlägt im Falle des getIso3Code()Auftretens dieser Nummer fehl 3.

In diesem speziellen Fall ist es daher besser, den getData('iso3_code')Anruf zu verwenden .

Ich hoffe, das gibt Ihnen ein klares Bild.

Rajeev K Tomy
quelle