robuust / craft-fixtures
Requires
- php: >=7.0
- craftcms/cms: ^3.0
Suggests
- codeception/codeception: Use the packaged test helpers with Codeception
- craftcms/commerce: For use with Product fixtures
README
此插件提供了所有必要的功能来将 Craft Elements 运行为 Yii2 固定工具。如果您不熟悉 Yii2 固定工具,建议您先阅读它们的手册。
安装
您可以使用 Composer 安装此工具。从您的项目根目录运行以下命令
composer require robuust/craft-fixtures
这将把 robuust/craft-fixtures
添加到您的项目的 composer.json
文件中,并将源代码安装到 vendor/robuust/craft-fixtures
目录。
现在,固定工具在 Craft 中可以作为可安装插件使用。您可以在 cp 中安装它,或使用 ./craft install/plugin fixtures
使用
此插件提供了一些抽象的固定工具,您需要扩展并实现。
创建固定工具
在您的项目根目录中创建一个名为 "fixtures" 的文件夹。在这个文件夹中,我们将放置固定类、固定数据和(可选)固定迁移。
在 Yii2 文档 中,您可以了解固定类和固定数据。
此插件为 Craft 元素提供了固定工具的基础。主要逻辑定义在 robuust\fixtures\base\ElementFixture
中。我们的固定类可以包含以下方法(除了 yii\test\ActiveFixture
提供的所有功能)
ElementFixture::isPrimaryKey(string $key): bool
用于定义哪些模型属性可以用来标识唯一的元素
ElementFixture::getElement(array $data): Element?
用于获取由给定数据标识的元素。使用定义好的主键来标识给定数据。
所有固定工具
ElementFixture 将定义 $this->siteIds
,其中包含所有站点处理程序作为键。
资产
扩展 robuust\fixtures\base\AssetFixture
以添加资产。其数据文件可能看起来像这样
<?php // We need a copy because Asset will move the temp file copy(__DIR__.'/assets/product.jpg', 'product.jpg'); return [ [ 'tempFilePath' => 'product.jpg', 'filename' => 'product.jpg', 'volumeId' => $this->volumeIds['products'], 'folderId' => $this->folderIds['clothes'], ], ];
这将上传并链接产品.jpg 作为资产。
AssetFixture 将定义 $this->volumeIds
和 $this->folderIds
,其中包含它们的处理程序作为键。
其主键为: volumeId
、folderId
、filename
和 title
。
类别
扩展 robuust\fixtures\base\CategoryFixture
以添加类别。其数据文件可能看起来像这样
<?php return [ [ 'groupId' => $this->groupIds['categories'], 'title' => 'Category', ], ];
CategoryFixture 将定义 $this->groupIds
,其中包含所有类别组处理程序作为键。
其主键为:siteId
、groupId
和 title
。
条目
扩展 robuust\fixtures\base\EntryFixture
以添加条目。其数据文件可能如下所示
<?php return [ [ 'sectionId' => $this->sectionIds['home'], 'typeId' => $this->typeIds['home']['home'], 'title' => 'Home', ], ];
EntryFixture 将定义 $this->sectionIds
,以所有部分句柄作为键。它还将定义 $this->typeIds
,以所有部分句柄作为第一个键,条目类型句柄作为第二个键。
其主键为:siteId
、sectionId
、typeId
和 title
。
全局设置
扩展 robuust\fixtures\base\GlobalSetFixture
以更新 (!) 全局设置(它们必须已经存在)。其数据文件可能如下所示
<?php return [ [ 'handle' => 'contact' 'contactAddress' => 'foo', 'contactCity' => 'bar', ], ];
其主键为:siteId
和 handle
,句柄是已经存在的全局设置之一。
标签
扩展 robuust\fixtures\base\TagFixture
以添加标签。其数据文件可能如下所示
<?php return [ [ 'groupId' => $this->groupIds['tags'], 'title' => 'Tag', ], ];
TagFixture 将定义 $this->groupIds
,以所有标签组句柄作为键。
其主键为:siteId
、groupId
和 title
。
用户
扩展 robuust\fixtures\base\UserFixture
以添加用户。其数据文件可能如下所示
<?php return [ [ 'username' => 'User', 'email' => 'info@example.com', ], ];
其主键为:siteId
、username
和 email
。
产品
扩展 robuust\fixtures\base\Product
以添加产品。其数据文件可能如下所示
<?php return [ [ 'typeId' => $this->productTypeIds['clothes'], 'title' => 'Product', ], ];
ProductFixture 将定义 $this->productTypeIds
,以所有产品类型句柄作为键。
其主键为:siteId
、typeId
和 title
。
运行固件
一旦在 Craft 中安装了插件,您就可以运行一些命令行操作。当您在命令行中运行 ./craft
时,您现在将看到这些操作
- fixtures/fixture Manages fixture data loading and unloading.
fixtures/fixture/load (default) Loads the specified fixture data.
fixtures/fixture/unload Unloads the specified fixtures.
fixtures/fixture
操作是从 Yii2 扩展的,并将接受相同的参数。使用 ./craft fixtures/fixture/load "*"
运行所有固件
运行固件迁移
在命令行中的 fixtures/fixture
操作旁边,您还会找到
- fixtures/migrate Migrate controller for fixtures.
fixtures/migrate/create Creates a new migration.
fixtures/migrate/down Downgrades the application by reverting old migrations.
fixtures/migrate/fresh Truncates the whole database and starts the migration from the
beginning.
fixtures/migrate/history Displays the migration history.
fixtures/migrate/mark Modifies the migration history to the specified version.
fixtures/migrate/new Displays the un-applied new migrations.
fixtures/migrate/redo Redoes the last few migrations.
fixtures/migrate/to Upgrades or downgrades till the specified version.
fixtures/migrate/up (default) Upgrades the application by applying new migrations.
fixtures/migrate
操作是从 Craft 扩展的,并将接受相同的参数。使用 ./craft fixtures/migrate/up
运行所有迁移
在测试中使用固件
要在 Craft 3 中使用这些固件进行 Codeception 测试,您可以使用 robuust\fixtures\test\Craft
模块而不是使用 Codeception 的 Yii2 模块。
modules: enabled: - \robuust\fixtures\test\Craft: part: [init, fixtures] configFile: 'config/app.test.php' # based on vendor/craftcms/cms/tests/_craft/config/test.php entryUrl: 'https:///index.php' cleanup: true
您可以在测试中加载固件,就像 Yii2 文档所描述的 那样。
示例
这是一个虚构的“联系页面”固件的示例
fixtures/ContactPageEntryFixture.php
<?php namespace fixtures; use fixtures\base\EntryFixture; /** * Contact page Fixture for Entry model. */ class ContactPageEntryFixture extends EntryFixture { /** * {@inheritdoc} */ public $dataFile = __DIR__.'/data/contact-page-entry.php'; /** * {@inheritdoc} */ public $depends = [ 'fixtures\SomeAssetFixture', ]; }
fixtures/data/contact-page-entry.php
<?php use craft\elements\Asset; $articleThumbIds = Asset::find()->filename('article-thumb.jpg')->ids(); return [ [ 'sectionId' => $this->sectionIds['contact'], 'typeId' => $this->typeIds['contact']['contact'], 'title' => 'Contact', 'contactMapTitle' => 'Floorplan', 'contactMapText' => ' <p> Maecenas faucibus mollis interdum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Donec sed odio dui. Aenean lacinia bibendum nulla sed consectetur. Curabitur blandit tempus porttitor. </p>', 'contactMapImage' => $articleThumbIds, 'contactMapPDF' => Asset::find()->filename('test.pdf')->ids(), ], ];
许可证
该项目已根据 MIT 许可证 (MIT) 许可。有关更多信息,请参阅 许可证文件。