Magento 2: manière différente d'obtenir le champ d'une collection

8

J'ai cette classe d'aide dans 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;
     }
}

La fonction getCountryIsoCode () a un exemple comme paramètre ('US').
Je ne comprends pas pourquoi getIso3Code () ne fonctionne pas. Au lieu de cela, getData () fonctionne parfaitement.

Dans Magento2, il n'y a plus de "fonction php magic pour obtenir le champ de la table de base de données"?
Y a-t-il quelque chose qui ne va pas dans mon code?

Giuseppe Morelli
la source

Réponses:

7

Le problème est le 3dans le nom.
Je viens de tester et le getter magique ne joue pas bien avec les chiffres du nom.
La méthode getIso3Coden'existe pas, donc, à la place, la méthode __callappelée est définie dans Magento\Framework\DataObject.
La getpartie ressemble à ceci.

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

le _underscoretransforme le nom de la méthode en clé de données nécessaire.
Voici la ligne qui compte.

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

Je viens d'exécuter ce code sur http://phpfiddle.org/ :

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

et à ma grande surprise, cela s'est montré iso_3_codemais vous vous attendiez iso3_code.

Marius
la source
Cette fois, je vous ai battu :-)
Rajeev K Tomy
2
Oui. Bon travail. J'ai déjà attribué +1 à votre réponse.
Marius
9

Non Magento 2 utilise également des méthodes magiques get / set. Si vous voulez voir cette magie. Veuillez essayer ceci:

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

Cela affichera la country_idvaleur du premier objet selon votre code.

Alors maintenant, la question est de savoir ce qui se passe avec l'appel getIso3Code(). Eh bien, voici la torsion. Le getter magique de Magento interprétera cet appel comme iso_3_codeétant évidemment indéfini, d'où nullle résultat.

Pourquoi Magento traite cet appel de cette façon, car il utilise une preg_replace()méthode en interne pour récupérer le vrai code à partir du getter magique que nous utilisons. Cela signifie que lorsque vous appelez getCountryId(), Magento a une logique interne qui va tracer le vrai code que vous recherchez country_id. Cette même logique interne échouera en cas de en getIso3Code()raison de l'occurrence de ce nombre 3.

Donc, dans ce cas particulier, il vaut mieux utiliser getData('iso3_code')call.

J'espère que cela vous donnera une image claire.

Rajeev K Tomy
la source