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

<?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));
}
}