Skip to content
Snippets Groups Projects
Forked from Stud.IP / Stud.IP
2289 commits behind the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
DataFieldSelectboxEntry.class.php 2.86 KiB
<?php
# Lifter002: DONE
# Lifter007: TEST

/**
 * @author  Jan-Hendrik Willms <tleilax+studip@gmail.com>
 * @author  Marcus Lunzenauer <mlunzena@uos.de>
 * @author  Martin Gieseking  <mgieseki@uos.de>
 * @license GPL2 or any later version
 */
class DataFieldSelectboxEntry extends DataFieldEntry
{
    protected $template = 'selectbox.php';
    protected $type_param;
    protected $is_assoc_param = false;

    /**
     * Constructs this datafield
     *
     * @param DataField $datafield Underlying model
     * @param String    $rangeID   Range id
     * @param mixed     $value     Value
     */
    public function __construct(DataField $struct = null, $range_id = '', $value = null)
    {
        parent::__construct($struct, $range_id, $value);

        list($values, $is_assoc) = $this->getParameters();
        $this->is_assoc_param = $is_assoc;
        $this->type_param     = $values;

        if ($this->getValue() === null) {
            reset($values);

            if ($is_assoc) {
                $this->setValue((string)key($values));
            } else {
                $this->setValue(current($values)); // first selectbox entry is default
            }
        }
    }

    /**
     * Returns the according input elements as html for this datafield
     *
     * @param String $name      Name prefix of the associated input
     * @param Array  $variables Additional variables
     * @return String containing the required html
     */
    public function getHTML($name = '', $variables = [])
    {
        $variables = array_merge([
            'multiple'   => false,
            'type_param' => $this->type_param,
            'is_assoc'   => $this->is_assoc_param,
        ], $variables);

        return parent::getHTML($name, $variables);
    }

    /**
     * Returns the individual type parameters.
     *
     * @return array containing the individual type parameters
     */
    public function getParameters()
    {
        $params = explode("\n", rtrim($this->model->typeparam));
        $params = array_map('trim', $params);
        $ret = [];
        $is_assoc = false;

        foreach ($params as $i => $p) {
            if (mb_strpos($p, '=>') !== false) {
                $is_assoc = true;

                list($key, $value) = array_map('trim', explode('=>', $p, 2));
                $ret[$key] = $value;
            } else {
                $ret[$i] = $p;
            }
        }
        return [$ret, $is_assoc];
    }

    /**
     * Returns the display/rendered value of this datafield
     *
     * @param bool $entities Should html entities be encoded (defaults to true)
     * @return String containg the rendered value
     */
    public function getDisplayValue($entities = true)
    {
        $value = $this->is_assoc_param
               ? $this->type_param[$this->getValue()]
               : $this->getValue();
        return $entities ? htmlReady($value) : $value;
    }
}