Создание личных фотоальбомов, перед загрузкой фото

#1 7 мая 2012 в 19:46
Здравствуйте уважаемое сообщество!!!
возникла необходимость сделать создание личных фотоальбомов перед загрузкой фотографий)))
что сделал:
в components/users/frontend.php добавил
  1. /////////////////////////////// new album /////////////////////////////////////////////////////////////////////////////////////////
  2. if ($do=='new_album'){
  3. if (!$inUser->id) { cmsUser::goToLogin(); }
  4.  
  5. if ($id != $inUser->id) { cmsCore::error404(); }
  6. if ($inCore->inRequest('submit')){
  7.  
  8. $new_album = $inCore->request('new_album', 'int', 0);
  9. $album['user_id'] = $id;
  10. $album['title'] = $inCore->request('album_title', 'str', $_LANG['PHOTOALBUM'].' '.date('d.m.Y'));
  11. $album['allow_who'] = $inCore->request('album_allow_who', 'str', 'all');
  12. $album_id = $model->addPhotoAlbum($album);
  13. }
  14. $inPage->addPathway($_LANG['NEVPHOTOALBUMS'], '/users/'.$usr['id'].'/nevphotoalbum.html');
  15. $smarty = $inCore->initSmarty('components', 'com_users_nevphotoalbum.tpl');
  16. $smarty->assign('albums', $albums);
  17. $smarty->assign('is_edit', $inCore->request('is_edit', 'int', 0));
  18.  
  19. $smarty->display('com_users_nevphotoalbum.tpl');
  20.  
  21. }
  22.  
в components/users/router.php добавил
  1. $routes[] = array(
  2. '_uri' => '/^users\/([0-9]+)\/nevphotoalbum.html$/i',
  3. 'do' => 'new_album',
  4. 1 => 'id',
  5. );
  6.  
создал com_users_nevphotoalbum.tpl
  1. <h1 class="con_heading">создание альбома</h1>
  2.  
  3.  
  4. <form action="" method="post">
  5.  
  6. <div id="usr_photos_upload_album">
  7. <table border="0" cellpadding="0" cellspacing="0">
  8. <tr>
  9. <td><label for="new_album_1">{$LANG.CREATE_NEW_ALBUM}:</label></td>
  10. <td style="padding:0px 10px">
  11. <input type="text" class="text-input" name="album_title" onclick="$('#description').show();$('#new_album_1').attr('checked', 'checked');" />
  12. </td>
  13.  
  14. </tr>
  15. </table>
  16. </div>
  17. <div id="usr_photos_submit_btn">
  18. <input type="submit" name="submit" value="{$LANG.SAVE}" /> {$LANG.AND_GO_TO_ALBUM}
  19. </div>
  20. </form>
помогите пожалуйста разобратся в ошибках
альбому несоздаются)))
#2 8 мая 2012 в 12:03
В components/users/frontend.php код что писал выше заменил на
  1. /////////////////////////////// new album /////////////////////////////////////////////////////////////////////////////////////////
  2. if ($do=='new_album'){
  3. if ($id != $inUser->id) { cmsCore::error404(); }
  4.  
  5. $is_send = $inCore->inRequest('send');
  6.  
  7. if (!$is_send){
  8. $smarty = $inCore->initSmarty('components', 'com_users_nevphotoalbum.tpl');
  9. $smarty->display('com_users_nevphotoalbum.tpl');
  10. }
  11. if ($is_send){
  12. $album['user_id'] = $id;
  13. $album['title'] = $inCore->request('album_title');
  14. if (!$album['title']){
  15.  
  16. //сохраняем текст ошибки в сессию
  17. cmsCore::addSessionMessage('Укажите название альбома!', 'error');
  18.  
  19. //и делаем редирект обратно на форму, завершая выполнение скрипта
  20. $inCore->redirectBack(); exit;
  21.  
  22. }
  23. $album_id = $model->addPhotoAlbum($album);
  24.  
  25. if ($album_id){
  26. //сохраняем текст успеха в сессию
  27. cmsCore::addSessionMessage('альбом успешно создан!', 'success');
  28. $inCore->redirect('/users/'.$id.'/photoalbum.html'); exit;
  29.  
  30. }
  31.  
  32. //5. если по каким-то причинам альбом не создался
  33. if (!$album_id){
  34. //сохраняем текст неудачи
  35. cmsCore::addSessionMessage('Ошибка создания альбома!', 'error');
  36. }
  37.  
  38.  
  39. }
  40. }
  41.  
