Перейти к содержанию
Официальный форум поддержки Simpla

Несколько изображения для поста блога


Рекомендуемые сообщения

http://i.imgur.com/c7qX2xB.jpg

 

Аналог загрузки изображений как в товаре

 

Возможности:
- Загрузка более одного изображения
- Удаление изображений
- Вывод изображений в шаблон

 

Минусы:
- Оригинальные изображения загружаются в папку file/originals

- "Резаные" изображения загружаются в папку file/products

p.s. В ближайшее время сделаю загрузку по другим папкам

 

#0 - Запрос в БД:

CREATE TABLE IF NOT EXISTS `s_images_post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `post_id` int(11) NOT NULL DEFAULT '0',
  `filename` varchar(255) NOT NULL DEFAULT '',
  `name` varchar(255) NOT NULL,
  `position` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `filename` (`filename`),
  KEY `post_id` (`post_id`),
  KEY `position` (`position`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

#1 - \simpla\design\html\post.tpl

найдем:

$('input[name="date"]').datepicker({
       regional:'ru'
});

ниже вставим:

// Сортировка изображений
	$(".images ul").sortable({ tolerance: 'pointer' });

	// Удаление изображений
	$(".images a.delete").live('click', function() {
		 $(this).closest("li").fadeOut(200, function() { $(this).remove(); });
		 return false;
	});
	// Загрузить изображение с компьютера
	$('#upload_image').click(function() {
		$("<input class='upload_image' name=images[] type=file>").appendTo('div#add_image').focus().click();
	});

найдем:

<!-- Правая колонка свойств товара -->	
	<div id="column_right">

ниже вставим:

<!-- Изображения поста -->	
<div class="block layer images">
	<h2>Изображения  поста</h2>
	<ul>
		{foreach from=$post_images item=image}
		<li>
			<a href='#' class="delete"><img src='design/images/cross-circle-frame.png'></a>
			<img src="{$image->filename|resize:100:100}" alt="" />
			<input type=hidden name='images[]' value='{$image->id}'>
		</li>
		{/foreach}
	</ul>
	<span class=upload_image><i class="dash_link" id="upload_image">Добавить изображение</i></span></span>
	<div id=add_image></div>
	
</div>

#2 - \simpla\PostAdmin.php
найдем:

public function fetch()
	{

ниже вставим:

$images = array();

найдем:

$this->design->assign('message_error', 'url_exists');

ниже вставим:

$images = $this->blog->get_images(array('post_id'=>$post->id));

найдем:

else
	{
		$this->blog->update_post($post->id, $post);
		$post = $this->blog->get_post($post->id);
		$this->design->assign('message_success', 'updated');
	}	

ниже вставим:

// Удаление изображений
$images = (array)$this->request->post('images');
$current_images = $this->blog->get_images(array('post_id'=>$post->id));
foreach($current_images as $image)
{
	if(!in_array($image->id, $images))
		$this->blog->delete_image($image->id);
	}

// Порядок изображений
if($images = $this->request->post('images'))
{
	$i=0;
	foreach($images as $id)
	{
		$this->blog->update_image($id, array('position'=>$i));
		$i++;
	}
}
// Загрузка изображений
if($images = $this->request->files('images'))
{
	for($i=0; $i<count($images['name']); $i++)
	{
		if ($image_name = $this->image->upload_image($images['tmp_name'][$i], $images['name'][$i]))
		{
			$this->blog->add_image($post->id, $image_name);
		}
		else
		{
			$this->design->assign('error', 'error uploading image');
		}
	}
}
$images = $this->blog->get_images(array('post_id'=>$post->id));

найдем:

$post = $this->blog->get_post(intval($post->id));

ниже вставим:
 

if($post && $post->id)
{
	// Изображения товара
	$images = $this->blog->get_images(array('post_id'=>$post->id));
}

найдем:

$this->design->assign('post', $post);

выше вставим:

$this->design->assign('post_images', $images);

#3 - \api\Blog.php

 

найдем:

$query = $this->db->placehold("DELETE FROM __blog WHERE id=? LIMIT 1", intval($id));

выше вставим:

$images = $this->get_images(array('post_id'=>$id));
	foreach($images as $i)
		$this->delete_image($i->id);

найдем:

/*
*
* Следующий пост
* @param $post
*
*/	 

 

выше вставим:

function get_images($filter = array())
	{		
		$post_id_filter = '';
		$group_by = '';

		if(!empty($filter['post_id']))
			$post_id_filter = $this->db->placehold('AND i.post_id in(?@)', (array)$filter['post_id']);

		// images
		$query = $this->db->placehold("SELECT i.id, i.post_id, i.name, i.filename, i.position
									FROM __images_post AS i WHERE 1 $post_id_filter $group_by ORDER BY i.post_id, i.position");
		$this->db->query($query);
		return $this->db->results();
	}
	
	public function add_image($post_id, $filename, $name = '')
	{
		$query = $this->db->placehold("SELECT id FROM __images_post WHERE post_id=? AND filename=?", $post_id, $filename);
		$this->db->query($query);
		$id = $this->db->result('id');
		if(empty($id))
		{
			$query = $this->db->placehold("INSERT INTO __images_post SET post_id=?, filename=?", $post_id, $filename);
			$this->db->query($query);
			$id = $this->db->insert_id();
			$query = $this->db->placehold("UPDATE __images_post SET position=id WHERE id=?", $id);
			$this->db->query($query);
		}
		return($id);
	}
	
	public function update_image($id, $image)
	{
	
		$query = $this->db->placehold("UPDATE __images_post SET ?% WHERE id=?", $image, $id);
		$this->db->query($query);
		
		return($id);
	}
	
	public function delete_image($id)
	{
		$query = $this->db->placehold("SELECT filename FROM __images_post WHERE id=?", $id);
		$this->db->query($query);
		$filename = $this->db->result('filename');
		$query = $this->db->placehold("DELETE FROM __images_post WHERE id=? LIMIT 1", $id);
		$this->db->query($query);
		$query = $this->db->placehold("SELECT count(*) as count FROM __images_post WHERE filename=? LIMIT 1", $filename);
		$this->db->query($query);
		$count = $this->db->result('count');
		if($count == 0)
		{			
			$file = pathinfo($filename, PATHINFO_FILENAME);
			$ext = pathinfo($filename, PATHINFO_EXTENSION);
			
			// Удалить все ресайзы
			$rezised_images = glob($this->config->root_dir.$this->config->resized_images_dir.$file."*.".$ext);
			if(is_array($rezised_images))
			foreach (glob($this->config->root_dir.$this->config->resized_images_dir.$file."*.".$ext) as $f)
				@unlink($f);

			@unlink($this->config->root_dir.$this->config->original_images_dir.$filename);		
		}
	}

#4 - \view\BlogView.php

 

найдем:

$post = $this->blog->get_post($url);

ниже вставим:

$post->images = $this->blog->get_images(array('post_id'=>$post->id));
$post->image = &$post->images[0];

#5 - вывод в шаблоне (post.tpl)

<!-- большая -->
{if $post->image}
<a href="{$post->image->filename|resize:800:600:w}" class="zoom" rel="group">
	<img src="{$post->image->filename|resize:200:300}" alt="{$post->name|escape}">
</a>
{/if}
<!-- маленькие -->
{if $post->images|count>1}
{foreach $post->images|cut as $i=>$image}
	<a href="{$image->filename|resize:800:600:w}" class="zoom" rel="group"><img src="{$image->filename|resize:95:95}" alt="{$post->name|escape}" /></a>
{/foreach}
{/if}
Ссылка на сообщение
Поделиться на другие сайты

можно глупый вопрос?

меня всегда удивляют такие доработки ... типа картинки в пост

Что мешает вставить сколько угодно изображений в аннотацию и body ???

ну правда

 

зачем городить это всё? Денис редактор же включил в Simpla ...

вставляй картинки / не хочу и отступы там можно сделать и прочее

 

Может я чего не понимаю?

Ссылка на сообщение
Поделиться на другие сайты

можно глупый вопрос?

меня всегда удивляют такие доработки ... типа картинки в пост

Что мешает вставить сколько угодно изображений в аннотацию и body ???

ну правда

 

зачем городить это всё? Денис редактор же включил в Simpla ...

вставляй картинки / не хочу и отступы там можно сделать и прочее

 

Может я чего не понимаю?

 

намного легче сделать галерею через такой модуль нежели вставлять непонятно что и сколько. если в посте нужен фотоотчет, будете вставлять 100 фоток?

Ссылка на сообщение
Поделиться на другие сайты

А в товар, по-Вашему, нужны картинки? Или тоже ни к чему, раз можно вставить в описание?

И в категорию...

 

всё можно оформить как хочешь...

вот товар, оформленный через ОБЫЧНЫЙ редактор, встроенный в симпла

 

на тебе пример на моём сайте

http://instrument-54.ru/products/rems-pikus-s235

Изменено пользователем ST_RU
Ссылка на сообщение
Поделиться на другие сайты

А в товар, по-Вашему, нужны картинки? Или тоже ни к чему, раз можно вставить в описание?

И в категорию...

 

http://i.gyazo.com/6cfe45a5332d3418566ad8243ca7ac49.png

 

в любой шаблон стили...

которые есть в конце списка при выборе

в редакторе

http://i.gyazo.com/f7f00da393788bc309bcec5216208b54.png

 

под "СЕБЯ" этот список можно нагородить.

Встроенный редактор справляется со всеми задачами по оформлению текстов.

если мозгами раскинуть

Изменено пользователем ST_RU
Ссылка на сообщение
Поделиться на другие сайты

для меня и для заказчика такое решение более приятно и легок в управлении

Ссылка на сообщение
Поделиться на другие сайты

Встроенный редактор справляется со всеми задачами по оформлению текстов.

если мозгами раскинуть

Если мозгами раскинуть еще больше, то и обычный HTML справится...

И из Новосибирска в Петербург можно ходить пешком или ездить на вело, были бы способности...

 

Решение, представленное ТС, очень хорошее и полезное.

 

Если Вы в состоянии представить свой вариант того, как делать аналогичное, то попробуйте расписать в деталях свой метод. Интересно будет сравнить. Вместо того, чтобы абстрактно болтать...

Ссылка на сообщение
Поделиться на другие сайты

можно глупый вопрос?

 

А когда нужно вывести статьи на главную и страницы... как вы будете выводить это дело?

Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

ps-simpla:   p.s. В ближайшее время сделаю загрузку по другим папкам

 

Когда ожидается доработка?

Изменено пользователем Gragory
Ссылка на сообщение
Поделиться на другие сайты
  • 3 месяца спустя...
  • 2 месяца спустя...

вывод в шаблоне (blog.tpl) kak ?

 

иоже интересен вопрос как в blog.tpl вывести иображения?

 

 

попробуйте в view/BlogView.php заменить

$posts = $this->blog->get_posts($filter);
if(empty($posts))
	return false; 

 

на

// Выбираем статьи из базы
$posts = array();
$temp_posts = $this->blog->get_posts($filter);
if(empty($temp_posts))
	return false;

$posts_ids = array();
foreach($temp_posts as $p) {
	$posts[$p->id] = $p;
	$posts_ids[] = $p->id;
}

$images = $this->blog->get_images(array('post_id'=>$posts_ids));
foreach($images as $i)
	$posts[$i->post_id]->images[] = $i; 

 

тогда будет доступны все фото в блоге.

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

попробуйте в view/BlogView.php после

$posts = $this->blog->get_posts($filter);
if(empty($posts))
	return false; 

 

добавить

$posts_ids = array();
foreach($posts as $p)
	$posts_ids[] = $p->id;

$images = $this->blog->get_images(array('post_id'=>$posts_ids));
foreach($images as $i)
	$posts[$i->post_id]->images[] = $i;

тогда будет доступны все фото в блоге.

 

 

Спасибо

 

вывод я понимаю такой в шаблоне blog.tpl

 

  {foreach $post->images as $i=>$image}
	<a href="{$image->filename|resize:800:600:w}" class="zoom" rel="group"><img src="{$image->filename|resize:95:95}" alt="{$post->name|escape}" /></a>
{/foreach}
Ссылка на сообщение
Поделиться на другие сайты

 

Спасибо

 

вывод я понимаю такой в шаблоне blog.tpl

 

  {foreach $post->images as $i=>$image}
	<a href="{$image->filename|resize:800:600:w}" class="zoom" rel="group"><img src="{$image->filename|resize:95:95}" alt="{$post->name|escape}" /></a>
{/foreach}

 

ну если вам все нужны фото. если нет, то 

{$image=$post->images|first}
Ссылка на сообщение
Поделиться на другие сайты

ну если вам все нужны фото. если нет, то 

{$image=$post->images|first}

 

 

немного не понял как вывести только первое изображение Изменено пользователем shooroop
Ссылка на сообщение
Поделиться на другие сайты

{$image=$post->images|first}

 

<a href="{$image->filename|resize:800:600:w}" class="zoom" rel="group"><img src="{$image->filename|resize:95:95}" alt="{$post->name|escape}" /></a>

 

Так пробовали без цикла?

Ссылка на сообщение
Поделиться на другие сайты

{$image=$post->images|first}

 

<a href="{$image->filename|resize:800:600:w}" class="zoom" rel="group"><img src="{$image->filename|resize:95:95}" alt="{$post->name|escape}" /></a>

 

Так пробовали без цикла?

да но при этом запись дублируется

 

{foreach $posts as $post}

      
	 <div id="" class="col-md-12 col-sm-12" style="margin-bottom: 10px;">
          <div id="" class="col-md-5 col-sm-5 blo">
       
        {if $post->images}
        {$image=$post->images|first}


<img src="{$image->filename|resize:95:95}" alt="{$post->name|escape}" />
        
{else}<img src="design/{$settings->theme|escape}/images/noblog.jpg" alt="" />{/if}
        
       
        
       
        </div>
		<div id="" class="col-md-7 col-sm-7">
                <h3><a data-post="{$post->id}" href="blog/{$post->url}">{$post->name|escape}</a></h3>
		
		<p>{$post->annotation}</p>
                <p>{$post->date|date}</p>
                 </div>
	</div>
	{/foreach}
 

 

получаем

 

 

 

Изменено пользователем shooroop
Ссылка на сообщение
Поделиться на другие сайты

в лс

заменил код в #14 там небыло учтено того что ключи массива не являются айди постов, из-за этого давало 2ю фотку.

Ссылка на сообщение
Поделиться на другие сайты
  • 4 недели спустя...
  • 2 недели спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...