neam / yii-qa-state
为ActiveRecords提供透明的属性翻译,无需查找表即可获取已翻译的字段内容。
Requires
- php: >=5.0.0
- yiisoft/yii: >=1.1.0
This package is not auto-updated.
Last update: 2024-09-24 02:52:32 UTC
README
提供工具(一个行为和一个控制台命令),用于跟踪和存储验证进度以及逐字段基于校对和审批进度。为内容管理系统创建,以帮助跟踪发布工作流程的完成进度,如创建、草稿、审阅、审批、校对、翻译等。
特性
- 根据验证规则自动设置当前项目状态(如临时、草稿、可审阅和可发布)
- 为内容创建过程中属于的属性提供一个方便的存储当前总体状态以及审批和校对标志的位置
- 计算和读取当前验证、审批和校对进度的方法
- 存储任何验证场景的当前进度,以便可以根据内容项的完成度进行列表/筛选
- 利用Yii验证逻辑作为验证字段的基本方法
- 利用Gii代码生成提供CRUD操作来设置和更改标志
- 控制台命令自动为必要的数据库更改创建迁移
- (可选)利用Yii扩展i18n-columns为每个翻译语言提供单独的质量保证状态
要求
- Yii 1.1或更高版本
- 使用Yii控制台
- 使用Gii(最好是Gtc)和/或giic
- MySQL 5.1.10+,SQL Server 2012或类似最近的数据库(对于控制台命令。行为本身与任何Yii支持的数据库兼容)
设置
下载和安装
确保您的composer.json中包含以下内容
"repositories":[
{
"type": "vcs",
"url": "https://github.com/neam/yii-qa-state"
},
...
],
"require":{
"neam/yii-qa-state":"dev-develop",
...
},
然后通过composer安装
php composer.php update neam/yii-qa-state
如果您不使用composer,请克隆或下载此项目到/path/to/your/app/vendor/neam/yii-qa-state
将别名添加到main.php和console.php中
'aliases' => array(
...
'vendor' => dirname(__FILE__) . '/../../vendor',
'qa-state' => 'vendor.neam.yii-qa-state',
...
),
在main.php中导入行为
'import' => array(
...
'qa-state.behaviors.QaStateBehavior',
...
),
在console.php中引用qa-state命令
'commandMap' => array(
...
'qa-state' => array(
'class' => 'qa-state.commands.QaStateCommand',
),
...
),
配置模型以参与qa过程
1. 在您的模型中设置验证规则,说明草稿、可审阅和可发布场景下需要哪些字段。
示例
// Chapter.php
class Chapter extends BaseChapter
{
...
public function rules()
{
return array_merge(
parent::rules(), array(
array('title, slug', 'required', 'on' => 'draft,reviewable,publishable'),
array('thumbnail, about, video, teachers_guide, exercises, snapshots, credits', 'required', 'on' => 'publishable'),
)
);
}
...
}
此示例仅使用“必需”验证规则,但当然可以使用任何验证规则。属性可以是普通模型属性、关系或使用自定义验证规则等的虚拟属性。重要的一点是,它们应用于行为配置中指定的场景(默认:草稿、可审阅、可发布)。
2. 将行为添加到您想跟踪qa状态和进度的模型中
public function behaviors()
{
return array(
'qa-state' => array(
'class' => 'QaStateBehavior',
'scenarios' => array(
'draft',
'reviewable',
'publishable',
/* Example: tracking translation progress through language-specific validation scenarios - add the scenarios through configuration:
'translate_into_es',
'translate_into_de',
'translate_into_fr',
'translate_into_sv',
*/
),
'manualFlags' => array(
'allow_review',
'allow_publish'
),
),
);
}
3. 使用包含的控制台命令生成必要的模式迁移
./yiic qa-state process
使用--verbose运行以查看更多详细信息。
4. 应用生成的迁移
./yiic migrate
这将添加相关表、关系和字段,以便跟踪配置模型的qa状态。
该模式具有以下一般结构
{table}_qa_state
id
foreach scenario: {scenario}_validation_progress
approval_progress
proofing_progress
foreach manualFlag: {manualFlag}
foreach attribute: {attribute}_approved - boolean (with null)
foreach attribute: {attribute}_proofed - boolean (with null)
created
modified
每个进度字段都是介于0和100之间的整数,反映总进度的百分比。总进度是测量为所有在验证下的属性分别验证、审批、校对或翻译。
示例迁移文件
<?php
class m131017_120644_qa_attributes extends CDbMigration
{
public function up()
{
$this->createTable('chapter_qa_state', array(
'id' => 'BIGINT NOT NULL AUTO_INCREMENT',
'PRIMARY KEY (`id`)',
));
$this->addColumn('chapter', 'chapter_qa_state_id', 'BIGINT NULL');
$this->addForeignKey('chapter_qa_state_id_fk', 'chapter', 'chapter_qa_state_id', 'chapter_qa_state', 'id', 'SET NULL', 'SET NULL');
$this->addColumn('chapter_qa_state', 'status', 'VARCHAR(255) NULL');
$this->addColumn('chapter_qa_state', 'draft_validation_progress', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'reviewable_validation_progress', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'publishable_validation_progress', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'approval_progress', 'INT NULL');
$this->addColumn('chapter_qa_state', 'proofing_progress', 'INT NULL');
$this->addColumn('chapter_qa_state', 'allow_review', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'allow_publish', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'title_approved', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'slug_approved', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'thumbnail_approved', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'about_approved', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'video_approved', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'teachers_guide_approved', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'exercises_approved', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'snapshots_approved', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'credits_approved', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'title_proofed', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'slug_proofed', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'thumbnail_proofed', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'about_proofed', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'video_proofed', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'teachers_guide_proofed', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'exercises_proofed', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'snapshots_proofed', 'BOOLEAN NULL');
$this->addColumn('chapter_qa_state', 'credits_proofed', 'BOOLEAN NULL');
// {...example file shortened...}
$this->createTable('video_file_qa_state', array(
'id' => 'BIGINT NOT NULL AUTO_INCREMENT',
'PRIMARY KEY (`id`)',
));
$this->addColumn('video_file', 'video_file_qa_state_id', 'BIGINT NULL');
$this->addForeignKey('video_file_qa_state_id_fk', 'video_file', 'video_file_qa_state_id', 'video_file_qa_state', 'id', 'SET NULL', 'SET NULL');
$this->addColumn('video_file_qa_state', 'status', 'VARCHAR(255) NULL');
$this->addColumn('video_file_qa_state', 'draft_validation_progress', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'reviewable_validation_progress', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'publishable_validation_progress', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'approval_progress', 'INT NULL');
$this->addColumn('video_file_qa_state', 'proofing_progress', 'INT NULL');
$this->addColumn('video_file_qa_state', 'allow_review', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'allow_publish', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'title_approved', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'slug_approved', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'clip_approved', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'about_approved', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'thumbnail_approved', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'subtitles_approved', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'title_proofed', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'slug_proofed', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'clip_proofed', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'about_proofed', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'thumbnail_proofed', 'BOOLEAN NULL');
$this->addColumn('video_file_qa_state', 'subtitles_proofed', 'BOOLEAN NULL');
}
public function down()
{
$this->dropForeignKey('chapter_qa_state_id_fk', 'chapter');
$this->dropColumn('chapter', 'chapter_qa_state_id');
$this->dropTable('chapter_qa_state');
$this->dropColumn('chapter_qa_state', 'status');
$this->dropColumn('chapter_qa_state', 'draft_validation_progress');
$this->dropColumn('chapter_qa_state', 'reviewable_validation_progress');
$this->dropColumn('chapter_qa_state', 'publishable_validation_progress');
$this->dropColumn('chapter_qa_state', 'approval_progress');
$this->dropColumn('chapter_qa_state', 'proofing_progress');
$this->dropColumn('chapter_qa_state', 'allow_review');
$this->dropColumn('chapter_qa_state', 'allow_publish');
$this->dropColumn('chapter_qa_state', 'title_approved');
$this->dropColumn('chapter_qa_state', 'slug_approved');
$this->dropColumn('chapter_qa_state', 'thumbnail_approved');
$this->dropColumn('chapter_qa_state', 'about_approved');
$this->dropColumn('chapter_qa_state', 'video_approved');
$this->dropColumn('chapter_qa_state', 'teachers_guide_approved');
$this->dropColumn('chapter_qa_state', 'exercises_approved');
$this->dropColumn('chapter_qa_state', 'snapshots_approved');
$this->dropColumn('chapter_qa_state', 'credits_approved');
$this->dropColumn('chapter_qa_state', 'title_proofed');
$this->dropColumn('chapter_qa_state', 'slug_proofed');
$this->dropColumn('chapter_qa_state', 'thumbnail_proofed');
$this->dropColumn('chapter_qa_state', 'about_proofed');
$this->dropColumn('chapter_qa_state', 'video_proofed');
$this->dropColumn('chapter_qa_state', 'teachers_guide_proofed');
$this->dropColumn('chapter_qa_state', 'exercises_proofed');
$this->dropColumn('chapter_qa_state', 'snapshots_proofed');
$this->dropColumn('chapter_qa_state', 'credits_proofed');
// {...example file shortened...}
$this->dropForeignKey('video_file_qa_state_id_fk', 'video_file');
$this->dropColumn('video_file', 'video_file_qa_state_id');
$this->dropTable('video_file_qa_state');
$this->dropColumn('video_file_qa_state', 'status');
$this->dropColumn('video_file_qa_state', 'draft_validation_progress');
$this->dropColumn('video_file_qa_state', 'reviewable_validation_progress');
$this->dropColumn('video_file_qa_state', 'publishable_validation_progress');
$this->dropColumn('video_file_qa_state', 'approval_progress');
$this->dropColumn('video_file_qa_state', 'proofing_progress');
$this->dropColumn('video_file_qa_state', 'allow_review');
$this->dropColumn('video_file_qa_state', 'allow_publish');
$this->dropColumn('video_file_qa_state', 'title_approved');
$this->dropColumn('video_file_qa_state', 'slug_approved');
$this->dropColumn('video_file_qa_state', 'clip_approved');
$this->dropColumn('video_file_qa_state', 'about_approved');
$this->dropColumn('video_file_qa_state', 'thumbnail_approved');
$this->dropColumn('video_file_qa_state', 'subtitles_approved');
$this->dropColumn('video_file_qa_state', 'title_proofed');
$this->dropColumn('video_file_qa_state', 'slug_proofed');
$this->dropColumn('video_file_qa_state', 'clip_proofed');
$this->dropColumn('video_file_qa_state', 'about_proofed');
$this->dropColumn('video_file_qa_state', 'thumbnail_proofed');
$this->dropColumn('video_file_qa_state', 'subtitles_proofed');
}
}
4. 重新生成模型和crud
按照官方文档使用Gii。之后,您就有了一个方便的地方来存储内容创建过程中属于的属性的审批和校对标志。
用法
手册标记以及批准和校对标记应由您应用中的相关用户/编辑员进行修改。行为更新将在afterSave之后更新总验证、批准和校对进度。
变更日志
0.1.0
- 初始发布
- 根据验证规则自动设置当前项目状态(如临时、草稿、可审阅和可发布)
- 为内容创建过程中属于的属性提供存储批准和校对标记的便利位置
- 计算和读取当前验证、审批和校对进度的方法
- 透明的qa状态记录创建
- 利用Yii验证逻辑作为验证字段的基本方法
- 利用Gii代码生成提供CRUD操作来设置和更改标志
- 可选:利用Yii扩展i18n-columns为每个翻译语言提供单独的质量保证状态
- 控制台命令自动为必要的数据库更改创建迁移
常见问题解答
在更新我的数据模型或qa过程属于的属性列表之后,我如何更新架构?
- 使用命令
./yiic qa-state process生成必要的架构迁移 - 使用
./yiic migrate应用迁移 - 生成新架构的crud
在生成crud之前,您可能想要删除任何不再配置为qa过程部分的字段。但这不是必需的,因为行为将只考虑当前配置的属性。为了帮助完成这项任务,可以使用resetAttributes操作。
如何重置和重新填充qa状态表中的属性说明
- 运行
./yiic qa-state process - 使用
./yiic migrate应用迁移 - 按照上述步骤1-3操作