'photos_image_page', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('imageView', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.image.inc', ); $items['photos/image/%/vote/%'] = array( 'page callback' => 'photos_image_vote', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('imageView', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.image.inc', ); $items['photos/image/%/update'] = array( 'page callback' => 'photos_edit_update', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('imageEdit', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.edit.inc', ); $items['photos/image/%/to_sub'] = array( 'title' => 'To sub-album', 'page callback' => 'photos_edit_to_sub', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('imageEdit', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.edit.inc', ); $items['photos/image/%/delete'] = array( 'page callback' => 'photos_edit_delete', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('imageDelete', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.edit.inc', ); if(variable_get('photos_access_photos', 1)){ $items['photos/get/%/%'] = array( 'page callback' => 'photos_image_get', 'page arguments' => array(2, 3), 'access callback' => '_photos_access', 'access arguments' => array('imageView', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.image.inc', ); } $items['photos/album/%node'] = array( 'page callback' => 'photos_album_page', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('album', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.album.inc' ); $items['photos/sub_album/%node'] = array( 'page callback' => 'photos_sub_album_page', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('subAlbum', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.album.inc' ); $items['photos/album/%node/share'] = array( 'title' => 'Share code', 'page callback' => 'photos_album_share', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('album', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.album.inc' ); $items['photos/sub_album/%node/share'] = array( 'title' => 'Share code', 'page callback' => 'photos_album_share', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('subAlbum', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.album.inc' ); $items['node/%node/photos'] = array( 'title' => 'Images Management', 'page callback' => 'photos_edit_page', 'page arguments' => array(1), 'access callback' => 'node_access', 'access arguments' => array('update', 1), 'type' => MENU_LOCAL_TASK, 'file' => 'inc/photos.edit.inc', ); $items['node/%node/photos/cover/%'] = array( 'page callback' => 'photos_edit_cover', 'page arguments' => array(1, 4), 'access callback' => 'node_access', 'access arguments' => array('update', 1), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.edit.inc', ); $items['photos/zoom/%'] = array( 'page callback' => 'photos_down_page', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('imageView', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.down.inc', ); $items['photos/zoom/%/original'] = array( 'page callback' => 'photos_down_page', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('imageOrig', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.down.inc', ); $items['admin/settings/photos'] = array( 'title' => 'Photos upload', 'page callback' => 'drupal_get_form', 'page arguments' => array('photos_admin_settings'), 'access arguments' => array('administer nodes'), 'file' => 'inc/photos.admin.inc', ); $items['admin/settings/photos/update'] = array( 'title' => 'Batch update', 'page callback' => 'photos_admin_update', 'access arguments' => array('administer nodes'), 'file' => 'inc/photos.admin.inc', ); $items['photos/data/user/%user'] = array( 'page callback' => 'photos_data_user', 'page arguments' => array(3), 'access callback' => 'user_access', 'access arguments' => array('view photo'), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.data.inc', ); $items['photos/data/sub_album/%node/block_new'] = array( 'page callback' => 'photos_data_sub_block', 'page arguments' => array(3, 4), 'access callback' => 'node_access', 'access arguments' => array('view', 3), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.data.inc', ); $items['photos/data/sub_album/%node'] = array( 'page callback' => 'photos_data_album', 'page arguments' => array(3), 'access callback' => 'node_access', 'access arguments' => array('view', 3), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.data.inc', ); $items['photos/data/album/%node'] = array( 'page callback' => 'photos_data_album', 'page arguments' => array(3), 'access callback' => 'node_access', 'access arguments' => array('view', 3), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.data.inc', ); $items['photos'] = array( 'title' => 'Album photos', 'page callback' => 'photos_page_default', 'access arguments' => array('view photo'), 'file' => 'inc/photos.page.inc', ); $items['photos/image'] = array( 'title' => 'Latest images', 'page callback' => 'photos_page_image', 'access arguments' => array('view photo'), 'file' => 'inc/photos.page.inc', ); $items['photos/album'] = array( 'title' => 'Latest albums', 'page callback' => 'photos_page_album', 'access arguments' => array('view photo'), 'file' => 'inc/photos.page.inc', ); $items['photos/user/%user_uid_optional/image'] = array( 'title' => 'My images', 'title callback' => 'photos_page_title', 'title arguments' => array(2, t('images')), 'page callback' => 'photos_page_image', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('viewUser', 2), 'file' => 'inc/photos.page.inc', ); $items['photos/user/%user_uid_optional/album'] = array( 'title' => 'My albums', 'title callback' => 'photos_page_title', 'title arguments' => array(2, t('albums')), 'page callback' => 'photos_page_album', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('viewUser', 2), 'file' => 'inc/photos.page.inc', ); if(variable_get('photos_slide', 0)){ $items['photos/user/%user_uid_optional/slide'] = array( 'title' => 'My slide', 'title callback' => 'photos_page_title', 'title arguments' => array(2, t('slide')), 'page callback' => 'photos_page_slide', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('viewUser', 2), 'file' => 'inc/photos.data.inc', ); $items['photos/album/%node/slide'] = array( 'page callback' => 'photos_album_slide', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('album', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.album.inc' ); $items['photos/sub_album/%node/slide'] = array( 'page callback' => 'photos_album_slide', 'page arguments' => array(2), 'access callback' => '_photos_access', 'access arguments' => array('subAlbum', 2), 'type' => MENU_CALLBACK, 'file' => 'inc/photos.album.inc' ); } $items['photos/share'] = array( 'title' => 'Share code', 'page callback' => 'photos_share', 'access arguments' => array('create photo'), 'file' => 'inc/photos.page.inc', ); $items['photos/upload'] = array( 'title' => 'Image upload', 'page callback' => 'photos_edit_upload', 'access arguments' => array('create photo'), 'file' => 'inc/photos.edit.inc', 'weight' => 9, ); if(variable_get('photos_upzip', 0)){ $items['photos/import'] = array( 'title' => 'Import ZIP', 'page callback' => 'drupal_get_form', 'page arguments' => array('photos_admin_import'), 'access arguments' => array('administer nodes'), 'weight' => 10, 'file' => 'inc/photos.admin.inc', ); } return $items; } function photos_page_title($ac, $str){ if($ac->uid != $GLOBALS['user']->uid){ return t('@name\'s !str', array('@name' =>$ac->name, '!str' => $str)); }else{ return t('My !str', array('!str' => $str)); } } function photos_photos_access(){ if(variable_get('photos_access_photos', 0)){ if(arg(0) == 'photos' && arg(1) != 'get' && is_numeric(arg(2))){ switch(arg(1)){ case 'album': case 'sub-album': case 'zoom': case 'sub-slide': return arg(2); case 'image': return $GLOBALS['photos'][arg(2).'_pid']; } } if(arg(0) == 'photos' && arg(1) == 'data' && is_numeric(arg(3))){ return arg(3); } } } function _photos_access($type, $value, $id = 0){ //$value = $node or $user or $file->fid or $node->nid global $user; switch ($type) { case 'viewUser': return $value->uid && user_access('view photo') && user_access('create photo', $value); case 'imageOrig': if(!user_access('view original')) return false; case 'imageView': //$value = $file->fid if($user->uid == 1) return true; if(variable_get('photos_access_photos', 0)){ $node = _photos_access_pass_type($value, 1); if($node['view']['viewid'] != 3){ return node_access('view', (object)$node['node']); }else if($node['view']['pass'] == $_SESSION[$node['view']['nid'].'_'.session_id()] || !_photos_access_pass_validate($node)){ return true; } }else{ return user_access('view photo'); } break; case 'album': return ($value->type == 'photos') && node_access('view', $value); case 'subAlbum': return _photos_select_sub_album() && variable_get('photos_node_'.$value->type, 0) && node_access('view', $value); case 'imageEdit': if(!is_object($value)){ $value = db_fetch_object(db_query('SELECT r.format, n.* FROM {node} n INNER JOIN {node_revisions} r ON n.nid = r.nid INNER JOIN {x_image} x ON n.nid = x.pid WHERE x.fid = %d', $value)); } return node_access('update', $value) || node_access('delete', $value); case 'imageDelete': if(!is_object($value)){ $value = db_fetch_object(db_query('SELECT r.format, n.* FROM {node} n INNER JOIN {node_revisions} r ON n.nid = r.nid INNER JOIN {x_image} x ON n.nid = x.pid WHERE x.fid = %d', $value)); } return node_access('delete', $value); } } //hook_node_info function photos_node_info() { return array( 'photos' => array( 'name' => t('Album'), 'module' => 'photos', 'has_title' => true, 'title_label' => t('Album name'), 'has_body' => true, 'body_label' => t('Album description'), ) ); } //hook_perm function photos_perm() { return array('view photo', 'create photo', 'edit own photo', 'edit any photo', 'delete own photo', 'delete any photo', 'allowed to vote', 'view vote list', 'view original'); } //hook_access function photos_access($op, $node, $account) { switch($op){ case 'create': return user_access('create photo', $account); case 'update': return user_access('edit any photo', $account) || (user_access('edit own photo', $account) && ($account->uid == $node->uid)) ? true : NULL; break; case 'delete': return user_access('delete any photo', $account) || (user_access('delete own photo', $account) && ($account->uid == $node->uid)) ? true : NULL; } } //hook_form function photos_form(&$node) { require_once('inc/photos.form.inc'); return _photos_form($node); } //hook_nodeapi function photos_nodeapi(&$node, $op, $teaser, $page) { global $user; switch ($op) { case 'load': if($node->type == 'photos'){ $a = db_fetch_object(db_query('SELECT * FROM {x_album} WHERE pid = %d', $node->nid)); if($a->pid){ $info['album'] = unserialize($a->data); $info['album']['pid'] = $a->pid; $info['album']['count'] = $a->count; if($a->fid && $image = db_fetch_array(db_query('SELECT * FROM {files} WHERE fid = %d', $a->fid))){ $image = photos_get_info(0, $image); $info['album']['cover']['fid'] = $a->fid; $thumb = variable_get('photos_title_0', false); $info['album']['cover']['url'] = url($image['thumb'][$thumb]); $info['album']['cover']['view'] = theme('photos_imagehtml', $image['thumb'][$thumb], array('href' => 'photos/album/'.$node->nid, 'filename' => check_plain($node->title))); }else{ $image = db_fetch_array(db_query_range('SELECT f.* FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid WHERE p.pid = %d ORDER BY f.fid DESC', $node->nid, 0, 1)); if($image['fid']){ $image = photos_get_info(0, $image); $thumb = variable_get('photos_title_0', false); $info['album']['cover']['url'] = url($image['thumb'][$thumb]); $info['album']['cover']['view'] = theme('photos_imagehtml', $image['thumb'][$thumb], array('href' => 'photos/album/'.$node->nid, 'filename' => check_plain($node->title))); } } } }else if(variable_get('photos_node_'.$node->type, 0)){ $photo = db_fetch_object(db_query("SELECT cid, value FROM {x_count} WHERE cid = %d AND type = '%s'", $node->nid, 'node_node')); if($photo->cid) $info['subalbum']['count'] = $photo->value; } return $info; break; case 'view': if($node->album['pid']){ if($teaser){ $album = _photos_node_view($node, $node->album['teaser_display'], 'teaser'); }else{ $album = _photos_node_view($node, $node->album['page_display'], 'page'); } $node->content['album']['#value'] = $album ? $album: ''; } break; case 'validate': if($node->type == 'photos'){ $t = photos_user_count(); $t['rest'] ? form_set_error('title',t('You cannot create more albums.')) : NULL; if(preg_match('/[^0-9x]/i', $node->album['slide'])){ form_set_error('album][slide', t('Slide size is not correct.')); } if(preg_match('/[^0-9x]/i', $node->album['teaser_slide'])){ form_set_error('album][teaser_slide', t('Slide size is not correct.')); } if(preg_match('/[^0-9x]/i', $node->album['page_slide'])){ form_set_error('album][page_slide', t('Slide size is not correct.')); } } break; case 'insert': case 'update': if($node->type == 'photos'){ if(!$node->album['pid']){ db_query("INSERT INTO {x_album} (pid, data) VALUES (%d, '%s')", $node->nid, serialize($node->album)); }else{ db_query("UPDATE {x_album} SET data = '%s' WHERE pid = '%s'", serialize($node->album), $node->nid); } photos_set_count('user_album', $node->uid); } break; case 'delete': if($node->type == 'photos'){ if($node->album['count'] || !variable_get('photos_user_count_cron', 0)){ $result = db_query('SELECT f.fid, f.filepath FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid WHERE p.pid = %d', $node->nid); while($file = db_fetch_object($result)){ $msg[] = photos_file_del($file->fid, $file->filepath);//删除相册下所有图片 } if($msg[0]) { photos_set_count('user_image', $node->uid); drupal_set_message(t('%count images are deleted.', array('%count' => COUNT($msg)))); } } photos_set_count('user_album', $node->uid); db_query('DELETE FROM {x_album} WHERE pid = %d', $node->nid); } if(variable_get('photos_node_'.$node->type, 0)){ db_query('DELETE FROM {x_node} WHERE nid = %d', $node->nid);//移除节点下所有图片,图片仍存在于相册中 db_query('DELETE FROM {x_count} WHERE nid = %d', $node->nid);//移除统计记录 } break; } } //node_nodepai_view function _photos_node_view($node, $display, $type){ switch($display){ case 1: return $node->album['cover']['view']; case 2: $order = explode('|', ($node->album['imageorder'] ? $node->album['imageorder'] : variable_get('photos_display_imageorder', 'timestamp|desc'))); $order = _photos_order_value_change($order[0], $order[1]); $limit = $node->album[$type.'_viewnum'] ? $node->album[$type.'_viewnum'] :variable_get('photos_display_'.$type.'_viewnum', 10); $result = db_query_range('SELECT f.filepath, f.filemime, f.timestamp, f.filename, f.filesize, u.uid, u.name, p.* FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid INNER JOIN {users} u ON f.uid = u.uid WHERE p.pid = %d'. $order, $node->nid, 0, $limit); $i = 0; while($data = db_fetch_array($result)){ $album .= photos_get_info(0, $data, array('href' => 'photos/image/'.$data['fid'], 'label' => $node->album[$type.'_imagesize'] ? $node->album[$type.'_imagesize'] : variable_get('photos_display_'.$type.'_imagesize', 0))); ++$i; } if($i >= $limit) $album .= theme('more_link', url('photos/album/'.$node->nid), t('Album view')); return $album; case 3: if($type == 'teaser' && $node->album['teaser_slide']){ list($width, $height) = explode('x', $node->album['teaser_slide']); }else if($type == 'page' && $node->album['page_slide']){ list($width, $height) = explode('x', $node->album['page_slide']); }else{ list($width, $height) = explode('x', variable_get('photos_display_slide', '640x480')); } return dfgallery_html(array('url' => url("photos/data/album/$node->nid", array('absolute' => true, 'query' => array('type' => 'json.json'))), 'width' => $width, 'height' => $height));; } } //hook_user function photos_user($op, &$edit, &$ac) { global $user; switch ($op){ case 'view': if (user_access('view photo') || user_access('create photo', $ac)) { if($ac->album['album']['count']){ $item[] = l(t('There are !a albums in total', array('!a'=> $ac->album['album']['count'])), "photos/user/$ac->uid/album"); }else if($ac->uid == $user->uid){ $item[] = t('No alubms yet, ').l(t('Create album'), 'node/add/photos'); } if($ac->album['image']['count']){ $item[] = l(t('There are !a images in total', array('!a'=> $ac->album['image']['count'])), "photos/user/$ac->uid/image"); }else if($ac->uid == $user->uid){ $item[] = t('No images yet, ').l(t('Upload images'), 'photos/upload'); } if(variable_get('photos_slide', 0) && $ac->album['image']['count']){ $item[] = l(t('Slideshow'), "photos/user/$ac->uid/slide"); } if($item[0]){ $ac->content['summary']['photos'] = array( '#type' => 'user_profile_item', '#title' => t('Album image'), '#value' => theme('item_list', $item), '#attributes' => array('class' => 'photos'), ); } } break; case 'load': $ac->album['album']['count'] = photos_get_count('user_album',$ac->uid); $ac->album['image']['count'] = photos_get_count('user_image',$ac->uid); break; case 'insert': db_query("INSERT INTO {x_count} (cid, changed, type, value) VALUES (%d, 0, '%s', 0), (%d, 0, '%s', 0)", $ac->uid, 'user_album', $ac->uid, 'user_image'); } } //hook_comment function photos_comment(&$comment, $op) { switch ($op) { case 'insert': if($comment['photos_fid']){ db_query("INSERT INTO {x_vote} (fid, cid) VALUES (%d, %d)", $comment['photos_fid'], $comment['cid']); db_query('UPDATE {x_image} SET comcount = (SELECT COUNT(fid) FROM {x_vote} WHERE fid = %d) WHERE fid = %d', $comment['photos_fid'], $comment['photos_fid']); } break; case 'delete': db_query('DELETE FROM {x_vote} WHERE cid = %d', $comment->cid); break; } } //hook_link function photos_link($type, $node = NULL, $teaser = FALSE) { global $user; $links = array(); if(user_access('view photo') && ($node->subalbum['count'] || $node->album['count'])){ if($node->type == 'photos'){ $title = t('Album view'); $type = 'album'; }else{ $title = t('Sub-Album view'); $type = 'sub_album'; } $title = ($node->type == 'photos') ? t('Album view') : t('Sub-Album view'); $count = !empty($node->subalbum['count']) ? $node->subalbum['count']:$node->album['count']; $links['photos_album'] = array( 'title' => $title, 'href' => "photos/$type/$node->nid", 'attributes' => array('title' => t('A total of !count images', array('!count'=> $count))), ); if(variable_get('photos_slide', 0)){ $links['photos_slide'] = array( 'title' => t('Slideshow'), 'href' => "photos/$type/$node->nid/slide", ); } } if ($type == 'comment' && $node->comment) { if (arg(0) != 'photos' && $fid = db_result(db_query('SELECT fid FROM {x_vote} WHERE cid = %d', $node->cid))) { $links['link_photo'] = array( 'title' => t('View image'), 'href' => 'photos/image/'.$fid, 'fragment' => 'comment-'.$node->cid ); } } return $links; } //hook_form_alter function photos_form_alter(&$form, $form_state, $form_id) { if ($form_id == 'node_type_form' && isset($form['identity']['type']) && arg(3) != 'photos') { $form['photos'] = array( '#type' => 'fieldset', '#title' => t('Sub-Album settings'), '#collapsible' => TRUE, '#collapsed' =>true, ); $form['photos']['photos_node'] = array( '#type' => 'radios', '#title' => t('Sub-Album'), '#default_value' => variable_get('photos_node_'. $form['#node_type']->type, 0), '#options' => array(t('Disabled'), t('Enabled')), '#description' => t('Node will become a sub-album, you can upload images to the node.'), ); $form['photos']['photos_share'] = array( '#type' => 'radios', '#title' => t('Reference'), '#default_value' => variable_get('photos_share_'. $form['#node_type']->type, 1), '#options' => array(t('Disabled'), t('Enabled')), '#description' => t('After enable this, you can insert a reference of images from other albums to the node, but do not attach the image to the node.'), ); } if($form_id == 'comment_form'){ if(arg(0) == 'photos' && is_numeric(arg(2))){ $fid = arg(2); }else if(arg(1) == 'reply' && is_numeric(arg(3))){ $fid = db_result(db_query('SELECT fid FROM {x_vote} WHERE cid = %d', arg(3))); } $form['photos_fid'] = array( '#type' => 'hidden', '#default_value' => $fid, ); $form['#submit'] = array('photos_comment_form_submit'); } if (isset($form['type']) && isset($form['#node']) && user_access('view photo')) { $node = $form['#node']; if(variable_get('photos_share_'.$node->type, 0)){ $form['photos_share'] = array( '#title' => t('Insert image'), '#weight' => 0, '#type' => 'fieldset', '#collapsible' => TRUE, ); $form['photos_share']['share']['#value'] = '
'.l(t('Insert an existing image'), 'photos/share', array('query' => 'KeepThis=true&TB_iframe=true&height=450&width=650', 'attributes' => array('title' => t('Choose an image from my albums to insert into the node'), 'class' => 'thickbox'))).'('.l(t('Open a new window'), 'photos/share', array('attributes' => array('title' => t('Choose an image from my albums to insert into the node'), 'target' => '_blank'))).')
'; } } } //hook_form_submit function photos_comment_form_submit($form, &$form_state) { if(!$form_state['values']['photos_fid']){ comment_form_submit($form, &$form_state); }else{ _comment_form_submit($form_state['values']); if ($cid = comment_save($form_state['values'])) { $node = node_load($form_state['values']['nid']); $page = comment_new_page_count($node->comment_count, 1, $node); $form_state['redirect'] = array('photos/image/'.$form_state['values']['photos_fid'], $page, "comment-$cid"); return; } } } //image view next or prev function photos_image_pager($fid, $id, $type = 'pid') { switch($type){ case 'pid': $sql = 'p.pid'; break; case 'nid': $sql = 't.pid'; break; case 'uid': $sql = 'p.uid'; } $result = db_query(db_rewrite_sql('SELECT p.pid, f.filepath, f.fid, f.filename FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid WHERE '.$sql.' = %d ORDER BY f.fid DESC', 'p', 'pid'), $id); $stop = $t['prev'] = $t['next'] = 0; while ($image = db_fetch_array($result)) { if ($stop == 1) { $t['next'] = $image; $t['next_view'] = photos_get_info(0, $t['next'], array('label' => variable_get('photos_title_0', false))); $t['next_url'] = url('photos/image/'.$image['fid']); break; } if ($image['fid'] == $fid) { $t['current'] = $image; $t['current_view'] = photos_get_info(0, $t['current'], array('label' => variable_get('photos_title_0', false))); $stop = 1; } else { $t['prev'] = $image; } } if($t['prev']){ $t['prev_view'] = photos_get_info(0, $t['prev'], array('label' => variable_get('photos_title_0', false))); $t['prev_url'] = url('photos/image/'.$t['prev']['fid']); } return $t; } //hook_block function photos_block($op = 'list', $delta = 0, $edit = array()) { global $user; switch ($op) { case 'list': $blocks[0]['info'] = t('Latest images'); $blocks[1]['info'] = t('User\'s images'); $blocks[2]['info'] = t('Photo information'); $blocks[3]['info'] = t('Random images'); return $blocks; case 'configure': switch ($delta) { case '2': $form['photos_block_num_2'] = array('#type' => 'radios', '#title' => t('Show sub-album info'), '#default_value' => variable_get('photos_block_num_2', 1), '#options' => array(t('Disabled'), t('Enabled'))); break; default: $num = drupal_map_assoc(array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 40)); $form['photos_block_num_'.$delta] = array('#type' => 'select', '#title' => t('Show several images'), '#default_value' => variable_get('photos_block_num_'.$delta, 10), '#options' => $num); break; } return $form; case 'save': variable_set('photos_block_num_'.$delta, $edit['photos_block_num_'.$delta]); break; case 'view': $block = array(); $count = variable_get('photos_block_num_'.$delta, 10); switch ($delta) { case '0': if(user_access('view photo') && $content = _photos_block_image('latest', $count, 'photos/image')){ $block['subject'] = t('Latest images'); $block['content'] = $content; } return $block; case '1': if(arg(0) == 'photos'){ switch(arg(1)){ case 'image': $uid = db_result(db_query('SELECT uid FROM {files} WHERE fid = %d', arg(2))); break; case 'user': $uid = arg(2); } } if(arg(0) == 'node' && is_numeric(arg(1))){ $uid = db_result(db_query('SELECT uid FROM {node} WHERE nid = %d', arg(1))); } if($uid && ($content = _photos_block_image('user', $count, "photos/user/$uid/image", $uid))){ $block['subject'] = t('%name\'s images', array('%name' => $content[1])); $block['content'] = $content[0]; } return $block; case '2': if(arg(0)=='photos' && arg(1) == 'image' && is_numeric(arg(2))){ if($image = db_fetch_array(db_query(db_rewrite_sql('SELECT n.nid, n.title, f.timestamp, f.filemime, f.fid, u.name, u.picture, u.uid, p.count, p.comcount, p.exif, p.des FROM {x_image} p INNER JOIN {files} f ON p.fid = f.fid INNER JOIN {node} n ON p.pid = n.nid INNER JOIN {users} u ON f.uid = u.uid WHERE p.fid = %d'), arg(2)))){ $image['pager'] = photos_image_pager($image['fid'], $image['nid']); $item[] = l(t('Copy image to share code'), "photos/zoom/$image[fid]"); if($image['exif'] && variable_get('photos_exif', 0)){ $item[] = l(t('View image Exif information'), "photos/zoom/$image[fid]/exif"); } if(variable_get('photos_slide', 0)){ $image['slide_url'] = url('photos/album/'.$image['nid'].'/slide'); } $image['links'] = theme('item_list', $item); if(variable_get('photos_block_num_2', 0)){ $result = db_query_range('SELECT n.nid, n.title, u.uid, u.name FROM {node} n INNER JOIN {x_node} a ON n.nid = a.nid INNER JOIN {users} u ON n.uid = u.uid WHERE a.fid = %d ORDER BY n.nid DESC', $image['fid'], 0, 10); while($node = db_fetch_array($result)){ $image['sub_album'][$node['nid']] = $node; $image['sub_album'][$node['nid']]['geturl'] = url('photos/data/sub_album/'.$node['nid'].'/block_new/json.json'); $image['sub_album'][$node['nid']]['url'] = url('photos/sub_album/'.$node['nid']); $image['sub_album'][$node['nid']]['user'] = theme('username', (object)$node); $image['sub_album'][$node['nid']]['info'] = t('!name in !time to create', array('!name' => $node['name'], '!time' => format_date($image['timestamp'], 'small'))); } } $block['subject'] = t('Photo information'); $block['content'] = theme('photos_imageblock', $image); } } return $block; case '3': if(user_access('view photo') && $content = _photos_block_image('rand', $count)){ $block['subject'] = t('Random images'); $block['content'] = $content; } return $block; } } } //block view image function _photos_block_image($type, $limit, $url = 0, $uid = 0, $sort = ' f.fid DESC'){ switch($type){ case 'user': $where = ' WHERE f.uid = '.$uid; break; case 'rand': $sort = ' RAND()'; } $result = db_query_range(db_rewrite_sql('SELECT f.filepath, f.filemime, f.timestamp, f.filename, u.uid, u.name, p.* FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid INNER JOIN {users} u ON f.uid = u.uid'.$where.' ORDER BY'.$sort, 'p', 'pid'), $limit); while($images = db_fetch_array($result)){ $image[] = photos_get_info(0, $images); } if($image[0]['fid']){ $content = theme('photos_block', $image, 'image'); if($url && count($image) >= $limit){ $content .=theme('more_link', url($url), t('View more')); } if($type == 'user') { return array($content, $image[0]['name']); }else{ return $content; } } } //block view album function _photos_block_album($type, $limit, $url = 0, $uid = 0, $sort = ' n.nid DESC'){ switch($type){ case 'user': $where = ' WHERE n.uid = '.$uid; break; case 'rand': $sort = ' RAND()'; } $result = db_query_range(db_rewrite_sql('SELECT n.nid, n.title, p.count, p.fid, u.uid, u.name FROM {x_album} p INNER JOIN {node} n ON p.pid = n.nid INNER JOIN {users} u ON n.uid = u.uid'.$where.' ORDER BY'.$sort), $limit); $i = 0; while($node = db_fetch_object($result)){ if($node->fid){ $view = photos_get_info($node->fid, 0, array('href' => 'photos/album/'.$node->nid, 'filename' => $node->title)); }else{ $image = db_fetch_array(db_query_range('SELECT f.fid, f.filepath, f.filename FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid WHERE p.pid = %d ORDER BY f.fid DESC', $node->nid, 0, 1)); if($image['fid']){ $view = photos_get_info(0, $image, array('href' => 'photos/album/'.$node->nid, 'filename' => $node->title)); } } $album[] = array('node' => $node, 'view' => $view); ++$i; } if($i){ $content = theme('photos_block', $album, 'album'); if($url && $i >= $limit){ $content .=theme('more_link', url($url), t('View more')); } if($type == 'user') { return array($content, $album[0]['node']->name); }else{ return $content; } } } //hook_theme function theme_photos_block($images = array(), $type){ //print_r($images); //$type: latest user rand $label = variable_get('photos_title_0', false); switch($type){ case 'image': foreach($images as $image){ $item[] = theme('photos_imagehtml', $image['thumb'][$label], array('filename' => $image['filename']. ' - ' .t('By: @name', array('@name' => $image['name'])), 'href' => 'photos/image/'.$image['fid'])); } break; case 'album': foreach($images as $album){ $op['attributes']['title'] = $album['node']->count ? t('A total of @title images', array('@title' => $album['node']->count)) : t('Album is empty'); $item[] = $album['view'] . '
' . l($album['node']->title, 'node/'.$album['node']->nid, $op).'
'; } } return theme('item_list', $item); } //图片删除 function photos_file_del($fid, $filepath = 0, $count = 0) { if(!$filepath){ if($count){ $file = db_fetch_object(db_query('SELECT f.uid, f.filepath, p.pid FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid WHERE f.fid = %d', $fid)); $filepath = $file->filepath; }else{ $filepath = db_result(db_query('SELECT filepath FROM {files} WHERE fid = %d', $fid)); } } if($filepath){ $filename = end(explode('/', $filepath)); $thumb = str_replace($filename, 'thumb_'.$fid, $filepath); if(is_dir($thumb)){ if($objs = glob($thumb.'/*')){ foreach($objs as $obj) { is_dir($obj) ? @rmdir($obj) : @unlink($obj); } } @rmdir($thumb); } @unlink($filepath); if(variable_get('photos_comment', 0)){ db_query('DELETE FROM {comments} WHERE cid IN (SELECT cid FROM {x_vote} WHERE fid = %d)', $fid); } db_query('DELETE FROM {x_image} WHERE fid = %d', $fid); db_query('DELETE FROM {x_node} WHERE fid = %d', $fid); db_query('DELETE FROM {x_vote} WHERE fid = %d', $fid); if($count){ photos_set_count('node_album', $file->pid); photos_set_count('user_image', $file->uid); _comment_update_node_statistics($file->pid); } return db_query('DELETE FROM {files} WHERE fid = %d', $fid); }else{ return false; } } //缩略图存储处理 function photos_image_crop($v = array()) { $i = image_get_info($v['path']); if ($i || !empty($i['extension'])) { $a = 0; $n = end(explode('/', $v['path'])); if(!$v['size']){ $info = photos_upload_info(0); $size = $info['size']; }else{ $size = $v['size']; } $thumbpath = photos_check_path('thumb', array($v['path'], $v['fid']), $v['privacy']); foreach($size as $t){ if($i['width'] > $t['w'] || $i['height'] > $t['h']){ if(!$t['l']){ $thumb = $t['w'] .'x'. $t['h'] . '_'. $t['r'].'_thumb_'; }else{ $thumb = $t['l']; } switch($t['r']){ case 'scale': image_scale_and_crop($v['path'], $thumbpath.'/'.$thumb . $n, $t['w'], $t['h']); $a++; break; case 'resize': image_resize($v['path'], $thumbpath.'/'.$thumb . $n, $t['w'], $t['h']); $a++; break; case 'crop': default: image_scale($v['path'], $thumbpath.'/'.$thumb . $n, $t['w'], $t['h']); $a++; break; } } } } return $a; } //获取缩略图地址。 function photos_get_thumb($filepath, $fid, $thumb, $set = 0){ if(is_file($filepath) && $thumb){ $filename = end(explode('/', $filepath)); $thumblabel = $thumb['w'] . 'x' . $thumb['h']. '_' . $thumb['r'].'_thumb'; $thumbfilepath = str_replace($filename, 'thumb_'.$fid.'/'.$thumblabel . '_' . $filename, $filepath); if(!$set || is_file($thumbfilepath)){ return $thumbfilepath; } $image = image_get_info($filepath); if($set && ($image['width'] > $thumb['w'] || $image['height'] > $thumb['h'])){ if(photos_image_crop(array('path' => $filepath, 'fid' => $fid, 'size' => array(array('t' => $t, 'w' => $thumb['w'], 'h' => $thumb['h'], 'r' => $thumb['r']))))){ return $thumbfilepath; } }else{ return $filepath; } } return false; } //存储路径 //$type: cache or thumb, $fid, function photos_check_path($type = 'default', $file = false, $ac = false) { if(!$ac) $ac = $GLOBALS['user']; $path = array(); switch($type){ case 'thumb': $filename = end(explode('/', $file[0])); $t = str_replace('/'.$filename, '', $file[0]).'/thumb_'. $file[1]; if (!file_check_directory($t, FILE_CREATE_DIRECTORY)) { return false; } return $t; case 'default': if(variable_get('photos_path', 'photos')){ $mm = format_date(time(), 'custom', "Y|m|d"); $m = explode('|', $mm); $a = array('%uid' => $ac->uid, '%username' => $ac->name, '%Y' => $m[0], '%m' => $m[1], '%d' => $m[2]); $b = strtr(variable_get('photos_path', 'photos'), $a); $path = explode('/',$b); }else{ $path[] = 'photos'; } break; } $dirs = array(); foreach($path as $folder) { $dirs[] = $folder; $t = file_create_path(file_directory_path().'/' .implode('/', $dirs)); if (!file_check_directory($t, FILE_CREATE_DIRECTORY)) { return false; } } return $t; } //存储处理信息 function photos_upload_info($t = 'd') { $info = variable_get('photos_size', false); if(is_array($info)){ if($t){ usort($info, '_photos_cmp'); }else{ usort($info, '_photos_cmpt'); } $v['count'] = count($info); $v['size'] = $info; return $v; } return false; } function _photos_cmp($a, $b){ if ($a['w'] == $b['w']) { if($a['h'] != $b['h']){ return ($a['h'] > $b['h']) ? -1 : 1; } return 0; } return ($a['w'] > $b['w']) ? -1 : 1; } function _photos_cmpt($a, $b){ if ($a['w'] == $b['w']) { if($a['h'] != $b['h']){ return ($a['h'] < $b['h']) ? -1 : 1; } return 0; } return ($a['w'] < $b['w']) ? -1 : 1; } //user albums function _photos_useralbum_option($uid = 0, $current = 0) { if(!$uid) $uid = $GLOBALS['user']->uid; $output = array(); if(arg(1) == 'quote' && $_GET['type'] != 'upload'){ $choice = new stdClass(); $choice->option = array(t('All albums')); $output[] = $choice; } $result = db_query('SELECT n.nid, n.title FROM {node} n INNER JOIN {x_album} a ON a.pid = n.nid WHERE n.uid = %d ORDER BY n.nid ASC', $uid); $true = false; while ($a = db_fetch_object($result)) { $choice = new stdClass(); $choice->option = array($a->nid => $a->title); $output[] = $choice; $true = true; }; if($current){ $choice = new stdClass(); $choice->option = array($current[0] => $current[1]); $output[] = $choice; } if(!$true){ $output = array(t('You do not have an album yet.')); } return $output; } //图片写入数据库 function photos_image_date($file, $title = 0){ $exif = ($file->filemime == 'image/jpeg') ? 1 : 0; if($file->fid && $file->pid && db_query("INSERT INTO {x_image} (fid, pid, des, wid, comcount, count, exif) VALUES (%d, %d, '%s', %d, 0, 0, %d)",$file->fid, $file->pid, $file->des, $file->wid, $exif)){ if(!variable_get('photos_thumb_create_time', 0)){ photos_image_crop(array('path' => $file->filepath, 'fid' => $file->fid)); } if($file->nid){ db_query('INSERT INTO {x_node} (nid, fid) VALUES (%d, %d)', $file->nid, $file->fid); } if(variable_get('photos_user_count_cron', 1)){ photos_set_count('user_image', ($file->uid ? $file->uid : $GLOBALS['user']->uid)); photos_set_count('node_album', $file->pid); $file->nid ? photos_set_count('node_node', $file->nid) : NULL; } if($title){ db_query("UPDATE {files} SET status = 1, filename = '%s' WHERE fid = %d", $file->title, $file->fid); } return true; }else{ return false; } } //根据名称获取缩略图信息 function _photos_get_thumbname($name){ $t = photos_upload_info(0); foreach($t['size'] as $c){ if($c['name'] == $name){ return $c; } } } //获取图片相关信息 function photos_get_info($fid, $image = 0, $view = 0, $all = 0){ if($fid){ if(!$all){ $image = db_fetch_array(db_query('SELECT fid, filepath, filename FROM {files} WHERE fid = %d', $fid)); }else{ $image = db_fetch_array(db_query('SELECT f.filepath, f.filemime, f.timestamp, f.filename, n.title, u.uid, u.name, p.* FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid INNER JOIN {node} n ON p.pid = n.nid INNER JOIN {users} u ON f.uid = u.uid WHERE p.fid = %d', $fid)); } } if($image['fid']){ $sizes = photos_upload_info(0); if(variable_get('photos_access_photos', 0)){ $image['original'] = 'photos/get/'.$image['fid'] .'/original/'.$image['filepath']; foreach($sizes['size'] as $thumb){ $image['thumb'][$thumb['name']] = 'photos/get/'.$image['fid'] .'/'.$thumb['name'].'/'.photos_get_thumb($image['filepath'], $image['fid'], $thumb); } }else{ $image['original'] = $image['filepath']; foreach($sizes['size'] as $thumb){ $image['thumb'][$thumb['name']] = photos_get_thumb($image['filepath'], $image['fid'], $thumb, 1); } } if($view){ if(!$view['filename']) $view['filename'] = $image['filename']; if($view['label'] && in_array($view['label'], _photos_labels($sizes['size']))){ $label = $view['label']; }else{ $label = variable_get('photos_title_0', false); } if($view['link']){ $view['href'] = 'photos/image/'.$image['fid']; } return theme('photos_imagehtml', $image['thumb'][$label], $view); } if($image['des']) $image['des'] = check_markup($image['des'], 0, FALSE); } return $image; } //获取相册或图片数量 function photos_get_count($type, $id = 0){ switch ($type){ case 'user_album': case 'user_image': case 'site_album': case 'site_image': case 'node_node': return db_result(db_query("SELECT value FROM {x_count} WHERE cid = %d AND type = '%s'", $id, $type)); case 'node_album': return db_result(db_query("SELECT count FROM {x_album} WHERE pid = %d", $id)); } } //计算数量 function photos_set_count($type, $id = 0){ switch($type){ case 'user_image': $count = db_result(db_query('SELECT count(x.fid) FROM {x_image} x INNER JOIN {files} f ON x.fid = f.fid WHERE f.uid = %d', $id)); db_query("UPDATE {x_count} SET value = %d, changed = %d WHERE cid = %d AND type = '%s'", $count, time(), $id, $type); if (!db_affected_rows()) { db_query("INSERT INTO {x_count} (cid, changed, type, value) VALUES (%d, %d, '%s', %d)", $id, time(), 'user_image', $count); } break; case 'user_album': $count = db_result(db_query('SELECT count(x.pid) FROM {x_album} x INNER JOIN {node} n ON x.pid = n.nid WHERE n.uid = %d', $id)); db_query("UPDATE {x_count} SET value = %d, changed = %d WHERE cid = %d AND type = '%s'", $count, time(), $id, $type); if (!db_affected_rows()) { db_query("INSERT INTO {x_count} (cid, changed, type, value) VALUES (%d, %d, '%s', %d)", $id, time(), 'user_album', $count); } break; case 'site_album': $count = db_result(db_query('SELECT COUNT(pid) FROM {x_album}')); db_query("UPDATE {x_count} SET value = %d, changed = '%s' WHERE cid = 0 AND type = '%s'", $count, time(), $type); if (!db_affected_rows()) { db_query("INSERT INTO {x_count} (cid, changed, type, value) VALUES (0, %d, '%s', %d)", time(), 'site_album', $count); } break; case 'site_image': $count = db_result(db_query('SELECT COUNT(fid) FROM {x_image}')); db_query("UPDATE {x_count} SET value = %d, changed = '%s' WHERE cid = 0 AND type = '%s'", $count, time(), $type); if (!db_affected_rows()) { db_query("INSERT INTO {x_count} (cid, changed, type, value) VALUES (0, %d, '%s', %d)", time(), 'site_image', $count); } break; case 'node_node': $count = db_result(db_query('SELECT COUNT(nid) FROM {x_node} WHERE nid = %d', $id)); db_query("UPDATE {x_count} SET value = %d, changed = %d WHERE cid = %d AND type = '%s'", $count, time(), $id, $type); if (!db_affected_rows()) { db_query("INSERT INTO {x_count} (cid, changed, type, value) VALUES (%d, %d, '%s', %d)", $id, time(), 'node_node', $count); } break; case 'node_album': db_query("UPDATE {x_album} SET count = (SELECT COUNT(fid) FROM {x_image} WHERE pid = %d) WHERE pid = %d", $id, $id); } } //hook_cron //2009/2/15 23:17 function photos_cron(){ _photos_res_count(1); } function _photos_res_count($cron = 0){ photos_set_count('site_album'); photos_set_count('site_image'); $time = $cron ? 7200 : 0; if((time() - variable_get('cron_last', 0)) > $time){ $result = db_query('SELECT uid FROM {users} WHERE uid != 0'); while($t = db_fetch_object($result)){ photos_set_count('user_image', $t->uid); photos_set_count('user_album', $t->uid); } $result = db_query('SELECT pid FROM {x_album}'); while($t = db_fetch_object($result)){ photos_set_count('node_album', $t->pid); } $result = db_query('SELECT DISTINCT(nid) FROM {x_node}'); while($t = db_fetch_object($result)){ photos_set_count('node_node', $t->nid); } } } //hook_init function photos_init() { drupal_add_js(drupal_get_path('module', 'photos').'/js/photos.js'); drupal_add_js(drupal_get_path('module', 'photos').'/js/jquery.jeditable.pack.js'); drupal_add_js(drupal_get_path('module', 'photos').'/thickbox/thickbox-compressed.js'); drupal_add_css(drupal_get_path('module', 'photos').'/thickbox/thickbox.css'); drupal_add_css(drupal_get_path('module', 'photos').'/css/photos.css'); } //hook_theme function photos_theme() { return array( 'photos_editlist_x' => array( 'arguments' => array('form' => NULL), ), 'photos_comment_count' => array( 'arguments' => array('comment' => NULL, 'url' => NULL), ), 'photos_default' => array( 'template' => 'tpl/photos_default', 'arguments' => array('content' => NULL), ), 'photos_down' => array( 'template' => 'tpl/photos_down', 'arguments' => array('content' => NULL, 'type' => NULL), ), 'photos_slide' => array( 'template' => 'tpl/photos_slide', 'arguments' => array('content' => NULL), ), 'photos_imageview' => array( 'template' => 'tpl/photos_imageview', 'arguments' => array('image' => NULL, 'type' => NULL), ), 'photos_imageblock' => array( 'template' => 'tpl/photos_imageblock', 'arguments' => array('image' => NULL), ), 'photos_block' => array( 'arguments' => array('images' => NULL, 'type' => NULL), ), 'photos_albumview' => array( 'template' => 'tpl/photos_albumview', 'arguments' => array('album' => NULL, 'node' => NULL), ), 'photos_albumlist' => array( 'template' => 'tpl/photos_albumlist', 'arguments' => array('image' => NULL), ), 'photos_albumlinks' => array( 'template' => 'tpl/photos_albumlinks', 'arguments' => array('links' => NULL), ), 'photos_imagehtml' => array( 'template' => 'tpl/photos_imagehtml', 'arguments' => array('imagepath' => NULL, 'image' => NULL), ), 'photos_exif' => array( 'template' => 'tpl/photos_exif', 'arguments' => array('exif' => NULL, 'type' => NULL), ), 'photos_print' => array( 'template' => 'tpl/photos_print', 'arguments' => array('content' => NULL, 'type' => NULL), ), 'photos_share' => array( 'template' => 'tpl/photos_share', 'arguments' => array('images' => NULL, 'type' => NULL), ), 'photos_vote' => array( 'template' => 'tpl/photos_vote', 'arguments' => array('fid' => NULL), ), ); } function template_preprocess_photos_vote(&$variables) { global $user; if($variables['fid']){ $fid = $variables['fid']; $x = votingapi_select_votes(array('uid' => $user->uid, 'content_type' => 'image', 'content_id' => $fid)); if(!user_access('allowed to vote')){ $variables['vote']['access'] = true; $variables['vote']['down']['#href'] = $variables['up']['#href'] = url('user/login', array('query' => drupal_get_destination())); $variables['vote']['down']['#title'] = $variables['up']['#title'] = t('Login to vote'); }else{ if($x['0']['value'] == 1) { $down_href = url("photos/image/$fid/vote/down", array('query' => drupal_get_destination())); }else if($x['0']['value'] == -1){ $up_href = url("photos/image/$fid/vote/up", array('query' => drupal_get_destination())); }else{ $down_href = url("photos/image/$fid/vote/down", array('query' => drupal_get_destination())); $up_href = url("photos/image/$fid/vote/up", array('query' => drupal_get_destination())); } $variables['vote']['up'] = array( '#title' => t('I like this image'), '#href' => $up_href ); $variables['vote']['down'] = array( '#title' => t('I do not like this image'), '#href' => $down_href ); } $sum = votingapi_recalculate_results('image', $fid); if($sum['0']['value']){ $t_sum = $sum['2']['value']; $t_average = $sum['1']['value']; $t_count = $sum['0']['value']; }else{ $t_count = $t_sum = 0; } $variables['vote']['count'] = array('#count' => $t_count, '#sum' => $t_sum, '#average' => $t_average, '#title' => t('View voting users')); if(user_access('view vote list')){ $variables['vote']['count']['#href'] = url("photos/zoom/$fid/vote"); } } } //文件随机重命名 //2009/2/15 16:21 function _photos_rename($name = 0, $ext = 0){ if(variable_get('photos_rname', 0)){ if($name){ return round(rand(15770,967049700)).time().'.'.($ext ? $ext : end(explode('.',$name))); } if (!empty($_FILES['files'])) { foreach ($_FILES['files']['name'] as $field => $filename) { $_FILES['files']['name'][$field] = round(rand(15770,967049700)).time().'.'. ($ext ? $ext : end(explode('.',$filename))); } } }else if($name){ return $name; } } //hook_theme function theme_photos_comment_count($comcount, $url = 0){ if(!$comcount){ if (!user_access('post comments')) { $comment = t('Login to post comments', array('@login' => url('user/login', array('query' => drupal_get_destination())))); }else{ $comment = '' .t('Add new comment'). ''; } }else if($comcount > 1){ $comment = '' .t('!con comments',array('!con' => $comcount)). ''; }else{ $comment = '' .t('!con comment',array('!con' => $comcount)). ''; } return $comment; } //解压zip function _photos_unzip($source, $value, $limits = false) { global $user; if (version_compare(PHP_VERSION, '5') >= 0) { if(!is_file($source)){ return t('Compressed file does not exist, please check the path: ').$source; } $type = array('jpg', 'gif', 'png', 'jpeg', 'JPG', 'GIF', 'PNG', 'JPEG'); $zip = new ZipArchive(); if ($zip->open($source)) { for ($x = 0; $x < $zip->numFiles; ++$x) { $image = $zip->statIndex($x); $ext = end(explode('.',$image['name'])); if(in_array($ext, $type)){ $path = file_create_filename(_photos_rename($image['name'], $ext), photos_check_path()); if($filepath = file_save_data($zip->getFromIndex($x), $path)){ $info = image_get_info($filepath); $file = new stdClass(); $file = $value; $file->uid = $user->uid; $file->filepath = $filepath; if($limits['resolution']){ list($width, $height) = explode('x', $limits['resolution']); if ($info['width'] > $width || $info['height'] > $height) { image_scale($filepath, $filepath, $width, $height); } } $file->filesize = $info['file_size']; $file->filename = $value->title ? $value->title : $image['name']; $file->filemime = $info['mime_type']; if($file->fid = _photos_save_data($file)){ if(photos_image_date($file)) $msg[] = 1; } } } } $zip->close(); file_delete($source); $message = t('To extract the success of %num image',array('%num' => count($msg))); } else { $message = t('Compressed file does not exist, please check the path: '). $source; } } return $message; } //写入files function _photos_save_data($file, $val = array()){ $errors = array(); foreach ($val as $function => $args) { array_unshift($args, $file); $errors = array_merge($errors, call_user_func_array($function, $args)); } if (!empty($errors)) { $message = t('The selected file %name could not be uploaded.', array('%name' => $file->filename)); if (count($errors) > 1) { $message .= ''; } else { $message .= ' '. array_pop($errors); } drupal_set_message($message); return 0; } db_query("INSERT INTO {files} (fid, uid, filename, filepath, filesize, filemime, status, timestamp) VALUES (NULL, %d, '%s', '%s', %d, '%s', 1, %d)", $file->uid, $file->filename, $file->filepath, $file->filesize, $file->filemime, time()); return db_last_insert_id('files', 'fid'); } function _photos_check_image($fid){ return db_fetch_object(db_query('SELECT * FROM {x_image} WHERE fid = %d', $fid)); } function _photos_node_title($nid){ return db_result(db_query('SELECT title FROM {node} WHERE nid = %d', $nid)); } function _photos_l($path) { return $GLOBALS['base_url'] . '/'. trim($path); } function _photos_breadcrumb($v = array()){ if($v){ $b[] = l(t('Home'), NULL); foreach ($v as $t){ $b[] = $t; } }else{ foreach (drupal_get_breadcrumb() as $t){ $b[] = $t; } $b[] = drupal_get_title(); } return drupal_set_breadcrumb($b); } //json转换,未启用json扩展则调用son-php4.php //2009/2/14 17:29 function _photos_json($type, $v){ if(function_exists('json_decode')){ if($type == 'en'){ return json_encode($v); }else{ return json_decode($v); } }else{ require_once('php/json-php4.php'); $json = new Services_JSON(); if($type == 'en'){ return $json->encode($v); }else{ return $json->decode($v); } } } //用户可创建和已创建的相册数量 //2009/2/14 17:29 function photos_user_count(){ global $user; $array = array_keys($user->roles); $t['create'] = photos_get_count('user_album', $user->uid); $t['total'] = variable_get('photos_pnum_'.$array[0], 20); $t['remain'] = ($t['total'] - $t['create']); if($user->uid != 1 && $t['remain'] <= 0){ $t['rest'] = 1; } return $t; } function _photos_order_value($field, $sort, $limit, $default = 0){ if(!$field && !$sort){ $t['order'] = !$default ? ' ORDER BY f.fid DESC': $default; }else{ if(!$t['order'] = _photos_order_value_change($field, $sort)){ $t['order'] = !$default ? ' ORDER BY f.fid DESC': $default; } } if($limit){ if(!$show = intval($_GET['limit'])){ if($_GET['destination']){ $str = urldecode($_GET['destination']); if(preg_match('/.*limit=(\d*).*/i', $str, $mat)) $show = intval($mat[1]); } } $t['limit'] = $show ? $show : $limit; } return $t; } function _photos_order_value_change($field, $sort){ $array = array('weight' => 'p.wid', 'timestamp' => 'f.fid', 'comments' => 'p.comcount', 'visits' => 'p.count', 'filesize' => 'f.filesize'); $array1 = array('desc' => 'desc', 'asc' => 'asc'); if($array[$field] && $array1[$sort]){ return " ORDER BY $array[$field] $array1[$sort]". ($array[$field] != 'f.fid' ? ', f.fid DESC' : NULL); } } function _pager_get_querystring() { static $string = NULL; if (!isset($string)) { $string = drupal_query_string_encode($_REQUEST, array_merge(array('limit', 'q', 'page', 'destination'), array_keys($_COOKIE))); } return $string; } function _photos_order_link($arg, $count = 0, $link = 0, $limit = 0){ $field = array( 'weight' => t('By weight'), 'timestamp' => t('By time'), 'comments' => t('By comments '), 'visits' => t('By visits'), 'filesize' => t('By filesize') ); if($limit){ $query = _pager_get_querystring(); $links['limit'] = l(t('Default'), $_GET['q'], array('query' => ($query ? $query: NULL))); if(!is_array($limit)){ $limit = array(5, 10, 20, 30, 40, 50); } foreach($limit as $tt){ $links['limit'] .= l($tt, $_GET['q'], array('query' => ($query ? $query .'&': NULL).'limit='.$tt, 'attributes' => array('class' => ($_GET['limit'] == $tt) ? 'orderac': NULL))); } } $links['count'] = $count; $links['link'] = $link ? $link: NULL; $links['sort'] = l(t('Default'), $arg); foreach ($field as $key => $t){ if($_GET['field'] != $key){ $sort = 'desc'; $class = 'photos_order_desc'; array('attributes' => array('class' => 'photos_order_desc')); }else if($_GET['sort'] == 'desc'){ $sort = 'asc'; $class = 'photos_order_desc orderac'; }else{ $sort = 'desc'; $class = 'photos_order_asc orderac'; } $links['sort'] .= l($t, $arg, array('query' => array('sort' => $sort, 'field' => $key), 'attributes' => array('class' => $class))); } return theme('photos_albumlinks', $links); } function _photos_order_label(){ return array( 'timestamp|desc' => t('Date - newest first'), 'timestamp|asc' => t('Date - oldest first'), 'weight|desc' => t('Weight - smallest first'), 'weight|asc' => t('Weight - largest first'), 'comments|desc' => t('Comments - most first'), 'comments|asc' => t('Comments - least first'), 'filesize|desc' => t('Filesize - smallest first'), 'filesize|asc' => t('Filesize - largest first'), 'visits|desc' => t('Visits - most first'), 'visits|asc' => t('Visits - least first') ); } function _photos_select_size($none = 0){ if($none) $v[] = 'Do not show'; $info = photos_upload_info(0); foreach($info['size'] as $size){ $v[$size['name']] = $size['name'].'('.$size['w'].'x'.$size['w'].')'; } return $v; } function _photos_labels($sizes = 0){ if(!$sizes) { $t = photos_upload_info(0); $sizes = $t['size']; } foreach($sizes as $size){ $label[] = $size['name']; } return $label; } //hook_filter function photos_filter($op, $delta = 0, $format = -1, $text = "") { switch ($op) { case 'list': return array(0 => t('Insert image and album')); case 'description': return t('photos.module filter format, at the node to insert images or albums. e.g: [photo=image]id=55,54,53,52|algin=right[/photo] or [photo=album]id=134[/photo] or [photo=album]id=134|limit=6[/photo]. '); case 'process': return photos_filter_process($text); default: return $text; } } function _photos_select_sub_album(){ $types = node_get_types(); foreach ($types as $type){ if(variable_get('photos_node_'.$type->type, 0)){ $t[] = "'".$type->type."'"; } } return $t; } //hook_filter_tips function photos_filter_tips($delta, $format, $long = FALSE) { switch ($long) { case 0: return t('Insert an image: [photo=image]id=55[/photo], Insert multiple images: [photo=image]id=55,56,57,58[/photo], Insert album: [photo=album]id=10[/photo]. '); case 1: $t = '

