diff --git a/app/Enums/LearningtaskUseFunction.php b/app/Enums/LearningtaskUseFunction.php index ceace37d0..f68242616 100644 --- a/app/Enums/LearningtaskUseFunction.php +++ b/app/Enums/LearningtaskUseFunction.php @@ -43,6 +43,8 @@ final class LearningtaskUseFunction extends EnumsBase const use_report_reference_mail = 'use_'.self::report.'_reference_mail'; // [表示方法] const use_report_status_collapse = 'use_'.self::report.'_status_collapse'; + const use_report_show_word_count = 'use_'.self::report.'_show_word_count'; + const use_report_show_char_count = 'use_'.self::report.'_show_char_count'; // --- 試験設定 // [利用する試験提出機能] @@ -110,6 +112,8 @@ final class LearningtaskUseFunction extends EnumsBase self::use_report_reference_mail => 'メール送信(受講者宛)', // 表示方法 self::use_report_status_collapse => '履歴を開閉する', + self::use_report_show_word_count => '文字数を表示する', + self::use_report_show_char_count => '字数を表示する', // --- 試験設定 // 利用する試験提出機能 self::use_examination => '提出', diff --git a/app/Models/User/Learningtasks/LearningtasksUsersStatuses.php b/app/Models/User/Learningtasks/LearningtasksUsersStatuses.php index c551d96ec..430cd56b5 100644 --- a/app/Models/User/Learningtasks/LearningtasksUsersStatuses.php +++ b/app/Models/User/Learningtasks/LearningtasksUsersStatuses.php @@ -192,4 +192,23 @@ public function upload() // withDefault() を指定しておくことで、Uploads がないときに空のオブジェクトが返ってくるので、null po 防止。 return $this->hasOne(Uploads::class, 'id', 'upload_id')->withDefault(); } + + /** + * 単語数を取得する + */ + public function getWordCountAttribute() + { + // マルチバイト文字などは適切な値を取得できない + // 必要になれば形態素解析などを行う必要がある + return $this->comment ? str_word_count($this->comment) : 0; + } + + /** + * 字数を取得する + * 文字数は、全角文字も半角文字も1文字としてカウントする。 + */ + public function getCharCountAttribute() + { + return $this->comment ? mb_strlen($this->comment) : 0; + } } diff --git a/app/Plugins/User/Learningtasks/DataProviders/ReportCsvDataProvider.php b/app/Plugins/User/Learningtasks/DataProviders/ReportCsvDataProvider.php index 32c0cc555..d1e513c35 100644 --- a/app/Plugins/User/Learningtasks/DataProviders/ReportCsvDataProvider.php +++ b/app/Plugins/User/Learningtasks/DataProviders/ReportCsvDataProvider.php @@ -171,6 +171,8 @@ private function getColumnDataGenerators( }, '評価' => fn() => optional($last_evaluation)->grade, '評価コメント' => fn() => optional($last_evaluation)->comment, + '単語数' => fn() => optional($last_submission)->word_count, + '字数' => fn() => optional($last_submission)->char_count, ]; } } diff --git a/app/Plugins/User/Learningtasks/Services/LearningtaskReportColumnDefinition.php b/app/Plugins/User/Learningtasks/Services/LearningtaskReportColumnDefinition.php index 4fadcc79f..5ee9bc09c 100644 --- a/app/Plugins/User/Learningtasks/Services/LearningtaskReportColumnDefinition.php +++ b/app/Plugins/User/Learningtasks/Services/LearningtaskReportColumnDefinition.php @@ -28,6 +28,8 @@ class LearningtaskReportColumnDefinition implements ColumnDefinitionInterface // 'ファイルURL' => 'file_url', '評価' => 'grade', '評価コメント' => 'comment', + '単語数' => 'word_count', + '字数' => 'char_count', ]; /** @@ -58,6 +60,12 @@ public function getHeaders(): array if ($this->setting_checker->isEnabled(LearningtaskUseFunction::use_report_comment)) { $header_columns[] = '本文'; } + if ($this->setting_checker->isEnabled(LearningtaskUseFunction::use_report_show_word_count)) { + $header_columns[] = '単語数'; + } + if ($this->setting_checker->isEnabled(LearningtaskUseFunction::use_report_show_char_count)) { + $header_columns[] = '字数'; + } if ($this->setting_checker->isEnabled(LearningtaskUseFunction::use_report_file)) { $header_columns[] = 'ファイルURL'; } diff --git a/resources/views/plugins/user/learningtasks/default/learningtasks_edit_learningtasks.blade.php b/resources/views/plugins/user/learningtasks/default/learningtasks_edit_learningtasks.blade.php index 175c5d190..ee62e8abd 100644 --- a/resources/views/plugins/user/learningtasks/default/learningtasks_edit_learningtasks.blade.php +++ b/resources/views/plugins/user/learningtasks/default/learningtasks_edit_learningtasks.blade.php @@ -340,11 +340,20 @@ class="custom-control-input"