Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace App\Controller\Question;
- use App\Breadcrumbs\BreadcrumbsBuilder;
- use App\Form\QuestionType as QuestionType2;
- use App\Model\InterviewQuery;
- use App\Model\Question;
- use App\Model\QuestionAnswerQuery;
- use App\Model\QuestionnaireType;
- use App\Model\QuestionQuery;
- use App\Model\QuestionType;
- use App\Model\QuestionTypeQuery;
- use App\Utils\QuestionTypeUtil;
- use PhpOffice\PhpSpreadsheet\Spreadsheet;
- use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
- use Propel\Runtime\ActiveQuery\ModelCriteria;
- use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
- use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
- use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
- use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpFoundation\StreamedResponse;
- use Symfony\Component\Routing\Annotation\Route;
- class CrudController extends AbstractController
- {
- private $breadcrumbs;
- public function __construct(BreadcrumbsBuilder $breadcrumbs)
- {
- $this->breadcrumbs = $breadcrumbs;
- }
- /**
- * @Route("/question/{questionnaire_type_id}/{question_type_id}/new", name="question_new", requirements={"questionnaire_type_id": "\d+", "question_type_id": "\d+"})
- * @ParamConverter("questionnaireType", options={"mapping"={"questionnaire_type_id"="id"}})
- * @ParamConverter("questionType", options={"mapping"={"question_type_id"="id"}})
- * @Method({"GET", "POST"})
- * @Security("has_role('ROLE_ADMIN')")
- */
- public function new(Request $request, QuestionnaireType $questionnaireType, QuestionType $questionType)
- {
- $respondentName = $questionnaireType->getName();
- $this->breadcrumbs->add('Questionnaire', 'questionnaire_index');
- $this->breadcrumbs->add($respondentName.' Questions', 'question_index', ['id' => $questionnaireType->getId()]);
- $this->breadcrumbs->add('Create Question', 'question_new', ['questionnaire_type_id' => $questionnaireType->getId(), 'question_type_id' => $questionType->getId()]);
- $question = new Question();
- $question->initAnswer($this->initNumber($questionType));
- $question->setQuestionnaireTypeId($questionnaireType->getId());
- $question->setQuestionTypeId($questionType->getId());
- $collectionChoices = ($questionType->getId() === QuestionTypeUtil::Image_selection) ? 1 : null;
- $isCard = ($questionType->getId() == QuestionTypeUtil::card) ? 1 : null;
- $isRating = ($questionType->getId() == QuestionTypeUtil::Range_Answer) ? true : false;
- $form = $this->createForm(QuestionType2::class, $question, [
- 'is_choices' => $collectionChoices,
- 'is_rating' => $isRating,
- 'is_card' => $isCard,
- ]);
- $form->handleRequest($request);
- if ($form->isSubmitted() && $form->isValid()) {
- $question->setQuestion($question->getQuestion());
- $question->setCreatedBy($this->getUser()->getId());
- $question->save();
- $this->addFlash('success', 'Question successfully added!');
- return $this->redirectToRoute('question_index', ['id' => $questionnaireType->getId()]);
- }
- //Rendering
- if($questionType->getId() == QuestionTypeUtil::Single_Answer_with_other || $questionType->getId() == QuestionTypeUtil::Multiple_has_other) {
- $withOther = true;
- } else {
- $withOther = false;
- }
- if($questionType->getId() == QuestionTypeUtil::Matrix_Answer || $questionType->getId() == QuestionTypeUtil::Matrix_multiple_select) {
- $withAtribut = true;
- $withAtributValue = ($questionType->getId() == QuestionTypeUtil::Matrix_multiple_select) ? true : false;
- } else {
- $withAtribut = false;
- $withAtributValue = false;
- }
- if($questionType->getId() === QuestionTypeUtil::Single_Answer_yes_no) {
- $formTemplate = 'question/form_boolean.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Openended_Answer_text || $questionType->getId() === QuestionTypeUtil::Openended_Answer_with_masking || $questionType->getId() === QuestionTypeUtil::card){
- $formTemplate = 'question/form_input.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Matrix_Answer){
- $formTemplate = 'question/form_matrix.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Image_selection){
- $formTemplate = 'question/form_image.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Matrix_multiple_select){
- $formTemplate = 'question/form_matrix_multiple.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Range_Answer){
- $formTemplate = 'question/form_rating.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::panel_dynamic){
- $formTemplate = 'question/form_panel_dynamic.html.twig';
- } else {
- $formTemplate = 'question/form.html.twig';
- }
- return $this->render('question/new.html.twig', [
- 'form' => $form->createView(),
- 'title' => $question->getQuestionType()->getName(),
- 'menu' => implode('', $this->generateMenu($questionnaireType->getId(), $questionType->getId())),
- 'formTemplate' => $formTemplate,
- 'withOther' => $withOther,
- 'withAtribut' => $withAtribut,
- 'withAtributValue' => $withAtributValue,
- 'questionnaire_type_id' => $questionnaireType->getId(),
- 'question_type_id' => $questionType->getId(),
- 'respondent_type_name' => $respondentName,
- 'is_card' => $isCard,
- 'is_masking' => $questionType->getId() == QuestionTypeUtil::Openended_Answer_with_masking,
- ]);
- }
- /**
- * @Route("/question/{questionnaire_type_id}/{question_type_id}/edit/{question_id}", name="question_edit", requirements={"questionnaire_type_id": "\d+", "question_type_id": "\d+", "question_id": "\d+"})
- * @ParamConverter("questionnaireType", options={"mapping"={"questionnaire_type_id"="id"}})
- * @ParamConverter("questionType", options={"mapping"={"question_type_id"="id"}})
- * @ParamConverter("question", options={"mapping"={"question_id"="id"}})
- * @Method({"GET", "POST"})
- * @Security("has_role('ROLE_ADMIN')")
- */
- public function edit(Request $request, QuestionnaireType $questionnaireType, QuestionType $questionType, Question $question)
- {
- $questionnaireName = $questionnaireType->getName();
- $this->breadcrumbs->add('Questionnaire', 'questionnaire_index');
- $this->breadcrumbs->add($questionnaireName.' Questions', 'question_index', ['id' => $questionnaireType->getId()]);
- $this->breadcrumbs->add('Edit Question', 'question_edit', ['questionnaire_type_id' => $questionnaireType->getId(), 'question_type_id' => $questionType->getId(), 'question_id' => $question->getId()]);
- if($question->getQuestionTypeId() != $questionType->getId()) {
- //Inisiasi - jumlah jawaban yg ada
- $initNumber = $this->initNumber($questionType) - $question->getQuestionAnswers()->count();
- $numbertoAdd = $initNumber >= 0 ? $initNumber : 0;
- $question->initAnswer($numbertoAdd);
- }
- $collectionChoices = ($questionType->getId() === QuestionTypeUtil::Image_selection) ? 1 : null;
- $isCard = ($questionType->getId() == QuestionTypeUtil::card) ? 1 : null;
- $isRating = ($questionType->getId() == QuestionTypeUtil::Range_Answer) ? true : false;
- $form = $this->createForm(QuestionType2::class, $question, [
- 'is_choices' => $collectionChoices,
- 'is_rating' => $isRating,
- 'is_card' => $isCard,
- ]);
- $form->handleRequest($request);
- if($form->isSubmitted() && $form->isValid()) {
- $question->setQuestion($question->getQuestion());
- $question->setQuestionTypeId($questionType->getId());
- $question->setCreatedBy($this->getUser()->getId());
- $question->save();
- $this->addFlash('success', 'Question has been updated!');
- return $this->redirectToRoute('question_index', ['id' => $questionnaireType->getId()]);
- }
- //render edit
- if($questionType->getId() == QuestionTypeUtil::Single_Answer_with_other || $questionType->getId() == QuestionTypeUtil::Multiple_has_other) {
- $withOther = true;
- } else {
- $withOther = false;
- }
- if($questionType->getId() == QuestionTypeUtil::Matrix_Answer || $questionType->getId() == QuestionTypeUtil::Matrix_multiple_select) {
- $withAtribut = true;
- $withAtributValue = ($questionType->getId() == QuestionTypeUtil::Matrix_multiple_select) ? true : false;
- } else {
- $withAtribut = false;
- $withAtributValue = false;
- }
- if($questionType->getId() === QuestionTypeUtil::Single_Answer_yes_no) {
- $formTemplate = 'question/form_boolean.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Openended_Answer_text || $questionType->getId() === QuestionTypeUtil::Openended_Answer_with_masking || $questionType->getId() === QuestionTypeUtil::card){
- $formTemplate = 'question/form_input.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Matrix_Answer){
- $formTemplate = 'question/form_matrix.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Image_selection){
- $formTemplate = 'question/form_image.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Matrix_multiple_select){
- $formTemplate = 'question/form_matrix_multiple.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::Range_Answer){
- $formTemplate = 'question/form_rating.html.twig';
- } else if($questionType->getId() === QuestionTypeUtil::panel_dynamic){
- $formTemplate = 'question/form_panel_dynamic.html.twig';
- } else {
- $formTemplate = 'question/form.html.twig';
- }
- return $this->render('question/edit.html.twig', [
- 'form' => $form->createView(),
- 'title' => $questionType->getName(),
- 'menu' => implode('', $this->generateMenu($questionnaireType->getId(), $questionType->getId(), $question->getId())),
- 'formTemplate' => $formTemplate,
- 'withOther' => $withOther,
- 'withAtribut' => $withAtribut,
- 'withAtributValue' => $withAtributValue,
- 'questionnaire_type_id' => $questionnaireType->getId(),
- 'question_type_id' => $questionType->getId(),
- 'respondent_type_name' => $questionnaireName,
- 'is_card' => $isCard,
- 'is_masking' => $questionType->getId() == QuestionTypeUtil::Openended_Answer_with_masking,
- ]);
- }
- /**
- * @Route("/question/{questionnaire_type_id}/{question_type_id}/download/{question_id}", name="question_download", requirements={"questionnaire_type_id": "\d+", "question_type_id": "\d+", "question_id": "\d+"})
- * @ParamConverter("questionnaireType", options={"mapping"={"questionnaire_type_id"="id"}})
- * @ParamConverter("questionType", options={"mapping"={"question_type_id"="id"}})
- * @ParamConverter("question", options={"mapping"={"question_id"="id"}})
- * @Method({"GET", "POST"})
- * @Security("has_role('ROLE_ADMIN')")
- */
- public function downloadExcel(Request $request, QuestionnaireType $questionnaireType, QuestionType $questionType, Question $question)
- {
- $head = $this->getQuestion($question);
- $answer = $this->getExcelData($question);
- $specialQuestion = [
- 'Matrix Multiple Select',
- 'Matrix Answer'
- ];
- $specialCase =
- [
- 'C3E'
- ];
- //create spreadsheet
- $spreadsheet = new Spreadsheet();
- $sheet = $spreadsheet->getActiveSheet();
- //create second header
- // if(in_array($question->getQuestionType(), $specialQuestion)) {
- // $questionAnswers = QuestionAnswerQuery::create()
- // ->filterByQuestion($question)
- // ->select(['answer'])
- // ->find()
- // ->toArray();
- //
- // $startCell = 'A6';
- // $sheet->fromArray(
- // $questionAnswers,
- // NULL,
- // 'A5',
- // true
- // );
- // }
- //create second header
- $questionAnswers = QuestionAnswerQuery::create()
- ->filterByQuestion($question)
- ->select(['answer'])
- ->find()
- ->toArray();
- if(in_array($question->getQuestionNumber(), $specialCase)){
- $attributes = QuestionQuery::create()
- ->filterByQuestionNumber($question->getQuestionNumber(),ModelCriteria::EQUAL)
- ->select(['atribut'])
- ->find()
- ->toArray();
- $attribute = explode(',', $attributes[0]);
- $arr =[];
- for($i=0;$i<count($questionAnswers);$i++){
- $arr = array_merge($arr,$attribute);
- }
- $startCell = 'A6';
- $sheet->fromArray(
- $arr,
- NULL,
- 'B5',
- true
- );
- }elseif(in_array($question->getQuestionType(), $specialQuestion) && !in_array($question->getQuestionNumber(), $specialCase)){
- $startCell = 'A6';
- $sheet->fromArray(
- $questionAnswers,
- NULL,
- 'B5',
- true
- );
- }else{
- $startCell = 'A5';
- }
- //header
- $sheet->fromArray(
- $head,
- NULL,
- 'A4',
- true);
- $sheet->fromArray(
- $answer,
- NULL,
- $startCell,
- true
- );
- //set title
- $sheet->setTitle($question->getQuestionNumber());
- // Create your Office 2007 Excel (XLSX Format)
- $writer = new Xlsx($spreadsheet);
- $response = new StreamedResponse(
- function () use ($writer) {
- $writer->save('php://output');
- }
- );
- $dispositions = 'attachment';
- $filename = 'export-'.$question->getQuestionNumber().'.xlsx';
- $response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
- $response->headers->set('Content-Disposition', $response->headers->makeDisposition($dispositions, $filename));
- $response->headers->set('Cache-Control','max-age=0');
- return $response;
- }
- private function getQuestion(Question $question)
- {
- $multipleAnswerQuestion =
- [
- 'Matrix Multiple Select',
- 'Multiple Answer with Other',
- 'Matrix Answer',
- 'Multiple Answers',
- ];
- $specialCase =
- [
- 'C3E'
- ];
- if(in_array($question->getQuestionType(), $multipleAnswerQuestion)){
- if(in_array($question->getQuestionNumber(), $specialCase)){
- $tmp = [];
- $attributes = explode(',', $question->getAtribut());
- $answers = QuestionAnswerQuery::create()
- ->filterByQuestion($question)
- ->select(['answer'])
- ->find()
- ->toArray();
- foreach ($answers as $answer)
- {
- foreach ($attributes as $attribute)
- {
- $tmp [] = $question->getQuestion().' - '.$answer;
- }
- }
- $question = $tmp;
- }else{
- $question = QuestionQuery::create()
- ->joinQuestionAnswer()
- ->filterById($question->getId())
- ->select(['question'])
- ->find()
- ->toArray();
- }
- }else{
- $question = [$question->getQuestion()];
- }
- return array_merge(['Respondent ID'],$question);
- }
- private function getExcelData(Question $question)
- {
- $oneForeachAnswer =
- [
- 'Multiple Answers',
- 'Multiple Answer with Other',
- ];
- $specialCase =
- [
- 'C3E'
- ];
- $answers = InterviewQuery::create()
- ->useRespondentQuery()
- ->filterByDeletedAt(null, ModelCriteria::EQUAL)
- ->endUse()
- ->useAssignmentDetailQuery()
- ->filterByStatusVerified()
- ->endUse()
- ->filterByQuestion($question)
- ->select(['raw_answer_export','respondent_id'])
- ->find()
- ->toArray();
- $questionAnswers = QuestionAnswerQuery::create()
- ->filterByQuestion($question)
- ->select(['answer'])
- ->find()
- ->toArray();
- if(($question->getQuestionType() == 'Matrix Multiple Select') && (!in_array($question->getQuestionNumber(),$specialCase))){
- $tmp = [];
- $flipQA = array_flip($questionAnswers);
- foreach ($answers as $answer)
- {
- $tmp [] = json_decode($answer['raw_answer_export'],true);
- }
- $containers = [];
- foreach ($tmp as $item)
- {
- foreach ($item as $index => $value)
- {
- $containers[] = $value;
- }
- }
- $returns = [];
- foreach ($containers as $contain)
- {
- //$return [] = array_merge_recursive($contain,array_flip($questionAnswers));
- //$return [] = array_replace_recursive(array_flip($questionAnswers), $contain);
- $returns [] = array_replace_recursive($flipQA, $contain);
- }
- $datas = [];
- $goods = [];
- foreach ($returns as $return)
- {
- foreach ($return as $index => $data)
- {
- if(is_array($data)){
- $datas [$index] = array_shift($data);
- }else{
- $datas[$index] = null;
- }
- }
- $goods[] = $datas;
- }
- // $result = $returns;
- $result = $goods;
- }elseif($question->getQuestionType() == 'Matrix Answer') {
- $tmp2 = [];
- $flipQuestionAnswers = array_flip($questionAnswers);
- $questionAnswer = [];
- foreach ($flipQuestionAnswers as $index => $fill)
- {
- $questionAnswer[$index] = null;
- }
- foreach ($answers as $answer2)
- {
- $tmp2 [] = json_decode($answer2['raw_answer_export'],true);
- }
- $container = [];
- foreach ($tmp2 as $item)
- {
- foreach ($item as $value)
- {
- $container[] = $value;
- }
- }
- $return = [];
- foreach ($container as $contain)
- {
- $return [] = array_replace_recursive($questionAnswer, $contain);
- }
- $result = $return;
- }elseif(in_array($question->getQuestionType(), $oneForeachAnswer)){
- $tmp3 = [];
- foreach ($answers as $answer3)
- {
- $tmp3 [] = json_decode($answer3['raw_answer_export'],true);
- }
- $final =[];
- foreach ($tmp3 as $value){
- if(array_key_exists($question->getId().'-Comment', $value))
- {
- $final [] = [$value[$question->getId().'-Comment']];
- }
- else
- {
- foreach ($value as $outcome){
- $final[] = $outcome;
- }
- }
- }
- $result = $final;
- }elseif(in_array($question->getQuestionNumber(),$specialCase)){
- $attributes = QuestionQuery::create()
- ->filterByQuestionNumber($question->getQuestionNumber(),ModelCriteria::EQUAL)
- ->select(['atribut'])
- ->find()
- ->toArray();
- $attribute = explode(',', $attributes[0]);
- $flipAttributes = array_flip($attribute);
- $flipAttribute = [];
- foreach ($flipAttributes as $index => $fill)
- {
- $flipAttribute[$index] = null;
- }
- $tmpr = [];
- foreach ($answers as $answered) {
- $tmpr [] = json_decode($answered['raw_answer_export'], true);
- }
- $items = [];
- foreach ($tmpr as $values)
- {
- foreach ($values as $value)
- {
- $items [] = $value;
- }
- }
- $return = [];
- $finalization = [];
- $merged = [];
- foreach ($items as $key => $item)
- {
- foreach ($item as $index => $price)
- {
- $return [$index] = array_replace_recursive($flipAttribute, $price);
- }
- $finalization[] = array_reduce(
- array_map(function($item) {
- return array_values($item);
- }, array_values($return)),
- [$this, "reduce_data"]
- );
- }
- $result = $finalization;
- // $result = $box;
- }else {
- $tmp4 = [];
- foreach ($answers as $answer4) {
- $tmp4 [] = json_decode($answer4['raw_answer_export'], true);
- }
- $result = $tmp4;
- }
- $respondent_id = [];
- foreach ($answers as $answer)
- {
- $respondent_id[] = json_decode($answer['respondent_id'],true);
- }
- $newArray = [];
- for($i=0;$i<count($respondent_id);$i++)
- {
- array_unshift($result[$i],$respondent_id[$i]);
- }
- return $result;
- }
- public function reduce_data($a, $b, $initial = []) {
- $a = is_null($a) ? [] : $a;
- $b = is_null($b) ? [] : $b;
- $initial = is_null($initial) ? [] : $initial;
- return array_merge($initial, $a, $b);
- }
- /**
- * @Route("/question/{id}/delete", name="question_delete", requirements={"id":"\d+"})
- * @Method({"DELETE"})
- * @Security("has_role('ROLE_ADMIN')")
- */
- public function deleteAction(Question $question)
- {
- $question->delete();
- $swal = "Question deleted!";
- return $this->json(['success' => true, 'message' => $swal]);
- }
- private function generateMenu($questionnaireTypeId, $typeId, $editId = null)
- {
- $types = QuestionTypeQuery::create()->orderByName()->find();
- foreach($types as $type){
- $class = '';
- $iconClass = 'text-grey-light';
- $textClass = 'text-grey-light';
- if($type->getId() == $typeId) {
- $class = 'active';
- $iconClass = 'txt-blue';
- $textClass = '';
- }
- if($editId) {
- $url = $this->generateUrl('question_edit', ['questionnaire_type_id' => $questionnaireTypeId, 'question_type_id' => $type->getId(), 'question_id' => $editId]);
- } else {
- $url = $this->generateUrl('question_new', ['questionnaire_type_id' => $questionnaireTypeId, 'question_type_id' => $type->getId()]);
- }
- $data[] = sprintf('<li class="%s"><a href="%s" class="%s"><i class="icon-check mr-5 %s"></i><span>%s</span></a></li>', $class, $url, $textClass, $iconClass, $type->getName());
- }
- return $data;
- }
- private function initNumber(QuestionType $questionType)
- {
- switch ($questionType->getId()) {
- case QuestionTypeUtil::Single_Answer_yes_no:
- return 2;
- case QuestionTypeUtil::Openended_Answer_text:
- return 0;
- case QuestionTypeUtil::Openended_Answer_with_masking:
- return 0;
- case QuestionTypeUtil::Range_Answer:
- return 10;
- case QuestionTypeUtil::card:
- return 0;
- default :
- return 4;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement