Magento 2'de Soyut Sınıfa Yeni Bir Yöntem Ekleme


16

Konuyu der ki: Magento 2 soyut sınıf geçersiz kıl içinde Magento 1 ,

Tamamen yeni bir sınıf oluşturabilirim. Magento 2'de eklentileri kullanmamız gerekiyor, ancak eklentiler sadece var olan yöntemleri değiştirmeme izin veriyor. Yeni bir yöntem eklemek istersem ne yapmam gerekir?

Misal:

Bu sınıfın vendor/magento/module-ui/Component/AbstractComponent.phpbir bileşen dizisi $componentsvardır : o dizinin öğelerini ayarlamak / silmek için bir işlev yoktur. Peki bu işlevi nasıl oluşturabilirim?

Yanıtlar:


0

Sınıfı tamamen geçersiz kılmadan bunu nasıl yapabileceğinizi anlamıyorum. Örneğin, "devre dışı" öğeyi XML'deki "veri" bağımsız değişkenine ayarlayarak bileşenleri tek tek devre dışı bırakabilirsiniz. Örneğin:

<?xml version="1.0" encoding="UTF-8"?>

<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="general">
        <field name="title">
            <argument name="data" xsi:type="array">
                <item name="disabled" xsi:type="boolean">true</item>
            </argument>
        </field>
    </fieldset>
</form>

Bu, 'başlık' $componentsdiziden etkili bir şekilde kaldırır .

Bunun nedeni sınıftaki createChildComponentyöntemdir Magento\Framework\View\Element\UiComponentFactory:

 protected function createChildComponent(
        array $bundleComponents,
        ContextInterface $renderContext,
        $identifier
    ) {
        list($className, $arguments) = $this->argumentsResolver($identifier, $bundleComponents);
        if (isset($arguments['data']['disabled']) && (int)$arguments['data']['disabled']) {
            return null;
        }
        $components = [];
        foreach ($bundleComponents['children'] as $childrenIdentifier => $childrenData) {
            $children = $this->createChildComponent(
                $childrenData,
                $renderContext,
                $childrenIdentifier
            );
            $components[$childrenIdentifier] = $children;
        }
        $components = array_filter($components);
        $arguments['components'] = $components;
        if (!isset($arguments['context'])) {
            $arguments['context'] = $renderContext;
        }

        return $this->objectManager->create($className, $arguments);
    }

Aradığım şey bu değil ... Soyut sınıfa yeni yöntemler eklemenin bir yolunu istiyorum ... bu sadece bir örnektir ... örneğin, öğeleri dinamik olarak kaldırmak istersem ne olur? Yorumunuzda bunu nasıl yaptığınızı "tam geçersiz kılma" dan bahsediyorsunuz ??
Matias

Daha sonra soyut sınıfı genişleten bir sınıfta yeni yöntemlerinizi tanımlamanız ve daha sonra sınıfınızdan devralan ve di.xml'de tercihleri ​​ayarlayan soyut sınıfın alt sınıfları için sınıflar oluşturmanız gerekir. Demek istediğim 'sınıfı tamamen geçersiz kılmak'. Bunu yapmaktan kaçınmanın bir örneğini göstermeye çalışıyordum.
Aaron Allen

Evet, seni anlıyorum ... ama çözüm hiç ölçeklenebilir değil ... M2'nin soyut sınıfları geçersiz kılma olasılığını ortadan kaldırdığına inanamıyorum ... Onu kaldırmak yerine onu geliştireceklerini düşündüm .. .
Matias


0

otomatik yükleyicide M1'de bir sınıfın topluluk veya yerel dizin aracılığıyla aşırı yüklenmesi (bağlandığınız soruda önerildiği gibi) M1'de çok iyi nedenlerle kötü uygulama olarak kabul edildi.

Çoğunlukla orijinal sınıf yerlerde değiştirilirse Magento örneğinizi yükseltme yeteneğini kaybedersiniz, aşırı yüklenmiş sınıfınızda dikkate almazsınız.

Aslında, soyut bir sınıfa gerçekten yöntemler eklemeniz gereken herhangi bir usecase'i düşünemiyorum, çünkü her zaman kendi sınıfınıza kendi mantığınızı ekleyebileceğiniz bir eklenti / gözlemci / viewModel / xml config

En iyi yol, soyut sınıfı özel kullanım durumunuz için genişleten yeni bir sınıfı tanıtmak ve daha sonra sınıfınızı gerektiğinde kullanmaktır.

Bir Ui Bileşeninden öğeleri kaldırmanız gerekiyorsa, bunu düzen / düzen işlemcisindeki bir eklenti / gerektiren js dosyasını değiştirerek yapmanın daha iyi bir yolu da olabilir.

Bu nedenle, spesifik kullanıcı tabanınızı tanımlarsanız, bunun daha iyi bir cevabı olabilir.


Biliyorum, bunu yapmak kötü bir uygulamadır, ama en azından bunu yapmanın bir yolu var. Örneğin, yüklediğiniz her bir model için önbellek eklemek istediğiniz durumu düşünün. Bu, soyut sınıftaki load yöntemini değiştirerek yapılabilir ve daha sonra bu değişiklik tüm sınıflara yayılır. Buna sahip değilseniz, sahip olduğunuz her modeli değiştirmeniz gerekir ve bu kesinlikle ölçeklenebilir değildir.
Matias

İkinci bir kullanım örneği, bilette söylediğim şeyi yapmak, bu dizideki öğeleri unet / silmek (örnek olarak düşünün), başka bir şey düşünebilirsiniz ... yeni bir işlev oluşturmanız gerekir soyut sınıfta, aksi takdirde, her sınıfta aynı işlevi yaratmak zorunda kalacaksınız ve bu da yine ölçeklenebilir değil ... Ve daha da kötüsü, çünkü Magento çekirdeğindeki değişkenler korunmak yerine özeldir, Bunu yapmanın tek yolu soyut sınıfta bir yöntem eklemektir ...
Matias

ilk örnek, soyut modele bir eklenti ekleyerek ve model başına yükün sonucunu önbelleğe alarak kesinlikle kolaydır. Soyut modelin değiştirilmesinden sonra gelecekteki her güncellemeyi kıracak olan soyut sınıfı aşırı yüklemekten çok daha iyi olurdu. İkinci "örnek" olarak size çok fazla şey söyleyemem, çünkü temelde gerçek kullanım durumunuzu belirtmek yerine soyut sınıfa tam olarak bir yöntem eklemek istediğinizi
David Verholen

btw Magento2'de hala mümkündür çünkü besteci otomatik yükleyiciyi manipüle edebilirsiniz, ancak güncellemelerde sorun yaşayacağınız için son derece cesaretiniz kırılmıştır magento.stackexchange.com/questions/164455/…
David Verholen

Bu bir seçenek değil
Matias
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.