Загрузить файл на Яндекс.Диск используя компонент main.file.input

В одном из проектов понадобилось добавление файла к заказу в корзине. Для этих целей к каждому товару в корзине (файл basket_items.php шаблона компонента sale.basket.basket) был добавлен вывод компонента main.file.input:

<?$APPLICATION->IncludeComponent("bitrix:main.file.input", "fileInput",
array( //id записи корзины
"INPUT_NAME"=>$arItem["ID"],
"MULTIPLE"=>"N",
"MODULE_ID"=>"catalog",
"MAX_FILE_SIZE"=>"",
"ALLOW_UPLOAD"=>"A",
"ALLOW_UPLOAD_EXT"=>"",
"INPUT_CAPTION" => "Загрузить макет",
),
false
);
?>
Выглядит это следующим образом:

yad_input.jpg
Далее при выборе файла, он должен добавляться как значение свойства текущего товара. В каталоге предварительно создано свойство типа строка с кодом "maket".
В script.js компонента main.file.input в функции onUploadDone (примерно 320 строка) добавляем строки (выделено жирным):
onUploadDone : function(item, result) {
var node = this.agent.getItem(item.id).node,
file = result["file"];
var sendData = {
id: this.params.inputName,
file: file["file_id"]
};
$.ajax({
url: "/ajax/add_prop.php",
global: false,
type: "POST",
data: ({sendData: sendData}),
success: function (data) {
$(".bx_ordercart_itemart").html(data);
}
});
.... }

Соответственно в файле add_prop.php происходит следующее:

<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
//Подключаем библиотеку Yandex Disk
require_once 'phar://yandex-php-library_0.4.1.phar/vendor/autoload.php';
//Определяем константу ACCESS_TOKEN
define("ACCESS_TOKEN", "ЗДЕСЬ УКАЗЫВАЕМ ТОКЕН (ВНИЗУ ДАНА ССЫЛКА КАК ЕГО ПОЛУЧИТЬ)");
use Yandex\Disk\DiskClient;
if (CModule::IncludeModule("sale"))
{
if (CModule::IncludeModule("catalog")){
$db_res = CSaleBasket::GetPropsList(
array(
"SORT" => "ASC",
"NAME" => "ASC"
),
array("BASKET_ID" => $_POST["sendData"]["id"])
);
//Собираем в массив все имеющиеся свойства, чтобы они не затерлись
while ($ar_res = $db_res->Fetch())
{
$addFieldsk['PROPS'][] = array(
"NAME" => $ar_res["NAME"],
"CODE" => $ar_res["CODE"],
"VALUE" => $ar_res["VALUE"],
"SORT" => "ASC"
);
}
// Создаем нового клиента диска
$disk = new DiskClient(ACCESS_TOKEN);
$disk->setServiceScheme(DiskClient::HTTPS_SCHEME);
// Получаем ссылку на загруженный файл
$fileName = $_SERVER["DOCUMENT_ROOT"].'/'.CFile::GetPath($_POST["sendData"]["file"]);
$type=substr($fileName,strrpos($fileName,'.')+1);
// Назначаем ему имя на диске (значение id записи корзины)
$newName = $_POST["sendData"]["id"].'.'.$type;
//Загружаем файл на диск
$disk->uploadFile(
'/makets/',
array(
'path' => $fileName,
'size' => filesize($fileName),
'name' => $newName
)
);
//Удаляем файл из каталога, чтобы не занимал место
CFile::Delete($_POST["sendData"]["file"]);
//Делаем файл публичным и получаем ссылку на него
$path = '/makets/'.$newName;
$url = $disk->startPublishing($path);
$addFieldsk['PROPS'][] = array(
"NAME" => "Макет пользователя",
"CODE" => "maket",
"VALUE" => $url,
"SORT" => "ASC"
);
//Обновляем корзину
CSaleBasket::Update( $_POST["sendData"]["id"], $addFieldsk); echo "<a class='maket_prop' target='_blank' href=".$url.">Макет</a><br>";
}
}
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>

После чего url будет записан как значение свойства maket и в файле basket_items.php шаблона компонента sale.basket.basket выводим его как ссылку:

if($val["CODE"] == "maket"){
echo "<a target='_blank' href=".$val["VALUE"].">Макет</a><br>";
} else {
echo htmlspecialcharsbx($val["NAME"]) . ":&nbsp;<span>" . $val["VALUE"] . "</span><br/>";
}

О том, как получить токен для яндекс.диска можно посмотреть ЗДЕСЬ

bitrixone © 2024