现在我们已经保存了,让我们创建一个列表,客户可以在其中查看他/她的所有博客
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; 以清晰可见的格式打印数据。
到现在为止的文件夹结构: