HEX
Server: Apache
System: Linux WWW 6.1.0-40-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.153-1 (2025-09-20) x86_64
User: web11 (1011)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: /var/www/apklausos/application/core/QuestionTypes/ArrayFlexibleRow/RenderArrayFlexibleRow.php
<?php

/**
 * RenderClass for Boilerplate Question
 *  * The ia Array contains the following
 *  0 => string qid
 *  1 => string sgqa
 *  2 => string questioncode
 *  3 => string question
 *  4 => string type
 *  5 => string gid
 *  6 => string mandatory,
 *  7 => string conditionsexist,
 *  8 => string usedinconditions
 *  0 => string used in group.php for question count
 * 10 => string new group id for question in randomization group (GroupbyGroup Mode)
 *
 */
class RenderArrayFlexibleRow extends QuestionBaseRenderer
{
    private $aMandatoryViolationSubQ;
    private $repeatheadings;
    private $minrepeatheadings;
    private $defaultWidth;
    private $columnswidth;
    private $answerwidth;
    private $cellwidth;
    private $sHeaders = '';
    private $sRepeatHeaders = '';

    private $rightExists;
    private $bUseDropdownLayout = false;

    private $inputnames = [];

    public $sCoreClass = "ls-answers subquestion-list questions-list";

    public function __construct($aFieldArray, $bRenderDirect = false)
    {
        parent::__construct($aFieldArray, $bRenderDirect);

        $aLastMoveResult         = LimeExpressionManager::GetLastMoveResult();
        $this->aMandatoryViolationSubQ = ($aLastMoveResult['mandViolation'] && $this->oQuestion->mandatory == 'Y') ? explode("|", (string) $aLastMoveResult['unansweredSQs']) : [];
        $this->repeatheadings    = Yii::app()->getConfig("repeatheadings");
        $this->minrepeatheadings = Yii::app()->getConfig("minrepeatheadings");

        if (ctype_digit((string) $this->repeatheadings) && !empty($this->repeatheadings)) {
            $this->repeatheadings    = intval($this->getQuestionAttribute('repeat_headings'));
            $this->minrepeatheadings = 0;
        }

        if ($this->getQuestionAttribute('use_dropdown') == 1) {
            $this->bUseDropdownLayout = true;
            $this->sCoreClass .= " dropdown-array";
        } else {
            $this->bUseDropdownLayout = false;
            $this->sCoreClass .= " radio-array";
        }

        $this->setSubquestions();
        $this->setAnsweroptions();

        $iCount = array_reduce($this->aSubQuestions[0], function ($combined, $oSubQuestions) {
            if (preg_match("/^[^|]+\|[^|]+$/", (string) $oSubQuestions->questionl10ns[$this->sLanguage]->question)) {
                $combined++;
            }
            return $combined;
        }, 0);
        // $right_exists is a flag to find out if there are any right hand answer parts.
        // If there arent we can leave out the right td column
        $this->rightExists = ($iCount > 0);

        if (ctype_digit(trim((string) $this->getQuestionAttribute('answer_width')))) {
            $this->answerwidth  = trim((string) $this->getQuestionAttribute('answer_width'));
            $this->defaultWidth = false;
        } else {
            $this->answerwidth = 33;
            $this->defaultWidth = true;
        }

        $this->columnswidth = 100 - $this->answerwidth;

        if ($this->rightExists) {
        /* put the right answer to same width : take place in answer width only if it's not default */
            if ($this->defaultWidth) {
                $this->columnswidth -= $this->answerwidth;
            } else {
                $this->answerwidth = $this->answerwidth / 2;
            }
        }
        if ($this->getQuestionCount() > 0 && $this->getAnswerCount() > 0) {
            $this->cellwidth = round(($this->columnswidth / $this->getAnswerCount()), 1);
        }
        /* set the default header */
        $this->setHeaders();
        /* set the repeat header */
        $this->setHeaders(true);
    }

    public function getMainView($forTwig = false)
    {
        return $this->bUseDropdownLayout
            ? '/survey/questions/answer/arrays/array/dropdown'
            : '/survey/questions/answer/arrays/array/no_dropdown';
    }

    /**
     * set the header
     * @var null|boolean isrepeat
     * @return void
     */
    public function setHeaders($isrepeat = false)
    {
        $sHeader = '';
        if ($this->bUseDropdownLayout) {
            $this->sHeaders =  $sHeader;
            return;
        }

        $sHeader  .= Yii::app()->twigRenderer->renderQuestion(
            $this->getMainView() . '/rows/cells/header_information',
            [
                'class'   => '',
                'content' => '',
                'type' => 'subquestion-header',
                'isrepeat' => $isrepeat,
            ]
        );

        foreach ($this->aAnswerOptions[0] as $oAnswer) {
            $sHeader  .= Yii::app()->twigRenderer->renderQuestion(
                $this->getMainView() . '/rows/cells/header_answer',
                [
                    'class'   => "answer-text",
                    'basename' => $this->sSGQA,
                    'content' => $oAnswer->answerl10ns[$this->sLanguage]->answer,
                    'code' => $oAnswer->code,
                    'isrepeat' => $isrepeat,
                    'oAnswer' => $oAnswer
                ]
            );
        }

        if ($this->rightExists) {
            $sHeader  .= Yii::app()->twigRenderer->renderQuestion(
                $this->getMainView() . '/rows/cells/header_information',
                [
                    'class'   => '',
                    'content' => '',
                    'type' => 'right-header',
                    'isrepeat' => $isrepeat,
                    'role' => null
                ]
            );
        }

        if (($this->oQuestion->mandatory != 'Y' && SHOW_NO_ANSWER == 1)) {
            //Question is not mandatory and we can show "no answer"
            $sHeader  .= Yii::app()->twigRenderer->renderQuestion(
                $this->getMainView() . '/rows/cells/header_answer',
                [
                    'class'   => 'answer-text noanswer-text',
                    'basename' => $this->sSGQA,
                    'content' => gT('No answer'),
                    'isrepeat' => $isrepeat,
                    'code' => '',
                    'oAnswer' => null
                ]
            );
        }
        if ($isrepeat) {
            $this->sRepeatHeaders =  $sHeader;
        } else {
            $this->sHeaders =  $sHeader;
        }
    }

    public function getDropdownRows()
    {
        // $labels[] = array(
        //     'code'   => $aAnswer->code,
        //     'answer' => $aAnswer->answerl10ns[$sSurveyLanguage]->answer
        // );

        //$aAnswer->answerl10ns[$sSurveyLanguage]->answer
        $aRows = [];
        foreach ($this->aSubQuestions[0] as $i => $oQuestion) {
            $myfname        = $this->sSGQA . $oQuestion->title;
            $answertext     = $oQuestion->questionl10ns[$this->sLanguage]['question'];
            // Check the mandatory sub Q violation
            $error = (in_array($myfname, $this->aMandatoryViolationSubQ));
            $value = $this->getFromSurveySession($myfname);

            if ($this->rightExists && (strpos((string) $oQuestion->questionl10ns[$this->sLanguage]['question'], '|') !== false)) {
                $aAnswertextArray = explode('|', (string) $oQuestion->questionl10ns[$this->sLanguage]['question']);
                $answertextright = $aAnswertextArray[1];
                $answertext = $aAnswertextArray[0];
            } else {
                $answertextright = null;
            }

            $options = [];

            // Dropdown representation : first choice (activated) must be Please choose... if there are no actual answer
            $showNoAnswer = ($this->oQuestion->mandatory != 'Y' && SHOW_NO_ANSWER == 1); // Tag if we must show no-answer
            if ($value === '') {
                $options[] = array(
                    'text' => gT('Please choose...'),
                    'value' => '',
                    'selected' => ''
                );
                $showNoAnswer = false;
            }
            // Real options
            foreach ($this->aAnswerOptions[0] as $i => $oAnswer) {
                $options[] = array(
                    'value' => $oAnswer->code,
                    'selected' => ($value == $oAnswer->code) ? SELECTED : '',
                    'text' => $oAnswer->answerl10ns[$this->sLanguage]->answer
                );
            }
            // Add the now answer if needed
            if ($showNoAnswer) {
                $options[] = array(
                    'text' => gT('No answer'),
                    'value' => '',
                    'selected' => ($value == '') ?  SELECTED : '',
                );
            }
            unset($showNoAnswer);
            $aRows[] = array(
                'myfname'                => $myfname,
                'answertext'             => $answertext,
                'answerwidth'            => $this->answerwidth,
                'value'                  => $value,
                'error'                  => $error,
                'checkconditionFunction' => 'checkconditions',
                'right_exists'           => $this->rightExists,
                'answertextright'        => $answertextright,
                'options'                => $options,
                'odd'                    => ($i % 2), // true for odd, false for even
            );

            $this->inputnames[] = $myfname;
        }
        return $aRows;
    }

