Skip to content
Snippets Groups Projects
Forked from Stud.IP / Stud.IP
3469 commits behind the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
SemesterSelectorWidget.php 3.13 KiB
<?php
/**
 * SemesterSelectorWidget
 *
 * This class defines a standard sidebar widget for choosing a semester.
 * The selector is derived from the more generic SelecWidget.
 *
 * @author    Jan-Hendrik Willms <tleilax+studip@gmail.com>
 * @see       SelectWidget
 * @since     Stud.IP 3.2
 * @license   GPL2 or any later version
 * @copyright Stud.IP Core Group
 */
class SemesterSelectorWidget extends SelectWidget
{
    protected $include_all = false;


    /**
     * The timestamp of the first semester that shall be selectable.
     */
    protected $semester_range_begin = 0;


    /**
     * The timestamp of the last semester that shall be selectable.
     */
    protected $semester_range_end = 0;


    /**
     * Overrides parent constructor by setting a default title and default
     * name.
     */
    public function __construct($url, $name = 'semester_id', $method = 'get')
    {
        parent::__construct(_('Semester auswählen'), $url, $name, $method);
    }

    /**
     * Should the list include an option for all semesters which results in
     * an option with a value of '0'.
     */
    public function includeAll($state = true)
    {
        $this->include_all = $state;
    }


    /**
     * Sets the range of semesters to be displayed.
     *
     * @param $semester_range_begin The timestamp of the first semester.
     *
     * @param $semester_range_end The timestamp of the end semester.
     */
    public function setRange($semester_range_begin, $semester_range_end)
    {
        if ($semester_range_end >= $semester_range_begin) {
            $this->semester_range_begin = $semester_range_begin;
            $this->semester_range_end = $semester_range_end;
        }
    }


    /**
     * Populates and renders the widget according to the previously made
     * settings.
     */
    public function render($variables = [])
    {
        $current_id = Request::get($this->template_variables['name']);
        if (!$current_id) {
            if ($this->template_variables['value']) {
                $current_id = $this->template_variables['value'];
            } elseif (!$this->include_all) {
                $current_id = Semester::findCurrent()->id;
            }
        }

        if ($this->include_all) {
            $element = new SelectElement(0, _('Alle Semester'), !$current_id);
            $this->addElement($element);
        }

        $semesters = [];
        if ($this->semester_range_begin && $this->semester_range_end) {
            $semesters = Semester::findBySql(
                '`beginn` BETWEEN :begin AND :end
                OR
                `ende` BETWEEN :begin AND :end
                ORDER BY `beginn` DESC',
                [
                    'begin' => $this->semester_range_begin,
                    'end' => $this->semester_range_end
                ]
            );
        } else {
            $semesters = array_reverse(Semester::getAll());
        }
        foreach ($semesters as $semester) {
            $element = new SelectElement($semester->id, $semester->name, $current_id && $semester->id == $current_id);
            $this->addElement($element);
        }

        return parent::render($variables);
    }
}