Фото для записей блога

+41
1.96K
Столкнулся с необходимостью создать возможность загружать фото для записей блога, как в статьях например.
Как всегда, делюсь описанием с обществом. Работы совсем немного. Описываю решение для 1.10, для ранних версий тоже подойдет, но работы там побольше.

После правки компонента, мы имеем возможность назначать фото для каждого поста в блоге, если фото нет то выводится заглушка. Размер картинки я установил 150х150 пикс., это можно изменить ниже в коде. Если менять картинку, то старая удаляется с сервера.
Иллюстрация
Иллюстрация
И так, приступим.
Первое правило — обязательно создать бэкап, если правите рабочий сайт.
Открываем файл \components\blogs\frontend.php

Находим текст
  1.  
  2. // Если есть ошибки, возвращаемся назад
  3. if($errors){
  4. cmsUser::sessionPut('mod', $mod);
  5. cmsCore::redirectBack();
  6. }
После него вставляем
  1.  
  2. if ($_FILES['image']['size'])
  3. {
  4. $uploaddir = PATH . '/images/blogs/';
  5. if (!is_dir($uploaddir))
  6. {
  7. @mkdir($uploaddir);
  8. }
  9. $realfile = $_FILES['image']['name'];
  10. $path_parts = pathinfo($realfile);
  11. $ext = strtolower($path_parts['extension']);
  12. if ($ext != 'jpg' && $ext != 'jpeg' && $ext != 'gif' && $ext != 'png' && $ext !=
  13. 'bmp')
  14. {
  15. die('тип файла неверный');
  16. }
  17. $realfile = substr($realfile, 0, strrpos($realfile, '.'));
  18. $realfile = preg_replace('/[^a-zA-Z0-9]/i', '', $realfile);
  19. $filename = md5($realfile . time()) . '.' . $ext;
  20. $uploadfile = $uploaddir . $filename;
  21. $inCore->includeGraphics();
  22. if (@move_uploaded_file($_FILES['image']['tmp_name'], $uploadfile))
  23. @img_resize($uploadfile, $uploadfile, 125, 125, false);
  24. { if ($do=='editpost') {
  25. if($post['image']!='/images/nopic.jpg') {@unlink(PATH.'/images/blogs/'.$post['image']);}
  26. $check = $inDB->rows_count('cms_blogs_photos', 'blog_id = '.$post[id]);
  27. if ($check) {
  28. $inDB->query("UPDATE cms_blogs_photos SET image='$filename' WHERE blog_id = '$post[id]'");}
  29. else { $inDB->query("INSERT INTO cms_blogs_photos (image, blog_id) VALUES ('$filename','$post[id]')"); }
  30. }
  31. }
  32. }
Дальше перед строчкой
  1.  
  2. cmsCore::addSessionMessage($_LANG['POST_CREATED'], 'success');
Вставляем
  1.  
  2. $inDB->query("INSERT INTO cms_blogs_photos (image, blog_id) VALUES ('$filename','$added[id]')");
  3.  
Открываем файл \core\classes\blog.class.php

Находим функцию
  1. public function getPosts($show_all = false, $ownerModel, $is_short = false){
и в запрос $sql = "SELECT p.*, после слова blog_allow_who, добавляем f.image,

после строчки LEFT JOIN cms_users u ON u.id = p.user_id

вставляем LEFT JOIN cms_blogs_photos f ON f.blog_id = p.id

Перед $posts[] = $post;

Вставляем $post['image']=$post['image']?'/images/blogs/'.$post['image']:'/images/nopic.jpg';


Находим функцию
  1. public function getPost($id_or_link=0){
в запрос $sql = "SELECT p.*, после слова author_image, добавляем f.image,

после строчки LEFT JOIN cms_user_profiles up ON up.user_id = u.id

вставляем LEFT JOIN cms_blogs_photos f ON f.blog_id = p.id

перед return cmsCore::callEvent('GET_POST', $post);

вставляем $post['image']=$post['image']?'/images/blogs/'.$post['image']:'/images/nopic.jpg';


Открываем файл com_blog_view.tpl

перед словом {$post.content_html} вставляем
  1.  
  2. <img src="{$post.image}" align="left" style="padding:5px;">


Открываем файл com_blog_view_posts.tpl

перед словом {$post.content_html} вставляем
  1. <img src="{$post.image}" align="left" style="padding:5px;">

Открываем файл com_blog_view_post.tpl

перед словом {$post.content_html} вставляем
  1.  
  2. <img src="{$post.image}" align="left" style="padding:5px;">

Открываем файл com_blog_edit_post.tpl

после блока
  1. <tr>
  2. <td valign="top">
  3. <strong>{$LANG.TAGS}:</strong>
  4. </td>
  5. <td>
  6. <input name="tags" class="text-input" type="text" id="tags"
  7.  
  8. style="width:400px" value="{$mod.tags|escape:'html'}"/>
  9.  
  10. <span class="hinttext" style="font-size:11px">{$LANG.KEYWORDS}</span>
  11. <script type="text/javascript">
  12. {$autocomplete_js}
  13. </script>
  14. </td>
  15. </tr>
вставляем
  1.  
  2. <tr>
  3. <td><strong>Фото:</strong></td>
  4. <td> <input name="image" id="image" type="file" size="34" /></td>
  5. </tr>
Теперь осталось лишь создать таблицу в базе, для этого выполним запрос в базу
  1. CREATE TABLE IF NOT EXISTS `cms_blogs_photos` (
  2. `id` INT(11) NOT NULL AUTO_INCREMENT,
  3. `blog_id` INT(11) NOT NULL,
  4. `image` VARCHAR(255) NOT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Также надо в папку /images закинуть картинку заглушку для постов без картинки с именем nopic.jpg
Вроде все. Может кому то и пригодится. Если вы не разбираетесь в коде, или не хотите рыться в коде, пишите в личку, за символическое вознаграждение могу установить все сам :)
+1
Kreator Kreator 11 лет назад #
За труд, это +
А так, чем это лучше, чем просто вставить фотку в блог? тем что текст обтекает?
0
deltas deltas 11 лет назад #
Нет, тем что в списке блогов, как на втором рисунке есть пиктограмма каждого поста.
И еще модуль для последних записей блогов теперь может показывать картинку поста (после небольшой доработки).
0
Kreator Kreator 11 лет назад #
Если же фотку вставлять до "Читать далее..." она же тоже там будет? не?
Я как то задумывался над такой идеей, только хотел дополнительный ббкод картики с обтеканием.
Ну это тож явно не спроста. Многим пригодится.
+
0
lokanaft lokanaft 11 лет назад #
Плюс)
Тоже возникла такая потребность, но я реализовывать буду совсем иначе - примерно как Join описал)
0
lezginka.ru lezginka.ru 11 лет назад #
+
0
picaboo picaboo 11 лет назад #
однозначно пригодится.

