最近我們team在做php的項目,使用到了Magento-2.xci框架
我也是Magento新手,做起來也辣手,也多虧有同事和Google Chrome(百度搜索國內有關於Magento的教程少之又少),今天也是想寫點相關的東西記錄一下(能幫到別人最好咯),action:
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改为一致方可进行操作。
通过以上步骤,可以完成我们的新增操作!鄙人实属新人,愚见若有不足的地方亦可留言,有幸也可以加友交流,
谢谢阅读!