Встала задача где то хранить кучу фотографий для сайта и других файлов. Покупать выделенный сервер для небольшого сайта, и тратить 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="">