id = intval($id); // read skin name/description/content type $res = sql_query('SELECT * FROM '.sql_table('skin_desc').' WHERE sdnumber=' . $this->id); $obj = sql_fetch_object($res); $this->isValid = (sql_num_rows($res) > 0); if ( !$this->isValid ) { return; } $this->name = $obj->sdname; $this->description = $obj->sddesc; $this->contentType = $obj->sdtype; $this->includeMode = $obj->sdincmode; $this->includePrefix = $obj->sdincpref; } /** * Get SKIN id */ function getID() { return $this->id; } /** * Get SKIN name */ function getName() { return $this->name; } /** * Get SKIN description */ function getDescription() { return $this->description; } /** * Get SKIN content type * * e.g. text/xml, text/html, application/atom+xml */ function getContentType() { return $this->contentType; } /** * Get include mode of the SKIN * * Returns either 'normal' or 'skindir': * 'normal': if a all data of the skin can be found in the databse * 'skindir': if the skin has data in the it's skin driectory */ function getIncludeMode() { return $this->includeMode; } /** * Get include prefix of the SKIN * * Get name of the subdirectory (with trailing slash) where * the files of the current skin can be found (e.g. 'default/') */ function getIncludePrefix() { return $this->includePrefix; } /** * Checks if a skin with a given shortname exists * @param string $name Skin short name * @return int number of skins with the given ID * @static */ function exists($name) { return quickQuery('select count(*) as result FROM ' . sql_table('skin_desc') . ' WHERE sdname="' . sql_real_escape_string($name) . '"') > 0; } /** * Checks if a skin with a given ID exists * @param string $id Skin ID * @return int number of skins with the given ID * @static */ function existsID($id) { return quickQuery('select COUNT(*) as result FROM ' . sql_table('skin_desc') . ' WHERE sdnumber=' . intval($id)) > 0; } /** * Returns a skin given its shortname * @param string $name Skin shortname * @return object SKIN * @static */ function createFromName($name) { return new SKIN(SKIN::getIdFromName($name)); } /** * Returns a skin ID given its shortname * @param string $name Skin shortname * @return int Skin ID * @static */ function getIdFromName($name) { $query = 'SELECT sdnumber' . ' FROM ' . sql_table('skin_desc') . ' WHERE sdname="' . sql_real_escape_string($name) . '"'; $res = sql_query($query); $obj = sql_fetch_object($res); return $obj->sdnumber; } /** * Returns a skin shortname given its ID * @param string $name * @return string Skin short name * @static */ function getNameFromId($id) { return quickQuery('SELECT sdname as result FROM ' . sql_table('skin_desc') . ' WHERE sdnumber=' . intval($id)); } /** * SKIN::createNew() * Creates a new skin, with the given characteristics. * * @static * @param String $name value for nucleus_skin.sdname * @param String $desc value for nucleus_skin.sddesc * @param String $type value for nucleus_skin.sdtype * @param String $includeMode value for nucleus_skin.sdinclude * @param String $includePrefix value for nucleus_skin.sdincpref * @return Integer ID for just inserted record * */ function createNew($name, $desc, $type = 'text/html', $includeMode = 'normal', $includePrefix = '') { global $manager; $manager->notify( 'PreAddSkin', array( 'name' => &$name, 'description' => &$desc, 'type' => &$type, 'includeMode' => &$includeMode, 'includePrefix' => &$includePrefix ) ); $query = "INSERT INTO %s (sdname, sddesc, sdtype, sdincmode, sdincpref) VALUES ('%s', '%s', '%s', '%s', '%s')"; $query = sprintf($query, sql_table('skin_desc'), sql_real_escape_string($name), sql_real_escape_string($desc), sql_real_escape_string($type), sql_real_escape_string($includeMode), sql_real_escape_string($includePrefix)); sql_query($query); $newid = sql_insert_id(); $manager->notify( 'PostAddSkin', array( 'skinid' => $newid, 'name' => $name, 'description' => $desc, 'type' => $type, 'includeMode' => $includeMode, 'includePrefix' => $includePrefix ) ); return $newid; } /** * Parse a SKIN * * @param string $type */ function parse($type) { global $manager, $CONF; $manager->notify('InitSkinParse',array('skin' => &$this, 'type' => $type)); // set output type sendContentType($this->getContentType(), 'skin'); // set skin name as global var (so plugins can access it) global $currentSkinName; $currentSkinName = $this->getName(); $contents = $this->getContent($type); if ( !$contents ) { // use base skin if this skin does not have contents $defskin = new SKIN($CONF['BaseSkin']); $contents = $defskin->getContent($type); if ( !$contents ) { echo _ERROR_SKIN; return; } } $actions = $this->getAllowedActionsForType($type); $manager->notify('PreSkinParse',array('skin' => &$this, 'type' => $type, 'contents' => &$contents)); // set IncludeMode properties of parser Parser::setProperty('IncludeMode',$this->getIncludeMode()); Parser::setProperty('IncludePrefix',$this->getIncludePrefix()); $handler = new Actions($type, $this); $parser = new Parser($actions, $handler); $handler->setParser($parser); $handler->setSkin($this); $parser->parse($contents); $manager->notify('PostSkinParse',array('skin' => &$this, 'type' => $type)); } /** * Get content of the skin part from the database * * @param $type type of the skin (e.g. index, item, search ...) */ function getContent($type) { $query = 'SELECT scontent FROM '. sql_table('skin') . " WHERE sdesc=$this->id and stype='" . sql_real_escape_string($type) . "'"; $res = sql_query($query); if ( sql_num_rows($res) == 0 ) { return ''; } else { return sql_result($res, 0, 0); } } /** * SKIN::update() * Updates the contents for one part of the skin in the database * * @param $type type of the skin part (e.g. index, item, search ...) * @param $content new content for this skin part * @return Void * */ function update($type, $content) { global $manager; $skinid = $this->id; $query = "SELECT sdesc FROM %s WHERE stype='%s' and sdesc=%d"; $query = sprintf($query, sql_table('skin'), sql_real_escape_string($type), (integer) $skinid); $res = sql_query($query); $skintypeexists = sql_fetch_object($res); $skintypevalue = ($content == true); if( $skintypevalue && $skintypeexists ) { // PreUpdateSkinPart event $manager->notify( 'PreUpdateSkinPart', array( 'skinid' => $skinid, 'type' => $type, 'content' => &$content ) ); } else if( $skintypevalue && (!$skintypeexists) ) { // PreAddSkinPart event $manager->notify( 'PreAddSkinPart', array( 'skinid' => $skinid, 'type' => $type, 'content' => &$content ) ); } else if( (!$skintypevalue) && $skintypeexists ) { // PreDeleteSkinPart event $manager->notify( 'PreDeleteSkinPart', array( 'skinid' => $skinid, 'type' => $type ) ); } // delete old thingie $query = "DELETE FROM %s WHERE stype='%s' and sdesc=%d"; $query = sprintf($query, sql_table('skin'), sql_real_escape_string($type), (integer) $skinid); sql_query($query); // write new thingie if ( $content ) { $query = "INSERT INTO %s (scontent, stype, sdesc) VALUE ('%s', '%s', %d)"; $query = sprintf($query, sql_table('skin'), sql_real_escape_string($content), sql_real_escape_string($type), (integer) $skinid); sql_query($query); } if( $skintypevalue && $skintypeexists ) { // PostUpdateSkinPart event $manager->notify( 'PostUpdateSkinPart', array( 'skinid' => $skinid, 'type' => $type, 'content' => &$content ) ); } else if( $skintypevalue && (!$skintypeexists) ) { // PostAddSkinPart event $manager->notify( 'PostAddSkinPart', array( 'skinid' => $skinid, 'type' => $type, 'content' => &$content ) ); } else if( (!$skintypevalue) && $skintypeexists ) { // PostDeleteSkinPart event $manager->notify( 'PostDeleteSkinPart', array( 'skinid' => $skinid, 'type' => $type ) ); } return; } /** * Deletes all skin parts from the database */ function deleteAllParts() { sql_query('DELETE FROM ' . sql_table('skin') . ' WHERE sdesc=' . $this->getID()); } /** * Updates the general information about the skin */ function updateGeneralInfo($name, $desc, $type = 'text/html', $includeMode = 'normal', $includePrefix = '') { $query = 'UPDATE '.sql_table('skin_desc').' SET' . " sdname='" . sql_real_escape_string($name) . "'," . " sddesc='" . sql_real_escape_string($desc) . "'," . " sdtype='" . sql_real_escape_string($type) . "'," . " sdincmode='" . sql_real_escape_string($includeMode) . "'," . " sdincpref='" . sql_real_escape_string($includePrefix) . "'" . " WHERE sdnumber=" . $this->getID(); sql_query($query); } /** * Get an array with the names of possible skin parts * Used to show all possible parts of a skin in the administration backend * * static: returns an array of friendly names */ function getFriendlyNames() { $skintypes = array( 'index' => _SKIN_PART_MAIN, 'item' => _SKIN_PART_ITEM, 'archivelist' => _SKIN_PART_ALIST, 'archive' => _SKIN_PART_ARCHIVE, 'search' => _SKIN_PART_SEARCH, 'error' => _SKIN_PART_ERROR, 'member' => _SKIN_PART_MEMBER, 'imagepopup' => _SKIN_PART_POPUP ); $query = "SELECT stype FROM " . sql_table('skin') . " WHERE stype NOT IN ('index', 'item', 'error', 'search', 'archive', 'archivelist', 'imagepopup', 'member')"; $res = sql_query($query); while ( $row = sql_fetch_array($res) ) { $skintypes[strtolower($row['stype'])] = ucfirst($row['stype']); } return $skintypes; } /** * Get the allowed actions for a skin type * returns an array with the allowed actions * * @param $type type of the skin (e.g. index, item, search ...) */ function getAllowedActionsForType($type) { global $blogid; // some actions that can be performed at any time, from anywhere $defaultActions = array('otherblog', 'plugin', 'version', 'nucleusbutton', 'include', 'phpinclude', 'parsedinclude', 'loginform', 'sitevar', 'otherarchivelist', 'otherarchivedaylist', 'otherarchiveyearlist', 'self', 'adminurl', 'todaylink', 'archivelink', 'member', 'category', 'searchform', 'referer', 'skinname', 'skinfile', 'set', 'if', 'else', 'endif', 'elseif', 'ifnot', 'elseifnot', 'charset', 'bloglist', 'addlink', 'addpopupcode', 'sticky', // deprecated (Nucleus v2.0) 'ifcat' ); // extra actions specific for a certain skin type $extraActions = array(); switch ( $type ) { case 'index': $extraActions = array('blog', 'blogsetting', 'preview', 'additemform', 'categorylist', 'archivelist', 'archivedaylist', 'archiveyearlist', 'nextlink', 'prevlink' ); break; case 'archive': $extraActions = array('blog', 'archive', 'otherarchive', 'categorylist', 'archivelist', 'archivedaylist', 'archiveyearlist', 'blogsetting', 'archivedate', 'nextarchive', 'prevarchive', 'nextlink', 'prevlink', 'archivetype' ); break; case 'archivelist': $extraActions = array('blog', 'archivelist', 'archivedaylist', 'archiveyearlist', 'categorylist', 'blogsetting', ); break; case 'search': $extraActions = array('blog', 'archivelist', 'archivedaylist', 'archiveyearlist', 'categorylist', 'searchresults', 'othersearchresults', 'blogsetting', 'query', 'nextlink', 'prevlink' ); break; case 'imagepopup': $extraActions = array('image', // deprecated (Nucleus v2.0) 'imagetext', ); break; case 'member': $extraActions = array( 'membermailform', 'blogsetting', 'nucleusbutton', 'categorylist' ); break; case 'item': $extraActions = array('blog', 'item', 'comments', 'commentform', 'vars', 'blogsetting', 'nextitem', 'previtem', 'nextlink', 'prevlink', 'nextitemtitle', 'previtemtitle', 'categorylist', 'archivelist', 'archivedaylist', 'archiveyearlist', 'itemtitle', 'itemid', 'itemlink', ); break; case 'error': $extraActions = array( 'errormessage', 'categorylist' ); break; default: if ( $blogid && $blogid > 0 ) { $extraActions = array( 'blog', 'blogsetting', 'preview', 'additemform', 'categorylist', 'archivelist', 'archivedaylist', 'archiveyearlist', 'nextlink', 'prevlink', 'membermailform', 'nucleusbutton', 'categorylist' ); } break; } return array_merge($defaultActions, $extraActions); } }