?php $textpart = "whatsnew"; include("tng_begin.php"); if($requirelogin && !$_SESSION['currentuser']) { header("Location:$homepage"); exit; } $langstr = isset($_GET['lang']) ? "&lang=$languages_path" . $_GET['lang'] : ""; @ini_set( "session.bug_compat_warn", "0" ); include($cms['tngpath'] . "version.php"); $getperson_url = getURL( "getperson", 1 ); $showmedia_url = getURL( "showmedia", 1 ); $familygroup_url = getURL( "familygroup", 1 ); $date = date("r"); $timezone = date("O"); function doMedia( $mediatypeID ) { global $tngdomain, $langstr, $mediatypes_display, $timezone, $session_charset; global $media_table, $medialinks_table, $change_limit, $cutoffstr, $text, $families_table, $sources_table, $repositories_table, $citations_table, $nonames; global $people_table, $familygroup_url, $showsource_url, $showrepo_url, $placesearch_url, $showmedia_url, $trees_table, $assignedtree; global $rootpath, $photopath, $documentpath, $headstonepath, $historypath, $mediapath, $header, $footer, $cemeteries_table; global $getperson_url, $livedefault, $whatsnew, $wherestr2, $showmap_url, $thumbmaxw, $events_table, $eventtypes_table, $tngconfig; if( $mediatypeID == "headstones" ) { $hsfields = ", $media_table.cemeteryID, cemname"; $hsjoin = "LEFT JOIN $cemeteries_table ON $media_table.cemeteryID = $cemeteries_table.cemeteryID"; } else $hsfields = $hsjoin = ""; $query = "SELECT distinct $media_table.mediaID as mediaID, description, $media_table.notes, thumbpath, path, form, mediatypeID, $media_table.gedcom as gedcom, alwayson, usecollfolder, DATE_FORMAT(changedate,'%a, %d %b %Y %T') as changedatef, status, abspath, newwindow $hsfields FROM $media_table $hsjoin"; $query .= " WHERE $cutoffstr $wherestr AND mediatypeID = \"$mediatypeID\" ORDER BY changedate DESC, description LIMIT $change_limit"; $mediaresult = tng_query($query); while( $row = tng_fetch_assoc( $mediaresult ) ) { $query = "SELECT medialinkID, $medialinks_table.personID as personID, $medialinks_table.eventID, people.personID as personID2, familyID, people.living as living, people.private as private, people.branch as branch, $families_table.branch as fbranch, $families_table.living as fliving, $families_table.private as fprivate, husband, wife, people.lastname as lastname, people.lnprefix as lnprefix, people.firstname as firstname, people.suffix as suffix, nameorder, $medialinks_table.gedcom as gedcom, treename, $sources_table.title, $sources_table.sourceID, $repositories_table.repoID,reponame, deathdate, burialdate, linktype FROM ($medialinks_table, $trees_table) LEFT JOIN $people_table AS people ON ($medialinks_table.personID = people.personID AND $medialinks_table.gedcom = people.gedcom) LEFT JOIN $families_table ON ($medialinks_table.personID = $families_table.familyID AND $medialinks_table.gedcom = $families_table.gedcom) LEFT JOIN $sources_table ON ($medialinks_table.personID = $sources_table.sourceID AND $medialinks_table.gedcom = $sources_table.gedcom) LEFT JOIN $repositories_table ON ($medialinks_table.personID = $repositories_table.repoID AND $medialinks_table.gedcom = $repositories_table.gedcom) WHERE mediaID = \"{$row['mediaID']}\" AND $medialinks_table.gedcom = $trees_table.gedcom$wherestr2 ORDER BY lastname, lnprefix, firstname, $medialinks_table.personID"; $presult = tng_query($query); $foundliving = 0; $foundprivate = 0; $hstext = ""; while( $prow = tng_fetch_assoc( $presult ) ) { if( $prow['fbranch'] != NULL ) $prow['branch'] = $prow['fbranch']; if( $prow['fliving'] != NULL ) $prow['living'] = $prow['fliving']; if( $prow['fprivate'] != NULL ) $prow['private'] = $prow['fprivate']; if( $prow['living'] == NULL && $prow['private'] == NULL && $prow['linktype'] == 'I') { $query = "SELECT count(personID) as ccount FROM $citations_table, $people_table WHERE $citations_table.sourceID = '{$prow['personID']}' AND $citations_table.persfamID = $people_table.personID AND $citations_table.gedcom = $people_table.gedcom AND (living = '1' OR private = '1')"; $presult2 = tng_query($query); $prow2 = tng_fetch_assoc( $presult2 ); if( $prow2['ccount'] ) $prow['living'] = 1; tng_free_result( $presult2 ); } $prow['allow_living'] = !$prow['living'] || $livedefault == 2; $prow['allow_private'] = !$prow['private']; if($prow['living'] && $livedefault != 2) $foundliving = 1; if($prow['private']) $foundprivate = 1; if( $prow['personID2'] != NULL ) { $medialink = $getperson_url . "personID={$prow['personID2']}&tree={$prow['gedcom']}"; $mediatext = getName( $prow ); if( $mediatypeID == "headstones" ) { $deathdate = $prow['deathdate'] ? $prow['deathdate'] : $prow['burialdate']; if( $prow['deathdate'] ) $abbrev = $text['deathabbr']; elseif( $prow['burialdate'] ) $abbrev = $text['burialabbr']; $hstext = $deathdate ? " ($abbrev " . displayDate( $deathdate ) . ")" : ""; } } elseif( $prow['familyID'] != NULL ) { $medialink = $familygroup_url . "familyID={$prow['familyID']}&tree={$prow['gedcom']}"; $mediatext = "{$text['family']}: " . getFamilyName( $prow ); } elseif( $prow['sourceID'] != NULL ) { $mediatext = $prow['title'] ? "{$text['source']}: {$prow['title']}" : "{$text['source']}: {$prow['sourceID']}"; $medialink = $showsource_url . "sourceID={$prow['sourceID']}&tree={$prow['gedcom']}"; } elseif( $prow['repoID'] != NULL ) { $mediatext = $prow['reponame'] ? $text['repository'] . ": " . $prow['reponame'] : $text['repository'] . ": " . $prow['repoID']; $medialink = $showrepo_url . "repoID={$prow['repoID']}&tree={$prow['gedcom']}"; } else { $medialink = $placesearch_url . "psearch={$prow['personID']}&tree={$prow['gedcom']}"; $mediatext = $prow['personID']; } if($prow['eventID']) { $query = "SELECT description from $events_table, $eventtypes_table WHERE eventID = \"{$prow['eventID']}\" AND $events_table.eventtypeID = $eventtypes_table.eventtypeID"; $eresult = tng_query($query) or die ("{$text['cannotexecutequery']}: $query"); $erow = tng_fetch_assoc($eresult); $event = $erow['description'] ? $erow['description'] : $prow['eventID']; tng_free_result($eresult); $mediatext .= " ($event)"; } } tng_free_result( $presult ); $href = getMediaHREF($row,0); $href = str_replace("\" target=\"_blank","",$href); // fix the string in case someone might have used the "open in a new window" option on the media if( (!$foundliving && !$foundprivate) || !$nonames || $row['alwayson'] ) { $description = strip_tags($row['description']); $notes = nl2br( strip_tags(getXrefNotes($row['notes'],$row['gedcom'])) ); if( ($foundliving || $foundprivate) && !$row['alwayson'] ) $notes .= " ({$text['livingphoto']})"; } else { $description = $text['living']; $notes = "({$text['livingphoto']})"; } //$description = strip_tags($description); // clean the text of HTML tags //$notes = strip_tags($notes); if( $row['status'] ) $notes = "{$text['status']}: {$row['status']}. $notes"; $item = "\n\n"; // build the $item string so that you can apply string functions more globally instead of piece meal, as required $typestr = $text[$mediatypeID] ? $text[$mediatypeID] : $mediatypes_display[$mediatypeID]; $item .= "" . xmlcharacters($typestr) . ": " . xmlcharacters($description) . "\n"; $item .= "" . "" . "\n"; // use CDATA to deal with odd links that include special characters if( $mediatypeID == "headstones" ) { $deathdate = $row['deathdate'] ? $row['deathdate'] : $row['burialdate']; $item .= "" . xmlcharacters($hstext . " " . htmlspecialchars($notes,ENT_NOQUOTES, $session_charset) ) . "\n"; $item .= "{$text['tree']}: " . xmlcharacters($trow['treename']) . "\n"; } else { $item .= "" . xmlcharacters(htmlspecialchars($notes,ENT_NOQUOTES, $session_charset)) . "\n"; //$item .= "\n"; // the RSS validator recognises an empty tag as an error, commented it out } $changedate = date_format(date_create($row['changedatef']), "D, d M Y H:i:s"); $item .= "$changedate $timezone\n"; $item .= "$tngdomain/{$row['mediaID']}-$changedate $timezone\n"; // using a guid improves the granularity of changes one ca monitor (ie: it allows for a changes minitus appart to be captures by the RSS feed) $item .= "\n"; echo $item; } tng_free_result($mediaresult); } header("Content-type: application/rss+xml; charset=\"$charset\""); $item .= "\n"; $item .= "\n"; $item .= "\n"; if( !$cms['support'] ) $tngscript = basename( $_SERVER['SCRIPT_NAME'], ".php" ); else $tngscript = $file; $item .= "$tng_title, v.$tng_version ($tng_date), Written by Darrin Lythgoe, $tng_copyright\n"; $item .= "$date\n"; //you will need to define $site_desc and $sitename in your customconfig.php file //as of 6.0, these will come from config.php, but anything defined in customconfig.php will take precedence $item .= "" . xmlcharacters($site_desc) . "\n"; if($personID) { $item .= "" . trim($sitename . " " . $text['indinfo']) . ": $personID\n"; } elseif($familyID) { $item .= "" . trim($sitename . " " . $text['family']) . ": $familyID\n"; } else{ $item .= "$sitename\n"; } $item .= "$tngdomain\n"; $item .= "$emailaddr ($dbowner)\n"; $item .= "$emailaddr ($dbowner)\n"; if($rssimage) { // define $rssimage in your customconfig.php file this will allow you to put a logo on your feed once you have subscribed $item .= "\n"; $item .= "" . $tngdomain . $rssimage . "\n"; // path for the logo if($personID) { $item .= "" . trim($sitename . " " . $text['indinfo']) . ": $personID\n"; // images require a title (match it with either the personID) } elseif($familyID) { $item .= "" . trim($sitename . " " . $text['family']) . ": $familyID\n"; // the familyID } else{ $item .= "$sitename\n"; // or just the site name } $item .= "" . $tngdomain . "\n"; // images also require the site link so that if you click on the image you go to the site $item .= "\n"; } echo $item; //you will need to define $rsslang in your customconfig.php file before you can use this //echo "$rsslang\n"; $text['pastxdays'] = preg_replace( "/xx/", "$change_cutoff", $text['pastxdays'] ); if( !$change_cutoff ) $change_cutoff = 0; if( !$change_limit ) $change_limit = 10; $cutoffstr = $change_cutoff ? "TO_DAYS(NOW()) - TO_DAYS(changedate) <= $change_cutoff" : "1=1"; if(!$personID && !$familyID) { // only feed the changes when not monitoring an person or a family initMediaTypes(); foreach( $mediatypes as $mediatype ) { $mediatypeID = $mediatype['ID']; echo doMedia( $mediatypeID ); } } $cutoffstr .= " AND"; if( $tree ) $allwhere = "AND p.gedcom = \"$tree\""; else $allwhere = ""; $more = getLivingPrivateRestrictions("p", false, false); if($more) $allwhere .= " AND " .$more; if(!$familyID) { // if a family is NOT specified (ie: we are looking for a personID or the What's New //select from people where date later than cutoff, order by changedate descending, limit = 10 $query = "SELECT p.personID, lastname, lnprefix, firstname, birthdate, prefix, suffix, nameorder, living, private, branch, DATE_FORMAT(changedate,'%e %b %Y') as changedatef, changedby, LPAD(SUBSTRING_INDEX(birthdate, ' ', -1),4,'0') as birthyear, birthplace, altbirthdate, LPAD(SUBSTRING_INDEX(altbirthdate, ' ', -1),4,'0') as altbirthyear, altbirthplace, p.gedcom as gedcom, treename FROM $people_table as p, $trees_table WHERE $cutoffstr p.gedcom = $trees_table.gedcom $allwhere ORDER BY changedate DESC, lastname, firstname, birthyear, altbirthyear LIMIT $change_limit"; $result = tng_query($query); $numrows = tng_num_rows( $result ); if( $numrows ) { while( $row = tng_fetch_assoc($result)) { $rights = determineLivingPrivateRights($row); $row['allow_living'] = $rights['living']; $row['allow_private'] = $rights['private']; $namestr = getNameRev( $row ); $birthplacestr = ""; if( $rights['both'] ) { if ( $row['birthdate'] ) { $birthdate = $text['birthabbr'] . " " . displayDate( $row['birthdate'] ); $birthplace = $row['birthplace']; } else if ( $row['altbirthdate'] ) { $birthdate = $text['chrabbr'] . " " . displayDate( $row['altbirthdate'] ); $birthplace = $row['altbirthplace']; } else { $birthdate = ""; $birthplace = ""; } } else $birthdate = $birthplace = ""; $query = "SELECT gedcom, treename FROM $trees_table WHERE gedcom = \"{$row['gedcom']}\""; $treeresult = tng_query($query); $treerow = tng_fetch_assoc( $treeresult ); $item = "\n\n"; $item .= ""; $item .= xmlcharacters($text['indinfo'] . ": " . $namestr . " (" . $row['personID'] . ")"); $item .= "\n"; $item .= "" . "$tngdomain/$getperson_url" . "personID=" . $row['personID'] . "&tree=" . $row['gedcom'] . $langstr . "\n"; $item .= ""; if( $birthdate || $birthplace ) $item .= xmlcharacters("$birthdate, $birthplace") . "\n"; else $item .= xmlcharacters($text['birthabbr']) . "\n"; $item .= "{$text['tree']}: " . xmlcharacters($treerow['treename']) . "\n"; $changedate = date_format(date_create($row['changedatef']), "D, d M Y H:i:s"); $item .= "$changedate $timezone \n"; //$item .= ">$tngdomain/$row[personID]-".date_format(date_create($row[changedatef]), DATE_ATOM)."\n"; $item .= "\n"; echo $item; } tng_free_result($result); } } //$allwhere = " AND $people_table.gedcom = $families_table.gedcom"; if($familyID) { $whereclause = "WHERE $families_table.familyID = \"$familyID\"$privacystr ORDER BY changedate LIMIT $change_limit"; } else { $whereclause = $change_cutoff ? "WHERE TO_DAYS(NOW()) - TO_DAYS($families_table.changedate) <= $change_cutoff$privacystr" : "WHERE 1=1$privacystr"; $whereclause .= " ORDER BY changedate DESC LIMIT $change_limit"; } if (!$personID) { //select husband, wife from families where date later than cutoff, order by changedate descending, limit = 10 $query = "SELECT familyID, husband, wife, marrdate, marrplace, gedcom, branch, living, private, DATE_FORMAT(changedate,'%a, %d %b %Y %T') as changedatef FROM $families_table $whereclause"; //$query = "SELECT familyID, husband, wife, marrdate, marrplace, $families_table.gedcom as gedcom, firstname, lnprefix, lastname, suffix, nameorder, $families_table.branch as fbranch, $people_table.branch as branch, $families_table.living as fliving, $families_table.private as fprivate, $people_table.living as living, $people_table.private as private, DATE_FORMAT($families_table.changedate,'%a, %d %b %Y %T') as changedatef FROM $families_table, $people_table $whereclause"; $famresult = tng_query($query); $numrows = tng_num_rows( $famresult ); if( $numrows ) { while( $row = tng_fetch_assoc($famresult)) { $row['allow_living'] = $nonames == 2 && $row['living'] ? 0 : 1; $row['allow_private'] = $tngconfig['nnpriv'] == 2 && $row['private'] ? 0 : 1; $query = "SELECT gedcom, treename FROM $trees_table WHERE gedcom = \"{$row['gedcom']}\""; $treeresult = tng_query($query); $treerow = tng_fetch_assoc( $treeresult ); $item = "\n\n"; $item .= "" . xmlcharacters($text['family'] . ": " . getFamilyName( $row )) . "\n"; $item .= "" . "$tngdomain/$familygroup_url" . "familyID={$row['familyID']}&tree={$row['gedcom']}$langstr" . "\n"; $item .= ""; $item .= displayDate( $row['marrdate'] ); if($row['marrdate'] && $row['marrplace']) $item .= ", "; $item .= xmlcharacters($row['marrplace']); $item .= "\n"; $item .= "{$text['tree']}: " . xmlcharacters($treerow['treename']) . "\n"; $item .= "" . displayDate( $row['changedatef'] ) . " $timezone \n"; //$item .= "$tngdomain/$row[familyID]-".date_format(date_create($row[changedatef]), DATE_ATOM)."\n"; $item .= "\n"; echo $item; } tng_free_result($famresult); } } echo "\n"; echo "\n"; ?>