Đặt và nhận các đối số khối theo chương trình


8

Trong bố cục khi tôi tạo một khối, tôi có thể đặt các đối số tùy chỉnh, ví dụ:

<block class="Company\Module\Block\Hello" name="block_name" template="test.phtml">
    <arguments>
        <argument name="my_arg" xsi:type="string">testvalue</argument>
    </arguments>
</block>

Sau này tôi có thể truy xuất đối số như thế này trong khối:

$arg = $this->getMyArg();

Khi tôi tạo một khối theo chương trình (theo phương thức này: link ) tôi có thể đặt các đối số tùy chỉnh như thế này:

$block = $this->frameworkViewLayout
    ->createBlock(
        "Company\Module\Block\Hello",
        "block_name",
        ['my_arg' => 'testvalue']
    )
    ->setData('area', 'frontend')
    ->setTemplate($template)
    ->toHtml();

Khối được tạo chính xác và nó hoạt động hoàn hảo. Nhưng tôi không chắc làm thế nào sau này tôi có thể truy xuất đối số trong lớp của khối . Tôi đã cố gắng làm điều đó như thế này:

$arg = $this->getMyArg();

hoặc là

$arg = $this->getData('my_arg');

Nhưng nó không trả về gì cả. Tôi đã bỏ lở những gì?

Câu trả lời:


17

Nếu bạn nhìn xa hơn trong mã, trong \Magento\Framework\View\Layout\Generator\Blocklớp, createBlockhàm chỉ thêm dữ liệu từ $arguements['data']phần tử. Vì vậy, tôi nghĩ bạn nên thay đổi mã của mình thành thế này:

$block = $this->frameworkViewLayout
    ->createBlock(
        "Company\Module\Block\Hello",
        "block_name",
        [
            'data' => [
                'my_arg' => 'testvalue'
            ]
        ]
    )
    ->setData('area', 'frontend')
    ->setTemplate($template)
    ->toHtml();

Sau đó, bạn có thể sử dụng getMyArg()hoặc getData('my_arg').


Điều gì xảy ra nếu đối số trong mảng Cách chuyển đổi nếu đối số nằm trong mảng như <block class = "Company \ Module \ Block \ Hello" name = "block_name" template = "test.phtml"> <argument> <argument name = "jsLayout" xsi: type = "mảng"> <item name = "thành phần" xsi: type = "mảng"> <item name = "msp-recaptcha" xsi: type = "mảng"> <item name = "thành phần" xsi: type = "chuỗi"> MSP_ReCaptcha / js / reCaptcha </ item> <item name = "area" xsi: type = "string"> tạo </ item> </ item> </ item> </ argument> </ argument>
ký sinh trùng sakariya

Tôi đã sử dụng mã của bạn nhưng tôi chỉ nhận được phần cơ thể chứ không phải cuộc gọi đầu trang và chân trang
Jinesh

2

Bạn có thể gán trực tiếp bất kỳ biến nào như,

$block = $this->_layout
    ->createBlock('Magento\Framework\View\Element\Template')
    ->setTemplate('Company_Namespace::index.phtml')
    ->setResponse('response')
    ->toHtml();
return $block;

và để có được giá trị biến trong tệp temTable,

echo $block->getResponse();

1

lưu ý khi gửi mảng 'dữ liệu' với các đối số như được đề cập bởi Jackie tại đây:

$block = $this->frameworkViewLayout
->createBlock(
    "Company\Module\Block\Hello",
    "block_name",
    [
        'data' => [
            'my_arg' => 'testvalue'
        ]
    ]
)
->setData('area', 'frontend')
->setTemplate($template)
->toHtml();

tránh tiêm biến dữ liệu $ trong định nghĩa khối (phương thức __construct)


Tôi xin lỗi nhưng tôi không hiểu ý của bạn. Bạn có thể giải thích?
zitix

0

Tôi khá mới với Magento 2, nhưng hãy thử sử dụng $my_arghoặc $block->getMyArg().

Bạn nên tránh sử dụng $this, bạn nên sử dụng $block.

Gọi $thissẽ kích hoạt một phương thức proxy đến $blocklớp, nhưng tôi đã gặp vấn đề với các phương thức ma thuật như getters.


Tôi đang sử dụng nó trong lớp block ( Company\Module\Block\Hello.php) vì vậy tôi cần sử dụng $this. Biến $blockkhông tồn tại ở đó vì vậy nếu tôi cố gắng sử dụng, tôi sẽ gặp lỗi Notice: Undefined variable: block.
zitix

Ồ, xin lỗi, tôi hiểu bạn đang sử dụng trong một tệp mẫu.
Phoenix128_RiccardoT

Bạn đã thử sử dụng $ my_arg làm tham số trong hàm tạo của bạn và kiểm tra nó chưa?
Phoenix128_RiccardoT
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.