Hello, I'm getting the following error both on my gallery pages and my image pages:
`Warning: Invalid argument supplied for foreach() in /home/content/b/j/a/bjancewicz/html/ZenPhoto/zp-core/template-functions.php on line 177`
I've tried to go through the entire template-functions.php doc to see if any brackets were missing or anything like that, but I don't see anything missing... does anything stick out to anyone else?
Here is line 177: `foreach ($_zp_plugin_scripts as $script) {'
Here is the whole template-functions.php
'
<?php<br />
/**
* Functions used to display content in themes.
*/
/**
* Load the classes
*/
require_once('classes.php');
/**
* Invoke the controller to handle requests
*/
require_once('controller.php');
//******************************************************************************
//*** Template Functions *******************************************************
//******************************************************************************
/*** Generic Helper Functions *************/
/******************************************/
/**
* General link printing function
*
@param string $url The link URL
*
@param string $text The text to go with the link
*
@param string $title Text for the title tag
*
@param string $class optional class
*
@param string $id optional id
*/
function printLink($url, $text, $title=NULL, $class=NULL, $id=NULL) {
echo "
(($title) ? " title="" . htmlspecialchars($title, ENT_QUOTES) . """ : "") .
(($class) ? " class="$class"" : "") .
(($id) ? " id="$id"" : "") . ">" .
$text . "";
}
/**
* Prints the zenphoto version string
*/
function printVersion() {
echo ZENPHOTO_VERSION. ' ['.ZENPHOTO_RELEASE. ']';
}
/**
* Prints the admin edit link for albums if the current user is logged-in
* Returns true if the user is logged in
* @param string $text text for the link
* @param string $before text do display before the link
* @param string $after text do display after the link
* @param string $title Text for the HTML title item
* @param string $class The HTML class for the link
* @param string $id The HTML id for the link
* @return bool
* @since 1.1
*/
function printAdminLink($text, $before='', $after='', $title=NULL, $class=NULL, $id=NULL) {
if (zp_loggedin()) {
echo $before;
printLink(WEBPATH.'/' . ZENFOLDER . '/admin.php', $text, $title, $class, $id);
echo $after;
return true;
}
return false;
}
/**
* Prints the admin edit link for subalbums if the current user is logged-in
* @param string $text text for the link
* @param string $before text do display before the link
* @param string $after text do display after the link
* @since 1.1
*/
function printSubalbumAdmin($text, $before='', $after='') {
global $_zp_current_album, $_zp_themeroot;
if (zp_loggedin()) {
echo $before;
printLink(WEBPATH.'/' . ZENFOLDER . '/admin.php?page=edit&album=' . urlencode($_zp_current_album->name), $text, NULL, NULL, NULL);
echo $after;
}
}
/**
* Prints the clickable drop down toolbox on any theme page with generic admin helpers
* @param string $context index, album, image or search
* @param string $id the html/css theming id
* @since 1.1
*/
function printAdminToolbox($context=null, $id='admin') {
global $_zp_current_album, $_zp_current_image, $_zp_current_search, $_zp_loggedin;
if (zp_loggedin()) {
$zf = WEBPATH."/".ZENFOLDER;
$dataid = $id . '_data';
$page = getCurrentPage();
$redirect = '';
echo "nn";
if (is_null($context)) { $context = get_context(); }
echo ''."n".'
'.gettext('Admin Toolbox').''."n"."n";
echo '
'."n";
printAdminLink(gettext('Admin'), '', "n");
$albumname = $_zp_current_album->name;
if ($context === ZP_INDEX) {
if (isMyAlbum($albumname, EDIT_RIGHTS)) {
printSortableGalleryLink(gettext('Sort gallery'), gettext('Manual sorting'));
echo "n";
}
if (isMyAlbum($albumname, UPLOAD_RIGHTS)) {
printLink($zf . '/admin.php?page=upload' . urlencode($_zp_current_album->name), gettext("New album"), NULL, NULL, NULL);
echo "n";
}
if (isset($_GET['p'])) {
$redirect = "&p=" . $_GET['p'];
}
$redirect .= "&page=$page";
} else if (!in_context(ZP_IMAGE) && (!is_null($_zp_current_album))) { // then it must be an album page
if (isMyAlbum($albumname, EDIT_RIGHTS)) {
printSubalbumAdmin(gettext('Edit album'), '', "n");
if (!$_zp_current_album->isDynamic()) {
printSortableAlbumLink(gettext('Sort album'), gettext('Manual sorting'));
echo "n";
}
echo "
urlencode($albumname) . "');" title="".gettext("Delete the album")."">".gettext("Delete album")."n";
}
if (isMyAlbum($albumname, UPLOAD_RIGHTS) && !$_zp_current_album->isDynamic()) {
printLink($zf . '/admin.php?page=upload&album=' . urlencode($albumname), gettext("Upload Here"), NULL, NULL, NULL);
echo "n";
printLink($zf . '/admin.php?page=upload&new&album=' . urlencode($albumname), gettext("New Album Here"), NULL, NULL, NULL);
echo "n";
}
$redirect = "&album=".urlencode($albumname)."&page=$page";
} else if (in_context(ZP_IMAGE)) {
$imagename = urlencode($_zp_current_image->filename);
if (isMyAlbum($albumname, EDIT_RIGHTS)) {
echo "
urlencode($albumname) . "&image=". $imagename . "');" title="".gettext("Delete the image")."">".gettext("Delete image")."";
echo "n";
}
$redirect = "&album=".urlencode($albumname)."&image=$imagename";
} else if (in_context(ZP_SEARCH)&& !empty($_zp_current_search->words)) {
if ($_zp_loggedin & UPLOAD_RIGHTS) {
echo "".gettext("Create Album")."";
}
$redirect = "&p=search" . $_zp_current_search->getSearchParams() . "&page=$page";
}
echo "
".gettext("Logout")."n";
echo "
n";
}
}
/**
* Print any Javascript required by zenphoto. Every theme should include this somewhere in its .
*/
function zenJavascript() {
global $_zp_phoogle, $_zp_current_album, $_zp_plugin_scripts;
if (!is_null($_zp_phoogle)) {$_zp_phoogle->printGoogleJS();}
if (($rights = zp_loggedin()) & EDIT_RIGHTS) {
if (in_context(ZP_ALBUM)) {
$grant = isMyAlbum($_zp_current_album->name, EDIT_RIGHTS);
} else {
$grant = $rights & ADMIN_RIGHTS;
}
if ($grant) {
echo " n";
echo " n";
sajax_show_javascript();
echo " n";
}
}
echo " n";
echo " n";
foreach ($_zp_plugin_scripts as $script) {
echo $script."n";
}
}
//*** Gallery Index (album list) Context ***
//******************************************
/**
* Returns the title of the ZenPhoto Gallery without printing it.
*
*
@return string
*/
function getGalleryTitle() {
return getOption('gallery_title');
}
/**
* Prints the title of the gallery.
*/
function printGalleryTitle() {
echo getGalleryTitle();
}
/**
* Returns the name of the main website if zenphoto is part of a website without printing it
* and if added this in zp-config.php..
*
*
@return string
*/
function getMainSiteName() {
return getOption('website_title');
}
/**
* Returns the URL of the main website (from the admin options)
*
*
@return string
*/
function getMainSiteURL() {
return getOption('website_url');
}
/**
* Returns the URL of the main gallery page containing the current album
*
*
@return string
*/
function getGalleryIndexURL() {
global $_zp_current_album;
if (in_context(ZP_ALBUM)) {
$album = getUrAlbum($_zp_current_album);
$page = $album->getGalleryPage();
}
if ($page > 1) {
return rewrite_path("/page/" . $page, "/index.php?page=" . $page);
} else {
return WEBPATH . "/";
}
}
/**
* Returns the number of albums.
*
*
@return int
*/
function getNumAlbums() {
global $_zp_gallery, $_zp_current_search;
if (in_context(ZP_SEARCH)) {
return $_zp_current_search->getNumAlbums();
} else {
return $_zp_gallery->getNumAlbums();
}
}
/*** Album AND Gallery Context ************/
/******************************************/
/**
* WHILE next_album(): context switches to Album.
* If we're already in the album context, this is a sub-albums loop, which,
* quite simply, changes the source of the album list.
* Switch back to the previous context when there are no more albums.
* Returns true if there are albums, false if none
*
*
@param bool $all true to go through all the albums
*
@param string $sorttype what you want to sort the albums by
*
@return bool
*
@since 0.6
*/
function next_album($all=false, $sorttype=null) {
global $_zp_albums, $_zp_gallery, $_zp_current_album, $_zp_page, $_zp_current_album_restore, $_zp_current_search;
if (checkforPassword()) { return false; }
if (is_null($_zp_albums)) {
if (in_context(ZP_SEARCH)) {
$_zp_albums = $_zp_current_search->getAlbums($all ? 0 : $_zp_page);
} else if (in_context(ZP_ALBUM)) {
if ($_zp_current_album->isDynamic()) {
$search = $_zp_current_album->getSearchEngine();
$_zp_albums = $search->getAlbums($all ? 0 : $_zp_page);
} else {
$_zp_albums = $_zp_current_album->getSubAlbums($all ? 0 : $_zp_page, $sorttype);
}
} else {
$_zp_albums = $_zp_gallery->getAlbums($all ? 0 : $_zp_page, $sorttype);
}
if (empty($_zp_albums)) { return false; }
$_zp_current_album_restore = $_zp_current_album;
$_zp_current_album = new Album($_zp_gallery, array_shift($_zp_albums));
save_context();
add_context(ZP_ALBUM);
return true;
} else if (empty($_zp_albums)) {
$_zp_albums = NULL;
$_zp_current_album = $_zp_current_album_restore;
restore_context();
return false;
} else {
$_zp_current_album = new Album($_zp_gallery, array_shift($_zp_albums));
return true;
}
}
/**
* Returns the number of albums without printing it.
*
*
@return int
*/
function getCurrentPage() {
global $_zp_page;
return $_zp_page;
}
/**
* Returns the count of subalbums in the album
*
*
@return int
*/
function getNumSubalbums() {
global $_zp_current_album, $_zp_current_search;
if (in_context(ZP_SEARCH)) {
return $_zp_current_search->getNumAlbums();
} else {
if ($_zp_current_album->isDynamic()) {
$search = $_zp_current_album->getSearchEngine();
return $search->getNumAlbums();
} else {
return count($_zp_current_album->getSubalbums());
}
}
}
/**
* Returns the number of pages for the current object
*
*
@param bool $oneImagePage set to true if your theme collapses all image thumbs
* or their equivalent to one page. This is typical with flash viewer themes
*
*
@return int
*/
function getTotalPages($oneImagePage=false) {
global $_zp_gallery, $_zp_gallery_albums_per_page, $_zp_current_album;
if (in_context(ZP_ALBUM | ZP_SEARCH)) {
$albums_per_page = max(1, getOption('albums_per_page'));
if (in_context(ZP_SEARCH)) {
$pageCount = ceil(getNumAlbums() / $albums_per_page);
} else {
$pageCount = ceil(getNumSubalbums() / $albums_per_page);
}
$imageCount = getNumImages();
if ($oneImagePage) {
$imageCount = min(1, $imageCount);
}
$images_per_page = max(1, getOption('images_per_page'));
$pageCount = ($pageCount + ceil(($imageCount - getOption('images_first_page')) / $images_per_page));
return $pageCount;
} else if (in_context(ZP_INDEX)) {
if($_zp_gallery_albums_per_page != 0) {
return ceil($_zp_gallery->getNumAlbums() / $_zp_gallery_albums_per_page);
} else {
return NULL;
}
} else {
return null;
}
}
/**
* Returns the URL of a page. Use alway with a variable like getPageURL(1)
* for the first page for example. Use this function when you know the total pages
*
*
@param int $page
*
@param int $total
*
@return int
*/
function getPageURL_($page, $total) {
global $_zp_current_album, $_zp_gallery, $_zp_current_search;
if (in_context(ZP_SEARCH)) {
$searchwords = $_zp_current_search->words;
$searchdate = $_zp_current_search->dates;
$searchfields = $_zp_current_search->fields;
$searchpagepath = getSearchURL($searchwords, $searchdate, $searchfields, $page);
return $searchpagepath;
} else {
if ($page <= $total && $page > 0) {
if (in_context(ZP_ALBUM)) {
return rewrite_path( pathurlencode($_zp_current_album->name) . (($page > 1) ? "/page/" . $page . "/" : ""),
"/index.php?album=" . pathurlencode($_zp_current_album->name) . (($page > 1) ? "&page=" . $page : "") );
} else if (in_context(ZP_INDEX)) {
return rewrite_path((($page > 1) ? "/page/" . $page . "/" : "/"), "/index.php" . (($page > 1) ? "?page=" . $page : ""));
}
}
return null;
}
}
/**
* Returns the URL of a page. Use alway with a variable like getPageURL(1)
* for the first page for example.
*
*
@param int $page
*
@return string
*/
function getPageURL($page) {
$total = getTotalPages();
return(getPageURL_($page, $total));
}
/**
* Returns true if there is a next page
*
*
@return bool
*/
function hasNextPage() { return (getCurrentPage() < getTotalPages()); }
/**
* Returns the URL of the next page. Use within If or while loops for pagination.
*
*
@return string
*/
function getNextPageURL() {
return getPageURL(getCurrentPage() + 1);
}
/**
* Prints the URL of the next page.
*
*
@param string $text text for the URL
*
@param string $title Text for the HTML title
*
@param string $class Text for the HTML class
*
@param string $id Text for the HTML id
*/
function printNextPageLink($text, $title=NULL, $class=NULL, $id=NULL) {
if (hasNextPage()) {
printLink(getNextPageURL(), $text, $title, $class, $id);
} else {
echo "$text";
}
}
/**
* Returns TRUE if there is a previous page. Use within If or while loops for pagination.
*
*
@return bool
*/
function hasPrevPage() { return (getCurrentPage() > 1); }
/**
* Returns the URL of the previous page.
*
*
@return string
*/
function getPrevPageURL() {
return getPageURL(getCurrentPage() - 1);
}
/**
* Returns the URL of the previous page.
*
*
@param string $text The linktext that should be printed as a link
*
@param string $title The text the html-tag "title" should contain
*
@param string $class Insert here the CSS-class name you want to style the link with
*
@param string $id Insert here the CSS-ID name you want to style the link with
*/
function printPrevPageLink($text, $title=NULL, $class=NULL, $id=NULL) {
if (hasPrevPage()) {
printLink(getPrevPageURL(), $text, $title, $class, $id);
} else {
echo "$text";
}
}
/**
* Prints a page navigation including previous and next page links
*
*
@param string $prevtext Insert here the linktext like 'previous page'
*
@param string $separator Insert here what you like to be shown between the prev and next links
*
@param string $nexttext Insert here the linktext like "next page"
*
@param string $class Insert here the CSS-class name you want to style the link with (default is "pagelist")
*
@param string $id Insert here the CSS-ID name if you want to style the link with this
*/
function printPageNav($prevtext, $separator, $nexttext, $class='pagenav', $id=NULL) {
echo "
";
printPrevPageLink($prevtext, gettext("Previous Page"));
echo " $separator ";
printNextPageLink($nexttext, gettext("Next Page"));
echo "
n";
}
/**
* Prints a list of all pages.
*
*
@param string $class the css class to use, "pagelist" by default
*
@param string $id the css id to use
*/
function printPageList($class='pagelist', $id=NULL) {
printPageListWithNav(null, null, false, false, $class, $id);
}
/**
* Prints a full page navigation including previous and next page links with a list of all pages in between.
*
*
@param string $prevtext Insert here the linktext like 'previous page'
*
@param string $nexttext Insert here the linktext like 'next page'
*
@param bool $oneImagePage set to true if there is only one image page as, for instance, in flash themes
*
@param string $nextprev set to true to get the 'next' and 'prev' links printed
*
@param string $class Insert here the CSS-class name you want to style the link with (default is "pagelist")
*
@param string $id Insert here the CSS-ID name if you want to style the link with this
*/
function printPageListWithNav($prevtext, $nexttext, $oneImagePage=false, $nextprev=true, $class='pagelist', $id=NULL) {
$total = getTotalPages($oneImagePage);
if ($total < 2) {
$class .= ' disabled_nav';
}
echo "
";
$current = getCurrentPage();
echo "n
";
if ($nextprev) {
echo "n - ";
printPrevPageLink($prevtext, gettext("Previous Page"));
echo "";
}
for ($i=($j=max(1, min($current-2, $total-6))); $i <= min($total, $j+6); $i++) {<br />
echo "n - ";
printLink(getPageURL_($i, $total), $i, "Page $i" . (($i == $current) ? gettext(" (Current Page)") : ""));
echo "";
}
if ($i <= $total) {echo "n<br />
- " . ". . ." . "
"; }
if ($nextprev) {
echo "n - ";
printNextPageLink($nexttext, gettext("Next Page"));
echo "";
}
echo "n";
echo "n
n";
}
//*** Album Context ************************
//******************************************
/**
* Returns the title of the current album.
*
*
@return string
*/
function getAlbumTitle() {
if(!in_context(ZP_ALBUM)) return false;
global $_zp_current_album;
return $_zp_current_album->getTitle();
}
/**
* Prints the title of the current album. If you are logged in you can click on this to modify the name on the fly.
*
*
@param bool $editable set to true to allow editing (for the admin)
*/
function printAlbumTitle($editable=false) {
global $_zp_current_album;
if ($editable && zp_loggedin()) {
echo "
" . htmlspecialchars(getAlbumTitle()) . "n";
echo "initEditableTitle('albumTitleEditable');";
} else {
echo htmlspecialchars(getAlbumTitle());
}
}
/**
* Gets the 'n' for n of m albums
*
*
@return int
*/
function albumNumber() {
global $_zp_current_album, $_zp_current_image, $_zp_current_search, $_zp_gallery, $_zp_dynamic_album;
$name = $_zp_current_album->getFolder();
if (in_context(ZP_SEARCH)) {
$albums = $_zp_current_search->getAlbums();
} else if (in_context(ZP_ALBUM)) {
if (is_null($_zp_dynamic_album)) {
$parent = $_zp_current_album->getParent();
if (is_null($parent)) {
$albums = $_zp_gallery->getAlbums();
} else {
$albums = $parent->getSubalbums();
}
} else {
$search = $_zp_dynamic_album->getSearchEngine();
$albums = $search->getAlbums();
}
}
$ct = count($albums);
for ($c = 0; $c < $ct; $c++) {
if ($name == $albums[$c]) {
return $c+1;
}
}
return false;
}
/**
* Returns an array of the names of the parents of the current album.
*
*
@return array
*/
function getParentAlbums($album=null) {
if(!in_context(ZP_ALBUM)) return false;
global $_zp_current_album, $_zp_current_search, $_zp_gallery;
$parents = array();
if (is_null($album)) {
if (in_context(ZP_SEARCH_LINKED)) {
$name = $_zp_current_search->dynalbumname;
if (empty($name)) return $parents;
$album = new Album($_zp_gallery, $name);
} else {
$album = $_zp_current_album;
}
}
while (!is_null($album = $album->getParent())) {
array_unshift($parents, $album);
}
return $parents;
}
/**
* prints the breadcrumb item for the current images's album
*
*
@param string $before Text to place before the breadcrumb
*
@param string $after Text to place after the breadcrumb
*
@param string $title Text to be used as the URL title tag
*/
function printAlbumBreadcrumb($before='', $after='', $title='Album Thumbnails') {
global $_zp_current_search, $_zp_current_gallery;
echo $before;
if (in_context(ZP_SEARCH_LINKED)) {
$page = $_zp_current_search->page;
$searchwords = $_zp_current_search->words;
$searchdate = $_zp_current_search->dates;
$searchfields = $_zp_current_search->fields;
$searchpagepath = getSearchURL($searchwords, $searchdate, $searchfields, $page);
$dynamic_album = $_zp_current_search->dynalbumname;
if (empty($dynamic_album)) {
echo "
";
echo "".gettext("Search")."";
} else {
$album = new Album($_zp_current_gallery, $dynamic_album);
echo "
";
echo $album->getTitle();
}
} else {
echo "" . getAlbumTitle() . "";
}
echo $after;
}
/**
* Prints the breadcrumb navigation for album, gallery and image view.
*
*
@param string $before Insert here the text to be printed before the links
*
@param string $between Insert here the text to be printed between the links
*
@param string $after Insert here the text to be printed after the links
*/
function printParentBreadcrumb($before = '', $between=' | ', $after = ' | ') {
echo $before;
if (in_context(ZP_SEARCH)) {
$parents = array();
} else {
$parents = getParentAlbums();
}
$n = count($parents);
if ($n == 0) return;
$i = 0;
foreach($parents as $parent) {
if ($i > 0) echo $between;
$url = rewrite_path("/" . pathurlencode($parent->name) . "/", "/index.php?album=" . urlencode($parent->name));
printLink($url, $parent->getTitle(), $parent->getDesc());
$i++;
}
echo $after;
}
/**
* Prints a link to the 'main website'
* Only prints the link if the url is not empty and does not point back the the gallery page
*
*
@param string $before text to precede the link
*
@param string $after text to follow the link
*
@param string $title Title text
*
@param string $class optional css class
*
@param string $id optional css id
* */
function printHomeLink($before='', $after='', $title=NULL, $class=NULL, $id=NULL) {
$site = getOption('website_url');
if (!empty($site)) {
if (substr($site,-1) == "/") { $site = substr($site, 0, -1); }
if (empty($name)) { $name = getOption('website_title'); }
if (empty($name)) { $name = 'Home'; }
if ($site != FULLWEBPATH) {
echo $before;
printLink($site, $name, $title, $class, $id);
echo $after;
}
}
}
/**
* Returns the formatted date field of the album
*
*
@param string $format
*
@return string
*/
function getAlbumDate($format=null) {
global $_zp_current_album;
$d = $_zp_current_album->getDateTime();
if (empty($d) || ($d == '0000-00-00 00:00:00')) {
return false;
}
if (is_null($format)) {
return $d;
}
return strftime($format, strtotime($d));
}
/**
* Returns the date of the current album
*
*
@param string $before Insert here the text to be printed before the date.
*
@param string $nonemessage Insert here the text to be printed if there is no date.
*
@param string $format Format string for the date formatting
*/
function printAlbumDate($before='Date: ', $nonemessage='', $format=null) {
if (is_null($format)) {
$format = getOption('date_format');
}
$date = getAlbumDate($format);
if ($date) {
echo $before . $date;
} else {
echo $nonemessage;
}
}
/**
* Returns the place of the album.
*
*
@return string
*/
function getAlbumPlace() {
global $_zp_current_album;
return $_zp_current_album->getPlace();
}
/**
* Prints the place of the album.
*
*/
function printAlbumPlace() {
echo getAlbumPlace();
}
/**
* Returns the album description of the current album.
*
*
@return string
*/
function getAlbumDesc() {
if(!in_context(ZP_ALBUM)) return false;
global $_zp_current_album;
return $_zp_current_album->getDesc();
}
/**
* Prints the album description of the current album.
*
*
@param bool $editable
*/
function printAlbumDesc($editable=false) {
global $_zp_current_album;
$desc = htmlspecialchars(getAlbumDesc());
$desc = str_replace("rn", "n", $_zp_current_album->getDesc());
$desc = str_replace("n", '', $desc);
if ($editable && zp_loggedin()) {
echo "
" . $desc . "
n";
echo "initEditableDesc('albumDescEditable');";
} else {
echo $desc;
}
}
/**
* Returns the custom_data field of the current album
*
*
@return string
*/
function getAlbumCustomData() {
global $_zp_current_album;
return $_zp_current_album->getCustomData();
}
/**
* Sets the album custom_data field
*
*
@param string $val
*/
function setAlbumCustomData($val) {
global $_zp_current_album;
$_zp_current_album->setCustomData($val);
$_zp_current_album->save();
}
/**
* A composit for getting album data
*
*
@param string $field which field you want
*
@return string
*/
function getAlbumData($field) {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_album_image;
return $_zp_album_image->get($field);
}
/**
* Returns the album link url of the current album.
*
*
@return string
*/
function getAlbumLinkURL($album=NULL) {
global $_zp_current_album, $_zp_current_image, $_zp_current_search, $firstPageImages;
if (is_null($album)) $album = $_zp_current_album;
$page = 0;
if (in_context(ZP_IMAGE) && !in_context(ZP_SEARCH)) {
if ($_zp_current_album->isDynamic()) {
$search = $_zp_current_album->getSearchEngine();
$imageindex = $search->getImageIndex($_zp_current_album->name, $_zp_current_image->filename);
$numalbums = count($search->getAlbums(0));
} else {
$imageindex = $_zp_current_image->getIndex();
$numalbums = count($album->getSubalbums());
}
$imagepage = floor(($imageindex - $firstPageImages) / max(1, getOption('images_per_page'))) + 1;
$albumpages = ceil($numalbums / max(1, getOption('albums_per_page')));
$page = $albumpages + $imagepage;
}
if (in_context(ZP_IMAGE) && $page > 1) {
// Link to the page the current image belongs to.
$link = rewrite_path("/" . pathurlencode($album->name) . "/page/" . $page,
"/index.php?album=" . urlencode($album->name) . "&page=" . $page);
} else {
$link = rewrite_path("/" . pathurlencode($album->name) . "/",
"/index.php?album=" . urlencode($album->name));
}
return $link;
}
/**
* Prints the album link url of the current album.
*
*
@param string $text Insert the link text here.
*
@param string $title Insert the title text here.
*
@param string $class Insert here the CSS-class name with with you want to style the link.
*
@param string $id Insert here the CSS-id name with with you want to style the link.
*/
function printAlbumLink($text, $title, $class=NULL, $id=NULL) {
printLink(getAlbumLinkURL(), $text, $title, $class, $id);
}
/**
* Print a link that allows the user to sort the current album if they are logged in.
* If they are already sorting, the Save button is displayed.
*
*
@param string $text Insert the link text here.
*
@param string $title Insert the title text here.
*
@param string $class Insert here the CSS-class name with with you want to style the link.
*
@param string $id Insert here the CSS-id name with with you want to style the link.
*/
function printSortableAlbumLink($text, $title, $class=NULL, $id=NULL) {
global $_zp_sortable_list, $_zp_current_album;
if (zp_loggedin()) {
if (!isset($_GET['sortable'])) {
printLink(WEBPATH . "/" . ZENFOLDER . "/albumsort.php?page=edit&album=" . urlencode($_zp_current_album->getFolder()),
$text, $title, $class, $id);
} else {
// TODO: this doesn't really work yet
$_zp_sortable_list->printForm(getAlbumLinkURL(), 'POST', gettext('Save'), 'button');
}
}
}
/**
* Print a link that allows the user to sort the Gallery if they are logged in.
* If they are already sorting, the Save button is displayed.
*
*
@param string $text Insert the link text here.
*
@param string $title Insert the title text here.
*
@param string $class Insert here the CSS-class name with with you want to style the link.
*
@param string $id Insert here the CSS-id name with with you want to style the link.
*/
function printSortableGalleryLink($text, $title, $class=NULL, $id=NULL) {
global $_zp_sortable_list, $_zp_current_album;
if (zp_loggedin()) {
if (!isset($_GET['sortable'])) {
printLink(WEBPATH . "/" . ZENFOLDER . "/admin.php?page=edit", $text, $title, $class, $id);
} else {
// TODO: this doesn't really work yet
$_zp_sortable_list->printForm(WEBPATH . "/" . ZENFOLDER . "/admin.php?page=edit", 'POST', gettext('Save'), 'button');
}
}
}
/**
* Returns the name of the defined album thumbnail image.
*
*
@return string
*/
function getAlbumThumb() {
global $_zp_current_album;
return $_zp_current_album->getAlbumThumb();
}
/**
* Prints the album thumbnail image.
*
*
@param string $alt Insert the text for the alternate image name here.
*
@param string $class Insert here the CSS-class name with with you want to style the link.
*
@param string $id Insert here the CSS-id name with with you want to style the link.
* */
function printAlbumThumbImage($alt, $class=NULL, $id=NULL) {
global $_zp_current_album;
if (!$_zp_current_album->getShow()) {
$class .= " not_visible";
} else {
$pwd = $_zp_current_album->getPassword();
if (zp_loggedin() && !empty($pwd)) {
$class .= " password_protected";
}
}
$class = trim($class);
if (checkAlbumPassword($_zp_current_album->name, $hint)) {
echo "
(($class) ? " class="$class"" : "") . (($id) ? " id="$id"" : "") . " />";
} else {
echo "
"" width="".getOption('thumb_crop_width')."" />";
}
}
/**
* Returns a link to a custom sized thumbnail of the current album
*
*
@param int $size the size of the image to have
*
@param int $width width
*
@param int $height height
*
@param int $cropw cropwidth
*
@param int $croph crop height
*
@param int $cropx crop part x axis
*
@param int $cropy crop part y axis
*
*
@return string
*/
function getCustomAlbumThumb($size, $width=NULL, $height=NULL, $cropw=NULL, $croph=NULL, $cropx=NULL, $cropy=null) {
global $_zp_current_album;
$thumb = $_zp_current_album->getAlbumThumbImage();
return $thumb->getCustomImage($size, $width, $height, $cropw, $croph, $cropx, $cropy, true);
}
/**
* Prints a link to a custom sized thumbnail of the current album
*
*
@param string $alt Alt atribute text
*
@param int $size size
*
@param int $width width
*
@param int $height height
*
@param int $cropw cropwidth
*
@param int $croph crop height
*
@param int $cropx crop part x axis
*
@param int $cropy crop part y axis
*
@param string $class css class
*
@param string $id css id
*
*
@return string
*/
function printCustomAlbumThumbImage($alt, $size, $width=NULL, $height=NULL, $cropw=NULL, $croph=NULL, $cropx=NULL, $cropy=null, $class=NULL, $id=NULL) {
global $_zp_current_album;
if (!$_zp_current_album->getShow()) {
$class .= " not_visible";
} else {
$pwd = $_zp_current_album->getPassword();
if (zp_loggedin() && !empty($pwd)) {
$class .= " password_protected";
}
}
$class = trim($class);
/* set the HTML image width and height parameters in case this image was "zen-logo.gif" substituted for no thumbnail then the thumb layout is preserved */
if ($sizeW = max(is_null($width) ? 0: $sizeW, is_null($cropw) ? 0 : $cropw)) {
$sizing = ' width="' . $sizeW . '"';
} else {
$sizing = null;
}
if ($sizeH = max(is_null($height) ? 0 : $height, is_null($croph) ? 0 : $croph)) {
$sizing = $sizing . ' height="' . $sizeH . '"';
}
if (checkAlbumPassword($_zp_current_album->name, $hint)){
echo "
(($class) ? " class="$class"" : "") . (($id) ? " id="$id"" : "") . " />";
} else {
echo "
";
}
}
/**
* Returns the next album
*
*
@return object
*/
function getNextAlbum() {
global $_zp_current_album, $_zp_current_search, $_zp_gallery;
if (in_context(ZP_SEARCH) || in_context(ZP_SEARCH_LINKED)) {
$nextalbum = $_zp_current_search->getNextAlbum($_zp_current_album->name);
} else if (in_context(ZP_ALBUM)) {
if ($_zp_current_album->isDynamic()) {
$search = $_zp_current_album->getSearchEngine();
$nextalbum = $search->getNextAlbum($_zp_current_album->name);
} else {
$nextalbum = $_zp_current_album->getNextAlbum();
}
} else {
return null;
}
return $nextalbum;
}
/**
* Get the URL of the next album in the gallery.
*
*
@return string
*/
function getNextAlbumURL() {
$nextalbum = getNextAlbum();
if ($nextalbum) {
return rewrite_path("/" . pathurlencode($nextalbum->name),
"/index.php?album=" . urlencode($nextalbum->name));
}
return false;
}
/**
* Returns the previous album
*
*
@return object
*/
function getPrevAlbum() {
global $_zp_current_album, $_zp_current_search;
if (in_context(ZP_SEARCH) || in_context(ZP_SEARCH_LINKED)) {
$prevalbum = $_zp_current_search->getPrevAlbum($_zp_current_album->name);
} else if(in_context(ZP_ALBUM)) {
if ($_zp_current_album->isDynamic()) {
$search = $_zp_current_album->getSearchEngine();
$prevalbum = $search->getPrevAlbum($_zp_current_album->name);
} else {
$prevalbum = $_zp_current_album->getPrevAlbum();
}
} else {
return null;
}
return $prevalbum;
}
/**
* Get the URL of the previous album in the gallery.
*
*
@return string
*/
function getPrevAlbumURL() {
$prevalbum = getPrevAlbum();
if ($prevalbum) {
return rewrite_path("/" . pathurlencode($prevalbum->name),
"/index.php?album=" . urlencode($prevalbum->name));
}
return false;
}
/**
* Returns true if this page has image thumbs on it
*
*
@return bool
*/
function isImagePage() {
global $_zp_page;
return ($_zp_page - getTotalPages(true)) >= 0;
}
/**
* Returns true if this page has album thumbs on it
*
*
@return bool
*/
function isAlbumPage() {
if (in_context(ZP_SEARCH)) {
$pageCount = Ceil(getNumAlbums() / getOption('albums_per_page'));
} else {
$pageCount = Ceil(getNumSubalbums() / getOption('albums_per_page'));
}
return ($_zp_page <= $pageCount);<br />
}
/**
* Returns the number of images in the album.
*
*
@return int
*/
function getNumImages() {
global $_zp_current_album, $_zp_current_search;
if (in_context(ZP_SEARCH)) {
return $_zp_current_search->getNumImages();
} else {
if ($_zp_current_album->isDynamic()) {
$search = $_zp_current_album->getSearchEngine();
return $search->getNumImages();
} else {
return $_zp_current_album->getNumImages();
}
}
}
/**
* Returns the count of all the images in the album and any subalbums
*
*
@param object $album The album whose image count you want
*
@return int
*
@since 1.1.4
*/
function getTotalImagesIn($album) {
global $_zp_gallery;
$sum = $album->getNumImages();
$subalbums = $album->getSubalbums(0);
while (count($subalbums) > 0) {
$albumname = array_pop($subalbums);
$album = new Album($_zp_gallery, $albumname);
$sum = $sum + getTotalImagesIn($album);
}
return $sum;
}
/**
* Returns the next image on a page.
* sets $_zp_current_image to the next image in the album.
* Returns true if there is an image to be shown
*
*
@param bool $all set to true disable pagination
*
@param int $firstPageCount the number of images which can go on the page that transitions between albums and images
*
@param string $sorttype overrides the default sort type
*
@param bool $overridePassword the password chedk
*
@return bool
*
*
@return bool
*/
function next_image($all=false, $firstPageCount=0, $sorttype=null, $overridePassword=false) {
global $_zp_images, $_zp_current_image, $_zp_current_album, $_zp_page, $_zp_current_image_restore,
$_zp_conf_vars, $_zp_current_search, $_zp_gallery;
if (!$overridePassword) { if (checkforPassword()) { return false; } }
$imagePageOffset = getTotalPages(true) - 1; /* gives us the count of pages for album thumbs */
if ($all) {
$imagePage = 1;
} else {
$_zp_conf_vars['images_first_page'] = $firstPageCount; /* save this so pagination can see it */
$imagePage = $_zp_page - $imagePageOffset;
}
if ($firstPageCount > 0) {
$imagePage = $imagePage + 1; /* can share with last album page */
}
if ($imagePage <= 0) {<br />
return false; /* we are on an album page */
}
if (is_null($_zp_images)) {
if (in_context(ZP_SEARCH)) {
$searchtype = true;
$_zp_images = $_zp_current_search->getImages($all ? 0 : ($imagePage), $firstPageCount);
} else {
if ($_zp_current_album->isDynamic()) {
$searchtype = true;
$search = $_zp_current_album->getSearchEngine();
$_zp_images = $search->getImages($all ? 0 : ($imagePage), $firstPageCount);
} else {
$_zp_images = $_zp_current_album->getImages($all ? 0 : ($imagePage), $firstPageCount, $sorttype);
}
}
if (empty($_zp_images)) { return false; }
$_zp_current_image_restore = $_zp_current_image;
$img = array_shift($_zp_images);
if (is_array($img)) {
$_zp_current_image = new Image(new Album($_zp_gallery, $img['folder']), $img['filename']);
} else {
$_zp_current_image = new Image($_zp_current_album, $img);
}
save_context();
add_context(ZP_IMAGE);
return true;
} else if (empty($_zp_images)) {
$_zp_images = NULL;
$_zp_current_image = $_zp_current_image_restore;
restore_context();
return false;
} else {
$img = array_shift($_zp_images);
if (is_array($img)) {
$_zp_current_image = new Image(new Album($_zp_gallery, $img['folder']), $img['filename']);
} else {
$_zp_current_image = new Image($_zp_current_album, $img);
}
return true;
}
}
//*** Image Context ************************
//******************************************
/**
* Returns the title of the current image.
*
*
@return string
*/
function getImageTitle() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->getTitle();
}
/**
* Returns the title of the current image.
*
*
@param bool $editable if set to true and the admin is logged in allows editing of the title
*/
function printImageTitle($editable=false) {
global $_zp_current_image;
if ($editable && zp_loggedin()) {
echo "
" . htmlspecialchars(getImageTitle()) . "n";
echo "initEditableTitle('imageTitle');";
} else {
echo "" . htmlspecialchars(getImageTitle()) . "n";
}
}
/**
* Returns the 'n' of n of m images
*
*
@return int
*/
function imageNumber() {
global $_zp_current_image, $_zp_current_search, $_zp_current_album;
$name = $_zp_current_image->getFileName();
if (in_context(ZP_SEARCH)) {
$images = $_zp_current_search->getImages();
$ct = count($images);
for ($c = 0; $c < $ct; $c++) {
if ($name == $images[$c] ['filename']) {
return $c+1;
}
}
} else {
if ($_zp_current_album->isDynamic()) {
$search = $_zp_current_album->getSearchEngine();
$images = $search->getImages();
$ct = count($images);
for ($c = 0; $c < $ct; $c++) {
if ($name == $images[$c] ['filename']) {
return $c+1;
}
}
} else {
return $_zp_current_image->getIndex()+1;
}
}
return false;
}
/**
* Returns the image date of the current image in yyyy-mm-dd hh:mm:ss format.
* Pass it a date format string for custom formatting
*
*
@param string $format formatting string for the data
*
@return string
*/
function getImageDate($format=null) {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
$d = $_zp_current_image->getDateTime();
if (empty($d) || ($d == '0000-00-00 00:00:00') ) {
return false;
}
if (is_null($format)) {
return $d;
}
return strftime($format, strtotime($d));
}
/**
* Prints the data from the current image
*
*
@param string $before Text to put out before the date (if there is a date)
*
@param string $nonemessage Text to put out if there is no date
*
@param string $format format string for the date
*/
function printImageDate($before='Date: ', $nonemessage='', $format=null) {
if (is_null($format)) {
$format = getOption('date_format');
}
$date = getImageDate($format);
if ($date) {
echo $before . $date;
} else {
echo $nonemessage;
}
}
// IPTC fields
/**
* Returns the Location field of the current image
*
*
@return string
*/
function getImageLocation() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->getLocation();
}
/**
* Returns the City field of the current image
*
*
@return string
*/
function getImageCity() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->getcity();
}
/**
* Returns the State field of the current image
*
*
@return string
*/
function getImageState() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->getState();
}
/**
* Returns the Country field of the current image
*
*
@return string
*/
function getImageCountry() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->getCountry();
}
/**
* Returns video argument of the current Image.
*
*
@return bool
*/
function getImageVideo() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->getVideo();
}
/**
* Returns video Thumbnail of the current Image.
*
*
@return string
*/
function getImageVideoThumb() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->getVideoThumb();
}
/**
* Returns the description field of the current image
* new lines are replaced with
tags
*
*
@return string
*/
function getImageDesc() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
$desc = str_replace("rn", "n", $_zp_current_image->getDesc());
return str_replace("n", "
", $desc);
}
/**
* Prints the description field of the current image
*
*
@param bool $editable set true to allow editing by the admin
*/
function printImageDesc($editable=false) {
global $_zp_current_image;
$desc = htmlspecialchars(getImageDesc());
$desc = str_replace("rn", "n", $_zp_current_image->getDesc());
$desc = str_replace("n", "
", $desc);
if ($editable && zp_loggedin()) {
echo "
" . $desc . "
n";
echo "initEditableDesc('imageDesc');";
} else {
echo "
" . $desc . "
n";
}
}
/**
* A composit for getting image data
*
*
@param string $field which field you want
*
@return string
*/
function getImageData($field) {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->get($field);
}
/**
* Returns the custom_data field of the current image
*
*
@return string
*/
function getImageCustomData() {
Global $_zp_current_image;
return $_zp_current_image->getCustomData();
}
/**
* Sets the image custom_data field
*
*
@param string $val
*/
function setImageCustomData($val) {
Global $_zp_current_image;
$_zp_current_image->setCustomData($val);
$_zp_current_image->save();
}
/**
* A composit for printing image data
*
*
@param string $field which data you want
*
@param string $label the html label for the paragraph
*/
function printImageData($field, $label) {
global $_zp_current_image;
if($data = getImageData($field)) { // only print it if there's something there
echo "
" . $label . " " . htmlspecialchars(getImageData($field)) . "n";
}
}
/**
* Get the unique ID of the current image.
*
* @return int
*/
function getImageID() {
if (!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->id;
}
/**
* Print the unique ID of the current image.
*/
function printImageID() {
if (!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
echo "image_".getImageID();
}
/**
* Get the sort order of this image.
*
* @return string
*/
function getImageSortOrder() {
if (!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->getSortOrder();
}
/**
* Print the sort order of this image.
*/
function printImageSortOrder() {
if (!in_context(ZP_IMAGE)) return false;
echo getImageSortOrder();
}
/**
* True if there is a next image
*
* @return bool
*/
function hasNextImage() { global $_zp_current_image; return $_zp_current_image->getNextImage(); }
/**
* True if there is a previous image
*
* @return bool
*/
function hasPrevImage() { global $_zp_current_image; return $_zp_current_image->getPrevImage(); }
/**
* Returns the url of the next image.
*
* @return string
*/
function getNextImageURL() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_album, $_zp_current_image;
$nextimg = $_zp_current_image->getNextImage();
return rewrite_path("/" . pathurlencode($nextimg->album->name) . "/" . urlencode($nextimg->filename) . im_suffix(),
"/index.php?album=" . urlencode($nextimg->album->name) . "&image=" . urlencode($nextimg->filename));
}
/**
* Returns the url of the previous image.
*
* @return string
*/
function getPrevImageURL() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_album, $_zp_current_image;
$previmg = $_zp_current_image->getPrevImage();
return rewrite_path("/" . pathurlencode($previmg->album->name) . "/" . urlencode($previmg->filename) . im_suffix(),
"/index.php?album=" . urlencode($previmg->album->name) . "&image=" . urlencode($previmg->filename));
}
/**
* Returns the url of the first image in current album.
*
* @return string
* @author gerben
*/
function getFirstImageURL() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_album, $_zp_current_image;
$firstimg = $_zp_current_album->getImage(0);
return rewrite_path("/" . pathurlencode($firstimg->album->name) . "/" . urlencode($firstimg->filename) . im_suffix(),
"/index.php?album=" . urlencode($firstimg->album->name) . "&image=" . urlencode($firstimg->filename));
}
/**
* Returns the url of the last image in current album.
*
* @return string
* @author gerben
*/
function getLastImageURL() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_album, $_zp_current_image;
$lastimg = $_zp_current_album->getImage($_zp_current_album->getNumImages() - 1);
return rewrite_path("/" . pathurlencode($lastimg->album->name) . "/" . urlencode($lastimg->filename) . im_suffix(),
"/index.php?album=" . urlencode($lastimg->album->name) . "&image=" . urlencode($lastimg->filename));
}
/**
* Prints out the javascript to preload the next and previous images
*
*/
function printPreloadScript() {
global $_zp_current_image;
$size = getOption('image_size');
if (hasNextImage() || hasPrevImage()) {
echo "n";
if (hasNextImage()) {
$nextimg = $_zp_current_image->getNextImage();
echo " nextimg = new Image();n nextimg.src = "" . $nextimg->getSizedImage($size) . "";n";
}
if (hasPrevImage()) {
$previmg = $_zp_current_image->getPrevImage();
echo " previmg = new Image();n previmg.src = "" . $previmg->getSizedImage($size) . "";n";
}
echo "nn";
}
}
/**
* Returns the thumbnail of the previous image.
*
* @return string
*/
function getPrevImageThumb() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
$img = $_zp_current_image->getPrevImage();
return $img->getThumb();
}
/**
* Returns the thumbnail of the next image.
*
* @return string
*/
function getNextImageThumb() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
$img = $_zp_current_image->getNextImage();
return $img->getThumb();
}
/**
* Returns the url of the current image.
*
* @return string
*/
function getImageLinkURL() {
if(!in_context(ZP_IMAGE)) return false;
global $_zp_current_image;
return $_zp_current_image->getImageLink();
}
/**
* Prints the link to the current image.
*
* @param string $text text for the link
* @param string $title title tag for the link
* @param string $class optional style class for the link
* @param string $id optional style id for the link
*/
function printImageLink($text, $title, $class=NULL, $id=NULL) {
printLink(getImageLinkURL(), $text, $title, $class, $id);
}
/**
* Print the entire
for a thumbnail. If we are in sorting mode, then only
* the image is inserted, if not, then the hyperlink to the image is also added.
*
*
@author Todd Papaioannou (lucky@luckyspin.org)
*
@since 1.0.0
*/
function printImageDiv() {
if (!isset($_GET['sortable'])) {
echo '
';
}
printImageThumb(getImageTitle());
if (!isset($_GET['sortable'])) {
echo '';
}
}
/**
* Returns the EXIF infromation from the current image
*
*
@return array
*/
function getImageEXIFData() {
global $_zp_current_image;
return $_zp_current_image->getExifData();
}
/**
* Prints image data. Deprecated, use printImageMetadata
*
*/
function printImageEXIFData() { if (getImageVideo()) { } else { printImageMetadata(); } }
/**
* Prints the EXIF data of the current image
*
*
@param string $title title tag for the class
*
@param bool $toggle set to true to get a java toggle on the display of the data
*
@param string $id style class id
*
@param string $class style class
*/
function printImageMetadata($title='Image Info', $toggle=true, $id='imagemetadata', $class=null) {
global $_zp_exifvars;
if (false === ($exif = getImageEXIFData())) { return; }
$dataid = $id . &#`
Comments
Actually the problem I've encountered looked alike but is probably not the same: I've realized that my host only uses php 4.4.3 ... then I guess it's just a miracle that zenphoto-1.1.5 worked there (since the front page show php 4.10 as a requirement)
So in case anyone has a persistent problem with the foreach() loops begin given invalid arguments in version 1.1.6, it might be good to know that the previous version (1.1.5) may work well anyway.
http://tibonihoo.free.fr/zenphoto/
However for other reasons, I've transfered my site on an other host, where the newest version of zenphot works pretty well (of course ). And I'm afraid I won't be able to help much on this.
Thanks for your replies !
We can put a test in to prevent the error, but other things will not work right if `glob()` is not functioning.
Maybe you shouldn't lose too much time on this, though, especially if I'm the only one to have the problem, since my host recently messed up my db in a very strange way and I don't know what else they have done (my wordpress installation is also kind of broken and the db does not seem to be the only problem)
Same thing here, on the same host (free.fr) and put define('SAFE_GLOB', true); in function.php work like a charm
Thanks for zenphoto... really (u rock:)