Magento 2: cách khác nhau có được lĩnh vực của một bộ sưu tập


8

Tôi có lớp người trợ giúp này trong 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;
     }
}

Hàm getCountryIsoCode () có một ví dụ là tham số ('US').
Tôi không biết tại sao getIso3Code () không hoạt động. Thay vào đó, getData () hoạt động hoàn hảo.

Trong Magento2 không còn "chức năng ma thuật php để lấy trường bảng cơ sở dữ liệu" nữa?
Có cái gì đó sai trong mã của tôi?

Câu trả lời:


7

Vấn đề là 3trong tên.
Tôi mới thử nghiệm và ma thuật getter không chơi tốt với các chữ số trong tên.
Phương thức getIso3Codekhông tồn tại, vì vậy, thay vào đó, phương thức __callđược gọi là được định nghĩa trong Magento\Framework\DataObject.
Phần gettrông như thế này.

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

các _underscorebiến tên phương pháp thành chìa khóa dữ liệu cần thiết.
Đây là dòng quan trọng.

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

Tôi vừa chạy mã này trên http://phpfiddle.org/ :

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

và tôi ngạc nhiên khi nó cho thấy iso_3_codenhưng bạn mong đợi iso3_code.


Lần này tôi đánh bại bạn :-)
Rajeev K Tomy

2
Vâng. Công việc tốt đẹp. Tôi đã + 1'd câu trả lời của bạn.
Marius

9

Không Magento 2 cũng sử dụng các phương thức ma thuật get / set. Nếu bạn muốn xem những điều kỳ diệu. Vui lòng thử điều này:

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

Điều này sẽ xuất country_idgiá trị của đối tượng đầu tiên theo mã của bạn.

Vì vậy, bây giờ câu hỏi là những gì xảy ra với cuộc gọi getIso3Code(). Vâng, đây là xoắn. Người nhận ma thuật của Magento sẽ diễn giải cuộc gọi này vì iso_3_coderõ ràng là không xác định, do đó bạn sẽ nhận được nullkết quả.

Tại sao Magento xử lý cuộc gọi này theo cách này bởi vì, nó sử dụng preg_replace()phương thức bên trong để lấy mã thực từ trình nhận ma thuật mà chúng ta đang sử dụng. Điều này có nghĩa, khi bạn gọi getCountryId(), Magento có một logic bên trong sẽ tìm ra mã thực mà bạn đang tìm kiếm country_id. Logic nội bộ tương tự này sẽ thất bại trong trường hợp getIso3Code()do sự xuất hiện của số đó 3.

Vì vậy, trong trường hợp cụ thể này, tốt hơn là sử dụng getData('iso3_code')cuộc gọi.

Hy vọng rằng sẽ cung cấp cho bạn một hình ảnh rõ ràng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.