You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
173 lines
4.2 KiB
PHP
173 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace Artmark\Forms\Attributes;
|
|
|
|
/**
|
|
* Description of CssClassAttribute
|
|
*
|
|
* @author Andrey Pokidov <pokidov@e-traffic.ru>
|
|
*/
|
|
trait CssClassAttribute
|
|
{
|
|
private $classes = [];
|
|
|
|
/**
|
|
* Массив названий CSS классов
|
|
* @return string[]
|
|
*/
|
|
public function cssClasses()
|
|
{
|
|
return $this->classes;
|
|
}
|
|
|
|
/**
|
|
* Проверяет, что список CSS классов не пуст
|
|
* @return boolean
|
|
*/
|
|
public function hasCssClasses()
|
|
{
|
|
return count($this->classes) > 0;
|
|
}
|
|
|
|
/**
|
|
* Проверяет, имеется ли такой класс
|
|
* @param string $className
|
|
* @return boolean
|
|
*/
|
|
public function hasCssClass($className)
|
|
{
|
|
if (!is_string($className)) {
|
|
return false;
|
|
}
|
|
|
|
$cleaned = trim($className);
|
|
|
|
return $cleaned !== '' && in_array($cleaned, $this->classes);
|
|
}
|
|
|
|
/**
|
|
* Удаляет все CSS классы
|
|
* @return $this
|
|
*/
|
|
public function clearCssClasses()
|
|
{
|
|
$this->classes = [];
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Добавляет CSS классы в начало списка
|
|
* @param string|array $classes
|
|
* @return $this
|
|
*/
|
|
public function prependCssClasses($classes)
|
|
{
|
|
if (!is_array($classes) && !is_string($classes)) {
|
|
return $this;
|
|
}
|
|
|
|
$classList = self::filterClasseserClasses(self::parseClasses($classes));
|
|
|
|
foreach ($this->classes as $className) {
|
|
if (!in_array($className, $classList)) {
|
|
$className[] = $className;
|
|
}
|
|
}
|
|
|
|
$this->classes = $className;
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Добавляет CSS классы в конец списка
|
|
* @param string|array $classes
|
|
* @return $this
|
|
*/
|
|
public function appendCssClasses($classes)
|
|
{
|
|
if (!is_array($classes) && !is_string($classes)) {
|
|
return $this;
|
|
}
|
|
|
|
foreach (self::filterClasseserClasses(self::parseClasses($classes)) as $className) {
|
|
if (!in_array($className, $this->classes)) {
|
|
$this->classes[] = $className;
|
|
}
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Удаляет CSS классы из списка
|
|
* @param string|array $classes
|
|
* @return $this
|
|
*/
|
|
public function removeCssClasses($classes)
|
|
{
|
|
if (!is_array($classes) && !is_string($classes)) {
|
|
return $this;
|
|
}
|
|
|
|
$i = 0;
|
|
|
|
foreach (self::filterClasseserClasses(self::parseClasses($classes)) as $className) {
|
|
$keys = array_keys($this->classes, $className);
|
|
|
|
foreach ($keys as $key) {
|
|
unset($this->classes[$key]);
|
|
$i++;
|
|
}
|
|
}
|
|
|
|
if ($i > 0) {
|
|
$this->classes = array_values($this->classes);
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
protected function appendCssClassAttribute(array & $attributes)
|
|
{
|
|
if ($this->hasCssClasses()) {
|
|
$attributes['class'] = implode(' ', $this->classes);
|
|
}
|
|
}
|
|
|
|
|
|
private static function filterClasseserClasses(array $classList)
|
|
{
|
|
$filteredClasses = [];
|
|
|
|
foreach ($classList as $className) {
|
|
if (self::isCorretClassName($className) && !in_array($className, $filteredClasses)) {
|
|
$filteredClasses[] = $className;
|
|
}
|
|
}
|
|
|
|
return $filteredClasses;
|
|
}
|
|
|
|
|
|
private static function parseClasses($classes) {
|
|
if (is_array($classes)) {
|
|
return $classes;
|
|
}
|
|
|
|
return preg_split('/[ \r\n\t\b]+/', $classes);
|
|
}
|
|
|
|
public static function checkClassName($className)
|
|
{
|
|
if (!self::isCorretClassName($className)) {
|
|
throw new FieldException('Incorrect class name: `' . strval($className) . '`');
|
|
}
|
|
}
|
|
|
|
public static function isCorretClassName($className)
|
|
{
|
|
return is_string($className) && preg_match('/^[a-z0-9_]+(-[a-z0-9_]+)*$/i', trim($className));
|
|
}
|
|
}
|