вівторок, 17 травня 2016 р.

Добавление картинки к блогу в Simpla





Блог без картинки - это прошлый век. Добавим же её! Нам нужно будет внести некоторые изменения как в сам шаблон, так и в админку. Поэтому при обновлении Simpla на новую версию скорее всего всё похерится. Селяви.

Сначала я думал воспользоваться нативным хранением картинок для товаров, но после решил отказаться от этой мысли. Во-первых, заглавная картинка для блога нам нужна всего одна и возможность хранить сразу несколько для одной страницы блога явно избыточна. Но хуже всего то, что в таблице s_images картинки привязаны к товару product_id. Я решил, что добавлять еще одно поле blog_id - это нарушать "нормальность" этой таблицы, и решил пойти другим, более "топорным", но простым путём - добавить в таблицу s_blog поле image, в котором и буду хранить путь к картинке.


Для начала пропишем в конфиге путь к папке, где будут храниться картинки (не забудем создать саму папку).

/*
 * Файл: [config/config.php]
 */
;Изображения блога
blog_images_dir = files/blog/;

Открываем любимый клиент mySQL (у меня HeidiSQL), подключаемся к нашей базе данных и вводим комманду, которая добавить в таблицу записей блогов новое поле для хранения адреса картинки:

ALTER TABLE `s_blog` ADD `image` VARCHAR(255) NOT NULL DEFAULT '' AFTER `url`;

Теперь нужно рассказать Симпле о том, что у нас изменения в структуре БД:

/*
 * Файл [api/Blog.php]
 */
public function get_post($id) 
{
  // ..
  // Добавили поле b.image
  $query = $this->db->placehold("SELECT b.id, b.url, b.name, b.image, b.annotation, 
                                 b.text, b.meta_title, b.meta_keywords, 
                                 b.meta_description, b.visible, b.date 
                                 FROM __blog b $where LIMIT 1");
  // ..
}
public function get_posts($filter = array()) 
{
  // ..
  // И тут тоже
  $query = $this->db->placehold("SELECT b.id, b.url, b.name, b.image, b.annotation, b.text,
                                 b.meta_title, b.meta_keywords, b.meta_description, 
                                 b.visible, b.date
                                 FROM __blog b WHERE 1 $post_id_filter $visible_filter $keyword_filter
                                 ORDER BY date DESC, id DESC $sql_limit");
  // ..
}


В том же файле добавим методы для удаления картинки из БД:

/*
 * Файл [api/Blog.php]
 */
public function delete_image($page_id)
{
  $query = $this->db->placehold("SELECT image FROM __blog WHERE id=?", intval($page_id));
  $this->db->query($query);
  $filename = $this->db->result('image');
  if(!empty($filename))
  {
    $query = $this->db->placehold("UPDATE __blog SET image=NULL WHERE id=?", $page_id);
    $this->db->query($query);
    $query = $this->db->placehold("SELECT count(*) as count FROM __blog WHERE image=? LIMIT 1", $filename);
    $this->db->query($query);
    $count = $this->db->result('count');
    if($count == 0)
    {
      @unlink($this->config->root_dir.$this->config->blog_images_dir.$filename);
    }
  }
}

Открываем шаблон страницы редактирования блога. Нам нужно добавить в него возможность прикрепить картинки к блогу. Находим блок "Правая колонка свойств товара" и вставляем в неё следующую разметку (которую кстати я слизал из файла [simpla/design/html/ppoducts.tpl], только немного переделал):

/*
 * Файл [simpla/design/html/post.tpl]
 */
<!-- Правая колонка свойств товара --><div id="column_right">
  <!-- Изображения товара -->
  <div class="block layer images">
    <h2>Изображение блога</h2>
    <input class='upload_image' name=image type=file>
    <input type=hidden name="delete_image" value="">
    {if $post->image}
    <ul>
      <li>
        <a href='#' class="delete"><img src='design/images/cross-circle-frame.png'></a>
        <img src="{$config->root_url}/{$config->blog_images_dir}{$post->image}" alt="" />
      </li>
    </ul>
    {/if}
  </div>
</div>
<!-- Правая колонка свойств товара (The End)-->

И в этом же файле находим где-то в начале конструкцию

<script>
$(function() {

});
</script>

В которую нужно добавить следующий код (именно добавить, а не заменить):

/*
 * Файл: [simpla/design/html/post.tpl]
 */
// Удаление изображений
$(".images a.delete").live('click', function() {
  $(this).closest("li").fadeOut(200, function() { $(this).remove(); });
  return false;
});

Уже скоро у нас всё будет готово, потерпите.
Открываем файл [simpla/PostAdmin.php], находим конструкцию

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

и вставляем ВМЕСТО неё код:

/*
 * Файл: [simpla/PostAdmin.php]
 */
if(empty($post->id))
{
  $post->id = $this->blog->add_post($post);
  $this->design->assign('message_success', 'added');
}
else
{
  $this->blog->update_post($post->id, $post);
  $this->design->assign('message_success', 'updated');
}
// Удаление изображения
if($this->request->post('delete_image'))
{
  $this->blog->delete_image($post->id);
}
// Загрузка изображений
if($image = $this->request->files('image'))
{
  if( ! empty($image['name']))
  {
    $this->blog->delete_image($post->id);
    move_uploaded_file($image['tmp_name'], $this->config->root_dir.$this->config->blog_images_dir.$image['name']);
    $this->blog->update_post($post->id, array('image'=>$image['name']));
  }
}
$post = $this->blog->get_post($post->id);

Всё, осталось вставить вывод картинки в шаблон блога:

/*
 * Файл: [design/ваш_шаблон/html/blog.tpl]
 * Вставить в нужное место, где-то внутри цикла 
 * {foreach $posts as $post}
 *    ...
 * {/foreach}
 */
{if $post->image}
<a href="blog/{$post->url}">
  <img src="{$config->root_url}/{$config->blog_images_dir}{$post->image}" alt="" />
</a>
{/if}

Втроенная обрезалка картинок работать не будет, поэтому настраиваем внешний вид картинки через CSS.

Немає коментарів :

Дописати коментар