Magento2 Collection and Block

现在我们已经保存了,让我们创建一个列表,客户可以在其中查看他/她的所有博客

Redirection and Messages

之前,当客户提交表单时,我们只显示了一条简单的消息,说“已保存”。 但是最好在保存数据后重定向到列表页面。

因此,我们必须编辑Controller / Manage / Save.php文件,

<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="theme:monokai lang:php decode:true "><?php
namespace Yshuq\BlogManager\Controller\Manage;

use Magento\Customer\Controller\AbstractAccount;
use Magento\Framework\App\Action\Context; 
use Magento\Customer\Model\Session;

class Save extends AbstractAccount
{
	public $blogFactory;
    public $customerSession;
    public $messageManager;

 	public function  __construct(
 		Context $context,
 		\Yshuq\BlogManager\Model\BlogFactory $blogFactory,
 		Session $customerSession,
 		\Magento\Framework\Message\ManagerInterface $messageManager
 		){
 		$this->blogFactory = $blogFactory;
 		$this->customerSession = $customerSession;
 		$this->messageManager = $messageManager;
 		parent::__construct($context);
 	}

 	public function execute()
 	{
 		$data = $this->getRequest()->getParams();
 		$model = $this->blogFactory->create();
 		//$model->setTitle($data['title']);
 		//$model->setContent($data['content']); 

 		$customer = $this->customerSession->getCustomer();
        $customerId = $customer->getId();
        
        $model->setUserId($customerId);
 		$model->setData($data);
 		$model->save();

 		$this->messageManager->addSuccess(__('Blog saved successfully.'));
        
 		// echo 'Saved';
 		return $this->resultRedirectFactory->create()->setPath('blog/manage');
 	}
}

</pre></div>

声明成员变量是一个好习惯。 因此,我们已经在课堂发言时声明了它们。 要重定向,我们使用了resultRedirectFactory并使用了要重定向的URL调用setPath方法。 您可能已经在此处注意到,我们仅给出了网址的两部分,因为它将自动用“索引”填充缺少的部分。 因此,我们的网址将成为Blog / manage / index。

现在,我们来谈谈\ Magento \ Framework \ Message \ ManagerInterface类。 用于在页面上显示消息。 magento中有四种可用的消息类型。

  • Success
  • Error
  • Notice
  • Warning
保存后结果

还要注意,在addSuccess方法中,我们传递了包含在__(“”)中的消息。 所有静态文本都应包含在__(“某些文本”)中,以便可以翻译。 Magento允许我们借助.csv文件来创建不同语言的翻译。

现在,让我们在Contoller / Manage / Index.php中创建索引操作,该操作将用于显示博客列表。

<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="theme:monokai font:monospace lang:php decode:true "><?php
namespace Yshuq\BlogManager\Controller\Manage;

use Magento\Customer\Controller\AbstractAccount;
use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;

class Index extends AbstractAccount
{
    public function __construct(
        Context $context,
        PageFactory $resultPageFactory
    ) {
        $this->resultPageFactory = $resultPageFactory;
        parent::__construct($context);
    }

    public function execute()
    {
        //echo('<h1>Hello World</h1>');
        $resultPage = $this->resultPageFactory->create();
        $resultPage->getConfig()->getTitle()->set(__('Blogs'));
        $layout = $resultPage->getLayout();
        return $resultPage;
    }
}
</pre></div>

Blocks

在这里,我们将显示一个phtml文件,因此我们需要将布局文件创建为view / frontend / layout / blogmanager_manage_index.xml

<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="theme:monokai lang:default decode:true "><?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">
    <update handle="customer_account"/>
    <body>
        <referenceContainer name="content">
            <block class="Yshuq\BlogManager\Block\BlogList" name="blogmanager.blog.list" template="Yshuq_BlogManager::list.phtml" />
        </referenceContainer>
    </body>
</page></pre></div>

在这里,除了块类外,所有内容都应该熟悉。 之前,我们在“博客添加”页面中使用了默认的Block类,但在“博客列表”页面中,我们将创建一个Block类Yshuq\ BlogManager\Block\BlogList。

为什么我们需要Block? Block的需要是将数据传递到模板文件。 Block类包含视图的逻辑部分。 模板文件所需的所有数据都应来自Block。 我们不在phtml文件中编写复杂的代码,而是在Block中编写复杂的代码,然后将结果传递给phtml文件。

