ACC SHELL
<?php
/**
* This file is part of the Nette Framework (http://nette.org)
* Copyright (c) 2004 David Grudl (http://davidgrudl.com)
*/
namespace Nette\Forms\Controls;
use Nette;
/**
* Select box control that allows single item selection.
*
* @author David Grudl
*
* @property bool $prompt
*/
class SelectBox extends ChoiceControl
{
/** validation rule */
const VALID = ':selectBoxValid';
/** @var array of option / optgroup */
private $options = array();
/** @var mixed */
private $prompt = FALSE;
/**
* Sets first prompt item in select box.
* @param string
* @return self
*/
public function setPrompt($prompt)
{
$this->prompt = $prompt;
return $this;
}
/**
* Returns first prompt item?
* @return mixed
*/
public function getPrompt()
{
return $this->prompt;
}
/**
* Sets options and option groups from which to choose.
* @return self
*/
public function setItems(array $items, $useKeys = TRUE)
{
if (!$useKeys) {
$res = array();
foreach ($items as $key => $value) {
unset($items[$key]);
if (is_array($value)) {
foreach ($value as $val) {
$res[$key][(string) $val] = $val;
}
} else {
$res[(string) $value] = $value;
}
}
$items = $res;
}
$this->options = $items;
return parent::setItems(Nette\Utils\Arrays::flatten($items, TRUE));
}
/**
* Generates control's HTML element.
* @return Nette\Utils\Html
*/
public function getControl()
{
$items = $this->prompt === FALSE ? array() : array('' => $this->translate($this->prompt));
foreach ($this->options as $key => $value) {
$items[is_array($value) ? $this->translate($key) : $key] = $this->translate($value);
}
return Nette\Forms\Helpers::createSelectBox(
$items,
array(
'selected?' => $this->value,
'disabled:' => is_array($this->disabled) ? $this->disabled : NULL
)
)->addAttributes(parent::getControl()->attrs);
}
/**
* Performs the server side validation.
* @return void
*/
public function validate()
{
parent::validate();
if (!$this->isDisabled() && $this->prompt === FALSE && $this->getValue() === NULL && $this->options) {
$this->addError(Nette\Forms\Rules::$defaultMessages[self::VALID]);
}
}
}
ACC SHELL 2018