небольшая просьба. легче читать когда
[code=html
[code=php
[code=sql
[code=js

не сочтите за наглость, но ведь и парсер пожрать может чего в запросах, а так выживут.
+1
deltas deltas 11 лет назад #
:) учту в дальнейшем... просто как показала практика [code=php наиболее надежный
0
Денис Васильевич Денис Васильевич 11 лет назад #
когда делал:
ссылка
ссылка2
0
deltas deltas 11 лет назад #
Извиняюсь, я ваш пост не видел. Если хотите могу удалить этот пост?
0
Денис Васильевич Денис Васильевич 11 лет назад #
нет, вы что.. не нужно.. :)
просто прочитав сообщение Join и lokanaft решил дать ссылки на то что делал когда-то..
п.с. это скорее я не к месту свои ссылки опубликовал.. не серчайте, если что :)
+1
picaboo picaboo 11 лет назад #
а обновляться будет под 1.10? расширенные блоги выглядят весьма неплохо
0
Def Def 11 лет назад #
только там были баги, я писал в ЛС ранее о них, пришлось отключить к сожалению у себя из-за этого.
+2
Сергей Петрович Сергей Петрович 11 лет назад #
Зачем создаётся отдельная таблица, а не просто поле в cms_blog_posts ?
0
lokanaft lokanaft 11 лет назад #
Ленивый был настолько ленивый, что аж прочитал пост до конца))
+1 к вопросу, действительно, почему?
+1
Максим Шорин Максим Шорин 11 лет назад #
[сарказм] таблицей больше, таблицей меньше.. (= [/сарказм]
-1
deltas deltas 11 лет назад #
[сарказм] глупым комментом больше, меньше...[/сарказм]
0
deltas deltas 11 лет назад #
Я у себя переделывал блоги полностью, под другую задачу, и фото несколько для каждого поста, поэтому и отдельная таблица. А тут привел по аналогии как у себя делал, конечно можно добавить просто поле в таблицу с записями...
0
lokanaft lokanaft 11 лет назад #
Но вы же не делаете выборку из бд по урлу конкретно, соответственно всё, что не участвует и не сможет в принципе никогда участвовать в выборе, можно сделать в одном поле с разделителями или другим способом организации.
0
alexbabo alexbabo 11 лет назад #
Подскажите как сделать,если фото не загружено,чтобы заглушка не выводилась?То есть ничего не выводилось если нет фото.
0
deltas deltas 11 лет назад #
Там в коде предусмотрено.
Код PHP:
  1. $post['image']=$post['image']?'/images/blogs/'.$post['image']:'/images/nopic.jpg';
Просто закиньте картинку nopic.jpg в папку /images
0
alexbabo alexbabo 11 лет назад #
Я другое имел ввиду,наоборот не хочу чтоб заглушка выводилась :)если пользователь не загружал картнку пусть ничего не выводится.типа чтоб в шаблоне выводилась
{if $post.image}
<img src="{$post.image}" align="left" style="padding:5px;">
{/if}

Если нету картники то ничего не выводим.
0
toropa toropa 11 лет назад #
а как под 1.9 ?
+2
Петр Петр 11 лет назад #
отличная доработка!
А можно архивом просто заменой файлов?
Ну или плагином?
0
Apsent Apsent 9 лет назад #
Подскажите, а как теперь сделать что бы фото блога отображалось в моделе последне из блогов на главной странице?

Еще от автора

Обновление компонента "Replacement замена в контенте" + бонус
Как и обещал, поработал над обновлением компонента Replacement.
Replacement - замена в контенте. Компонент для ICMS 2.x
Компонент на основе фильтра "Красивые заметки в тексте" для первой версии. По просьбам пользователей сделал подобное для второй ветки.
Фильтр ICMS Note - Красивые заметки в тексте
Опять же по просьбе Nomin сделал фильтр для создания красивых заметок в тексте.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.