现在,让我们在模块目录下创建Block文件夹。 在“Block”文件夹中,我们需要创建Block文件为BlogList.php

<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="lang:php decode:true "><?php
namespace Yshuq\BlogManager\Block;

class BlogList extends \Magento\Framework\View\Element\Template
{
    public $blogCollection;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Yshuq\BlogManager\Model\ResourceModel\Blog\CollectionFactory $blogCollection,
        array $data = []
    ) {
        $this->blogCollection = $blogCollection;
        parent::__construct($context, $data);
    }

    public function getBlogs()
    {
        $collection = $this->blogCollection->create();
        return $collection;
    }
}</pre></div>

所有块都必须扩展默认块类\ Magento \ Framework \ View \ Element \ Template。 我们将使用此块来加载博客数据。 请注意,这里我们使用的是集合\ Webkul \ BlogManager \ Model \ ResourceModel \ Blog \ CollectionFactory,因为我们需要从表中加载多行。 就像模型一样,模型集合也具有工厂类。

在这里,我们有getBlogs()方法,在该方法中我们加载了集合并返回了整个集合。 就像这里的模型工厂一样,我们也需要调用create()方法来创建集合的新对象。

现在我们已经创建了该块,让我们在view / frontend / templates文件夹下为该块创建list.phtml文件。

<table>
    <tr>
        <th>
            <?= __("Id")?>
        </th>
        <th>
            <?= __("Title")?>
        </th>
        <th>
            <?= __("Content")?>
        </th>
    </tr>
    <?php
    $blogs = $block->getBlogs();

    foreach ($blogs as $blog) {?>
    <tr>
        <td>
            <?= $blog->getId()?>
        </td>
        <td>
            <?= $blog->getTitle()?>
        </td>
        <td>
            <?= substr($blog->getContent(), 0, 20).'...'?>
        </td>
    </tr>
    <?php } ?>
</table>

<?=?>只是<?php echo?>的简写。 您可以在php手册中找到有关它的信息。 我已经讲过__(“”),它用于翻译。

现在看到重要的一行$ blogs = $ block-> getBlogs(); 在这里,我们调用该块的getBlogs()函数,该函数将返回blogs集合。 记得我曾告诉过您,集合是模型的集合,所以当我们使用foreach循环遍历集合时,我们将在每次迭代中获得一个模型。 这意味着在每次迭代中,我们将从表中获得一行。

$ blog-> getId()将返回entity_id,这表示它充当getEntityId(),这是因为在模型中,我们已经编写了此方法,

就像我们在以前的博客中看到的setter一样,getter都在内部进行管理,我们只需要对每一列使用camelCase命名约定。 因此,即使我们没有在模型文件中编写这些方法,我们也可以分别使用getTitle()和getContent()来访问title和content列

现在,当您提交添加博客表单时,您将被重定向到博客列表页面,并显示一条成功消息,例如

我们还要为此页面创建一个客户导航链接,我们必须编辑view / frontend / layout / customer_account.xml

<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="theme:monokai lang:default decode:true " ><?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>
        <referenceBlock name="customer_account_navigation">
            <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-blog-add" after="-" >
                <arguments>
                    <argument name="label" xsi:type="string" translate="true">Add Blog</argument>
                    <argument name="path" xsi:type="string">blog/manage/add</argument>
                </arguments>
            </block>
            <block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-blog-list" before="customer-account-navigation-blog-add" >
                <arguments>
                    <argument name="label" xsi:type="string" translate="true">Blogs</argument>
                    <argument name="path" xsi:type="string">blog/manage</argument>
                </arguments>
            </block>
        </referenceBlock>
    </body>
</page></pre></div>

在这里,我们在块节点中添加了before =“ customer-account-navigation-blog-add”,因此它将在博客添加菜单之前添加博客列表菜单。 您将能够在客户导航中看到Blogs链接,

注意: 我们也可以从模型类中获取集合。 当我们调用$ model-> getCollection()时,它返回模型的集合。就像setData一样,模型和集合也具有getData,它以关联数组格式返回数据。 因此,在开发或调试期间必须查看数据时,我们使用echo‘<pre>; print_r($ collection-> getData()); die; 以清晰可见的格式打印数据。

到现在为止的文件夹结构:

文件夹结构