Импорт и экспорт редиректов в csv

Материал из Umicms
Перейти к:навигация, поиск

Актуально для версии 18.

Задача

Реализовать массовый импорт/экспорт редиректов для модуля Редиректы.

Решение

Для реализации данной задачи напишем небольшой standalone PHP скрипт для импорта и экспорта редиректов. В корне сайта создаем файл redirect.php в который помещаем следующий код:

<?php
	require_once('standalone.php');
	if (isset($_REQUEST['list'])) {
		$list = json_decode($_REQUEST['list']);		
		$umiRedirectsCollection = umiRedirectsCollection::getInstance();	
		foreach ($list as $obj)
			$redirect = $umiRedirectsCollection->create([
					'source' => $obj->s, // перенаправление с этого адреса 
					'target' => $obj->t, // перенаправление на этот адрес
					'status' => $obj->st, // статус перенаправления
					'made_by_user' => $obj->fl, // флаг принудительного редиректа
					'field_name_prefix' => 'data[new]'
				]);
		echo "ok";
	} elseif (isset($_REQUEST['get'])) {
		$umiRedirectsCollection = umiRedirectsCollection::getInstance();
		$redirects = $umiRedirectsCollection->export([
					'offset' => 0,
					'limit' => 1000,
					'count' => 1,
					'like_mode' => [], 
					'compare_mode' => []
				]);
		echo json_encode($redirects);
	} else {
	?>
	<html>
	<head>
		<title>Redirects</title>
		<meta charset="utf-8">
		<style type="text/css">
			* {
				margin: 0;
			}
			.but {
				padding: 10px;
			}
			.cont {
				margin: 10px;
			}
		</style>
	</head>
	<body>
		<div class='cont'>
			<textarea id="textarea" name="list"></textarea>
			<br>
			<input id="output_redd" class="but" type="button" value="Получить редиректы">
			<input id="input_redd" class="but" type="button" value="Отправить редиректы">
			<input id="clear" class="but" type="button" value="Очистить">
		</div>
		<script>
		function xhrajax(data,rType,func) {
			var xhr = new XMLHttpRequest;
			xhr.open("POST", location.href, true);
			xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
			xhr.onreadystatechange = function() { 
				if(xhr.readyState == 4) {
					if(xhr.response) {
						func(xhr.response);
					} else {
						alert("Что-то пошло не так");
					}
				}
			};
			xhr.responseType = rType;
			xhr.send(data);
		}
		window.onload = function() {
			textarea.style.width = window.innerWidth/2;
			textarea.style.height = 500;
			input_redd.onclick = function() {
				if(confirm("Вы действительно хотите записать редиректы?")) {
					data = [];
					ptext = textarea.value;
					regexp = /'(.+)','(.+)','(.+)','(.+)'/g;
					var r;
					var str = "";
					while ((r = regexp.exec(ptext)) !== null) {
						data.push({'s':r[1],'t':r[2],'st':r[3],'fl':(+r[4]?true:false)})
					}	
					xhrajax("list="+JSON.stringify(data),"document",function(r){
							alert("Редиректы добавлены");
						});
				}
			};
			output_redd.onclick = function() {
				xhrajax("get=1","json",function(res){
					var str = "";
					for(var i in res) {
						str += "'"+res[i]['source']+"','";
						str += res[i]['target']+"','";
						str += res[i]['status']+"','";
						str += (res[i]['made_by_user']?1:0)+"'\n";
					}
					textarea.value = str;
				});
			}
			clear.onclick = function() {
				textarea.value = "";
			}
		}
		</script>
	</body>
	</html>
	<?
	}

Кнопка Получить редиректы записывает редиректы в поле textarea в формате csv.

Кнопка Отправить редиректы записывает редиректы в csv формате из поля textarea в модуль Редиректы.

Кнопка Очистить очищает поле textarea.