в com_users_nevphotoalbum.tpl заменил на
  1. <h1 class="con_heading">создание альбома</h1>
  2.  
  3.  
  4. <form action="" method="post">
  5.  
  6. <div>название льбома:</div>
  7. <div>
  8. <input type="text" name="album_title" />
  9. </div>
  10. <div>
  11. <input type="submit" name="send" value="создать" />
  12. </div>
  13. </form>
после создание происходит редирект на фотоальбомы пользователя но новый альбом не создаётся.
подскажите в чём моя ошибка)))
#3 8 мая 2012 в 14:59
посмотрел базу данных в cms_user_albums добавляются строки о новом альбоме (то-есть в базе они создаются) но в фотоальбомах пользователя не отображаются
подскажите с чем это связано?
#4 8 мая 2012 в 15:52
Ввёл в адресной строке адрес созданого альбома и он открылся)) значит всё работает)))
подскажите где копать чтобы он выводился в альбомах пользователя(я так думаю что гдето стоит проверка загружены ли фотографии в альбом и если да то выводить)
подскажите где это стоит)))
#5 8 мая 2012 в 16:38
Олег, хорошо у вас получается ) сами с собой ))) главное разобрались )
Это и называется отладка скрипта, который занимает у кодера 80-90% времени )))
Загрузите в альбом хотя бы одно фото и он появится в альбомах пользователя. Проверки как таковой нет. Проверка идет в самом запросе, в файле /components/users/model.php, начиная со строки 657. Берутся только альбомы с фотографиями.
Если хотите, чтобы показывались и вновь созданные альбомы без фотографий придется переписать не только весь запрос но и сам метод getPhotoAlbums(), чтобы у вновь созданного альбома показывался какой-нибудь тумбнайл-заглушка.
#6 8 мая 2012 в 21:25
Марат, спасибо вам за ответ)))

Проверка идет в самом запросе, в файле /components/users/model.php, начиная со строки 657. Берутся только альбомы с фотографиями.
Если хотите, чтобы показывались и вновь созданные альбомы без фотографий придется переписать не только весь запрос но и сам метод getPhotoAlbums(), чтобы у вновь созданного альбома показывался какой-нибудь тумбнайл-заглушка.

Марат
в методе getPhotoAlbums() делается запрос не к альбомам пользователя а к фотографиям пользователя и от туда берётся id альбома
поэтому и выводятся те альбомы у которых загружены фотографии
жесть)))
если сделать запрос к альбомам пользователя и вывести то наверное прийдётся сделать запрос и к фотографиям(чтобы определить в каком альбоме есть фотографии и при выводе альбома подставлять одну из фотографий альбома)
а это уже два запроса к базе))))
есть ли проще вариант???
#7 8 мая 2012 в 23:35

есть ли проще вариант???

Проще сделать сложный запрос сразу к двум таблицам. В файле так и есть, но немного не так, как вам нужно. Вот держите как вам нужно, замените запрос полностью следующим:
  1.  
  2. $sql = "SELECT a.id as id,
  3. a.title as title,
  4. a.pubdate as pubdate,
  5. a.allow_who as allow_who,
  6. 'private' as type,
  7. p.imageurl as imageurl,
  8. COUNT(p.id) as photos_count
  9. FROM cms_user_albums a
  10. LEFT JOIN cms_user_photos p ON p.album_id = a.id
  11. WHERE a.user_id='{$user_id}' {$filter}
  12. GROUP BY p.album_id";
  13.  
На первый взгляд работает. Более подробно не тестировал.
#8 8 мая 2012 в 23:40
При желании можете проверить условием есть ли $album['imageurl'], и если нет то присвоить какую-нибудь картинку-заглушку далее по коду, прямо перед строчкой 673
  1.  
  2. $album['imageurl'] = "/images/users/photos/small/{$album['imageurl']}";
  3.  
#9 9 мая 2012 в 01:26
Марат, изменил запрос на ваш
поставил условие
  1. if (!$album['imageurl']){
  2. $album['imageurl'] = "/images/users/photos/small/no_cover.gif";}
  3. else {
  4.  
  5. $album['imageurl'] = "/images/users/photos/small/{$album['imageurl']}";}
  6.  
