isaacongoma / laravel-quiz
Laravel 项目中添加问卷的库。
Requires
Requires (Dev)
- mockery/mockery: ^1.1
- orchestra/testbench: ~3.0
- phpunit/phpunit: ~7.0
- sempro/phpunit-pretty-print: ^1.0
- symplify/easy-coding-standard: ^6.0
This package is auto-updated.
Last update: 2024-09-05 14:33:00 UTC
README
为 Laravel 项目添加问卷的包。
最低要求
- PHP 7.0
- Laravel 5.8
- Laravel Datatables 9.0
安装
要安装,只需使用以下命令
composer require brenofortunato/laravel-quiz
然后,发布资源
php artisan vendor:publish --provider="PandoApps\Quiz\QuizServiceProvider"
配置
请确保不存在名为 questionnaires、question_types、questions、alternatives、executables 和 answers 的表。如果存在,请删除或重命名它们,别忘了相关模型、视图等。准备好后,执行迁移
php artisan migrate
然后,执行 QuestionTypeSeeder
php artisan db:seed --class=QuestionTypeSeeder
打开 config/quiz.php 文件并编辑 models 数组以满足您的需求,如下所述
'models' => [ 'executable' => App\User::class, // Model que responderá o questionário 'executable_column_name' => 'name', // Nome da coluna que representa a descrição do model que executa o questionário 'parent_type' => App\Holding::class, // Model que é dono do questionário 'parent_id' => 'holding_id', // Nome da coluna que representa a FK para o model que é dono do questionário 'parent_url_name' => 'holdings', // Nome da tabela do model que é dono do questionário ]
将以下关系添加到将回答问卷的模型中(例如,在上述示例中为 User)
/** * @return \Illuminate\Database\Eloquent\Relations\MorphMany **/ public function executables() { return $this->morphMany(\PandoApps\Quiz\Models\Executable::class, 'executable'); } /** * @return \Illuminate\Database\Eloquent\Relations\MorphToMany **/ public function answeredQuestionnaires() { return $this->morphToMany(\PandoApps\Quiz\Models\Questionnaire::class, 'executable')->withPivot('id', 'score', 'answered')->withTimestamps(); }
并将以下关系添加到拥有问卷的模型中(例如,在上述示例中为 Holding)
/** * @return \Illuminate\Database\Eloquent\Relations\MorphMany **/ public function questionnaires() { return $this->morphMany(\PandoApps\Quiz\Models\Questionnaire::class, 'parent'); }
在 routes/web.php 中添加路由
Route::group(['prefix' => config('quiz.models.parent_url_name'). '/{' . config('quiz.models.parent_id'). '}'], function () { Route::group(['prefix' => 'questionnaires'], function () { Route::get('/', ['as'=>'questionnaires.index', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@index']); Route::get('/create', ['as'=>'questionnaires.create', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@create']); Route::post('/', ['as'=>'questionnaires.store', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@store']); Route::get('/{questionnaire_id}', ['as'=>'questionnaires.show', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@show']); Route::match(['put', 'patch'], '/{questionnaire_id}', ['as'=>'questionnaires.update', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@update']); Route::delete('/{questionnaire_id}', ['as'=>'questionnaires.destroy', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@destroy']); Route::get('/{questionnaire_id}/edit', ['as'=>'questionnaires.edit', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@edit']); }); Route::group(['prefix' => 'questions'], function () { Route::get('/', ['as'=>'questions.index', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@index']); Route::get('/{question_id}', ['as'=>'questions.show', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@show']); Route::match(['put', 'patch'], '/{question_id}', ['as'=>'questions.update', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@update']); Route::delete('/{question_id}', ['as'=>'questions.destroy', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@destroy']); Route::get('/{question_id}/edit', ['as'=>'questions.edit', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@edit']); }); Route::group(['prefix' => 'alternatives'], function () { Route::get('/', ['as'=>'alternatives.index', 'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@index']); Route::get('/{alternative_id}', ['as'=>'alternatives.show', 'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@show']); Route::match(['put', 'patch'], '/{alternative_id}', ['as'=>'alternatives.update', 'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@update']); Route::delete('/{alternative_id}', ['as'=>'alternatives.destroy', 'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@destroy']); Route::get('/{alternative_id}/edit', ['as'=>'alternatives.edit', 'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@edit']); }); Route::group(['prefix' => 'executables'], function () { Route::get('/', ['as'=>'executables.index', 'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@index']); Route::get('/{questionnaire_id}/questionnaire', ['as'=>'executables.statistics', 'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@statistics']); Route::get('{executable_id}/', ['as'=>'executables.show', 'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@show']); Route::get('{questionnaire_id}/create/{model_id}', ['as'=>'executables.create', 'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@create']); Route::post('{questionnaire_id}/store', ['as'=>'executables.store', 'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@store']); Route::post('start', ['as'=>'executables.start', 'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@start']); }); Route::group(['prefix' => 'answers'], function () { Route::get('/', ['as'=>'answers.index', 'uses'=>'\PandoApps\Quiz\Controllers\AnswerController@index']); Route::get('/{answer_id}', ['as'=>'answers.show', 'uses'=>'\PandoApps\Quiz\Controllers\AnswerController@show']); }); });
在 resources/views/layouts/menu.blade.php 中将问卷添加到菜单中,用您的对应值替换 request()->PARENT_ID(在示例中,为 request()->holding_id)
<li class="{{ (Request::is('*questionnaires*') || Request::is('*questions*') || Request::is('*alternatives*')) ? 'active' : '' }}"> <a href="{!! route('questionnaires.index', request()->PARENT_ID) !!}"><i class="far fa-list-alt sidebar-icons"></i><span>{!! \Lang::choice('tables.questionnaires','p') !!}</span></a> @if(Request::is('*questions*') && request()->questionnaire_id) <ul class="treeview-menu"> <li class="{{ Request::is('*questions*') ? 'active text-bold' : '' }}"> <a class="treeview-link" href="{!! route('questions.index', [request()->PARENT_ID, 'questionnaire_id' => request()->questionnaire_id]) !!}"><i class="fas fa-question sidebar-icons-treeview"></i><span>{!! \Lang::choice('tables.questions','p') !!}</span></a> </li> </ul> @endisset @if(Request::is('*alternatives*') && request()->question_id) <ul class="treeview-menu"> <li class="{{ Request::is('*alternatives*') ? 'active text-bold' : '' }}"> <a class="treeview-link" href="{!! route('alternatives.index', [request()->PARENT_ID, 'question_id' => request()->question_id]) !!}"><i class="fas fa-check-square sidebar-icons-treeview"></i><span>{!! \Lang::choice('tables.alternatives','p') !!}</span></a> </li> </ul> @endisset </li>
在 resources/lang/pt_BR/tables.php 中添加表的翻译
'questionnaires' => '[s] Questionário |[p] Questionários', 'questions' => '[s] Questão |[p] Questões', 'alternatives' => '[s] Alternativa |[p] Alternativas', 'question_types' => '[s] Tipo da Questão |[p] Tipo das Questões', 'answers' => '[s] Resposta |[p] Respostas',
自定义
以下说明不是必需的,但可以作为进一步自定义包的指南。
如果您想修改 datatables 中显示的翻译,请编辑 resources/lang/vandor/pandoapps/pt_BR/datatable.php 文件。
如果您想修改视图,请编辑 resources/views/vendor/pandoapps 目录下的文件。
要修改 datatables,请在 app/DataTables 中创建它们的副本。以下文件作为基础(别忘了将命名空间改为 App\DataTables)
要修改控制器,请在 app/Http/Controllers 中创建它们的副本。以下文件作为基础(别忘了将命名空间改为 App\Http\Controllers)
- QuestionnaireController
- QuestionController
- AlternativeController
- ExecutableController
- AnswerController
修改控制器时,别忘了更新路由。例如,如果 QuestionnaireController 被修改,请将 questionnaires 前缀下的 uses 属性更改为
Route::group(['prefix' => 'questionnaires'], function () { Route::get('/', ['as'=>'questionnaires.index', 'uses'=>'QuestionnaireController@index']); Route::get('/create', ['as'=>'questionnaires.create', 'uses'=>'QuestionnaireController@create']); Route::post('/', ['as'=>'questionnaires.store', 'uses'=>'QuestionnaireController@store']); Route::get('/{questionnaire_id}', ['as'=>'questionnaires.show', 'uses'=>'QuestionnaireController@show']); Route::match(['put', 'patch'], '/{questionnaire_id}', ['as'=>'questionnaires.update', 'uses'=>'QuestionnaireController@update']); Route::delete('/{questionnaire_id}', ['as'=>'questionnaires.destroy', 'uses'=>'QuestionnaireController@destroy']); Route::get('/{questionnaire_id}/edit', ['as'=>'questionnaires.edit', 'uses'=>'QuestionnaireController@edit']); });