Wie kann ich die Sammlung eines benutzerdefinierten Moduls in Magento 2 erhalten?

9

Ich versuche, ein benutzerdefiniertes Modul in M ​​2 0.74.0-beta16 zu erstellen. Wie kann ich eine Sammlung von benutzerdefinierten Tabellen erhalten. Ich habe es versucht $this->_mymodulemodelFactory->create()->getCollection();. Die Factory-Datei wird für mein Modul generiert, aber getCollection () gibt Hinweise.

Shaheer Ali
quelle
Anna Völkls Antwort in Magento 2.3.1
Vashy

Antworten:

24

Sie müssen die Modellsammlungsfabrik in Ihren Konstruktor einfügen

protected $mymodulemodelFactory;
public function __construct(
    ....
    \[Namespace]\[Module]\Model\ResourceModel\[Entity]\CollectionFactory $mymodulemodelFactory, 
    ...
)
{
    ...
    $this->mymodulemodelFactory = $mymodulemodelFactory;
    ...
}

und Sie können in einer der Klassenmethoden verwenden:

$collection = $this->mymodulemodelFactory->create();
Marius
quelle
Ich habe das gleiche für meinen benutzerdefinierten Import versucht, um die Produktkollektion zu erhalten, aber wenn ich die CSV importiere, wird das Ajax-
Ladesymbol auf
Ich möchte die Produktkollektion basierend auf der Entitäts-ID
abrufen
18

Sie müssen drei Dateien erstellen , um die Sammlung von einem benutzerdefinierten Modul abzurufen

1) Modell, 2) Ressourcenmodell, 3) Sammlung

Namespace: Prinz

Modul: Hallo

Tabelle: Hallo

1) Erstellen Sie die Hello.php-Modelldatei unter

App / Code / Prince / Helloworld / Model / Hello.php

<?php

namespace Prince\Helloworld\Model;

use Magento\Framework\Model\AbstractModel;

class Hello extends AbstractModel
{
    /**
     * Define resource model
     */
    protected function _construct()
    {
        $this->_init('Prince\Helloworld\Model\ResourceModel\Hello');
    }
}

2) Erstellen Sie nun Hello.php ResourceModel unter

app / code / Prince / Helloworld / Model / ResourceModel / Hello.php

<?php

namespace Prince\Helloworld\Model\ResourceModel;

use Magento\Framework\Model\ResourceModel\Db\AbstractDb;

class Hello extends AbstractDb
{
    /**
     * Define main table
     */
    protected function _construct()
    {
        $this->_init('hello', 'id'); //hello is table of module
    }
}

3) Erstellen Sie nun die Collection.php Collection-Datei unter

app / code / Prince / Helloworld / Model / ResourceModel / Hallo / Collection.php

<?php

namespace Prince\Helloworld\Model\ResourceModel\Hello;

use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

class Collection extends AbstractCollection
{
    /**
     * Define model & resource model
     */
    protected function _construct()
    {
        $this->_init(
            'Prince\Helloworld\Model\Hello',
            'Prince\Helloworld\Model\ResourceModel\Hello'
        );
    }
}

Jetzt können Sie Ihre Sammlung im Index.phpController testenapp/code/Prince/Helloworld/Controller/Index/Index.php

<?php

namespace Prince\Helloworld\Controller\Index;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Prince\Helloworld\Model\HelloFactory;

class Index extends Action
{
    protected $_modelHelloFactory;

    public function __construct(
        Context $context, 
        HelloFactory $modelHelloFactory
    ) {
        parent::__construct($context);
        $this->_modelHelloFactory = $modelHelloFactory;
    }

    public function execute()
    {

        $resultPage = $this->_modelHelloFactory->create();
        $collection = $resultPage->getCollection(); //Get Collection of module data
        var_dump($collection->getData());
        exit;

    }
}

Wenn Sie eine Sammlung in einer Vorlage mithilfe einer Blockdatei erhalten möchten

Weitere vier Dateien, die Sie hinzufügen und erstellen müssen

1. Blockieren Sie die Datei

2. Layoutdatei

3. Controller-Datei

4. Templarte-Datei

Blockdatei erstellen Hello.php

namespace vendorName\ModuleName\Block\Index;

use Magento\Framework\App\RequestInterface;
use vendorName\ModuleName\Model\Hello;

class Hello extends \Magento\Framework\View\Element\Template 
{
    protected $helloModelFactory;
    protected $request;

    public function __construct(
        \Magento\Catalog\Block\Product\Context $context,
        Hello $helloModelFactory,
        RequestInterface $request,
        array $data = []
    ) {
        parent::__construct($context, $data);
        $this->_helloModelFactory = $helloModelFactory;
        $this->_request = $request;
    }

    /**
     * Preparing global layout
     *
     * @return $this
     */
    protected function _prepareLayout() {
        parent::_prepareLayout();
        $this->pageConfig->getTitle()->set(__('Display Collection'));
        return $this;
    }

    public function getHello()
    {
        $collection = $this->_helloModelFactory->getCollection();
        return $collection;
    }
}

Oder erstellen Sie die Layoutdatei routName_controllername_index.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="content">
             <block class="vendorName\ModuleName\Block\Event\Index" name="newevent" template="vendorName_ModuleName::Index.phtml" />
        </referenceContainer>
    </body>
</page>

Erstellen Sie die Controller-Datei Index.php

<?php
namespace vendorName\ModuleName\Controller\Index;

use Magento\Framework\App\Action;
use Magento\Framework\View\Result\PageFactory;

class Index extends \Magento\Framework\App\Action\Action 
{
    /**
     * @param Action\Context $context
     */

    protected $resultPageFactory;

    public function __construct(
        Action\Context $context,
        PageFactory $resultPageFactory
    ) {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }

    public function execute() {

        $this->_view->loadLayout();
        $this->_view->renderLayout();
    }
}

Erstellen Sie die Vorlagendatei Index.phtml

<?php

var_dump($block->getgetHello()->getData());

Ich hoffe es ist Arbeit für immer

Prinz Patel
quelle
Verwenden Sie Prince \ Helloworld \ Model \ HelloFactory. wo ist das?
Jibin George
Entschuldigung
Jibin George
Wie bekomme ich die vollständigen Daten in ein Array? Sie var_dumping die Daten gibt es sowieso ich könnte die vollständigen Daten in Array bekommen?
Jibin George
1

Versuche dies $collection = $this->_mymodulemodelFactory->create()

Bojjaiah
quelle
1

Ich weiß, dass es ein kleiner alter Thread ist, aber die beste Lösung, um Modell und Sammlung mit einer einfachen Injektion zu erhalten:

  • Stellen Sie sicher, dass Ihr Modell Ihr ModelInterface implementiert und Sie die Voreinstellung für Ihr ModelInterface in di.xml festlegen

<preference for="Your\Module\Api\Data\ModelInterface" type="Your\Module\Model\Model"/>

  • Inject ModelInterfaceFactory in den Konstruktor einfügen

  protected $_modelFactory;   public function __construct( .... \Your\Module\Api\Data\ModelInterfaceFactory $modelFactory, ... ) { ... $this->_modelFactory = $modelFactory; ... }

  • und einfach überall in der Klasse verwenden

    zur Abholung:

    $collection = $this->_modelFactory->create()->getCollection();

    für Modell:

    $model = $this->_modelFactory->create();

Mammouth
quelle