'.t('Insert image and album').'

'; $item[] = t('Insert an image: [photo=image]id=55[/photo].'); $item[] = t('Insert multiple images: [photo=image]id=55,56,57,58,59[/photo].'); $item[] = t('Optional attributes: algin, e.g: [photo=image]id=55|algin=left[/photo] or [photo=image]id=55,56,57|algin=right[/photo].'); $t .= theme('item_list', $item, t('Insert image')); $item = array(); $item[] = t('Insert album: [photo=album]id=10[/photo].The default display album cover. You can change, please configure the "limit" property. '); $item[] = t('Optional attributes: algin or limit, e.g: [photo=album]id=10|algin=left[/photo] or [photo=album]id=10|algin=right|limit=5[/photo].'); $t .= theme('item_list', $item, t('Insert album')); $t .= t('This is similar to bbcode, do not seem friendly, You can try visualization interface: !url', array('!url' => l(t('Click to here'), 'photos/share'))); return $t; } } function photos_filter_process($text) { $text = ' '. $text .' '; $text = preg_replace_callback('/\[photo=(.*?)\](.*?)\[\/photo\]/ms', '_photos_filter_process', $text); $text = substr($text, 1, -1); return $text; } function _photos_filter_process($mat) { if($mat[1] == 'image' || $mat[1] == 'album'){ $algin = array('left' => 'photos_filter_left', 'right' => 'photos_filter_right', 'center' => 'photos_filter_center'); $array = explode('|', $mat[2]); if(is_array($array)){ foreach($array as $setting){ $t = explode('=', $setting); $set[$t[0]] = $t[1]; } } $set['link'] = 1; if($set['id']){ if(preg_match('/[^\d,]/i', $set['id'])){ return; }else if(!strstr($set['id'], ',')){ if($mat[1] == 'image'){ $value = photos_get_info($set['id'], 0, $set); }else{ $album = db_fetch_object(db_query('SELECT p.pid, p.fid FROM {x_album} p WHERE pid = %d', $set['id'])); if($album->pid){ if($set['limit'] && intval($set['limit']) == $set['limit']){ $limit = ($set['limit'] > 10) ? 10 : $set['limit']; $result = db_query_range('SELECT f.fid, f.filepath, f.filename FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid WHERE p.pid = %d ORDER BY f.fid DESC', $album->pid, 0, $limit); while($image = db_fetch_array($result)){ $value .= photos_get_info(0, $image, $set); } }else if($album->fid){ $set['link'] = 0; $set['href'] = 'photos/album/'.$album->pid; $value = photos_get_info($album->fid, 0, $set); }else{ $set['link'] = 0; $set['href'] = 'photos/album/'.$album->pid; $image = db_fetch_array(db_query_range('SELECT f.fid, f.filepath, f.filename FROM {files} f INNER JOIN {x_image} p ON f.fid = p.fid WHERE p.pid = %d ORDER BY f.fid DESC', $album->pid, 0, 1)); $value = photos_get_info(0, $image, $set); } } } }else if($mat[1] == 'image'){ $result = db_query('SELECT fid, filepath, filename FROM {files} WHERE fid IN ('.$set['id'].')'); while($image = db_fetch_array($result)){ $value .= photos_get_info(0, $image, $set); } } if($value){ $output = $algin[$set['algin']] ? '
' : ''; $output .= $value; $output .= $algin[$set['algin']] ? '
' : ''; return $output; } } } }