Применение для Яндекс.Диска

Назад

Встала задача где то хранить кучу фотографий для сайта и других файлов. Покупать выделенный сервер для небольшого сайта, и тратить 5-10 тысяч рублей, совсем не разумно. Тут мне на глаза попался Яндекс.Диск, вместилище на 1тб тут стоит всего лишь 200 рублей. И я подумал, а почему бы и нет? Поковырял API, нашел симпатичную библиотеку yandex-php-library и на её основе сворганил свой набор скриптов для любимой MODX REVO. В итоге все работает в связке с pdoTools. Посмотреть как работает можно тут.

Как мне кажется идея достаточно не плохая. Пока все простенько, и недоработано, но уже прекрасно работает. Остается только получить токен и все, способ его получения хорошо описан в yandex-php-library. Для самых хитрых показываю код.

Сниппет getFileYandexDisc работает в паре с pdoPage

<?php
require_once MODX_CORE_PATH.'/components/yandexdisc/custom/yandex/vendor/autoload.php'; // Подключаем библиотеку yandex-php-library
require_once MODX_CORE_PATH.'/components/yandexdisc/model/yandexDisc.class.php'; // Я уже создал обертку для Yandex\Disk\DiskClient, но вы можете и не создавать её

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);

$yandexDisc = new yandexDisc('Тут ваш токен, полученный через OAuth');
$yandexDisc->setServiceScheme(yandexDisc::HTTPS_SCHEME);

$dirContent = $yandexDisc->directoryContents('/elenamart/Album1/');

$arrayFiles = array();

if(empty($offset)){
   $offset = 0; 
}
if(empty($limit)){
   $limit = 10; 
}

$s = 0;
$output = '';
foreach ($dirContent as $podDirItem) {
    if($podDirItem['href'] != '/elenamart/Album1/'){
        $arrayFile[] = $podDirItem;
        $itog = $offset + $limit;
        if($s >= $offset AND $s < $itog){
           $output .=  $modx->parseChunk($tplRow, array('href' => $podDirItem['href']));; 
        }
        
        $s++;
    }
}
$count = count($arrayFile);
$modx->setPlaceholder('page.total', $count);

return $output;

Будущая обертка для Yandex\Disk\DiskClient

<?php
use Yandex\Disk\DiskClient;

class yandexDisc extends Yandex\Disk\DiskClient{

    var $diskClient;
    var $modx;

    // Получаем список файлов
    function getListFiles(){

    }

    // Получаем содержимое файла
    function getFileContent(){

    }
}

Файл для отрисовки изображения

<?php
define('MODX_API_MODE', true);
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/index.php';

require_once MODX_CORE_PATH.'/components/yandexdisc/custom/yandex/vendor/autoload.php'; // Подключаем библиотеку yandex-php-library
require_once MODX_CORE_PATH.'/components/yandexdisc/model/yandexDisc.class.php'; // Я уже создал обертку для Yandex\Disk\DiskClient, но вы можете и не создавать её

error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);

$yandexDisc = new yandexDisc('Токен вашего диска');
$yandexDisc->setServiceScheme(yandexDisc::HTTPS_SCHEME);

$size = 'XXXL';

if(isset($_GET['size'])){
    $size = $_GET['size'];
}

if(isset($_GET['target'])){
    $target = $_GET['target'];

    $file = $yandexDisc->getImagePreview($target, $size);

    header('Content-Description: File Transfer');
    header('Connection: Keep-Alive');
    header('Expires: 0');
    header('Content-Type: '.$file['headers']['content-type']);
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Date: ' . $file['headers']['date']);
    header('Content-Length: ' . $file['headers']['content-length']);
    header('Accept-Ranges: ' . $file['headers']['accept-ranges']);
    echo $file['body'];
}

Вызываем сниппет

[[!pdoPage?
    &limit=`12`
    &parents=`0`
    &element=`getFileYandexDisc`
    &tplRow=`portfolioRow`
]]
[[!+page.nav]]

Код чанка

<img src="/assets/components/yandexdisc/echoFile.php?target=[[+href]]&size=350x350" alt="">