landings_image_collection

Коллекция для хранения изображений. Из особенностей этой коллекции следует отметить:

  • Встроенный механизм массовой AJAX-загрузки изображений;
  • Встроенный механизм создания миниатюр.

Рассмотрим эти особенности ближе.

 

AJAX-загрузка изображений

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

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

<script type="text/javascript" src="{$wa_app_static_url}js/load-image.min.js"></script>
<script type="text/javascript" src="{$wa_url}wa-content/js/jquery-plugins/fileupload/jquery.iframe-transport.js"></script>
<script type="text/javascript" src="{$wa_url}wa-content/js/jquery-plugins/fileupload/jquery.fileupload.js"></script>
<script type="text/javascript" src="{$wa_app_static_url}js/gofileupload.js"></script>

<h2 class="l-tab-caption l-block mt20">
    Изображения
</h2>
<form id="slider_file_upload" action="?module=block&action=exec&block_id={$block.id|escape}&func=uploadImages" method="POST" enctype="multipart/form-data">
    <div class="l-dropbox">
        <a class="l-fileinput-button">
            <i class="icon16 upload"></i> Выберите изображения
            <input type="file" name="files[]" multiple="">
        </a>
        <span class="gray">или просто перетащите их сюда, чтобы начать загрузку</span>
    </div>
    {$wa->csrf()}
    <div class="dialog width500px height400px" id="l_upload_notification">
        <div class="dialog-background"></div>
        <div class="dialog-window">
            <div class="l-upload-list"></div>
            <div class="dialog-buttons">
                <div class="block float-right" style="padding-top: 22px;">
                    <a href="#" class="l-cancel hint cancel">Отмена</a>
                </div>
                <div style="display:none; padding-top: 25px;" class="l-upload-errors block errormsg">
                    Некоторые файлы загружены с ошибками
                </div>
            </div>
        </div>
    </div>
</form>
<script type="text/javascript">
    $(document).ready(function() {
          $('#slider_file_upload').goFileUpload(function(jData) {
              // Будет вызвано в случае успешной загрузки изображения
              console.log(jData);
          }); 
    });
</script>

Обратите внимание на атрибут action формы. Как и откуда он берется, Вы можете прочитать в статье "Настройки блока".

Теперь серверная часть:

public function uploadImages()
{
    // Инициализация коллекции
    $image_collection_id = ifempty($this->settings['image_collection_id'], 0);
    if(!$image_collection_id)
    {
        $image_collection = new landingsImageCollection(null, $this->id);
        $this->settings['image_collection_id'] = $image_collection->getId();
        $this->saveSettings();
    }
    else {$image_collection = new landingsImageCollection($image_collection_id);}
    
    // Самая мякотка. Для загрузки нужно всего лишь вызвать этот метод коллекции    
    return $image_collection->uploadFromPost('files'); // files - имя параметра с файлами в запросе
}

 

Механизм создания миниатюр

Да, данная коллекция, получив изображение, может масштабировать его и отдавать в нужном разрешении. Чтобы получить ссылку на миниатюру, нужно вызвать метод:

landingsImageCollection::getThumbUrl($collection_id, $image_id = null, $size = null, $ext = null, $absolute = false)

Параметры:

  • collection_id - идентификатор коллекции;
  • image_id - идентификатор изображения (позиции);
  • size - размер изображения. Указывается, как принято в Webasyst, сторокой, например, '512x512' или '970x0' (если требуется фиксированный размер только по одной стороне, вторая авто);
  • ext - расширение файла изображения;
  • absolute - если true - выдаст абсолютную ссылку, иначе - относительную.

Все необходимые данные можно получить, если знать id изображения и запросить его при помощи метода getItem($item_id).