. * * @file * @ingroup Skins */ namespace Skins\Chameleon; /** * Class IdRegistry provides a registry and access methods to ensure each id is only used once per HTML page. * * @author Stephan Gambke * @since 1.0 * @ingroup Skins */ class IdRegistry { private static $sInstance; private $mRegistry = array(); /** * @return IdRegistry */ public static function getRegistry() { if ( self::$sInstance === null ) { self::$sInstance = new IdRegistry(); } return self::$sInstance; } /** * Returns the opening tag of an HTML element in a string. * * The advantage over Html::openElement is that any id attribute is ensured to be unique. * * @param string $tag * @param array $attributes * * @return string */ public function openElement( $tag, $attributes = array() ) { if ( is_array( $attributes ) && isset( $attributes[ 'id' ] ) ) { $attributes[ 'id' ] = $this->getId( $attributes[ 'id' ] ); } return \Html::openElement( $tag, $attributes ); } /** * @param null|string $id * @param null|mixed $component * @return string */ public function getId( $id = null, $component = null ) { if ( empty( $id ) ) { // no specific id requested, just return a unique string return base_convert( uniqid(), 16, 36 ); } elseif ( array_key_exists( $id, $this->mRegistry ) ) { // specific id requested, but already in use // return a string derived from the id and a unique string $key = "$id-" . base_convert( uniqid(), 16, 36 ); $this->mRegistry[ $id ][ $key ] = $component; return $key; } else { // specific id requested that is not yet in use // return the id $this->mRegistry[ $id ][ $id ] = $component; return $id; } } /** * Returns an HTML element in a string. The contents are NOT escaped. * * The advantage over Html::rawElement is that any id attribute is ensured to be unique. * * @param string $tag * @param array $attributes * @param string $contents * * @return string */ public function element( $tag, $attributes = array(), $contents = '' ) { if ( is_array( $attributes ) && isset( $attributes[ 'id' ] ) ) { $attributes[ 'id' ] = $this->getId( $attributes[ 'id' ] ); } return \Html::rawElement( $tag, $attributes, $contents ); } }