You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1698 lines
60 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
//this script may only be included - so its better to die if called directly.
if (strpos($_SERVER['SCRIPT_NAME'], basename(__FILE__)) !== false) {
header('location: index.php');
exit;
}
class ArtLib extends TikiLib
{
//Special parsing for multipage articles
public function get_number_of_pages($data)
{
$parts = explode('...page...', $data);
return count($parts);
}
public function get_page($data, $i)
{
// Get slides
$parts = explode('...page...', $data);
if (! isset($parts[$i - 1])) {
$i = 1;
}
$ret = $parts[$i - 1];
if (substr($parts[$i - 1], 1, 5) == '<br/>') {
$ret = substr($parts[$i - 1], 6);
}
if (substr($parts[$i - 1], 1, 6) == '<br />') {
$ret = substr($parts[$i - 1], 7);
}
return $ret;
}
public function approve_submission($subId)
{
$data = $this->get_submission($subId);
if (! $data) {
return false;
}
if (! $data['image_x']) {
$data['image_x'] = 0;
}
if (! $data['image_y']) {
$data['image_y'] = 0;
}
$articleId = $this->replace_article(
$data['title'],
$data['authorName'],
$data['topicId'],
$data['useImage'],
$data['image_name'],
$data['image_size'],
$data['image_type'],
$data['image_data'],
$data['heading'],
$data['body'],
$data['publishDate'],
$data['expireDate'],
$data['author'],
0,
$data['image_x'],
$data['image_y'],
$data['type'],
$data['topline'],
$data['subtitle'],
$data['linkto'],
$data['image_caption'],
$data['lang'],
$data['rating'],
$data['isfloat']
);
$this->transfer_attributes_from_submission($subId, $articleId);
$query = "update `tiki_objects` set `type`= ?, `itemId`= ?, `href`=? where `itemId` = ? and `type`= ?";
$this->query($query, ['article', (int)$articleId, "tiki-read_article.php?articleId=$articleId", (int)$subId, 'submission']);
$query = 'update `tiki_objects` set `href`=?, `type`=? where `href`=?';
$this->query($query, ["'tiki-read_article.php?articleId=$articleId", 'article', "tiki-edit_submission.php?subId=$subId"]);
$this->remove_submission($subId);
}
public function add_article_hit($articleId)
{
if (StatsLib::is_stats_hit()) {
$query = "update `tiki_articles` set `nbreads`=`nbreads`+1 where `articleId`=?";
$this->query($query, [$articleId]);
}
}
public function remove_article($articleId, $article_data = '')
{
global $user, $prefs;
$smarty = TikiLib::lib('smarty');
$tikilib = TikiLib::lib('tiki');
if ($articleId) {
if (empty($article_data)) {
$article_data = $this->get_article($articleId);
}
$query = 'delete from `tiki_articles` where `articleId`=?';
$result = $this->query($query, [$articleId]);
$this->remove_object('article', $articleId);
$multilinguallib = TikiLib::lib('multilingual');
$multilinguallib->detachTranslation('article', $articleId);
TikiLib::events()->trigger(
'tiki.article.delete',
[
'type' => 'article',
'object' => $articleId,
'user' => $user,
]
);
// TODO refactor
$nots = $tikilib->get_event_watches('article_deleted', '*');
if (! empty($article_data['topicId'])) {
$nots2 = $tikilib->get_event_watches('topic_article_deleted', $article_data['topicId']);
} else {
$nots2 = [];
}
$smarty->assign('mail_action', 'Delete');
$nots3 = [];
foreach ($nots as $n) {
$nots3[] = $n['email'];
}
foreach ($nots2 as $n) {
if (! in_array($n['email'], $nots3)) {
$nots[] = $n;
}
}
if ($prefs['user_article_watch_editor'] != "y") {
for ($i = count($nots) - 1; $i >= 0; --$i) {
if ($nots[$i]['user'] == $user) {
unset($nots[$i]);
break;
}
}
}
if (! isset($_SERVER['SERVER_NAME'])) {
$_SERVER['SERVER_NAME'] = $_SERVER["HTTP_HOST"];
}
if ($prefs['feature_user_watches'] == 'y' && $prefs['feature_daily_report_watches'] == 'y') {
$reportsManager = Reports_Factory::build('Reports_Manager');
$reportsManager->addToCache(
$nots,
[
'event' => 'article_deleted',
'articleId' => $articleId,
'articleTitle' => $article_data['title'],
'authorName' => $article_data['authorName'],
'user' => $user
]
);
}
if (count($nots) || (! empty($emails) && is_array($emails))) {
include_once('lib/notifications/notificationemaillib.php');
$smarty->assign('mail_site', $_SERVER['SERVER_NAME']);
$smarty->assign('mail_title', 'articleId=' . $articleId);
$smarty->assign('mail_postid', $articleId);
$smarty->assign('mail_user', $user);
$smarty->assign('mail_current_data', $article_data['heading'] . "\n----------------------\n" . $article_data['body']);
// the strings below are used to localize messages in the template file
//get_strings tr('New article post:') tr('Edited article post:') tr('Deleted article post:')
sendEmailNotification($nots, 'watch', 'user_watch_article_post_subject.tpl', $_SERVER['SERVER_NAME'], 'user_watch_article_post.tpl');
}
return true;
}
}
public function remove_submission($subId)
{
if ($subId) {
$query = 'delete from `tiki_submissions` where `subId`=?';
$result = $this->query($query, [(int) $subId]);
$this->remove_object('submission', $subId);
return true;
}
}
public function delete_expired_submissions($maxrows = 1000)
{
$tiki_submissions = TikiDb::get()->table('tiki_submissions');
$expired = $tiki_submissions->fetchColumn(
'subId',
['expireDate' => $tiki_submissions->lesserThan($this->now)],
$maxrows
);
$transaction = $this->begin();
foreach ($expired as $subId) {
$tiki_submissions->delete(['subId' => $subId]);
$this->remove_object('submission', $subId);
}
$transaction->commit();
return true;
}
public function replace_submission($title, $authorName, $topicId, $useImage, $imgname, $imgsize, $imgtype, $imgdata, $heading, $body, $publishDate, $expireDate, $user, $subId, $image_x, $image_y, $type, $topline, $subtitle, $linkto, $image_caption, $lang, $rating = 0, $isfloat = 'n')
{
global $tiki_p_autoapprove_submission, $prefs;
$smarty = TikiLib::lib('smarty');
$tikilib = TikiLib::lib('tiki');
if ($expireDate < $publishDate) {
$expireDate = $publishDate;
}
if (empty($imgdata)) {
$imgdata = '';
}
$notificationlib = TikiLib::lib('notification');
$query = 'select `name` from `tiki_topics` where `topicId` = ?';
$topicName = $this->getOne($query, [(int) $topicId]);
$size = strlen($body);
$info = [
'title' => $title,
'authorName' => $authorName,
'topicId' => (int) $topicId,
'topicName' => $topicName,
'size' => (int) $size,
'useImage' => $useImage,
'image_name' => $imgname,
'image_type' => $imgtype,
'image_size' => (int) $imgsize,
'image_data' => $imgdata,
'isfloat' => $isfloat,
'image_x' => (int) $image_x,
'image_y' => (int) $image_y,
'heading' => $heading,
'body' => $body,
'publishDate' => (int) $publishDate,
'expireDate' => (int) $expireDate,
'author' => $user,
'type' => $type,
'rating' => (float) $rating,
'topline' => $topline,
'subtitle' => $subtitle,
'linkto' => $linkto,
'image_caption' => $image_caption,
'lang' => $lang,
];
$article_table = $this->table('tiki_submissions');
if ($subId) {
$article_table->update($info, [
'subId' => (int) $subId,
]);
} else {
$info['created'] = (int) $this->now;
$info['nbreads'] = 0;
$info['votes'] = 0;
$info['points'] = 0;
$id = $article_table->insert($info);
}
if ($tiki_p_autoapprove_submission != 'y') {
$nots = $tikilib->get_event_watches('article_submitted', '*');
$nots2 = $tikilib->get_event_watches('topic_article_created', $topicId);
$nots3 = [];
foreach ($nots as $n) {
$nots3[] = $n['email'];
}
foreach ($nots2 as $n) {
if (! in_array($n['emails'], $nots3)) {
$nots[] = $n;
}
}
if (! isset($_SERVER['SERVER_NAME'])) {
$_SERVER['SERVER_NAME'] = $_SERVER['HTTP_HOST'];
}
if ($prefs['user_article_watch_editor'] != "y") {
for ($i = count($nots) - 1; $i >= 0; --$i) {
if ($nots[$i]['user'] == $user) {
unset($nots[$i]);
break;
}
}
}
if (count($nots)) {
include_once('lib/notifications/notificationemaillib.php');
$smarty->assign('mail_site', $_SERVER['SERVER_NAME']);
$smarty->assign('mail_user', $user);
$smarty->assign('mail_title', $title);
$smarty->assign('mail_heading', $heading);
$smarty->assign('mail_body', $body);
$smarty->assign('mail_subId', $id);
sendEmailNotification($nots, 'watch', 'submission_notification_subject.tpl', $_SERVER['SERVER_NAME'], 'submission_notification.tpl');
}
}
$tikilib = TikiLib::lib('tiki');
$tikilib->object_post_save(
[
'type' => 'submission',
'object' => $id,
'description' => substr($heading, 0, 200),
'name' => $title,
'href' => "tiki-edit_submission.php?subId=$id",
],
[ 'content' => $heading . "\n" . $body ]
);
return $id;
}
public function replace_article($title, $authorName, $topicId, $useImage, $imgname, $imgsize, $imgtype, $imgdata, $heading, $body, $publishDate, $expireDate, $user, $articleId, $image_x, $image_y, $type, $topline, $subtitle, $linkto, $image_caption, $lang, $rating = 0, $isfloat = 'n', $emails = '', $from = '', $list_image_x = '', $list_image_y = '', $ispublished = 'y', $fromurl = false)
{
$tikilib = TikiLib::lib('tiki');
$smarty = TikiLib::lib('smarty');
if ($expireDate < $publishDate) {
$expireDate = $publishDate;
}
if (empty($imgdata) || $useImage === 'n') { // remove image data if not using it
$imgdata = '';
}
$query = 'select `name` from `tiki_topics` where `topicId` = ?';
$topicName = $this->getOne($query, [$topicId]);
$size = $body ? mb_strlen($body) : mb_strlen($heading);
$info = [
'title' => $title,
'authorName' => $authorName,
'topicId' => (int) $topicId,
'topicName' => $topicName,
'size' => (int) $size,
'useImage' => $useImage,
'image_name' => $imgname,
'image_type' => $imgtype,
'image_size' => (int) $imgsize,
'image_data' => $imgdata,
'isfloat' => $isfloat,
'image_x' => (int) $image_x,
'image_y' => (int) $image_y,
'list_image_x' => (int) $list_image_x,
'list_image_y' => (int) $list_image_y,
'heading' => $heading,
'body' => $body,
'publishDate' => (int) $publishDate,
'expireDate' => (int) $expireDate,
'author' => $user,
'type' => $type,
'rating' => (float) $rating,
'topline' => $topline,
'subtitle' => $subtitle,
'linkto' => $linkto,
'image_caption' => $image_caption,
'lang' => $lang,
'ispublished' => $ispublished,
];
$article_table = $this->table('tiki_articles');
if ($articleId) {
$oldArticle = $this->get_article($articleId);
$article_table->update($info, [
'articleId' => (int) $articleId,
]);
// Clear article image cache because image may just have been changed
$this->delete_image_cache('article', $articleId);
$event = 'article_edited';
$nots = $tikilib->get_event_watches('article_edited', $articleId);
$nots2 = $tikilib->get_event_watches('topic_article_edited', $topicId);
$smarty->assign('mail_action', 'Edit');
$smarty->assign('mail_old_title', $oldArticle['title']);
$smarty->assign('mail_old_publish_date', $oldArticle['publishDate']);
$smarty->assign('mail_old_expiration_date', $oldArticle['expireDate']);
$smarty->assign('mail_old_data', $oldArticle['heading'] . "\n----------------------\n" . $oldArticle['body']);
} else {
$info['created'] = (int) $this->now;
$info['nbreads'] = 0;
$info['votes'] = 0;
$info['points'] = 0;
$articleId = $article_table->insert($info);
global $prefs;
TikiLib::events()->trigger(
'tiki.article.create',
[
'type' => 'article',
'object' => $articleId,
'user' => $user,
]
);
$event = 'article_submitted';
$nots = $tikilib->get_event_watches('article_submitted', $articleId);
$nots2 = $tikilib->get_event_watches('topic_article_created', $topicId);
$smarty->assign('mail_action', 'New');
// Create tracker item as well if feature is enabled
if (! $fromurl && $prefs['tracker_article_tracker'] == 'y' && $trackerId = $prefs['tracker_article_trackerId']) {
$trklib = TikiLib::lib('trk');
$definition = Tracker_Definition::get($trackerId);
if ($fieldId = $definition->getArticleField()) {
$addit = [];
$addit[] = [
'fieldId' => $fieldId,
'type' => 'articles',
'value' => $articleId,
];
$itemId = $trklib->replace_item($trackerId, 0, ['data' => $addit]);
TikiLib::lib('relation')->add_relation('tiki.article.attach', 'trackeritem', $itemId, 'article', $articleId);
}
}
}
$wikilib = TikiLib::lib('wiki');
$wikilib->update_wikicontent_relations(
$heading . "\n" . $body,
'article',
(int)$articleId
);
$wikilib->update_wikicontent_links(
$heading . "\n" . $body,
'article',
(int)$articleId
);
$nots3 = [];
foreach ($nots as $n) {
$nots3[] = $n['email'];
}
foreach ($nots2 as $n) {
if (! in_array($n['email'], $nots3)) {
$nots[] = $n;
}
}
if (is_array($emails) && (empty($from) || $from == $prefs['sender_email'])) {
foreach ($emails as $n) {
if (! in_array($n, $nots3)) {
$nots[] = ['email' => $n, 'language' => $prefs['site_language']];
}
}
}
global $prefs;
if ($prefs['user_article_watch_editor'] != "y") {
for ($i = count($nots) - 1; $i >= 0; --$i) {
if ($nots[$i]['user'] == $user) {
unset($nots[$i]);
break;
}
}
}
if (! isset($_SERVER['SERVER_NAME'])) {
$_SERVER['SERVER_NAME'] = $_SERVER['HTTP_HOST'];
}
if ($prefs['feature_user_watches'] == 'y' && $prefs['feature_daily_report_watches'] == 'y') {
$reportsManager = Reports_Factory::build('Reports_Manager');
$reportsManager->addToCache(
$nots,
[
'event' => $event,
'articleId' => $articleId,
'articleTitle' => $title,
'authorName' => $authorName,
'user' => $user
]
);
}
if (count($nots) || is_array($emails)) {
include_once('lib/notifications/notificationemaillib.php');
$smarty->assign('mail_site', $_SERVER['SERVER_NAME']);
$smarty->assign('mail_title', $title);
$smarty->assign('mail_postid', $articleId);
$smarty->assign('mail_user', $user);
$smarty->assign('mail_current_publish_date', $publishDate);
$smarty->assign('mail_current_expiration_date', $expireDate);
$smarty->assign('mail_current_data', $heading . "\n----------------------\n" . $body);
sendEmailNotification($nots, 'watch', 'user_watch_article_post_subject.tpl', $_SERVER['SERVER_NAME'], 'user_watch_article_post.tpl');
if (is_array($emails) && ! empty($from) && $from != $prefs['sender_email']) {
$nots = [];
foreach ($emails as $n) {
$nots[] = ['email' => $n, 'language' => $prefs['site_language']];
}
sendEmailNotification($nots, 'watch', 'user_watch_article_post_subject.tpl', $_SERVER['SERVER_NAME'], 'user_watch_article_post.tpl', $from);
}
}
require_once('lib/search/refresh-functions.php');
refresh_index('articles', $articleId);
$tikilib = TikiLib::lib('tiki');
$tikilib->object_post_save(
[
'type' => 'article',
'object' => $articleId,
'description' => substr($heading, 0, 200),
'name' => $title,
'href' => "tiki-read_article.php?articleId=$articleId"
],
[ 'content' => $body . "\n" . $heading ]
);
return $articleId;
}
public function add_topic($name, $imagename, $imagetype, $imagesize, $imagedata)
{
$query = 'insert into `tiki_topics`(`name`,`image_name`,`image_type`,`image_size`,`image_data`,`active`,`created`) values(?,?,?,?,?,?,?)';
$result = $this->query($query, [$name, $imagename, $imagetype, (int) $imagesize, $imagedata, 'y', (int) $this->now]);
$query = 'select max(`topicId`) from `tiki_topics` where `created`=? and `name`=?';
$topicId = $this->getOne($query, [(int) $this->now, $name]);
return $topicId;
}
public function remove_topic($topicId, $all = 0)
{
$query = 'delete from `tiki_topics` where `topicId`=?';
$result = $this->query($query, [$topicId]);
if ($all == 1) {
$query = 'delete from `tiki_articles` where `topicId`=?';
$result = $this->query($query, [$topicId]);
} else {
$query = 'update `tiki_articles` set `topicId`=?, `topicName`=? where `topicId`=?';
$result = $this->query($query, [null, null, $topicId]);
}
return true;
}
public function replace_topic_name($topicId, $name)
{
$query = 'update `tiki_topics` set `name` = ? where `topicId` = ?';
$result = $this->query($query, [$name, (int)$topicId]);
$query = 'update `tiki_articles` set `topicName` = ? where `topicId`= ?';
$result = $this->query($query, [$name, (int)$topicId]);
return true;
}
public function replace_topic_image($topicId, $imagename, $imagetype, $imagesize, $imagedata)
{
$topicId = (int)$topicId;
$query = 'update `tiki_topics` set `image_name` = ?, `image_type` = ?, `image_size` = ?, `image_data` = ? where `topicId` = ?';
$result = $this->query($query, [$imagename, $imagetype, $imagesize, $imagedata, $topicId]);
return true;
}
public function activate_topic($topicId)
{
$query = 'update `tiki_topics` set `active`=? where `topicId`=?';
$result = $this->query($query, ['y', $topicId]);
}
public function deactivate_topic($topicId)
{
$query = 'update `tiki_topics` set `active`=? where `topicId`=?';
$result = $this->query($query, ['n', $topicId]);
}
public function get_topic($topicId)
{
$query = 'select `topicId`,`name`,`image_name`,`image_size`,`image_type` from `tiki_topics` where `topicId`=?';
$result = $this->query($query, [$topicId]);
$res = $result->fetchRow();
return $res;
}
public function get_topicId($name)
{
$query = 'select `topicId` from `tiki_topics` where `name`=?';
return $this->getOne($query, [$name]);
}
public function list_topics()
{
$query = 'select `topicId`,`name`,`image_name`,`image_size`,`image_type`,`active` from `tiki_topics` order by `name`';
$result = $this->query($query, []);
$ret = [];
while ($res = $result->fetchRow()) {
$res['subs'] = $this->getOne('select count(*) from `tiki_submissions` where `topicId`=?', [$res['topicId']]);
$res['arts'] = $this->getOne('select count(*) from `tiki_articles` where `topicId`=?', [$res['topicId']]);
$ret[$res['topicId']] = $res;
}
return $ret;
}
public function list_active_topics()
{
$query = 'select * from `tiki_topics` where `active`=?';
$result = $this->query($query, ['y']);
$ret = [];
while ($res = $result->fetchRow()) {
$ret[] = $res;
}
return $ret;
}
// Article Type functions
public function add_type($type)
{
$result = $this->query('insert into `tiki_article_types`(`type`) values(?)', [$type]);
return true;
}
public function edit_type($type, $use_ratings, $show_pre_publ, $show_post_expire, $heading_only, $allow_comments, $comment_can_rate_article, $show_image, $show_avatar, $show_author, $show_pubdate, $show_expdate, $show_reads, $show_size, $show_topline, $show_subtitle, $show_linkto, $show_image_caption, $creator_edit)
{
if ($use_ratings == 'on') {
$use_ratings = 'y';
} else {
$use_ratings = 'n';
}
if ($show_pre_publ == 'on') {
$show_pre_publ = 'y';
} else {
$show_pre_publ = 'n';
}
if ($show_post_expire == 'on') {
$show_post_expire = 'y';
} else {
$show_post_expire = 'n';
}
if ($heading_only == 'on') {
$heading_only = 'y';
} else {
$heading_only = 'n';
}
if ($allow_comments == 'on') {
$allow_comments = 'y';
} else {
$allow_comments = 'n';
}
if ($comment_can_rate_article == 'on') {
$comment_can_rate_article = 'y';
} else {
$comment_can_rate_article = 'n';
}
if ($show_image == 'on') {
$show_image = 'y';
} else {
$show_image = 'n';
}
if ($show_avatar == 'on') {
$show_avatar = 'y';
} else {
$show_avatar = 'n';
}
if ($show_author == 'on') {
$show_author = 'y';
} else {
$show_author = 'n';
}
if ($show_pubdate == 'on') {
$show_pubdate = 'y';
} else {
$show_pubdate = 'n';
}
if ($show_expdate == 'on') {
$show_expdate = 'y';
} else {
$show_expdate = 'n';
}
if ($show_reads == 'on') {
$show_reads = 'y';
} else {
$show_reads = 'n';
}
if ($show_size == 'on') {
$show_size = 'y';
} else {
$show_size = 'n';
}
if ($show_topline == 'on') {
$show_topline = 'y';
} else {
$show_topline = 'n';
}
if ($show_subtitle == 'on') {
$show_subtitle = 'y';
} else {
$show_subtitle = 'n';
}
if ($show_linkto == 'on') {
$show_linkto = 'y';
} else {
$show_linkto = 'n';
}
if ($show_image_caption == 'on') {
$show_image_caption = 'y';
} else {
$show_image_caption = 'n';
}
if ($creator_edit == 'on') {
$creator_edit = 'y';
} else {
$creator_edit = 'n';
}
$query = "update `tiki_article_types` set
`use_ratings` = ?,
`show_pre_publ` = ?,
`show_post_expire` = ?,
`heading_only` = ?,
`allow_comments` = ?,
`comment_can_rate_article` = ?,
`show_image` = ?,
`show_avatar` = ?,
`show_author` = ?,
`show_pubdate` = ?,
`show_expdate` = ?,
`show_reads` = ?,
`show_size` = ?,
`show_topline` = ?,
`show_subtitle` = ?,
`show_linkto` = ?,
`show_image_caption` = ?,
`creator_edit` = ?
where `type` = ?";
$result = $this->query(
$query,
[
$use_ratings,
$show_pre_publ,
$show_post_expire,
$heading_only,
$allow_comments,
$comment_can_rate_article,
$show_image,
$show_avatar,
$show_author,
$show_pubdate,
$show_expdate,
$show_reads,
$show_size,
$show_topline,
$show_subtitle,
$show_linkto,
$show_image_caption,
$creator_edit,
$type
]
);
}
public function remove_type($type)
{
$query = 'delete from `tiki_article_types` where `type`=?';
$result = $this->query($query, [$type]);
// remove attributes set for this type too
$query = "delete from `tiki_object_relations` where `source_type` = 'articletype' and `source_itemId`=?";
$result = $this->query($query, [$type]);
}
public function get_type($type)
{
$query = 'select * from `tiki_article_types` where `type`=?';
$result = $this->query($query, [$type]);
$res = $result->fetchRow();
return $res;
}
public function list_types()
{
$query = 'select * from `tiki_article_types`';
$result = $this->query($query, []);
$ret = [];
while ($res = $result->fetchRow()) {
$res['article_cnt'] = $this->getOne('select count(*) from `tiki_articles` where `type` = ?', [$res['type']]);
$ret[] = $res;
}
return $ret;
}
public function list_types_byname()
{
$query = "select * from `tiki_article_types` order by `type` asc";
$result = $this->query($query, []);
$ret = [];
while ($res = $result->fetchRow()) {
$ret[$res['type']] = $res;
}
return $ret;
}
public function get_user_articles($user, $max)
{
$query = 'select `articleId` ,`title` from `tiki_articles` where `author`=? order by `publishDate` desc';
$articles = $this->fetchAll($query, [$user], $max);
return Perms::filter(['type' => 'article'], 'object', $articles, ['object' => 'articleId'], 'read_article');
}
public function import_csv($fileName, &$msgs, $csvDelimiter = ',')
{
global $user, $prefs, $tikilib;
$fhandle = fopen($fileName, 'r');
if (($fds = fgetcsv($fhandle, 4096, $csvDelimiter)) === false || empty($fds[0])) {
$msgs[] = tra('The file has incorrect syntax or is not a CSV file');
return false;
}
for ($i = 0, $icount_fds = count($fds); $i < $icount_fds; $i++) {
$fields[trim($fds[$i])] = $i;
}
if (! isset($fields['title'])) {
$fields['title'] = $i++;
}
if (! isset($fields['authorName'])) {
$fields['authorName'] = $i++;
}
if (! isset($fields['topicId'])) {
$fields['topicId'] = $i++;
}
if (! isset($fields['useImage'])) {
$fields['useImage'] = $i++;
}
if (! isset($fields['imgname'])) {
$fields['imgname'] = $i++;
}
if (! isset($fields['imgsize'])) {
$fields['imgsize'] = $i++;
}
if (! isset($fields['imgtype'])) {
$fields['imgtype'] = $i++;
}
if (! isset($fields['imgdata'])) {
$fields['imgdata'] = $i++;
}
if (! isset($fields['heading'])) {
$fields['heading'] = $i++;
}
if (! isset($fields['body'])) {
$fields['body'] = $i++;
}
if (! isset($fields['publishDate'])) {
$fields['publishDate'] = $i++;
}
if (! isset($fields['expireDate'])) {
$fields['expireDate'] = $i++;
}
if (! isset($fields['user'])) {
$fields['user'] = $i++;
}
if (! isset($fields['image_x'])) {
$fields['image_x'] = $i++;
}
if (! isset($fields['image_y'])) {
$fields['image_y'] = $i++;
}
if (! isset($fields['type'])) {
$fields['type'] = $i++;
}
if (! isset($fields['topline'])) {
$fields['topline'] = $i++;
}
if (! isset($fields['subtitle'])) {
$fields['subtitle'] = $i++;
}
if (! isset($fields['linkto'])) {
$fields['linkto'] = $i++;
}
if (! isset($fields['image_caption'])) {
$fields['image_caption'] = $i++;
}
if (! isset($fields['lang'])) {
$fields['lang'] = $i++;
}
if (! isset($fields['rating'])) {
$fields['rating'] = $i++;
}
if (! isset($fields['isfloat'])) {
$fields['isfloat'] = $i++;
}
if (! isset($fields['emails'])) {
$fields['emails'] = $i++;
}
$line = 1;
while (($data = fgetcsv($fhandle, 4096, $csvDelimiter)) !== false) {
++$line;
if (! isset($data[$fields['title']])) {
$data[$fields['title']] = '';
}
if (! isset($data[$fields['authorName']])) {
$data[$fields['authorName']] = '';
}
if (! isset($data[$fields['topicId']])) {
$data[$fields['topicId']] = 0;
}
if (! isset($data[$fields['useImage']])) {
$data[$fields['useImage']] = 'n';
}
if (! isset($data[$fields['imgname']])) {
$data[$fields['imgname']] = '';
}
if (! isset($data[$fields['imgsize']])) {
$data[$fields['imgsize']] = '';
}
if (! isset($data[$fields['imgtype']])) {
$data[$fields['imgtype']] = '';
}
if (! isset($data[$fields['imgdata']])) {
$data[$fields['imgdata']] = '';
}
if (! isset($data[$fields['heading']])) {
$data[$fields['heading']] = '';
}
if (! isset($data[$fields['body']])) {
$data[$fields['body']] = '';
}
if (! isset($data[$fields['publishDate']])) {
$data[$fields['publishDate']] = $tikilib->now;
}
if (! isset($data[$fields['expireDate']])) {
$data[$fields['expireDate']] = $tikilib->now + 365 * 24 * 60 * 60;
}
if (! isset($data[$fields['user']])) {
$data[$fields['user']] = $user;
}
if (! isset($data[$fields['image_x']])) {
$data[$fields['image_x']] = 0;
}
if (! isset($data[$fields['image_y']])) {
$data[$fields['image_y']] = 0;
}
if (! isset($data[$fields['type']])) {
$data[$fields['type']] = 'Article';
}
if (! isset($data[$fields['topline']])) {
$data[$fields['topline']] = '';
}
if (! isset($data[$fields['subtitle']])) {
$data[$fields['subtitle']] = '';
}
if (! isset($data[$fields['linkto']])) {
$data[$fields['linkto']] = '';
}
if (! isset($data[$fields['image_caption']])) {
$data[$fields['image_caption']] = '';
}
if (! isset($data[$fields['lang']])) {
$data[$fields['lang']] = $prefs['language'];
}
if (! isset($data[$fields['rating']])) {
$data[$fields['rating']] = 7;
}
if (! isset($data[$fields['isfloat']])) {
$data[$fields['isfloat']] = 'n';
}
if (! isset($data[$fields['emails']])) {
$data[$fields['emails']] = '';
}
$articleId = $this->replace_article(
$data[$fields['title']],
$data[$fields['authorName']],
$data[$fields['topicId']],
$data[$fields['useImage']],
$data[$fields['imgname']],
$data[$fields['imgsize']],
$data[$fields['imgtype']],
$data[$fields['imgdata']],
$data[$fields['heading']],
$data[$fields['body']],
$data[$fields['publishDate']],
$data[$fields['expireDate']],
$data[$fields['user']],
0,
$data[$fields['image_x']],
$data[$fields['image_y']],
$data[$fields['type']],
$data[$fields['topline']],
$data[$fields['subtitle']],
$data[$fields['linkto']],
$data[$fields['image_caption']],
$data[$fields['lang']],
$data[$fields['rating']],
$data[$fields['isfloat']],
$data[$fields['emails']]
);
if (empty($articleId)) {
$msgs[] = sprintf(tr('Error line: %d'), $line);
return false;
}
}
if (isset($articleId) && $articleId) {
return true;
} else {
$msgs[] = tr('Import failed due to data format. Make sure the file has Unix-style line breaks.');
return false;
}
}
public function delete_image_cache($image_type, $imageId)
{
global $prefs, $tikidomain;
// Input validation: imageId must be a number, and not 0
if (! ctype_digit("$imageId") || ! ($imageId > 0)) {
return false;
}
switch ($image_type) {
case 'article':
$image_cache_prefix = 'article';
break;
case 'submission':
$image_cache_prefix = 'article_submission';
break;
case 'preview':
$image_cache_prefix = 'article_preview';
break;
default:
return false;
}
$article_image_cache = $prefs['tmpDir'];
if ($tikidomain) {
$article_image_cache .= "/$tikidomain";
}
$article_image_cache .= "/$image_cache_prefix." . $imageId;
if (@unlink($article_image_cache)) {
return true;
} else {
return false;
}
}
public function get_title($articleId)
{
$query = 'select `title` from `tiki_articles` where `articleId`=?';
return $this->getOne($query, [(int)$articleId]);
}
public function fetchtopicId($topic)
{
$topicId = '';
$query = 'select `topicId` from `tiki_topics` where `name` = ?';
$topicId = $this->getOne($query, [$topic]);
return $topicId;
}
public function get_most_recent_article_id()
{
$maxRecords = 1;
$sort_mode = 'publishDate_desc';
$date_min = 0;
$date_max = $this->now;
$query = 'SELECT `tiki_articles`.`articleId` FROM `tiki_articles` INNER JOIN `tiki_article_types` on `tiki_articles`.`type` = `tiki_article_types`.`type` ' .
'WHERE `tiki_articles`.`publishDate`>=\'0\' AND (`tiki_articles`.`publishDate`<=? OR `tiki_article_types`.`show_pre_publ`=\'y\') AND ' .
'(`tiki_articles`.`expireDate`>? OR `tiki_article_types`.`show_post_expire`=\'y\') AND `tiki_articles`.`ispublished`=\'y\' ' .
'ORDER BY `publishDate` DESC';
$bindvars = [ $date_max, $date_max ];
$id = $this->getOne($query, $bindvars);
return $id;
}
public function list_articles($offset = 0, $maxRecords = -1, $sort_mode = 'publishDate_desc', $find = '', $date_min = 0, $date_max = 0, $user = false, $type = '', $topicId = '', $visible_only = 'y', $topic = '', $categId = '', $creator = '', $group = '', $lang = '', $min_rating = '', $max_rating = '', $override_dates = false, $ispublished = '', $filter = '')
{
global $user, $prefs;
$userlib = TikiLib::lib('user');
$mid = $join = '';
$bindvars = [];
$fromSql = '';
if (! empty($filter)) {
foreach ($filter as $typeF => $val) {
if ($typeF == 'translationOrphan') {
$multilinguallib = TikiLib::lib('multilingual');
$multilinguallib->sqlTranslationOrphan('article', '`tiki_articles`', 'articleId', $val, $join, $mid, $bindvars);
$mid = ' where ' . $mid;
}
if ($typeF == 'articleId' || $typeF == 'notArticleId') {
$mid .= empty($mid) ? ' where ' : ' and ';
$mid .= '`articleId` ' . ($typeF == 'notArticleId' ? 'not in ' : 'in') . ' (' . implode(',', array_fill(0, count($val), '?')) . ')';
$bindvars = array_merge($bindvars, $val);
}
}
}
if ($find) {
$findesc = '%' . $find . '%';
$mid .= empty($mid) ? ' where ' : ' and ';
$mid .= " (`title` like ? or `heading` like ? or `body` like ? or `author` like ? or `authorName` like ?) ";
$bindvars = [$findesc, $findesc, $findesc, $findesc, $findesc];
}
// type=>[!]a+b+c+d+...
if ($type) {
$invert = '';
$connect = ' or ';
// parameter list negated?
if (substr($type, 0, 1) == '!') {
$type = substr($type, 1);
$invert = '!';
$connect = ' and ';
}
$add = '';
$rest = explode('+', $type);
foreach ($rest as $type) {
if ($add == '') {
if ($mid) {
$mid .= ' and ';
} else {
$mid = ' where ';
}
} else {
$add .= $connect;
}
$add .= " `tiki_articles`.`type`$invert=? ";
$bindvars[] = $type;
}
if ($add <> '') {
$mid .= ' ( ' . $add . ' ) ';
}
}
// topicId=>[!]a+b+c+d+...
if (($topicId) || ($topicId == '0')) {
$invert = '';
$connect = ' or ';
// parameter list negated?
if (substr($topicId, 0, 1) == '!') {
$topicId = substr($topicId, 1);
$invert = '!';
$connect = ' and ';
}
$add = '';
$rest = explode('+', $topicId);
foreach ($rest as $topicId) {
if ($add == '') {
if ($mid) {
$mid .= ' and ';
} else {
$mid = ' where ';
}
} else {
$add .= $connect;
}
$add .= " `tiki_articles`.`topicId`$invert=? ";
$bindvars[] = $topicId;
}
if ($add <> '') {
$mid .= ' ( ' . $add . ' ) ';
}
}
// topic=>[!]a+b+c+d+...
if ($topic) {
$invert = '';
// parameter list negated?
if (substr($topic, 0, 1) == '!') {
$topic = substr($topic, 1);
$invert = '!';
}
$rest = explode('\+', $topic);
if ($mid) {
$mid .= ' and ';
} else {
$mid = ' where ';
}
$add = $this->in('tiki_articles.topicName', $rest, $bindvars);
if ($add <> '') {
$add = ($invert ? ' NOT' : '') . ' ( ' . $add . ' ) ';
if ($invert) {
$add = 'COALESCE(' . $add . ', TRUE)';
}
$mid .= $add;
}
}
if (($visible_only) && ($visible_only <> 'n')) {
if ($date_max <= 0) {
// show articles published today
$date_max = $this->now;
}
$bindvars[] = (int)$date_min;
$bindvars[] = (int)$date_max;
if ($override_dates) {
$condition = "`tiki_articles`.`publishDate`>=? and `tiki_articles`.`publishDate`<=?";
} else {
$bindvars[] = (int)$this->now;
$condition = "`tiki_articles`.`publishDate`>=? and (`tiki_articles`.`publishDate`<=? or `tiki_article_types`.`show_pre_publ`='y')"
. " and (`tiki_articles`.`expireDate`>? or `tiki_article_types`.`show_post_expire`='y')"
;
}
$mid .= ( $mid ? ' and ' : ' where ' ) . $condition;
}
if (! empty($lang)) {
$condition = '`tiki_articles`.`lang`=?';
$mid .= ($mid) ? ' and ' : ' where ';
$mid .= $condition . ' ';
$bindvars[] = $lang;
}
if (! empty($ispublished)) {
$condition = '`tiki_articles`.`ispublished`=?';
$mid .= ($mid) ? ' and ' : ' where ';
$mid .= $condition . ' ';
$bindvars[] = $ispublished;
}
if ($mid) {
$mid2 = ' and 1 = 1 ';
} else {
$mid2 = ' where 1 = 1 ';
}
if ($creator != '') {
$mid2 .= ' and `tiki_articles`.`author` like ? ';
$bindvars[] = "%$creator%";
}
if ($min_rating || $max_rating) {
$min_rating = isset($min_rating) ? $min_rating : '0.0';
$max_rating = isset($max_rating) ? $max_rating : '10.0';
$mid2 .= ' and (`tiki_articles`.`rating` >= ? and `tiki_articles`.`rating` <= ? )';
$bindvars[] = $min_rating;
$bindvars[] = $max_rating;
}
$categlib = TikiLib::lib('categ');
if ($categId) {
$jail = $categId;
} else {
$jail = $categlib->get_jail();
}
if ($jail) {
$categlib->getSqlJoin($jail, 'article', '`tiki_articles`.`articleId`', $fromSql, $mid2, $bindvars);
}
if (empty($sort_mode)) {
$sort_mode = 'publishDate_desc';
}
if ($prefs['rating_advanced'] == 'y') {
$ratinglib = TikiLib::lib('rating');
$fromSql .= $ratinglib->convert_rating_sort($sort_mode, 'article', '`articleId`');
}
$fromSql .= ' inner join `tiki_article_types` on `tiki_articles`.`type` = `tiki_article_types`.`type` ';
$query = "select distinct `tiki_articles`.*,
`tiki_article_types`.`use_ratings`,
`tiki_article_types`.`show_pre_publ`,
`tiki_article_types`.`show_post_expire`,
`tiki_article_types`.`heading_only`,
`tiki_article_types`.`allow_comments`,
`tiki_article_types`.`comment_can_rate_article`,
`tiki_article_types`.`show_image`,
`tiki_article_types`.`show_avatar`,
`tiki_article_types`.`show_author`,
`tiki_article_types`.`show_pubdate`,
`tiki_article_types`.`show_expdate`,
`tiki_article_types`.`show_reads`,
`tiki_article_types`.`show_size`,
`tiki_article_types`.`show_topline`,
`tiki_article_types`.`show_subtitle`,
`tiki_article_types`.`show_linkto`,
`tiki_article_types`.`show_image_caption`,
`tiki_article_types`.`creator_edit`
from `tiki_articles`
$fromSql
$join
$mid $mid2 order by " .
$this->convertSortMode(
$sort_mode,
[
'title',
'state',
'authorName',
'topicId',
'topicName',
'publishDate',
'expireDate',
'created',
'author',
'rating',
'nbreads',
]
);
$result = $this->fetchAll($query, $bindvars, $maxRecords, $offset);
$query_cant = "select distinct count(*) from `tiki_articles` $fromSql $join $mid $mid2";
$cant = $this->getOne($query_cant, $bindvars);
$ret = [];
$articleIds = array_map(
function ($res) {
return $res['articleId'];
},
$result
);
Perms::bulk(['type' => 'article'], 'object', $articleIds);
foreach ($result as $res) {
$res['perms'] = $this->get_perm_object($res['articleId'], 'article', [], false);
// Determine if unpublished article should be listed
if ($res['ispublished'] != 'y' && $res['perms']['tiki_p_edit_article'] != 'y') {
$res['disp_article'] = 'n';
} else {
// no need to do all of the following if we are not adding this article to the array
if ($res['perms']['tiki_p_read_article'] == 'y' || $res['perms']['tiki_p_articles_read_heading'] == 'y') {
$res['entrating'] = floor($res['rating']);
if (empty($res['body'])) {
$res['isEmpty'] = 'y';
} else {
$res['isEmpty'] = 'n';
}
if (strlen($res['image_data']) > 0) {
$res['hasImage'] = 'y';
} else {
$res['hasImage'] = 'n';
}
$res['count_comments'] = 0;
// Determine if the article would be displayed in the view page
$res['disp_article'] = 'y';
if (($res['show_pre_publ'] != 'y') and ($this->now < $res['publishDate']) && ! $override_dates) {
$res['disp_article'] = 'n';
}
if (($res['show_post_expire'] != 'y') and ($this->now > $res['expireDate']) && ! $override_dates) {
$res['disp_article'] = 'n';
}
$ret[] = $res;
}
}
}
$retval = [];
$retval['data'] = $ret;
$retval['cant'] = $cant;
return $retval;
}
/**
* Work out if body (or heading) should be parsed as html or not
* Currently (tiki 11) tries the prefs but also checks for html in body in case wysiwyg_htmltowiki wasn't enabled previously
*
* @param array $article of article data
* @param bool $check_heading use heading or (default) body
* @return bool
*/
public function is_html($article, $check_heading = false)
{
global $prefs;
$text = $check_heading ? $article['heading'] : $article['body'];
return ($prefs['feature_wysiwyg'] === 'y' || $prefs['mobile_mode'] === 'y') && // this now assumes that if in mobile mode any html in articles should not be encoded
$prefs['wysiwyg_htmltowiki'] !== 'y' ||
preg_match('/(<\/p>|<\/span>|<\/div>|<\/?br>)/', $text);
}
public function list_submissions($offset = 0, $maxRecords = -1, $sort_mode = 'publishDate_desc', $find = '', $date = '', $type = '', $topicId = '', $lang = '')
{
if ($find) {
$findPattern = '%' . $find . '%';
$mid = " where (`title` like ? or `heading` like ? or `body` like ? or `author` like ? or `authorName` like ?) ";
$bindvars = [$findPattern, $findPattern, $findPattern, $findPattern, $findPattern];
} else {
$mid = '';
$bindvars = [];
}
if ($date) {
if ($mid) {
$mid .= ' and `publishDate` <= ? ';
} else {
$mid = ' where `publishDate` <= ? ';
}
$bindvars[] = $date;
}
if ($type) {
$mid .= $mid ? ' AND ' : ' WHERE ';
$mid .= ' `type` = ? ';
$bindvars[] = $type;
}
if ($topicId) {
$mid .= $mid ? ' AND ' : ' WHERE ';
$mid .= ' `topicId` = ? ';
$bindvars[] = $topicId;
}
if ($lang) {
$mid .= $mid ? ' AND ' : ' WHERE ';
$mid .= ' `lang` = ? ';
$bindvars[] = $lang;
}
$query = "select * from `tiki_submissions` $mid order by " . $this->convertSortMode($sort_mode);
$query_cant = "select count(*) from `tiki_submissions` $mid";
$result = $this->query($query, $bindvars, $maxRecords, $offset);
$cant = $this->getOne($query_cant, $bindvars);
$ret = [];
while ($res = $result->fetchRow()) {
$res['entrating'] = floor($res['rating']);
if (empty($res['body'])) {
$res['isEmpty'] = 'y';
} else {
$res['isEmpty'] = 'n';
}
if (strlen($res['image_data']) > 0) {
$res['hasImage'] = 'y';
} else {
$res['hasImage'] = 'n';
}
$ret[] = $res;
}
$retval = [];
$retval['data'] = $ret;
$retval['cant'] = $cant;
return $retval;
}
public function get_article($articleId, $checkPerms = true)
{
global $user, $prefs;
$query = "select `tiki_articles`.*,
`users_users`.`avatarLibName`,
`tiki_article_types`.`use_ratings`,
`tiki_article_types`.`show_pre_publ`,
`tiki_article_types`.`show_post_expire`,
`tiki_article_types`.`heading_only`,
`tiki_article_types`.`allow_comments`,
`tiki_article_types`.`comment_can_rate_article`,
`tiki_article_types`.`show_image`,
`tiki_article_types`.`show_avatar`,
`tiki_article_types`.`show_author`,
`tiki_article_types`.`show_pubdate`,
`tiki_article_types`.`show_expdate`,
`tiki_article_types`.`show_reads`,
`tiki_article_types`.`show_size`,
`tiki_article_types`.`show_topline`,
`tiki_article_types`.`show_subtitle`,
`tiki_article_types`.`show_linkto`,
`tiki_article_types`.`show_image_caption`,
`tiki_article_types`.`creator_edit`
from `tiki_articles`
left join `tiki_article_types` ON `tiki_articles`.`type` = `tiki_article_types`.`type`
left join `users_users` on `tiki_articles`.`author` = `users_users`.`login`
where `tiki_articles`.`articleId`=?"
;
$result = $this->query($query, [(int)$articleId]);
if ($result->numRows()) {
$res = $result->fetchRow();
$res['entrating'] = floor($res['rating']);
} else {
return '';
}
if ($checkPerms) {
$perms = Perms::get('article', $articleId);
$permsok = $perms->admin_cms || $perms->read_article || $perms->articles_read_heading;
if (! $permsok) {
return false;
}
}
if ($res['author'] != $user) {
TikiLib::events()->trigger(
'tiki.article.view',
[
'type' => 'article',
'object' => $articleId,
'user' => $user,
'author' => $res['author'],
]
);
}
return $res;
}
public function get_submission($subId)
{
$query = 'select * from `tiki_submissions` where `subId`=?';
$result = $this->query($query, [(int) $subId]);
if ($result->numRows()) {
$res = $result->fetchRow();
$res['entrating'] = floor($res['rating']);
} else {
return false;
}
return $res;
}
public function get_topic_image($topicId)
{
$query = 'select `image_name` ,`image_size`,`image_type`, `image_data` from `tiki_topics` where `topicId`=?';
$result = $this->query($query, [(int) $topicId]);
$res = $result->fetchRow();
return $res;
}
public function get_article_image($id)
{
$query = 'select `image_name` ,`image_size`,`image_type`, `image_data` from `tiki_articles` where `articleId`=?';
$result = $this->query($query, [(int) $id]);
$res = $result->fetchRow();
return $res;
}
public function add_article_type_attribute($artType, $attributeName)
{
$relationlib = TikiLib::lib('relation');
$attributelib = TikiLib::lib('attribute');
$fullAttributeName = TikiFilter::get('attribute_type')->filter(trim('tiki.article.' . $attributeName));
$relationId = $relationlib->add_relation('tiki.article.attribute', 'articletype', $artType, 'attribute', $fullAttributeName);
if (! $relationId) {
return 0;
} else {
$attributelib->set_attribute('relation', $relationId, 'tiki.relation.target', $attributeName);
return $relationId;
}
}
public function delete_article_type_attribute($artType, $relationId)
{
$relationlib = TikiLib::lib('relation');
// double check relation is associated with article type before deleting
$currentAttributes = $relationlib->get_relations_from('articletype', $artType, 'tiki.article.attribute');
foreach ($currentAttributes as $att) {
if ($att['relationId'] == $relationId) {
$relationlib->remove_relation($att['relationId']);
}
}
return true;
}
public function get_article_type_attributes($artType, $orderby = '')
{
$relationlib = TikiLib::lib('relation');
$attributelib = TikiLib::lib('attribute');
$attributes = $relationlib->get_relations_from('articletype', $artType, 'tiki.article.attribute', $orderby);
$ret = [];
foreach ($attributes as $att) {
$relationAtt = $attributelib->get_attributes('relation', $att['relationId']);
if (isset($relationAtt['tiki.relation.target'])) {
$ret[$relationAtt['tiki.relation.target']] = $att;
}
}
return $ret;
}
public function set_article_attributes($articleId, $attributeArray, $isSubmission = false)
{
// expects attributeArray in the form of $key=>$val where $key is tiki.article.xxxx and $val is value
$attributelib = TikiLib::lib('attribute');
if ($isSubmission) {
$type = 'submission';
} else {
$type = 'article';
}
$currentAtt = $this->get_article_attributes($articleId);
foreach ($attributeArray as $name => $value) {
if (! in_array($name, array_keys($currentAtt)) || $value != $currentAtt[$name]['value']) {
$attributelib->set_attribute($type, $articleId, $name, $value);
}
}
return true;
}
public function get_article_attributes($articleId, $isSubmission = false)
{
$attributelib = TikiLib::lib('attribute');
if ($isSubmission) {
$type = 'submission';
} else {
$type = 'article';
}
$allAttributes = $attributelib->get_attributes($type, $articleId);
$ret = [];
foreach ($allAttributes as $k => $att) {
if (substr($k, 0, 13) == 'tiki.article.') {
$ret[$k] = $att;
}
}
return $ret;
}
public function transfer_attributes_from_submission($subId, $articleId)
{
$this->query(
'UPDATE `tiki_object_attributes` set `type` = ?, `itemId` = ? where `type` = ? and `itemId` = ?',
[ 'article', $articleId, 'submission', $subId ]
);
}
/**
* Get related articles using $freetaglib->get_similar()
*
* @param int $articleId
* @param int $maxResults
* @return array
*/
public function get_related_articles($articleId, $maxResults = 5)
{
$freetaglib = TikiLib::lib('freetag');
$relatedArticles = $freetaglib->get_similar('article', $articleId);
foreach ($relatedArticles as $key => $article) {
$relatedArticles[$key]['articleId'] = $relatedId = str_replace('tiki-read_article.php?articleId=', '', $article['href']);
$relatedArticle = $this->get_article($relatedId);
// exclude articles from the list if they are not published or if no permission to view them
if (! $relatedArticle || $relatedArticle['ispublished'] != 'y') {
unset($relatedArticles[$key]);
}
}
$relatedArticles = array_splice($relatedArticles, 0, $maxResults);
return $relatedArticles;
}
}
$artlib = new ArtLib();