brenofortunato / laravel-quiz
Laravel项目中添加问卷的库。
Requires
- php: >=7.0
- ghunti/highcharts-php: ~3.0
- laracasts/flash: ^3.0
- laravelcollective/html: ^5.8.0
- predis/predis: ^1.1
- yajra/laravel-datatables-buttons: ^4.6
- yajra/laravel-datatables-html: ^4.0
- yajra/laravel-datatables-oracle: ~9.0
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
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 被修改,请将 uses 属性的 questionnaires 前缀下的块更改为:
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']); });