всё заработало только выводится последний созданый альбом(которые без фотографий) остальные без фотографий невыводятся
#10 9 мая 2012 в 07:45
Олег, работает вроде бы. Единственное, я не совсем правильно подсказал. Строку 673
  1.  
  2. $album['imageurl'] = "/images/users/photos/small/{$album['imageurl']}";
  3.  
замените вашим
  1.  
  2. if (!$album['imageurl']){
  3. $album['imageurl'] = "/images/users/photos/small/no_cover.gif";}
  4. else {
  5.  
  6. $album['imageurl'] = "/images/users/photos/small/{$album['imageurl']}";}
  7.  
#11 9 мая 2012 в 09:31

замените вашим

Марат
я так и сделал)))
правда из всего кода убрал код который выводит из общего альбома фотографии которые загружал пользователь (думаю что фотографии клуба должны буть в клубе и тд) вот что получилось
  1. public function getPhotoAlbums($user_id, $is_friends=false, $only_private=false) {
  2.  
  3. $inUser = cmsUser::getInstance();
  4. $is_my = $inUser->id == $user_id || $inUser->is_admin;
  5. $is_friends = (int)$is_friends;
  6. $filter = '';
  7. $albums = array();
  8.  
  9. if (!$is_my){
  10. $filter = "AND (
  11. a.allow_who='all'
  12. OR
  13. (a.allow_who='registered' AND ({$inUser->id}>0))
  14. OR
  15. (a.allow_who='friends' AND ({$is_friends}=1))
  16. )";
  17. }
  18.  
  19. $sql = "SELECT a.id as id,
  20. a.title as title,
  21. a.pubdate as pubdate,
  22. a.allow_who as allow_who,
  23. 'private' as type,
  24. p.imageurl as imageurl,
  25. COUNT(p.id) as photos_count
  26. FROM cms_user_albums a
  27. LEFT JOIN cms_user_photos p ON p.album_id = a.id
  28. WHERE a.user_id='{$user_id}' {$filter}
  29. GROUP BY p.album_id";
  30.  
  31. $result = $this->inDB->query($sql);
  32.  
  33. if ($this->inDB->num_rows($result)) {
  34. while($album = $this->inDB->fetch_assoc($result)){
  35. if (!$album['imageurl']){
  36. $album['imageurl'] = "/images/users/photos/small/no_cover.gif";}
  37. else {
  38.  
  39. $album['imageurl'] = "/images/users/photos/small/{$album['imageurl']}";}
  40.  
  41.  
  42. $album['pubdate'] = cmsCore::dateFormat($album['pubdate']);
  43. $albums[] = $album;
  44. }
  45. }
  46.  
  47.  
  48.  
  49.  
  50. $albums = cmsCore::callEvent('GET_USER_ALBUMS', $albums);
  51.  
  52. return $albums;
  53.  
  54. }
  55.  
но но альбом который без фотографий выводится последний созданый
пробывал загрузить в него фотку, он показывать начинает как альбом с фоткой и выводит следующий альбом без фотографий (картинку подставляет)
#12 9 мая 2012 в 09:54
Да. Просмотрел ) Замените в запросе последнюю строчку
  1. GROUP BY p.album_id";
на
  1. GROUP BY a.id";
#13 9 мая 2012 в 10:21
Марат, спасибо большое всё заработало)))
теперь пункт 2:
подскажите как сделать чтобы при регистрации у пользователя создавался альбом с названием личные фотографии?
а у уже зарегестрированых пользователей (у которых созданы альбомы) первый их созданый альбом переименовать в личные фотографии(в принципе это можно и вручную в базе переименовать) и у кого ещё несоздан альбом тоже создать)))
зачем это нужно-на форумах часто писали изменить систему личных фотоальбомов но так толком никто и неизменил)))
вот и решил попробывать с помощью этого форума совместно с другими изменить систему личных фотографий)))
#14 9 мая 2012 в 10:41
Олег, сейчас не могу. Уезжаю в небольшую командировку. Приеду завтра вечером, но уставший ). Давайте займемся послезавтра, если никто не подскажет. ок?
#15 9 мая 2012 в 11:09
ок спасибо)))
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.