*/ 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)); } }