Magento-2.x:以編程的方式通過UpgradeData.php新增Block & Category & SubCategory

      最近我們team在做php的項目,使用到了Magento-2.xci框架

    我也是Magento新手,做起來也辣手,也多虧有同事和Google Chrome(百度搜索國內有關於Magento的教程少之又少),今天也是想寫點相關的東西記錄一下(能幫到別人最好咯),action:

點我看看 Magento介紹:  

點我看看Magento的同類技術&異同:


Magento組成部分:

一般來說,將我們的項目放在XAMPP\htdocs\<your-projectName>,而我們項目的結構如下:

\<your-projectName>\.settings

                                    \.vscode

                                    \ajax

                                    \app                      

                                        |---\code

                                                |---<your-vendorName>

                                                        |---<mode-name>

                                                               |---Block                     #頁面的重要組成部分

                                                               |---Console

                                                               |---Controller            

                                                               |---etc                         #配置文件module/di/router.xml...

                                                               |---Helper

                                                               |---Model                    #模型

                                                               |---Setup                     #操作DB的CRUD

                                                               |---view                       #layout,css,template,js

                                                               |---composer.json

                                                               |---registration.php

                                                ......

                                                |---<other-vendorName>

                                        |---\design

                                       |---\etc

                                       |---\i18n

                                        |---\.htaccess


                                    \bin

                                    \dev

                                    \lib

                                     ...

                                    \vendor\                 (Magento它自己的代碼,儘可能不要更改)

今天我們不是在Magento後臺手動添加Block/Category,而是以編程的方式新增,既然要新增,就是说要和DB打交道,那我们就在Setup中操作,在app\code\<your-vendorName>\<module-Name>\Setup中提供了以下类创建或升级DB:

  • InstallSchema.php- 安装数据库结构
  • InstallData.php- 初始化数据库表的数据。
  • UpgradeSchema.php- 升级数据库结构
  • UpgradeData.php- 从表中升级(添加/删除)数据。

所以我们选择UpgradeData.php,內容如:

<?php

namespace <your-vendorName>\<Module-Name>\Setup;

use Magento\Framework\Setup\UpgradeDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Cms\Model\Page;
use Magento\Cms\Model\PageFactory;
use Magento\Catalog\Model\CategoryFactory;

/**
 * @codeCoverageIgnore
 */
class UpgradeData implements UpgradeDataInterface {

   /**
     * EAV setup factory
     *
     * @var EavSetupFactory
     */
    private $eavSetupFactory;

    /**
    * @var \Magento\Cms\Model\BlockFactory
    */
    protected $blockFactory;

    /**
    * @var \Magento\Cms\Model\BlockRepository
    */
    protected $blockRepository;

    protected $categoryFactory;

    protected $categoryRepository;
    
 

    /**
     * Init
     *
     * @param EavSetupFactory $eavSetupFactory
     */
     public function __construct(
        EavSetupFactory $eavSetupFactory,
        PageFactory $resultPageFactory,
        \Magento\Cms\Model\BlockFactory $blockFactory,
        \Magento\Cms\Model\BlockRepository $blockRepository,
        \Magento\Catalog\Model\CategoryFactory $categoryFactory,
        \Magento\Catalog\Model\CategoryRepository $categoryRepository
     
       ) {
        $this->eavSetupFactory = $eavSetupFactory;
        $this->resultPageFactory = $resultPageFactory;
        $this->blockFactory = $blockFactory;
        $this->blockRepository = $blockRepository;
        $this->categoryFactory = $categoryFactory;
        $this->categoryRepository = $categoryRepository;
        }
    /**
     * {@inheritdoc}
     */
    public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context) 
    {
        $setup->startSetup();

        $eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
       

  

       

         //Add Block  

if(version_compare($context->getVersion(), '2.0.1', '<')) {

$data = [

'title' => 'New Block',

'identifier' => 'new_block',

'stores' => ['0'],

'is_active' => 1, 

'content' => '<table><tbody><tr><td style="width: 316px; height: 316px; background-image: url(\'http://127.0.0.1/pub/media/wysiwyg/pe3.png\'); background-repeat: no-repeat;"><a style="width: 168px; height: 25px; background: #000; display: block; color: #ffffff; margin-left: 60px; margin-top: 250px; text-align: center; text-decoration: none; line-height: 25px;">REDEEM NOW</a></td><td style="width: 316px; height: 316px; background-image: url(\'http://127.0.0.1/pub/media/wysiwyg/re3.png\'); background-repeat: no-repeat;"></td></tr></tbody></table>'

];

$newBlock = $this->blockFactory->create(['data' => $data]); 

$this->blockRepository->save($newBlock);

} 

//Add Category 

if(version_compare($context->getVersion(), '2.0.3', '<')) 

{

$data = [ 

'parent_id' => 2,

'name'=> 'Category Father',

'is_active'=> 1, 

'url_key' => 'category father',

'position'=> 13,

'include_in_menu'=> 1,

'display_mode' =>'PAGE',

'is_anchor'=> 1,

'page_layout' =>'1column' 

]; 

$newCategory = $this->categoryFactory->create(['data' => $data]);

$newCategory = $this->categoryRepository->save($newCategory);

$categoryId = $newCategory->getId();

} 

//Add SubCategory 

if(version_compare($context->getVersion(), '1.0.70', '<')) 

{

$childrenData = [

'parent_id' => $categoryId,

'name'=> 'Category Children',

'is_active'=> 1,

'url_key' => 'category_children',

'position'=> 1,

'include_in_menu'=> 1,

'display_mode' =>'PAGE', 

'is_anchor'=> 1,

'page_layout' =>'1column'

];

$children = $this->categoryFactory->create(['data' => $childrenData]);

$this->categoryRepository->save($children); 

}

...//other codes

$setup->endSetup(); 

}

}


/*1 判断该模块的version是否<2.0.1,是则inset 到DB,否则no故需要将目錄下的
    app\code\<your-vendorName>\<module-Name>\etc\module.xml文件中的,
    setup_version改为setup_version="2.0.1",
2 ..Factory 是用来创建对象
..Repository 是用来save对象到DB(insert)
 */




 



如果在执行setup:upgrade命令时出现上述错误,我们可以检查我们数据库的setup_module 表,对应的模块的version是否一致:






将schema_version和data_version的value改为一致方可进行操作。

通过以上步骤,可以完成我们的新增操作!鄙人实属新人,愚见若有不足的地方亦可留言,有幸也可以加友交流,

谢谢阅读!






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值