From: shizuki Date: Fri, 13 Feb 2009 01:25:12 +0000 (+0000) Subject: git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/nucleus-jp/trunk@937 1ca29b... X-Git-Tag: release-3-50~87 X-Git-Url: http://git.sourceforge.jp/view?p=nucleus-jp%2Fnucleus-jp-ancient.git;a=commitdiff_plain;h=e140747be0f2a50edd58a9a2d45417fdb9ac474a git-svn-id: https://svn.sourceforge.jp/svnroot/nucleus-jp/nucleus-jp/trunk@937 1ca29b6e-896d-4ea0-84a5-967f57386b96 --- diff --git a/utf8/extra/htaccess/media/media.htaccess b/utf8/extra/htaccess/media/media.htaccess new file mode 100644 index 0000000..da274e3 --- /dev/null +++ b/utf8/extra/htaccess/media/media.htaccess @@ -0,0 +1,11 @@ +# You may modify following line to avoid script execution completely. +# In environment where multiple users are using Nucleus, +# be sure that any script cannot be executed due to your server setting. +# Note that this isn't needed when all members are super-admin. +# スクリプトの実行を避ける為に、適宜追加してください。 +# サーバの設定によっては、アップロードされたファイルをスクリプトとして +# 実行される恐れがありますので、複数人でNucleusを運用している場合は特に +# 注意が必要です。 +# + +RemoveHandler php cgi pl py rb shtml \ No newline at end of file diff --git a/utf8/extra/htaccess/media/readme.ja.txt b/utf8/extra/htaccess/media/readme.ja.txt new file mode 100644 index 0000000..73b4d8a --- /dev/null +++ b/utf8/extra/htaccess/media/readme.ja.txt @@ -0,0 +1,17 @@ +Nucleus Media ディレクトリ +----------------------- + +アップロードされた画像等のファイルは、最終的にこのディレクトリに移動されます。 + + +サブディレクトリについて: + +* 数字 (例 /media/1/) + +アップロードしたメンバーだけがファイルを使用できます。(ディレクトリ名はメンバーIDになります) + +* 数字以外 (例 /media/common/) + +誰が使ってもいいファイルを保存しておく為のディレクトリ。 +ディレクトリを作ってパーミッションを777等にしておくだけで、新しいコレクションとして追加されます。 + diff --git a/utf8/extra/htaccess/media/readme.txt b/utf8/extra/htaccess/media/readme.txt new file mode 100644 index 0000000..308d3a1 --- /dev/null +++ b/utf8/extra/htaccess/media/readme.txt @@ -0,0 +1,15 @@ +Nucleus Media Directory +----------------------- + +Uploaded images will end up in the media directory. + +Subdirectories work as follows: + +* numeric (e.g. /media/1/) + +Media files for a certain member (directory name is the memberid) + +* other directories (e.g. /media/common/) + +Global media collections that can be used by any member that is on a team. In order to create a new collection, simply create a new directory and assure write access is enabled for it. + diff --git a/utf8/extra/htaccess/skins/readme.ja.txt b/utf8/extra/htaccess/skins/readme.ja.txt new file mode 100644 index 0000000..073d092 --- /dev/null +++ b/utf8/extra/htaccess/skins/readme.ja.txt @@ -0,0 +1,12 @@ +Nucleus skins ディレクトリ +----------------------- + +注意:このディレクトリ内(サブディレクトリを含む)にある、skinbackup.xml や skindata.xml 等のファイルを直接編集することは避けてください。 + これらのファイルはユーザーに配布する為に、Nucleusの機能を使用して作成されています。 + + スキンを編集する時は、Nucleusの管理エリアで左のメニューから「スキン編集」を選択し、スキン編集画面へと進んでください。 + +注意:このディレクトリの.htaccessファイルは、ディレクトリ内(サブディレクトリを含む)の .inc ファイルや .php ファイルに外部から直接アクセス + することを禁止する為のものです。 + サーバの設定によっては、.htaccessに記述された内容が、意図したとおりに動作しないことがあります。 + スキンの表示が壊れている時は、.htaccess ファイルを修正することで直ることがあります。 \ No newline at end of file diff --git a/utf8/extra/htaccess/skins/readme.txt b/utf8/extra/htaccess/skins/readme.txt new file mode 100644 index 0000000..3844617 --- /dev/null +++ b/utf8/extra/htaccess/skins/readme.txt @@ -0,0 +1,8 @@ +Nucleus skins directory +----------------------- + +PLEASE NOTE: the skinbackup.xml or skindata.xml files in these directories are not where you should edit the skins. These files get generated by the Nucleus skin export function and are meant to distribute skins between Nucleus users. + +To edit skins, open the Nucleus Admin Area, and select 'skins' in the left menu. + +PLEASE NOTE: the .htaccess file in this directory is intended to prohibit, for enhanced security, direct access .inc and .php files in the skin folders. Depending on the web server configuration, the code in this .htaccess file may not work as intended. In this case, your site will be displayed incorrectly, with missing content or style. Renaming the .htaccess file should fix the problem. \ No newline at end of file diff --git a/utf8/extra/htaccess/skins/skins.htaccess b/utf8/extra/htaccess/skins/skins.htaccess new file mode 100644 index 0000000..f7027bd --- /dev/null +++ b/utf8/extra/htaccess/skins/skins.htaccess @@ -0,0 +1,4 @@ + +Order allow,deny +Deny from all + \ No newline at end of file diff --git a/utf8/nucleus/documentation/devdocs/custominstall.html b/utf8/nucleus/documentation/devdocs/custominstall.html index fe829f7..44a2a22 100755 --- a/utf8/nucleus/documentation/devdocs/custominstall.html +++ b/utf8/nucleus/documentation/devdocs/custominstall.html @@ -21,41 +21,19 @@ Nucleus - インストールスクリプトのカスタマイズ +
-小 -中 -大 +小 +中 +大
diff --git a/utf8/nucleus/documentation/history.html b/utf8/nucleus/documentation/history.html index ce24a4c..07521a7 100755 --- a/utf8/nucleus/documentation/history.html +++ b/utf8/nucleus/documentation/history.html @@ -50,6 +50,8 @@
  • CHANGED: NP_SkinFilesオプション用言語定義追加(NP_SkinFiles option word update via language file)(shizuki)
  • UPDATED: NP_SkinFiles 2.03に差し替え(code:yama/commit:shizuki)(NP_SkinFiles update to 2.03)(code:yama,katsumi/commit:shizuki)
  • FIXED: 「General」カテゴリのUPDATE漏れ修正(install.php)(preinstall default category name is not localize)(shizuki)
  • +
  • CHANGED: Comment count at items list display via 'sprintf()'. (shizuki)
  • +
  • ADDED: instructions for manually adding .htaccess files to media and skins folder after upgrade. (ftruscot)
  • FIXED: the unwished ping after adding an item to a new category (what you have written here: http://forum.nucleuscms.org/viewtopic.php?p=89142#89142)(shizuki)
  • FIXED: Few hardcoded strings moved to langage file(shizuki)
  • CHANGED: Ease the solution for the new member option for autosave draft(kaigreve)
  • diff --git a/utf8/nucleus/libs/BLOG.php b/utf8/nucleus/libs/BLOG.php index b9508d1..aef93a5 100755 --- a/utf8/nucleus/libs/BLOG.php +++ b/utf8/nucleus/libs/BLOG.php @@ -20,1235 +20,1235 @@ * $NucleusJP: BLOG.php,v 1.12.2.2 2007/08/08 05:26:22 kimitake Exp $ */ -if ( !function_exists('requestVar') ) exit; -require_once dirname(__FILE__) . '/ITEMACTIONS.php'; - -class BLOG { - - // blog id - var $blogid; - - // ID of currently selected category - var $selectedcatid; - - // After creating an object of the blog class, contains true if the BLOG object is - // valid (the blog exists) - var $isValid; - - // associative array, containing all blogsettings (use the get/set functions instead) - var $settings; - - /** - * Creates a new BLOG object for the given blog - * - * @param $id blogid - */ - function BLOG($id) { - $this->blogid = intval($id); - $this->readSettings(); - - // try to set catid - // (the parse functions in SKIN.php will override this, so it's mainly useless) - global $catid; - $this->setSelectedCategory($catid); - } - - /** - * Shows the given amount of items for this blog - * - * @param $template - * String representing the template _NAME_ (!) - * @param $amountEntries - * amount of entries to show - * @param $startpos - * offset from where items should be shown (e.g. 5 = start at fifth item) - * @returns int - * amount of items shown - */ - function readLog($template, $amountEntries, $offset = 0, $startpos = 0) { - return $this->readLogAmount($template,$amountEntries,'','',1,1,$offset, $startpos); - } - - /** - * Shows an archive for a given month - * - * @param $year - * year - * @param $month - * month - * @param $template - * String representing the template name to be used - */ - function showArchive($templatename, $year, $month, $day=0) { - - // create extra where clause for select query - if ($day == 0) { - $timestamp_start = mktime(0,0,0,$month,1,$year); - $timestamp_end = mktime(0,0,0,$month+1,1,$year); // also works when $month==12 - } else { - $timestamp_start = mktime(0,0,0,$month,$day,$year); - $timestamp_end = mktime(0,0,0,$month,$day+1,$year); - } - $extra_query = ' and i.itime>=' . mysqldate($timestamp_start) - . ' and i.itime<' . mysqldate($timestamp_end); - - - $this->readLogAmount($templatename,0,$extra_query,'',1,1); - - } - - - // sets/gets current category (only when category exists) - function setSelectedCategory($catid) { - if ($this->isValidCategory($catid) || (intval($catid) == 0)) - $this->selectedcatid = intval($catid); - } - - function setSelectedCategoryByName($catname) { - $this->setSelectedCategory($this->getCategoryIdFromName($catname)); - } - - function getSelectedCategory() { - return $this->selectedcatid; - } - - /** - * Shows the given amount of items for this blog - * - * @param $template - * String representing the template _NAME_ (!) - * @param $amountEntries - * amount of entries to show (0 = no limit) - * @param $extraQuery - * extra conditions to be added to the query - * @param $highlight - * contains a query that should be highlighted - * @param $comments - * 1=show comments 0=don't show comments - * @param $dateheads - * 1=show dateheads 0=don't show dateheads - * @param $offset - * offset - * @returns int - * amount of items shown - */ - function readLogAmount($template, $amountEntries, $extraQuery, $highlight, $comments, $dateheads, $offset = 0, $startpos = 0) { - - $query = $this->getSqlBlog($extraQuery); - - if ($amountEntries > 0) { - // $offset zou moeten worden: - // (($startpos / $amountentries) + 1) * $offset ... later testen ... - $query .= ' LIMIT ' . intval($startpos + $offset).',' . intval($amountEntries); - } - return $this->showUsingQuery($template, $query, $highlight, $comments, $dateheads); - } - - function showUsingQuery($templateName, $query, $highlight = '', $comments = 0, $dateheads = 1) { - global $CONF, $manager; - - $lastVisit = cookieVar($CONF['CookiePrefix'] .'lastVisit'); - if ($lastVisit != 0) - $lastVisit = $this->getCorrectTime($lastVisit); - - // set templatename as global variable (so plugins can access it) - global $currentTemplateName; - $currentTemplateName = $templateName; - - $template =& $manager->getTemplate($templateName); - - // create parser object & action handler - $actions =& new ITEMACTIONS($this); - $parser =& new PARSER($actions->getDefinedActions(),$actions); - $actions->setTemplate($template); - $actions->setHighlight($highlight); - $actions->setLastVisit($lastVisit); - $actions->setParser($parser); - $actions->setShowComments($comments); - - // execute query - $items = sql_query($query); - - // loop over all items - $old_date = 0; - while ($item = mysql_fetch_object($items)) { - - $item->timestamp = strtotime($item->itime); // string timestamp -> unix timestamp - - // action handler needs to know the item we're handling - $actions->setCurrentItem($item); - - // add date header if needed - if ($dateheads) { - $new_date = date('dFY',$item->timestamp); - if ($new_date != $old_date) { - // unless this is the first time, write date footer - $timestamp = $item->timestamp; - if ($old_date != 0) { - $oldTS = strtotime($old_date); - $manager->notify('PreDateFoot',array('blog' => &$this, 'timestamp' => $oldTS)); - $tmp_footer = strftime($template['DATE_FOOTER'], $oldTS); - $parser->parse($tmp_footer); - $manager->notify('PostDateFoot',array('blog' => &$this, 'timestamp' => $oldTS)); - } - $manager->notify('PreDateHead',array('blog' => &$this, 'timestamp' => $timestamp)); - // note, to use templatvars in the dateheader, the %-characters need to be doubled in - // order to be preserved by strftime - $tmp_header = strftime((isset($template['DATE_HEADER']) ? $template['DATE_HEADER'] : null), $timestamp); - $parser->parse($tmp_header); - $manager->notify('PostDateHead',array('blog' => &$this, 'timestamp' => $timestamp)); - } - $old_date = $new_date; - } - - // parse item - $parser->parse($template['ITEM_HEADER']); - $manager->notify('PreItem', array('blog' => &$this, 'item' => &$item)); - $parser->parse($template['ITEM']); - $manager->notify('PostItem', array('blog' => &$this, 'item' => &$item)); - $parser->parse($template['ITEM_FOOTER']); - - } - - $numrows = mysql_num_rows($items); - - // add another date footer if there was at least one item - if (($numrows > 0) && $dateheads) { - $manager->notify('PreDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date))); - $parser->parse($template['DATE_FOOTER']); - $manager->notify('PostDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date))); - } - - mysql_free_result($items); // free memory - - return $numrows; - - } - - function showOneitem($itemid, $template, $highlight) { - $extraQuery = ' and inumber=' . intval($itemid); - - return $this->readLogAmount($template, 1, $extraQuery, $highlight, 0, 0); - } - - - /** - * Adds an item to this blog - */ - function additem($catid, $title, $body, $more, $blogid, $authorid, $timestamp, $closed, $draft, $posted='1') { - global $manager; - - $blogid = intval($blogid); - $authorid = intval($authorid); - $title = $title; - $body = $body; - $more = $more; - $catid = intval($catid); - - // convert newlines to
    - if ($this->convertBreaks()) { - $body = addBreaks($body); - $more = addBreaks($more); - } - - if ($closed != '1') $closed = '0'; - if ($draft != '0') $draft = '1'; - - if (!$this->isValidCategory($catid)) - $catid = $this->getDefaultCategory(); - - if ($timestamp > $this->getCorrectTime()) - $isFuture = 1; - - $timestamp = date('Y-m-d H:i:s',$timestamp); - - $manager->notify('PreAddItem',array('title' => &$title, 'body' => &$body, 'more' => &$more, 'blog' => &$this, 'authorid' => &$authorid, 'timestamp' => &$timestamp, 'closed' => &$closed, 'draft' => &$draft, 'catid' => &$catid)); - - $title = addslashes($title); - $body = addslashes($body); - $more = addslashes($more); - - $query = 'INSERT INTO '.sql_table('item').' (ITITLE, IBODY, IMORE, IBLOG, IAUTHOR, ITIME, ICLOSED, IDRAFT, ICAT, IPOSTED) ' - . "VALUES ('$title', '$body', '$more', $blogid, $authorid, '$timestamp', $closed, $draft, $catid, $posted)"; - sql_query($query); - $itemid = mysql_insert_id(); - - $manager->notify('PostAddItem',array('itemid' => $itemid)); - - if (!$draft) - $this->updateUpdateFile(); - - // send notification mail - if (!$draft && !$isFuture && $this->getNotifyAddress() && $this->notifyOnNewItem()) - $this->sendNewItemNotification($itemid, stripslashes($title), stripslashes($body)); - - return $itemid; - } - - function sendNewItemNotification($itemid, $title, $body) { - global $CONF, $member; - - // create text version of html post - $ascii = toAscii($body); - - $mailto_msg = _NOTIFY_NI_MSG . " \n"; -// $mailto_msg .= $CONF['IndexURL'] . 'index.php?itemid=' . $itemid . "\n\n"; - $temp = parse_url($CONF['Self']); - if ($temp['scheme']) { - $mailto_msg .= createItemLink($itemid) . "\n\n"; - } else { - $tempurl = $this->getURL(); - if (substr($tempurl, -1) == '/' || substr($tempurl, -4) == '.php') { - $mailto_msg .= $tempurl . '?itemid=' . $itemid . "\n\n"; - } else { - $mailto_msg .= $tempurl . '/?itemid=' . $itemid . "\n\n"; - } - } - $mailto_msg .= _NOTIFY_TITLE . ' ' . strip_tags($title) . "\n"; - $mailto_msg .= _NOTIFY_CONTENTS . "\n " . $ascii . "\n"; - $mailto_msg .= getMailFooter(); - - $mailto_title = $this->getName() . ': ' . _NOTIFY_NI_TITLE; - - $frommail = $member->getNotifyFromMailAddress(); - - $notify =& new NOTIFICATION($this->getNotifyAddress()); - $notify->notify($mailto_title, $mailto_msg , $frommail); - - - - } - - - /** - * Creates a new category for this blog - * - * @param $catName - * name of the new category. When empty, a name is generated automatically - * (starting with newcat) - * @param $catDescription - * description of the new category. Defaults to 'New Category' - * - * @returns - * the new category-id in case of success. - * 0 on failure - */ - function createNewCategory($catName = '', $catDescription = _CREATED_NEW_CATEGORY_DESC) { - global $member, $manager; - - if ($member->blogAdminRights($this->getID())) { - // generate - if ($catName == '') - { - $catName = _CREATED_NEW_CATEGORY_NAME; - $i = 1; - - $res = sql_query('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID()); - while (mysql_num_rows($res) > 0) - { - $i++; - $res = sql_query('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID()); - } - - $catName = $catName . $i; - } - - $manager->notify( - 'PreAddCategory', - array( - 'blog' => &$this, - 'name' => &$catName, - 'description' => $catDescription - ) - ); - - $query = 'INSERT INTO '.sql_table('category').' (cblog, cname, cdesc) VALUES (' . $this->getID() . ", '" . addslashes($catName) . "', '" . addslashes($catDescription) . "')"; - sql_query($query); - $catid = mysql_insert_id(); - - $manager->notify( - 'PostAddCategory', - array( - 'blog' => &$this, - 'name' => $catName, - 'description' => $catDescription, - 'catid' => $catid - ) - ); - - return $catid; - } else { - return 0; - } - - } - - - /** - * Searches all months of this blog for the given query - * - * @param $query - * search query - * @param $template - * template to be used (__NAME__ of the template) - * @param $amountMonths - * max amount of months to be search (0 = all) - * @param $maxresults - * max number of results to show - * @param $startpos - * offset - * @returns - * amount of hits found - */ - function search($query, $template, $amountMonths, $maxresults, $startpos) { - global $CONF, $manager; - - $highlight = ''; - $sqlquery = $this->getSqlSearch($query, $amountMonths, $highlight); - - if ($sqlquery == '') - { - // no query -> show everything - $extraquery = ''; - $amountfound = $this->readLogAmount($template, $maxresults, $extraQuery, $query, 1, 1); - } else { - - // add LIMIT to query (to split search results into pages) - if (intval($maxresults > 0)) - $sqlquery .= ' LIMIT ' . intval($startpos).',' . intval($maxresults); - - // show results - $amountfound = $this->showUsingQuery($template, $sqlquery, $highlight, 1, 1); - - // when no results were found, show a message - if ($amountfound == 0) - { - $template =& $manager->getTemplate($template); - $vars = array( - 'query' => htmlspecialchars($query), - 'blogid' => $this->getID() - ); - echo TEMPLATE::fill($template['SEARCH_NOTHINGFOUND'],$vars); - } - } - - return $amountfound; - } - - /** - * Returns an SQL query to use for a search query - * - * @param $query - * search query - * @param $amountMonths - * amount of months to search back. Default = 0 = unlimited - * @param $mode - * either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query - * @returns $highlight - * words to highlight (out parameter) - * @returns - * either a full SQL query, or an empty string (if querystring empty) - * @note - * No LIMIT clause is added. (caller should add this if multiple pages are requested) - */ - function getSqlSearch($query, $amountMonths = 0, &$highlight, $mode = '') - { - $searchclass =& new SEARCH($query); - - $highlight = $searchclass->inclusive; - - // if querystring is empty, return empty string - if ($searchclass->inclusive == '') - return ''; - - - $where = $searchclass->boolean_sql_where('ititle,ibody,imore'); - $select = $searchclass->boolean_sql_select('ititle,ibody,imore'); - - // get list of blogs to search - $blogs = $searchclass->blogs; // array containing blogs that always need to be included - $blogs[] = $this->getID(); // also search current blog (duh) - $blogs = array_unique($blogs); // remove duplicates - $selectblogs = ''; - if (count($blogs) > 0) - $selectblogs = ' and i.iblog in (' . implode(',', $blogs) . ')'; - - if ($mode == '') - { - $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, i.itime, i.imore as more, m.mnumber as authorid, m.memail as authormail, m.murl as authorurl, c.cname as category, i.icat as catid, i.iclosed as closed'; - if ($select) - $query .= ', '.$select. ' as score '; - } else { - $query = 'SELECT COUNT(*) as result '; - } - - $query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c' - . ' WHERE i.iauthor=m.mnumber' - . ' and i.icat=c.catid' - . ' and i.idraft=0' // exclude drafts - . $selectblogs - // don't show future items - . ' and i.itime<=' . mysqldate($this->getCorrectTime()) - . ' and '.$where; - - // take into account amount of months to search - if ($amountMonths > 0) - { - $localtime = getdate($this->getCorrectTime()); - $timestamp_start = mktime(0,0,0,$localtime['mon'] - $amountMonths,1,$localtime['year']); - $query .= ' and i.itime>' . mysqldate($timestamp_start); - } - - if ($mode == '') - { - if ($select) - $query .= ' ORDER BY score DESC'; - else - $query .= ' ORDER BY i.itime DESC '; - } - - return $query; - } - - /** - * Returns the SQL query that's normally used to display the blog items on the index type skins - * - * @param $mode - * either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query - * @returns - * either a full SQL query, or an empty string - * @note - * No LIMIT clause is added. (caller should add this if multiple pages are requested) - */ - function getSqlBlog($extraQuery, $mode = '') - { - if ($mode == '') - $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, i.itime, i.imore as more, m.mnumber as authorid, m.memail as authormail, m.murl as authorurl, c.cname as category, i.icat as catid, i.iclosed as closed'; - else - $query = 'SELECT COUNT(*) as result '; - - $query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c' - . ' WHERE i.iblog='.$this->blogid - . ' and i.iauthor=m.mnumber' - . ' and i.icat=c.catid' - . ' and i.idraft=0' // exclude drafts - // don't show future items - . ' and i.itime<=' . mysqldate($this->getCorrectTime()); - - if ($this->getSelectedCategory()) - $query .= ' and i.icat=' . $this->getSelectedCategory() . ' '; - - - $query .= $extraQuery; - - if ($mode == '') - $query .= ' ORDER BY i.itime DESC'; - - return $query; - } - - /** - * Shows the archivelist using the given template - */ - function showArchiveList($template, $mode = 'month', $limit = 0) { - global $CONF, $catid, $manager; - - if ($catid) - $linkparams = array('catid' => $catid); - - $template =& $manager->getTemplate($template); - $data['blogid'] = $this->getID(); - - echo TEMPLATE::fill($template['ARCHIVELIST_HEADER'],$data); - - $query = 'SELECT itime, SUBSTRING(itime,1,4) AS Year, SUBSTRING(itime,6,2) AS Month, SUBSTRING(itime,9,2) as Day FROM '.sql_table('item') - . ' WHERE iblog=' . $this->getID() - . ' and itime <=' . mysqldate($this->getCorrectTime()) // don't show future items! - . ' and idraft=0'; // don't show draft items - - if ($catid) - $query .= ' and icat=' . intval($catid); - - $query .= ' GROUP BY Year, Month'; - if ($mode == 'day') - $query .= ', Day'; - - - $query .= ' ORDER BY itime DESC'; - - if ($limit > 0) - $query .= ' LIMIT ' . intval($limit); - - $res = sql_query($query); - - while ($current = mysql_fetch_object($res)) { - $current->itime = strtotime($current->itime); // string time -> unix timestamp - - if ($mode == 'day') { - $archivedate = date('Y-m-d',$current->itime); - $archive['day'] = date('d',$current->itime); - $data['day'] = date('d',$current->itime); - } else { - $archivedate = date('Y-m',$current->itime); - } - $data['month'] = date('m',$current->itime); - $data['year'] = date('Y',$current->itime); - $data['archivelink'] = createArchiveLink($this->getID(),$archivedate,$linkparams); - - $manager->notify( - 'PreArchiveListItem', - array( - 'listitem' => &$data - ) - ); - - $temp = TEMPLATE::fill($template['ARCHIVELIST_LISTITEM'],$data); - echo strftime($temp,$current->itime); - - } - - mysql_free_result($res); - - echo TEMPLATE::fill($template['ARCHIVELIST_FOOTER'],$data); - } - - - /** - * Shows the list of categories using a given template - */ - function showCategoryList($template) { - global $CONF, $manager; - - // determine arguments next to catids - // I guess this can be done in a better way, but it works - global $archive, $archivelist; - - $linkparams = array(); - if ($archive) { - $blogurl = createArchiveLink($this->getID(), $archive, ''); - $linkparams['blogid'] = $this->getID(); - $linkparams['archive'] = $archive; - } else if ($archivelist) { - $blogurl = createArchiveListLink($this->getID(), ''); - $linkparams['archivelist'] = $archivelist; - } else { - $blogurl = createBlogidLink($this->getID(), ''); - $linkparams['blogid'] = $this->getID(); - } - - //$blogurl = $this->getURL() . $qargs; - //$blogurl = createBlogLink($this->getURL(), $linkparams); - - $template =& $manager->getTemplate($template); - - echo TEMPLATE::fill((isset($template['CATLIST_HEADER']) ? $template['CATLIST_HEADER'] : null), - array( - 'blogid' => $this->getID(), - 'blogurl' => $blogurl, - 'self' => $CONF['Self'] - )); - - $query = 'SELECT catid, cdesc as catdesc, cname as catname FROM '.sql_table('category').' WHERE cblog=' . $this->getID() . ' ORDER BY cname ASC'; - $res = sql_query($query); - - - while ($data = mysql_fetch_assoc($res)) { - $data['blogid'] = $this->getID(); - $data['blogurl'] = $blogurl; - $data['catlink'] = createLink( - 'category', - array( - 'catid' => $data['catid'], - 'name' => $data['catname'], - 'extra' => $linkparams - ) - ); - $data['self'] = $CONF['Self']; - - $manager->notify( - 'PreCategoryListItem', - array( - 'listitem' => &$data - ) - ); - - echo TEMPLATE::fill((isset($template['CATLIST_LISTITEM']) ? $template['CATLIST_LISTITEM'] : null), $data); - //$temp = TEMPLATE::fill((isset($template['CATLIST_LISTITEM']) ? $template['CATLIST_LISTITEM'] : null), $data); - //echo strftime($temp, $current->itime); - - } - - mysql_free_result($res); - - echo TEMPLATE::fill((isset($template['CATLIST_FOOTER']) ? $template['CATLIST_FOOTER'] : null), - array( - 'blogid' => $this->getID(), - 'blogurl' => $blogurl, - 'self' => $CONF['Self'] - )); - } - - /** - * Shows a list of all blogs in the system using a given template - * ordered by number, name, shortname or description - * in ascending or descending order - */ - function showBlogList($template, $bnametype, $orderby, $direction) { - global $CONF, $manager; - - switch ($orderby) { - case 'number': - $orderby='bnumber'; - break; - case 'name': - $orderby='bname'; - break; - case 'shortname': - $orderby='bshortname'; - break; - case 'description': - $orderby='bdesc'; - break; - default: - $orderby='bnumber'; - break; - } - - $direction=strtolower($direction); - switch ($direction) { - case 'asc': - $direction='ASC'; - break; - case 'desc': - $direction='DESC'; - break; - default: - $direction='ASC'; - break; - } - - $template =& $manager->getTemplate($template); - - echo TEMPLATE::fill((isset($template['BLOGLIST_HEADER']) ? $template['BLOGLIST_HEADER'] : null), - array( - 'sitename' => $CONF['SiteName'], - 'siteurl' => $CONF['IndexURL'] - )); - - $query = 'SELECT bnumber, bname, bshortname, bdesc, burl FROM '.sql_table('blog').' ORDER BY '.$orderby.' '.$direction; - $res = sql_query($query); - - while ($data = mysql_fetch_assoc($res)) { - - $list = array(); - -// $list['bloglink'] = createLink('blog', array('blogid' => $data['bnumber'])); - $list['bloglink'] = createBlogidLink($data['bnumber']); - - $list['blogdesc'] = $data['bdesc']; - - $list['blogurl'] = $data['burl']; - - if ($bnametype=='shortname') { - $list['blogname'] = $data['bshortname']; - } - else { // all other cases - $list['blogname'] = $data['bname']; - } - - $manager->notify( - 'PreBlogListItem', - array( - 'listitem' => &$list - ) - ); - - echo TEMPLATE::fill((isset($template['BLOGLIST_LISTITEM']) ? $template['BLOGLIST_LISTITEM'] : null), $list); - - } - - mysql_free_result($res); - - echo TEMPLATE::fill((isset($template['BLOGLIST_FOOTER']) ? $template['BLOGLIST_FOOTER'] : null), - array( - 'sitename' => $CONF['SiteName'], - 'siteurl' => $CONF['IndexURL'] - )); - - } - - /** - * Blogsettings functions - */ - - function readSettings() { - $query = 'SELECT *' - . ' FROM '.sql_table('blog') - . ' WHERE bnumber=' . $this->blogid; - $res = sql_query($query); - - $this->isValid = (mysql_num_rows($res) > 0); - if (!$this->isValid) - return; - - $this->settings = mysql_fetch_assoc($res); - } - - function writeSettings() { - - // (can't use floatval since not available prior to PHP 4.2) - $offset = $this->getTimeOffset(); - if (!is_float($offset)) - $offset = intval($offset); - - $query = 'UPDATE '.sql_table('blog') - . " SET bname='" . addslashes($this->getName()) . "'," - . " bshortname='". addslashes($this->getShortName()) . "'," - . " bcomments=". intval($this->commentsEnabled()) . "," - . " bmaxcomments=" . intval($this->getMaxComments()) . "," - . " btimeoffset=" . $offset . "," - . " bpublic=" . intval($this->isPublic()) . "," - . " breqemail=" . intval($this->emailRequired()) . "," - . " bsendping=" . intval($this->sendPing()) . "," - . " bconvertbreaks=" . intval($this->convertBreaks()) . "," - . " ballowpast=" . intval($this->allowPastPosting()) . "," - . " bnotify='" . addslashes($this->getNotifyAddress()) . "'," - . " bnotifytype=" . intval($this->getNotifyType()) . "," - . " burl='" . addslashes($this->getURL()) . "'," - . " bupdate='" . addslashes($this->getUpdateFile()) . "'," - . " bdesc='" . addslashes($this->getDescription()) . "'," - . " bdefcat=" . intval($this->getDefaultCategory()) . "," - . " bdefskin=" . intval($this->getDefaultSkin()) . "," - . " bincludesearch=" . intval($this->getSearchable()) - . " WHERE bnumber=" . intval($this->getID()); - sql_query($query); - - } - - - - // update update file if requested - function updateUpdatefile() { - if ($this->getUpdateFile()) { - $f_update = fopen($this->getUpdateFile(),'w'); - fputs($f_update,$this->getCorrectTime()); - fclose($f_update); - } - - } - - function isValidCategory($catid) { - $query = 'SELECT * FROM '.sql_table('category').' WHERE cblog=' . $this->getID() . ' and catid=' . intval($catid); - $res = sql_query($query); - return (mysql_num_rows($res) != 0); - } - - function getCategoryName($catid) { - $res = sql_query('SELECT cname FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid)); - $o = mysql_fetch_object($res); - return $o->cname; - } - - function getCategoryDesc($catid) { - $res = sql_query('SELECT cdesc FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid)); - $o = mysql_fetch_object($res); - return $o->cdesc; - } - - function getCategoryIdFromName($name) { - $res = sql_query('SELECT catid FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and cname="' . addslashes($name) . '"'); - if (mysql_num_rows($res) > 0) { - $o = mysql_fetch_object($res); - return $o->catid; - } else { - return $this->getDefaultCategory(); - } - } - - function sendPing() { - return $this->getSetting('bsendping'); - } - - function setPingUserland($val) { - $this->setSetting('bsendping',$val); - } - - function convertBreaks() { - return $this->getSetting('bconvertbreaks'); - } - - function insertJavaScriptInfo($authorid = '') { - global $member, $CONF; - - if ($authorid == '') - $authorid = $member->getID(); - - ?> - setSetting('bconvertbreaks',$val); - } - function setAllowPastPosting($val) { - $this->setSetting('ballowpast',$val); - } - function allowPastPosting() { - return $this->getSetting('ballowpast'); - } - - function getCorrectTime($t=0) { - if ($t == 0) $t = time(); - return ($t + 3600 * $this->getTimeOffset()); - } - - function getName() { - return $this->getSetting('bname'); - } - - function getShortName() { - return $this->getSetting('bshortname'); - } - - function getMaxComments() { - return $this->getSetting('bmaxcomments'); - } - - function getNotifyAddress() { - return $this->getSetting('bnotify'); - } - - function getNotifyType() { - return $this->getSetting('bnotifytype'); - } - - function notifyOnComment() { - $n = $this->getNotifyType(); - return (($n != 0) && (($n % 3) == 0)); - } - - function notifyOnVote() { - $n = $this->getNotifyType(); - return (($n != 0) && (($n % 5) == 0)); - } - - function notifyOnNewItem() { - $n = $this->getNotifyType(); - return (($n != 0) && (($n % 7) == 0)); - } - - function setNotifyType($val) { - $this->setSetting('bnotifytype',$val); - } - - - function getTimeOffset() { - return $this->getSetting('btimeoffset'); - } - - function commentsEnabled() { - return $this->getSetting('bcomments'); - } - - function getURL() { - return $this->getSetting('burl'); - } - - function getDefaultSkin() { - return $this->getSetting('bdefskin'); - } - - function getUpdateFile() { - return $this->getSetting('bupdate'); - } - - function getDescription() { - return $this->getSetting('bdesc'); - } - - function isPublic() { - return $this->getSetting('bpublic'); - } - - function emailRequired() { - return $this->getSetting('breqemail'); - } - - function getSearchable() { - return $this->getSetting('bincludesearch'); - } - - function getDefaultCategory() { - return $this->getSetting('bdefcat'); - } - - function setPublic($val) { - $this->setSetting('bpublic',$val); - } - - function setSearchable($val) { - $this->setSetting('bincludesearch',$val); - } - - function setDescription($val) { - $this->setSetting('bdesc',$val); - } - - function setUpdateFile($val) { - $this->setSetting('bupdate',$val); - } - - function setDefaultSkin($val) { - $this->setSetting('bdefskin',$val); - } - - function setURL($val) { - $this->setSetting('burl',$val); - } - - function setName($val) { - $this->setSetting('bname',$val); - } - - function setShortName($val) { - $this->setSetting('bshortname',$val); - } - - function setCommentsEnabled($val) { - $this->setSetting('bcomments',$val); - } - - function setMaxComments($val) { - $this->setSetting('bmaxcomments',$val); - } - - function setNotifyAddress($val) { - $this->setSetting('bnotify',$val); - } - - function setEmailRequired($val) { - $this->setSetting('breqemail',$val); - } - - function setTimeOffset($val) { - // check validity of value - // 1. replace , by . (common mistake) - $val = str_replace(',','.',$val); - // 2. cast to float or int - if (is_numeric($val) && strstr($val,'.5')) { - $val = (float) $val; - } else { - $val = intval($val); - } - - $this->setSetting('btimeoffset',$val); - } - - function setDefaultCategory($val) { - $this->setSetting('bdefcat',$val); - } - - function getSetting($key) { - return $this->settings[$key]; - } - - function setSetting($key,$value) { - $this->settings[$key] = $value; - } - - - // tries to add a member to the team. Returns false if the member was already on - // the team - function addTeamMember($memberid, $admin) { - global $manager; - - $memberid = intval($memberid); - $admin = intval($admin); - - // check if member is already a member - $tmem = MEMBER::createFromID($memberid); - - if ($tmem->isTeamMember($this->getID())) - return 0; - - $manager->notify( - 'PreAddTeamMember', - array( - 'blog' => &$this, - 'member' => &$tmem, - 'admin' => &$admin - ) - ); - - // add to team - $query = 'INSERT INTO '.sql_table('team').' (TMEMBER, TBLOG, TADMIN) ' - . 'VALUES (' . $memberid .', '.$this->getID().', "'.$admin.'")'; - sql_query($query); - - $manager->notify( - 'PostAddTeamMember', - array( - 'blog' => &$this, - 'member' => &$tmem, - 'admin' => $admin - ) - - ); - - $logMsg = sprintf(_TEAM_ADD_NEWTEAMMEMBER, $tmem->getDisplayName(), $memberid, $this->getName()); - ACTIONLOG::add(INFO, $logMsg); - - return 1; - } - - function getID() { - return intVal($this->blogid); - } - - // returns true if there is a blog with the given shortname (static) - function exists($name) { - $r = sql_query('select * FROM '.sql_table('blog').' WHERE bshortname="'.addslashes($name).'"'); - return (mysql_num_rows($r) != 0); - } - - // returns true if there is a blog with the given ID (static) - function existsID($id) { - $r = sql_query('select * FROM '.sql_table('blog').' WHERE bnumber='.intval($id)); - return (mysql_num_rows($r) != 0); - } - - // flag there is a future post pending - function setFuturePost() { - $query = 'UPDATE '.sql_table('blog') - . " SET bfuturepost='1' WHERE bnumber=" . $this->getID(); - sql_query($query); - } - - // clear there is a future post pending - function clearFuturePost() { - $query = 'UPDATE '.sql_table('blog') - . " SET bfuturepost='0' WHERE bnumber=" . $this->getID(); - sql_query($query); - } - - // check if we should throw justPosted event - function checkJustPosted() { - global $manager; - - if ($this->settings['bfuturepost'] == 1) { - $blogid = $this->getID(); - $result = sql_query("SELECT * FROM " . sql_table('item') - . " WHERE iposted=0 AND iblog=" . $blogid . " AND itime 0) { - // This $pinged is allow a plugin to tell other hook to the event that a ping is sent already - // Note that the plugins's calling order is subject to thri order in the plugin list - $pinged = false; - $manager->notify( - 'JustPosted', - array('blogid' => $blogid, - 'pinged' => &$pinged - ) - ); - - // clear all expired future posts - sql_query("UPDATE " . sql_table('item') . " SET iposted='1' WHERE iblog=" . $blogid . " AND itimenotify('PostAddItem',array('itemid' => $itemid)); + + if (!$draft) + $this->updateUpdateFile(); + + // send notification mail + if (!$draft && !$isFuture && $this->getNotifyAddress() && $this->notifyOnNewItem()) + $this->sendNewItemNotification($itemid, stripslashes($title), stripslashes($body)); + + return $itemid; + } + + function sendNewItemNotification($itemid, $title, $body) { + global $CONF, $member; + + // create text version of html post + $ascii = toAscii($body); + + $mailto_msg = _NOTIFY_NI_MSG . " \n"; +// $mailto_msg .= $CONF['IndexURL'] . 'index.php?itemid=' . $itemid . "\n\n"; + $temp = parse_url($CONF['Self']); + if ($temp['scheme']) { + $mailto_msg .= createItemLink($itemid) . "\n\n"; + } else { + $tempurl = $this->getURL(); + if (substr($tempurl, -1) == '/' || substr($tempurl, -4) == '.php') { + $mailto_msg .= $tempurl . '?itemid=' . $itemid . "\n\n"; + } else { + $mailto_msg .= $tempurl . '/?itemid=' . $itemid . "\n\n"; + } + } + $mailto_msg .= _NOTIFY_TITLE . ' ' . strip_tags($title) . "\n"; + $mailto_msg .= _NOTIFY_CONTENTS . "\n " . $ascii . "\n"; + $mailto_msg .= getMailFooter(); + + $mailto_title = $this->getName() . ': ' . _NOTIFY_NI_TITLE; + + $frommail = $member->getNotifyFromMailAddress(); + + $notify =& new NOTIFICATION($this->getNotifyAddress()); + $notify->notify($mailto_title, $mailto_msg , $frommail); + + + + } + + + /** + * Creates a new category for this blog + * + * @param $catName + * name of the new category. When empty, a name is generated automatically + * (starting with newcat) + * @param $catDescription + * description of the new category. Defaults to 'New Category' + * + * @returns + * the new category-id in case of success. + * 0 on failure + */ + function createNewCategory($catName = '', $catDescription = _CREATED_NEW_CATEGORY_DESC) { + global $member, $manager; + + if ($member->blogAdminRights($this->getID())) { + // generate + if ($catName == '') + { + $catName = _CREATED_NEW_CATEGORY_NAME; + $i = 1; + + $res = sql_query('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID()); + while (mysql_num_rows($res) > 0) + { + $i++; + $res = sql_query('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID()); + } + + $catName = $catName . $i; + } + + $manager->notify( + 'PreAddCategory', + array( + 'blog' => &$this, + 'name' => &$catName, + 'description' => $catDescription + ) + ); + + $query = 'INSERT INTO '.sql_table('category').' (cblog, cname, cdesc) VALUES (' . $this->getID() . ", '" . addslashes($catName) . "', '" . addslashes($catDescription) . "')"; + sql_query($query); + $catid = mysql_insert_id(); + + $manager->notify( + 'PostAddCategory', + array( + 'blog' => &$this, + 'name' => $catName, + 'description' => $catDescription, + 'catid' => $catid + ) + ); + + return $catid; + } else { + return 0; + } + + } + + + /** + * Searches all months of this blog for the given query + * + * @param $query + * search query + * @param $template + * template to be used (__NAME__ of the template) + * @param $amountMonths + * max amount of months to be search (0 = all) + * @param $maxresults + * max number of results to show + * @param $startpos + * offset + * @returns + * amount of hits found + */ + function search($query, $template, $amountMonths, $maxresults, $startpos) { + global $CONF, $manager; + + $highlight = ''; + $sqlquery = $this->getSqlSearch($query, $amountMonths, $highlight); + + if ($sqlquery == '') + { + // no query -> show everything + $extraquery = ''; + $amountfound = $this->readLogAmount($template, $maxresults, $extraQuery, $query, 1, 1); + } else { + + // add LIMIT to query (to split search results into pages) + if (intval($maxresults > 0)) + $sqlquery .= ' LIMIT ' . intval($startpos).',' . intval($maxresults); + + // show results + $amountfound = $this->showUsingQuery($template, $sqlquery, $highlight, 1, 1); + + // when no results were found, show a message + if ($amountfound == 0) + { + $template =& $manager->getTemplate($template); + $vars = array( + 'query' => htmlspecialchars($query), + 'blogid' => $this->getID() + ); + echo TEMPLATE::fill($template['SEARCH_NOTHINGFOUND'],$vars); + } + } + + return $amountfound; + } + + /** + * Returns an SQL query to use for a search query + * + * @param $query + * search query + * @param $amountMonths + * amount of months to search back. Default = 0 = unlimited + * @param $mode + * either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query + * @returns $highlight + * words to highlight (out parameter) + * @returns + * either a full SQL query, or an empty string (if querystring empty) + * @note + * No LIMIT clause is added. (caller should add this if multiple pages are requested) + */ + function getSqlSearch($query, $amountMonths = 0, &$highlight, $mode = '') + { + $searchclass =& new SEARCH($query); + + $highlight = $searchclass->inclusive; + + // if querystring is empty, return empty string + if ($searchclass->inclusive == '') + return ''; + + + $where = $searchclass->boolean_sql_where('ititle,ibody,imore'); + $select = $searchclass->boolean_sql_select('ititle,ibody,imore'); + + // get list of blogs to search + $blogs = $searchclass->blogs; // array containing blogs that always need to be included + $blogs[] = $this->getID(); // also search current blog (duh) + $blogs = array_unique($blogs); // remove duplicates + $selectblogs = ''; + if (count($blogs) > 0) + $selectblogs = ' and i.iblog in (' . implode(',', $blogs) . ')'; + + if ($mode == '') + { + $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, i.itime, i.imore as more, m.mnumber as authorid, m.memail as authormail, m.murl as authorurl, c.cname as category, i.icat as catid, i.iclosed as closed'; + if ($select) + $query .= ', '.$select. ' as score '; + } else { + $query = 'SELECT COUNT(*) as result '; + } + + $query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c' + . ' WHERE i.iauthor=m.mnumber' + . ' and i.icat=c.catid' + . ' and i.idraft=0' // exclude drafts + . $selectblogs + // don't show future items + . ' and i.itime<=' . mysqldate($this->getCorrectTime()) + . ' and '.$where; + + // take into account amount of months to search + if ($amountMonths > 0) + { + $localtime = getdate($this->getCorrectTime()); + $timestamp_start = mktime(0,0,0,$localtime['mon'] - $amountMonths,1,$localtime['year']); + $query .= ' and i.itime>' . mysqldate($timestamp_start); + } + + if ($mode == '') + { + if ($select) + $query .= ' ORDER BY score DESC'; + else + $query .= ' ORDER BY i.itime DESC '; + } + + return $query; + } + + /** + * Returns the SQL query that's normally used to display the blog items on the index type skins + * + * @param $mode + * either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query + * @returns + * either a full SQL query, or an empty string + * @note + * No LIMIT clause is added. (caller should add this if multiple pages are requested) + */ + function getSqlBlog($extraQuery, $mode = '') + { + if ($mode == '') + $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, i.itime, i.imore as more, m.mnumber as authorid, m.memail as authormail, m.murl as authorurl, c.cname as category, i.icat as catid, i.iclosed as closed'; + else + $query = 'SELECT COUNT(*) as result '; + + $query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c' + . ' WHERE i.iblog='.$this->blogid + . ' and i.iauthor=m.mnumber' + . ' and i.icat=c.catid' + . ' and i.idraft=0' // exclude drafts + // don't show future items + . ' and i.itime<=' . mysqldate($this->getCorrectTime()); + + if ($this->getSelectedCategory()) + $query .= ' and i.icat=' . $this->getSelectedCategory() . ' '; + + + $query .= $extraQuery; + + if ($mode == '') + $query .= ' ORDER BY i.itime DESC'; + + return $query; + } + + /** + * Shows the archivelist using the given template + */ + function showArchiveList($template, $mode = 'month', $limit = 0) { + global $CONF, $catid, $manager; + + if ($catid) + $linkparams = array('catid' => $catid); + + $template =& $manager->getTemplate($template); + $data['blogid'] = $this->getID(); + + echo TEMPLATE::fill($template['ARCHIVELIST_HEADER'],$data); + + $query = 'SELECT itime, SUBSTRING(itime,1,4) AS Year, SUBSTRING(itime,6,2) AS Month, SUBSTRING(itime,9,2) as Day FROM '.sql_table('item') + . ' WHERE iblog=' . $this->getID() + . ' and itime <=' . mysqldate($this->getCorrectTime()) // don't show future items! + . ' and idraft=0'; // don't show draft items + + if ($catid) + $query .= ' and icat=' . intval($catid); + + $query .= ' GROUP BY Year, Month'; + if ($mode == 'day') + $query .= ', Day'; + + + $query .= ' ORDER BY itime DESC'; + + if ($limit > 0) + $query .= ' LIMIT ' . intval($limit); + + $res = sql_query($query); + + while ($current = mysql_fetch_object($res)) { + $current->itime = strtotime($current->itime); // string time -> unix timestamp + + if ($mode == 'day') { + $archivedate = date('Y-m-d',$current->itime); + $archive['day'] = date('d',$current->itime); + $data['day'] = date('d',$current->itime); + } else { + $archivedate = date('Y-m',$current->itime); + } + $data['month'] = date('m',$current->itime); + $data['year'] = date('Y',$current->itime); + $data['archivelink'] = createArchiveLink($this->getID(),$archivedate,$linkparams); + + $manager->notify( + 'PreArchiveListItem', + array( + 'listitem' => &$data + ) + ); + + $temp = TEMPLATE::fill($template['ARCHIVELIST_LISTITEM'],$data); + echo strftime($temp,$current->itime); + + } + + mysql_free_result($res); + + echo TEMPLATE::fill($template['ARCHIVELIST_FOOTER'],$data); + } + + + /** + * Shows the list of categories using a given template + */ + function showCategoryList($template) { + global $CONF, $manager; + + // determine arguments next to catids + // I guess this can be done in a better way, but it works + global $archive, $archivelist; + + $linkparams = array(); + if ($archive) { + $blogurl = createArchiveLink($this->getID(), $archive, ''); + $linkparams['blogid'] = $this->getID(); + $linkparams['archive'] = $archive; + } else if ($archivelist) { + $blogurl = createArchiveListLink($this->getID(), ''); + $linkparams['archivelist'] = $archivelist; + } else { + $blogurl = createBlogidLink($this->getID(), ''); + $linkparams['blogid'] = $this->getID(); + } + + //$blogurl = $this->getURL() . $qargs; + //$blogurl = createBlogLink($this->getURL(), $linkparams); + + $template =& $manager->getTemplate($template); + + echo TEMPLATE::fill((isset($template['CATLIST_HEADER']) ? $template['CATLIST_HEADER'] : null), + array( + 'blogid' => $this->getID(), + 'blogurl' => $blogurl, + 'self' => $CONF['Self'] + )); + + $query = 'SELECT catid, cdesc as catdesc, cname as catname FROM '.sql_table('category').' WHERE cblog=' . $this->getID() . ' ORDER BY cname ASC'; + $res = sql_query($query); + + + while ($data = mysql_fetch_assoc($res)) { + $data['blogid'] = $this->getID(); + $data['blogurl'] = $blogurl; + $data['catlink'] = createLink( + 'category', + array( + 'catid' => $data['catid'], + 'name' => $data['catname'], + 'extra' => $linkparams + ) + ); + $data['self'] = $CONF['Self']; + + $manager->notify( + 'PreCategoryListItem', + array( + 'listitem' => &$data + ) + ); + + echo TEMPLATE::fill((isset($template['CATLIST_LISTITEM']) ? $template['CATLIST_LISTITEM'] : null), $data); + //$temp = TEMPLATE::fill((isset($template['CATLIST_LISTITEM']) ? $template['CATLIST_LISTITEM'] : null), $data); + //echo strftime($temp, $current->itime); + + } + + mysql_free_result($res); + + echo TEMPLATE::fill((isset($template['CATLIST_FOOTER']) ? $template['CATLIST_FOOTER'] : null), + array( + 'blogid' => $this->getID(), + 'blogurl' => $blogurl, + 'self' => $CONF['Self'] + )); + } + + /** + * Shows a list of all blogs in the system using a given template + * ordered by number, name, shortname or description + * in ascending or descending order + */ + function showBlogList($template, $bnametype, $orderby, $direction) { + global $CONF, $manager; + + switch ($orderby) { + case 'number': + $orderby='bnumber'; + break; + case 'name': + $orderby='bname'; + break; + case 'shortname': + $orderby='bshortname'; + break; + case 'description': + $orderby='bdesc'; + break; + default: + $orderby='bnumber'; + break; + } + + $direction=strtolower($direction); + switch ($direction) { + case 'asc': + $direction='ASC'; + break; + case 'desc': + $direction='DESC'; + break; + default: + $direction='ASC'; + break; + } + + $template =& $manager->getTemplate($template); + + echo TEMPLATE::fill((isset($template['BLOGLIST_HEADER']) ? $template['BLOGLIST_HEADER'] : null), + array( + 'sitename' => $CONF['SiteName'], + 'siteurl' => $CONF['IndexURL'] + )); + + $query = 'SELECT bnumber, bname, bshortname, bdesc, burl FROM '.sql_table('blog').' ORDER BY '.$orderby.' '.$direction; + $res = sql_query($query); + + while ($data = mysql_fetch_assoc($res)) { + + $list = array(); + +// $list['bloglink'] = createLink('blog', array('blogid' => $data['bnumber'])); + $list['bloglink'] = createBlogidLink($data['bnumber']); + + $list['blogdesc'] = $data['bdesc']; + + $list['blogurl'] = $data['burl']; + + if ($bnametype=='shortname') { + $list['blogname'] = $data['bshortname']; + } + else { // all other cases + $list['blogname'] = $data['bname']; + } + + $manager->notify( + 'PreBlogListItem', + array( + 'listitem' => &$list + ) + ); + + echo TEMPLATE::fill((isset($template['BLOGLIST_LISTITEM']) ? $template['BLOGLIST_LISTITEM'] : null), $list); + + } + + mysql_free_result($res); + + echo TEMPLATE::fill((isset($template['BLOGLIST_FOOTER']) ? $template['BLOGLIST_FOOTER'] : null), + array( + 'sitename' => $CONF['SiteName'], + 'siteurl' => $CONF['IndexURL'] + )); + + } + + /** + * Blogsettings functions + */ + + function readSettings() { + $query = 'SELECT *' + . ' FROM '.sql_table('blog') + . ' WHERE bnumber=' . $this->blogid; + $res = sql_query($query); + + $this->isValid = (mysql_num_rows($res) > 0); + if (!$this->isValid) + return; + + $this->settings = mysql_fetch_assoc($res); + } + + function writeSettings() { + + // (can't use floatval since not available prior to PHP 4.2) + $offset = $this->getTimeOffset(); + if (!is_float($offset)) + $offset = intval($offset); + + $query = 'UPDATE '.sql_table('blog') + . " SET bname='" . addslashes($this->getName()) . "'," + . " bshortname='". addslashes($this->getShortName()) . "'," + . " bcomments=". intval($this->commentsEnabled()) . "," + . " bmaxcomments=" . intval($this->getMaxComments()) . "," + . " btimeoffset=" . $offset . "," + . " bpublic=" . intval($this->isPublic()) . "," + . " breqemail=" . intval($this->emailRequired()) . "," + . " bsendping=" . intval($this->sendPing()) . "," + . " bconvertbreaks=" . intval($this->convertBreaks()) . "," + . " ballowpast=" . intval($this->allowPastPosting()) . "," + . " bnotify='" . addslashes($this->getNotifyAddress()) . "'," + . " bnotifytype=" . intval($this->getNotifyType()) . "," + . " burl='" . addslashes($this->getURL()) . "'," + . " bupdate='" . addslashes($this->getUpdateFile()) . "'," + . " bdesc='" . addslashes($this->getDescription()) . "'," + . " bdefcat=" . intval($this->getDefaultCategory()) . "," + . " bdefskin=" . intval($this->getDefaultSkin()) . "," + . " bincludesearch=" . intval($this->getSearchable()) + . " WHERE bnumber=" . intval($this->getID()); + sql_query($query); + + } + + + + // update update file if requested + function updateUpdatefile() { + if ($this->getUpdateFile()) { + $f_update = fopen($this->getUpdateFile(),'w'); + fputs($f_update,$this->getCorrectTime()); + fclose($f_update); + } + + } + + function isValidCategory($catid) { + $query = 'SELECT * FROM '.sql_table('category').' WHERE cblog=' . $this->getID() . ' and catid=' . intval($catid); + $res = sql_query($query); + return (mysql_num_rows($res) != 0); + } + + function getCategoryName($catid) { + $res = sql_query('SELECT cname FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid)); + $o = mysql_fetch_object($res); + return $o->cname; + } + + function getCategoryDesc($catid) { + $res = sql_query('SELECT cdesc FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid)); + $o = mysql_fetch_object($res); + return $o->cdesc; + } + + function getCategoryIdFromName($name) { + $res = sql_query('SELECT catid FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and cname="' . addslashes($name) . '"'); + if (mysql_num_rows($res) > 0) { + $o = mysql_fetch_object($res); + return $o->catid; + } else { + return $this->getDefaultCategory(); + } + } + + function sendPing() { + return $this->getSetting('bsendping'); + } + + function setPingUserland($val) { + $this->setSetting('bsendping',$val); + } + + function convertBreaks() { + return $this->getSetting('bconvertbreaks'); + } + + function insertJavaScriptInfo($authorid = '') { + global $member, $CONF; + + if ($authorid == '') + $authorid = $member->getID(); + + ?> + setSetting('bconvertbreaks',$val); + } + function setAllowPastPosting($val) { + $this->setSetting('ballowpast',$val); + } + function allowPastPosting() { + return $this->getSetting('ballowpast'); + } + + function getCorrectTime($t=0) { + if ($t == 0) $t = time(); + return ($t + 3600 * $this->getTimeOffset()); + } + + function getName() { + return $this->getSetting('bname'); + } + + function getShortName() { + return $this->getSetting('bshortname'); + } + + function getMaxComments() { + return $this->getSetting('bmaxcomments'); + } + + function getNotifyAddress() { + return $this->getSetting('bnotify'); + } + + function getNotifyType() { + return $this->getSetting('bnotifytype'); + } + + function notifyOnComment() { + $n = $this->getNotifyType(); + return (($n != 0) && (($n % 3) == 0)); + } + + function notifyOnVote() { + $n = $this->getNotifyType(); + return (($n != 0) && (($n % 5) == 0)); + } + + function notifyOnNewItem() { + $n = $this->getNotifyType(); + return (($n != 0) && (($n % 7) == 0)); + } + + function setNotifyType($val) { + $this->setSetting('bnotifytype',$val); + } + + + function getTimeOffset() { + return $this->getSetting('btimeoffset'); + } + + function commentsEnabled() { + return $this->getSetting('bcomments'); + } + + function getURL() { + return $this->getSetting('burl'); + } + + function getDefaultSkin() { + return $this->getSetting('bdefskin'); + } + + function getUpdateFile() { + return $this->getSetting('bupdate'); + } + + function getDescription() { + return $this->getSetting('bdesc'); + } + + function isPublic() { + return $this->getSetting('bpublic'); + } + + function emailRequired() { + return $this->getSetting('breqemail'); + } + + function getSearchable() { + return $this->getSetting('bincludesearch'); + } + + function getDefaultCategory() { + return $this->getSetting('bdefcat'); + } + + function setPublic($val) { + $this->setSetting('bpublic',$val); + } + + function setSearchable($val) { + $this->setSetting('bincludesearch',$val); + } + + function setDescription($val) { + $this->setSetting('bdesc',$val); + } + + function setUpdateFile($val) { + $this->setSetting('bupdate',$val); + } + + function setDefaultSkin($val) { + $this->setSetting('bdefskin',$val); + } + + function setURL($val) { + $this->setSetting('burl',$val); + } + + function setName($val) { + $this->setSetting('bname',$val); + } + + function setShortName($val) { + $this->setSetting('bshortname',$val); + } + + function setCommentsEnabled($val) { + $this->setSetting('bcomments',$val); + } + + function setMaxComments($val) { + $this->setSetting('bmaxcomments',$val); + } + + function setNotifyAddress($val) { + $this->setSetting('bnotify',$val); + } + + function setEmailRequired($val) { + $this->setSetting('breqemail',$val); + } + + function setTimeOffset($val) { + // check validity of value + // 1. replace , by . (common mistake) + $val = str_replace(',','.',$val); + // 2. cast to float or int + if (is_numeric($val) && strstr($val,'.5')) { + $val = (float) $val; + } else { + $val = intval($val); + } + + $this->setSetting('btimeoffset',$val); + } + + function setDefaultCategory($val) { + $this->setSetting('bdefcat',$val); + } + + function getSetting($key) { + return $this->settings[$key]; + } + + function setSetting($key,$value) { + $this->settings[$key] = $value; + } + + + // tries to add a member to the team. Returns false if the member was already on + // the team + function addTeamMember($memberid, $admin) { + global $manager; + + $memberid = intval($memberid); + $admin = intval($admin); + + // check if member is already a member + $tmem = MEMBER::createFromID($memberid); + + if ($tmem->isTeamMember($this->getID())) + return 0; + + $manager->notify( + 'PreAddTeamMember', + array( + 'blog' => &$this, + 'member' => &$tmem, + 'admin' => &$admin + ) + ); + + // add to team + $query = 'INSERT INTO '.sql_table('team').' (TMEMBER, TBLOG, TADMIN) ' + . 'VALUES (' . $memberid .', '.$this->getID().', "'.$admin.'")'; + sql_query($query); + + $manager->notify( + 'PostAddTeamMember', + array( + 'blog' => &$this, + 'member' => &$tmem, + 'admin' => $admin + ) + + ); + + $logMsg = sprintf(_TEAM_ADD_NEWTEAMMEMBER, $tmem->getDisplayName(), $memberid, $this->getName()); + ACTIONLOG::add(INFO, $logMsg); + + return 1; + } + + function getID() { + return intVal($this->blogid); + } + + // returns true if there is a blog with the given shortname (static) + function exists($name) { + $r = sql_query('select * FROM '.sql_table('blog').' WHERE bshortname="'.addslashes($name).'"'); + return (mysql_num_rows($r) != 0); + } + + // returns true if there is a blog with the given ID (static) + function existsID($id) { + $r = sql_query('select * FROM '.sql_table('blog').' WHERE bnumber='.intval($id)); + return (mysql_num_rows($r) != 0); + } + + // flag there is a future post pending + function setFuturePost() { + $query = 'UPDATE '.sql_table('blog') + . " SET bfuturepost='1' WHERE bnumber=" . $this->getID(); + sql_query($query); + } + + // clear there is a future post pending + function clearFuturePost() { + $query = 'UPDATE '.sql_table('blog') + . " SET bfuturepost='0' WHERE bnumber=" . $this->getID(); + sql_query($query); + } + + // check if we should throw justPosted event + function checkJustPosted() { + global $manager; + + if ($this->settings['bfuturepost'] == 1) { + $blogid = $this->getID(); + $result = sql_query("SELECT * FROM " . sql_table('item') + . " WHERE iposted=0 AND iblog=" . $blogid . " AND itime 0) { + // This $pinged is allow a plugin to tell other hook to the event that a ping is sent already + // Note that the plugins's calling order is subject to thri order in the plugin list + $pinged = false; + $manager->notify( + 'JustPosted', + array('blogid' => $blogid, + 'pinged' => &$pinged + ) + ); + + // clear all expired future posts + sql_query("UPDATE " . sql_table('item') . " SET iposted='1' WHERE iblog=" . $blogid . " AND itimeamountComments(); if ($camount>0) { - echo "
    ".sprintf(_LIST_ITEM_COMMENTS, $COMMENTS->amountComments()).""; + echo "
    "; + echo "( " . sprintf(_LIST_ITEM_COMMENTS, $COMMENTS->amountComments())." )"; } else { echo "
    "._LIST_ITEM_NOCONTENT;