    public function getNonDropdownRows()
    {
        $aRows = [];
        foreach ($this->aSubQuestions[0] as $i => $oQuestion) {
            if (($this->repeatheadings > 0) && ($i > 0) && ($i % $this->repeatheadings == 0)) {
                if (($this->getQuestionCount() - $i + 1) >= $this->minrepeatheadings) {
                    // Close actual body and open another one
                    $aRows[] = [
                        'template' => '/survey/questions/answer/arrays/array/no_dropdown/rows/repeat_header.twig',
                        'content' => array(
                            'sHeaders' => $this->sRepeatHeaders
                        )
                    ];
                }
            }

            $myfname        = $this->sSGQA . $oQuestion->title;
            $answertext     = $oQuestion->questionl10ns[$this->sLanguage]->question;
            $answertext     = (strpos((string) $answertext, '|') !== false) ? substr((string) $answertext, 0, strpos((string) $answertext, '|')) : $answertext;

            if ($this->rightExists && strpos((string) $oQuestion->questionl10ns[$this->sLanguage]->question, '|') !== false) {
                $answertextright = substr((string) $oQuestion->questionl10ns[$this->sLanguage]->question, strpos((string) $oQuestion->questionl10ns[$this->sLanguage]->question, '|') + 1);
            } else {
                $answertextright = '';
            }

            $error          = (in_array($myfname, $this->aMandatoryViolationSubQ)); /* Check the mandatory sub Q violation */
            $value          = $this->getFromSurveySession($myfname);
            $aAnswerColumns = [];

            foreach ($this->aAnswerOptions[0] as $oAnswer) {
                $aAnswerColumns[] = array(
                    'basename' => $this->sSGQA,
                    'myfname' => $myfname,
                    'ld' => $oAnswer->code,
                    'code' => $oAnswer->code,
                    'label' => $oAnswer->answerl10ns[$this->sLanguage]->answer,
                    'checked' => ($value == $oAnswer->code) ? 'checked' : '',
                    );
            }

            $aNoAnswerColumn = [];
            if (($this->oQuestion->mandatory != 'Y' && SHOW_NO_ANSWER == 1)) {
                $aNoAnswerColumn = array(
                    'basename' => $this->sSGQA,
                    'myfname'                => $myfname,
                    'ld'                     => '',
                    'code' => $oAnswer->code,
                    'label'                  => gT('No answer'),
                    'checked'                => (is_null($value) || $value === '') ? 'checked' : '',
                );
            }

            $aRows[] = [
                "template" => "survey/questions/answer/arrays/array/no_dropdown/rows/answer_row.twig",
                "content" => array(
                    'aAnswerColumns' => $aAnswerColumns,
                    'aNoAnswerColumn' => $aNoAnswerColumn,
                    'sSGQA'    => $this->sSGQA,
                    'myfname'    => $myfname,
                    'answertext' => $answertext,
                    'answerwidth' => $this->answerwidth,
                    'answertextright' => $answertextright,
                    'right_exists' => intval($this->rightExists),
                    'value'      => $value,
                    'error'      => $error,
                    'odd'        => ($i % 2), // true for odd, false for even
                )
                ];

            $this->inputnames[] = $myfname;
        }

        return $aRows;
    }

    public function getColumns()
    {
        $aColumns = [];
        $oddEven = false;
        foreach ($this->aAnswerOptions[0] as $oAnswer) {
            $aColumns[] = array(
                'class'     => $oddEven ? 'ls-col-even' : 'ls-col-odd',
                'cellwidth' => $this->cellwidth,
            );
                $oddEven = !$oddEven;
        }

        if ($this->rightExists) {
            $aColumns[] = array(
                'class'     => 'answertextright ' . ($oddEven ? 'ls-col-even' : 'ls-col-odd'),
                'cellwidth' => $this->answerwidth,
            );
            $oddEven = !$oddEven;
        }

        if (($this->oQuestion->mandatory != 'Y' && SHOW_NO_ANSWER == 1)) {
            //Question is not mandatory
            $aColumns[] = array(
                'class'     => 'col-no-answer ' . ($oddEven ? 'ls-col-even' : 'ls-col-odd'),
                'cellwidth' => $this->cellwidth,
            );
            $oddEven = !$oddEven;
        }
        return $aColumns;
    }


    public function getRows()
    {
        //return;
        return $this->bUseDropdownLayout
            ? $this->getDropdownRows()
            : $this->getNonDropdownRows();
    }

    public function render($sCoreClasses = '')
    {

        //return @do_array($this->aFieldArray);
        $answer = '';
        $answer .=  Yii::app()->twigRenderer->renderQuestion($this->getMainView() . '/answer', array(
            'anscount'   => $this->getQuestionCount(),
            'aRows'      => $this->getRows(),
            'aColumns'   => $this->getColumns(),
            'basename'   => $this->sSGQA,
            'answerwidth' => $this->answerwidth,
            'columnswidth' => $this->columnswidth,
            'right_exists' => $this->rightExists,
            'coreClass'  => $this->sCoreClass,
            'sHeaders'   => $this->sHeaders,
            ), true);

        $this->registerAssets();
        return array($answer, $this->inputnames);
    }

    protected function getAnswerCount($iScaleId = 0)
    {
        // Getting answerrcount
        $anscount  = count($this->aAnswerOptions[0]);
        $anscount  = ($this->oQuestion->other == 'Y') ? $anscount + 1 : $anscount; //COUNT OTHER AS AN ANSWER FOR MANDATORY CHECKING!
        $anscount  = ($this->oQuestion->mandatory != 'Y' && SHOW_NO_ANSWER == 1) ? $anscount + 1 : $anscount; //Count up if "No answer" is showing
        return $anscount;
    }
}