Magento 2: forma diferente de obtener el campo de una colección

8

Tengo esta clase de ayuda en 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 función getCountryIsoCode () tiene un ejemplo como parámetro ('US').
No sé por qué getIso3Code () no funciona. En cambio, getData () funciona perfectamente.

¿En Magento2 ya no hay "función mágica php para obtener el campo de la tabla de la base de datos"?
¿Hay algo mal en mi código?

Giuseppe Morelli
fuente

Respuestas:

7

El problema está 3en el nombre.
Acabo de probar y el captador de magia no juega bien con dígitos en el nombre.
El método getIso3Codeno existe, por lo que __callse llama método definido en Magento\Framework\DataObject.
La getparte se ve así.

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

la _underscoretransforma el nombre del método en la llave de datos necesarios.
Aquí está la línea que importa.

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

Acabo de ejecutar este código en http://phpfiddle.org/ :

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

y para mi sorpresa se notaba iso_3_codepero esperabas iso3_code.

Marius
fuente
Esta vez te gané :-)
Rajeev K Tomy
2
Sí. Buen trabajo. Ya hice +1 en tu respuesta.
Marius
9

No Magento 2 también usa métodos mágicos get / set. Si quieres ver esa magia. Por favor intente esto:

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

Esto generará el country_idvalor del primer objeto según su código.

Así que ahora la pregunta es qué sucede con la llamada getIso3Code(). Bueno, aquí está el giro. El captador de magia de Magento interpretará esta llamada como iso_3_codeque obviamente no está definida, por lo tanto, obtienes el nullresultado.

Por qué Magento trata esta llamada de esta manera porque usa el preg_replace()método internamente para recuperar el código real del getter mágico que estamos usando. Esto significa que, cuando llamas getCountryId(), Magento tiene una lógica interna que rastreará el código real que estás buscando country_id. Esta misma lógica interna fallará en caso de getIso3Code()que ocurra ese número 3.

Entonces, en este caso particular, es mejor usar getData('iso3_code')call.

Espero que te dé una imagen clara.

Rajeev K Tomy
fuente