M 2 0.74.0-beta16でカスタムモジュールを作成しようとしています。カスタムテーブルのコレクションを取得するにはどうすればよいですか。試しました
$this->_mymodulemodelFactory->create()->getCollection();
。私のモジュール用にファクトリーファイルが生成されますが、getCollection()が指摘します。
M 2 0.74.0-beta16でカスタムモジュールを作成しようとしています。カスタムテーブルのコレクションを取得するにはどうすればよいですか。試しました
$this->_mymodulemodelFactory->create()->getCollection();
。私のモジュール用にファクトリーファイルが生成されますが、getCollection()が指摘します。
回答:
モデルコレクションファクトリをコンストラクターに注入する必要があります
protected $mymodulemodelFactory;
public function __construct(
....
\[Namespace]\[Module]\Model\ResourceModel\[Entity]\CollectionFactory $mymodulemodelFactory,
...
)
{
...
$this->mymodulemodelFactory = $mymodulemodelFactory;
...
}
そして、あなたはクラスメソッドのどれでも使うことができます:
$collection = $this->mymodulemodelFactory->create();
カスタムモジュールからコレクションを取得するには、3つのファイルを作成する必要があります
1)モデル、2)ResourceModel、3)コレクション
名前空間:プリンス
モジュール:こんにちは
テーブル:こんにちは
1)Hello.phpモデルファイルを
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)Hello.php ResourceModelを作成します
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)Collection.phpコレクションファイルを作成します
app / code / Prince / Helloworld / Model / ResourceModel / Hello / 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'
);
}
}
これで、Index.php
コントローラーでコレクションをテストできますapp/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;
}
}
ブロックファイルを使用してテンプレートでコレクションを取得したい場合
nad createを追加する必要がある別の4つのファイル
1.ブロックファイル
2.レイアウトファイル
3.コントローラファイル
4. Templarteファイル
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;
}
}
またはレイアウトファイル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>
コントローラファイル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();
}
}
テンプレートファイルIndex.phtmlを作成する
<?php
var_dump($block->getgetHello()->getData());
私はそれが永遠にうまくいくことを願っています
私はそれが少し古いスレッドであることを知っていますが、単純な注入でモデルとコレクションを取得するための最良の解決策:
<preference for="Your\Module\Api\Data\ModelInterface" type="Your\Module\Model\Model"/>
protected $_modelFactory; public function __construct( .... \Your\Module\Api\Data\ModelInterfaceFactory $modelFactory, ... ) { ... $this->_modelFactory = $modelFactory; ... }
クラスのどこでも使用できます
コレクション:
$collection = $this->_modelFactory->create()->getCollection();
モデル:
$model = $this->_modelFactory->create();