Установка скрипта «Дополнительные поля для модулей»

# Введение

Установка скриптового решения займет некоторое время. Пожалуйста, внимательно читайте инструкции и старайтесь следовать всем рекомендациям.

Дополнительные поля это многоцелевой инструмент, с помощью которого вы можете улучшить свой сайт оригинальными и нестандартными решениями. Часто системный лимит количества дополнительных полей у материалов для пользователей слишком мал. Из-за этого приходится реализовывать многие идеи на сайте иначе или полностью отказываться от них. uScript понимает вас и рад представить вам скрипт для решения этого вопроса.
Что скрипт может дать? К примеру, на кино-сайте у вас появится возможность указать полную информацию о фильме, его режиссере, сценаристах, актерах, годе выпуска. Если у вас сайт-журнал, дополнительные поля помогут вам перевести его на основные языки мира, таким образом значительно расширив аудиторию.

Этот скрипт позволит вам добавить 10 дополнительных полей для материалов в следующих модулях:
- новости сайта;
- блог;
- каталог файлов;
- онлайн-игры.

Также скрипт имеет следующие дополнительные преимущества:
- количество новых дополнительных полей не ограничено и задаётся лично администратором сайта;
- сортировка дополнительных полей полностью визуализирована и работает по принципу "Drag and Drop" (перетащи и брось). Вам не будет нужно что-то менять в коде скрипта, просто "захватите" блок курсом мыши и тащите в нужное место.

Требования к установке:
- активированное PHP;
- использование базового API.

Автор скрипта – Новский Александр, победивший в конкурсе реализации PHP скриптов.

Перед установкой, сделайте полный бэкап шаблонов на случай, если вы в какой-то момент решите вернуть прежний вид сайту или отдельным его элементам. Сделать это можно в Панели управления » Управление дизайном » Backup шаблонов.

# Первый шаг: активация API и PHP

## Активация API

Для работы скрипта, нам необходимо включить возможность использования API, сделать это вы можете перейдя в Панель управления » Верхний-бар: Настройки » Общие настройки.
Почти в самом низу страницы найдите опцию "Разрешить использование API", установите напротив неё галочку, затем прокрутите страницу вниз и сохраните изменения.
Примечание: поле "API key" вы можете активировать. В этом случае система сгенерирует специальный уникальный ключ о применении которого речь пойдёт ниже. В случае, если для вас нет разницы использовать API key или не использовать его – можно оставить неактивным.

# Активация PHP

Убедитесь, что на вашем сайте активна услуга PHP. Для этого перейдите на главную страницу панели управления и обратите внимание на правую часть страницы. В случае наличия активной услуги вы увидите текст "PHP детали".
– перейдите к следующему шагу установки, PHP-услуга у вас активна. Если такой текст отсутствует, значит услуга PHP отключена или просрочена. Для подключения PHP необходимо оплатить премиум пакет, включающий возможность использования PHP-скриптов, либо заказать данную услугу отдельно.

# Второй шаг: загрузка скриптов на FTP PHP

## Этап 1. Установка пароля

Если у вас задан пароль к FTP PHP, сразу же переходите к следующему этапу.
Перейдите на главную страницу панели управления вашим сайтом, в правой верхней части нажмите на ссылку «PHP детали».
В открывшемся окне кликните на ссылку: «Пароль не установлен».
Мы попадем на страницу установки пароля на FTP PHP. Заполните поля, продолжайте следовать инструкциям системы.

## Этап 2. Подключение к PHP FTP серверу

После установки пароля, скачайте FTP-клиент, рекомендуем бесплатный FTP клиент FileZilla. После установки программы, в верхней части вводим параметры подключения:

- Сервер: s2000.ucoz.net
- Логин (FTP login): введите свой логин, который указан в меню "PHP детали"
- Пароль: пароль который вы ввели ранее в специальном разделе

После заполнения полей нажмите на кнопку «Быстрое соединение».

## Этап 3. Загрузка скриптов на PHP FTP сервер

После успешного подключения вы увидите каталог под именем «scripts» в правой части окна программы. Обязательно переходим в этот каталог двойным кликом по нему.
Теперь загрузите в этот каталог папку из архива со скриптом «fields». Загрузить легко, просто перетащите эту папку в правый диалог (где отображаются каталоги и файлы хранящиеся на сервере).
Узнать статус передачи файлов вы можете в окне статуса, которое находится в нижней части программы, там отображаются файлы которые ожидают передачи и те, которые не удалось передать, в частности которые были успешно переданы.

# Третий шаг: загрузка файлов на сайт

Перейдите в Панель управления » Файловый менеджер.
В правом верхнем углу кликните на кнопку "Создать папку", введите название папки css.
Кликните на галочку и ура, мы создали папку с нужным именем!:) Теперь зайдите в созданную папку css и загрузите в эту папку файл "addfields.css" из архива со скриптом (папка "стили").

# Четвёртый шаг: установка кода

Перейдите в шаблон «Страница материала и комментариев к нему» нужного вам модуля, и в то место, где желаете видеть вывод информации доп.полей, разместите следующий код:

    <script type="text/javascript">
        $.ajax({
    	type: "GET",
    	url: "/php/fields/readdops.php?id=$ID$&mod=$MODULE_ID$",
    	success: function(html) {
    	    $("#additional_fields").empty();
    	    $("#additional_fields").append(html);
    	}
        });
    </script><div id="additional_fields"></div>

## Для модуля: новости сайта.

Перейдите в шаблон «Страница архива материалов», после системной переменной $BODY$ разместите код:

    <?if($PAGE_ID$='add' || $PAGE_ID$='edit')?>
    <script type='text/javascript'>
        $("#nwM22").after('<tr><td colspan="2"><div id="additional_fields"><input onclick="dopsadd()" type="button" value="Добавить поля"/></div></td></tr>');
        function dopsadd()
        {
    	adres1 = location.href.split('/');
    	ext1 = adres1[adres1.length - 1];
    	adres2 = ext1.split('-');
    	ext2 = adres2[adres2.length - 2];
    	if (ext1 != 0) {
    	    var idm = "?id=" + ext2 + "&mod=$MODULE_ID$";
    	} else {
    	    var idm = "";
    	}
    	$.ajax({
    	    type: "GET",
    	    url: "/php/fields/naredakt.php" + idm,
    	    success: function(html) {
    		$("#additional_fields").empty();
    		$("#additional_fields").append(html);
    	    }
    	});
        }
        $("#addEntForm").submit(function () {
    	setTimeout(function () {
    	    var f = true;
    	    if (document.getElementById('chtitles')) {
    		$("div.myWinSuccess").each(function () {
    		    if (this.innerHTML.indexOf("успешно") !== -1) this.innerHTML += '';
    		});
    	    }
    	    $("a").each(function () {
    		if (this.innerHTML.indexOf("Перейти на страницу материала") !== -1) {
    		    $("div[class*='xt-close']").css("display", "none");
    		    adres = this.href.split('/');
    		    ext = adres[adres.length - 1];
    		    ext2 = ext.split('-');
    		    ext3 = ext2[ext2.length - 1];
    		    var fields = $(":input[name$='mess']").serializeArray();
    		    $("#serialize").empty();
    		    jQuery.each(fields, function(i, field){
    			$("#serialize").append(field.value);
    		    });
    		    if ($("#serialize").text() != 0){
    			$.ajax({
    			    url: encodeURI('/php/fields/savefiledops.php?id=' + ext3 + '&mod=$MODULE_ID$&cid=' + ext),
    			    type: "POST",
    			    data: $("#chtitles").serialize(),
    			    timeout: 10000,
    			    dataType: "json",
    			    success: function (data) {
    				$("#loaderphp").html(data.SCRIPTDATA);
    				$("div[class*='xt-close']").css("display", "block");
    			    }
    			});
    		    } else {
    			$.post("/php/fields/deletedops.php", {
    			    mod: "$MODULE_ID$",
    			    id: ext3,
    			    cid: ext
    			}, function (data) {
    			    if (data) {
    				$('#loaderphp').html(data.SCRIPTDATA);
    				$("div[class*='xt-close']").css("display", "block");
    			    }
    			}, "json")
    			    }
    		    f = false;
    		}
    	    });
    	    f && setTimeout(arguments.callee, 100);
    	}, 100);
        });
    </script>
    <?endif?>

## Для модуля: блог.

Перейдите в шаблон «Страница архива материалов», после системной переменной $BODY$ разместите код:

    <?if($PAGE_ID$='add' || $PAGE_ID$='edit')?>
    <script type='text/javascript'>
        $("#blM22").after('<tr><td colspan="2"><div id="additional_fields"><input onclick="dopsadd()" type="button" value="Добавить поля"/></div></td></tr>');
        function dopsadd()
        {
    	adres1 = location.href.split('/');
    	ext1 = adres1[adres1.length - 1];
    	adres2 = ext1.split('-');
    	ext2 = adres2[adres2.length - 2];
    	if (ext1 != 0) {
    	    var idm = "?id=" + ext2 + "&mod=$MODULE_ID$";
    	} else {
    	    var idm = "";
    	}
    	$.ajax({
    	    type: "GET",
    	    url: "/php/fields/naredakt.php" + idm,
    	    success: function(html) {
    		$("#additional_fields").empty();
    		$("#additional_fields").append(html);
    	    }
    	});
        }
        $("#addEntForm").submit(function () {
    	setTimeout(function () {
    	    var f = true;
    	    if (document.getElementById('chtitles')) {
    		$("div.myWinSuccess").each(function () {
    		    if (this.innerHTML.indexOf("успешно") !== -1) this.innerHTML += '';
    		});
    	    }
    	    $("a").each(function () {
    		if (this.innerHTML.indexOf("Перейти на страницу материала") !== -1) {
    		    $("div[class*='xt-close']").css("display", "none");
    		    adres = this.href.split('/');
    		    ext = adres[adres.length - 1];
    		    ext2 = ext.split('-');
    		    ext3 = ext2[ext2.length - 1];
    		    var fields = $(":input[name$='mess']").serializeArray();
    		    $("#serialize").empty();
    		    jQuery.each(fields, function(i, field){
    			$("#serialize").append(field.value);
    		    });
    		    if ($("#serialize").text() != 0){
    			$.ajax({
    			    url: encodeURI('/php/fields/savefiledops.php?id=' + ext3 + '&mod=$MODULE_ID$&cid=' + ext),
    			    type: "POST",
    			    data: $("#chtitles").serialize(),
    			    timeout: 10000,
    			    dataType: "json",

    			    success: function (data) {
    				$("#loaderphp").html(data.SCRIPTDATA);
    				$("div[class*='xt-close']").css("display", "block");

    			    }
    			});
    		    } else {
    			$.post("/php/fields/deletedops.php", {
    			    mod: "$MODULE_ID$",
    			    id: ext3,
    			    cid: ext
    			}, function (data) {
    			    if (data) {
    				$('#loaderphp').html(data.SCRIPTDATA);
    				$("div[class*='xt-close']").css("display", "block");
    			    }
    			}, "json")
    			    }
    		    f = false;
    		}
    	    });
    	    f && setTimeout(arguments.callee, 100);
    	}, 100);
        });
    </script>
    <?endif?>

## Для модуля: каталог файлов.

Перейдите в шаблон «Страница добавления/редактирования материала», после системной переменной $BODY$ разместите код:

    <script type='text/javascript'>
        $("#ldM6").after('<tr><td colspan="2"><div id="additional_fields"><input onclick="dopsadd()" type="button" value="Добавить поля"/></div></td></tr>');
        function dopsadd()
        {
    	adres1 = location.href.split('/');
    	ext1 = adres1[adres1.length - 1];
    	adres2 = ext1.split('-');
    	ext2 = adres2[adres2.length - 2];
    	if (ext1 != 0) {
    	    var idm = "?id=" + ext2 + "&mod=$MODULE_ID$";
    	} else {
    	    var idm = "";
    	}
    	$.ajax({
    	    type: "GET",
    	    url: "/php/fields/naredakt.php" + idm,
    	    success: function(html) {
    		$("#additional_fields").empty();
    		$("#additional_fields").append(html);
    	    }
    	});
        }
        $("#addEntForm").submit(function () {
    	setTimeout(function () {
    	    var f = true;
    	    if (document.getElementById('chtitles')) {
    		$("div.myWinSuccess").each(function () {
    		    if (this.innerHTML.indexOf("успешно") !== -1) this.innerHTML += '';
    		});
    	    }
    	    $("a").each(function () {
    		if (this.innerHTML.indexOf("Перейти на страницу материала") !== -1) {
    		    $("div[class*='xt-close']").css("display", "none");
    		    adres = this.href.split('/');
    		    ext = adres[adres.length - 1];
    		    ext2 = ext.split('-');
    		    ext3 = ext2[ext2.length - 1];
    		    var fields = $(":input[name$='mess']").serializeArray();
    		    $("#serialize").empty();
    		    jQuery.each(fields, function(i, field){
    			$("#serialize").append(field.value);
    		    });
    		    if ($("#serialize").text() != 0){
    			$.ajax({
    			    url: encodeURI('/php/fields/savefiledops.php?id=' + ext3 + '&mod=$MODULE_ID$&cid=' + ext),
    			    type: "POST",
    			    data: $("#chtitles").serialize(),
    			    timeout: 10000,
    			    dataType: "json",
    			    success: function (data) {
    				$("#loaderphp").html(data.SCRIPTDATA);
    				$("div[class*='xt-close']").css("display", "block");

    			    }
    			});
    		    } else {
    			$.post("/php/fields/deletedops.php", {
    			    mod: "$MODULE_ID$",
    			    id: ext3,
    			    cid: ext
    			}, function (data) {
    			    if (data) {
    				$('#loaderphp').html(data.SCRIPTDATA);
    				$("div[class*='xt-close']").css("display", "block");
    			    }
    			}, "json")
    			    }
    		    f = false;
    		}
    	    });
    	    f && setTimeout(arguments.callee, 100);
    	}, 100);
        });
    </script>

## Для модуля: онлайн-игры.

Перейдите в шаблон «Страница добавления/редактирования материала», после системной переменной $BODY$ разместите код:

    <script type='text/javascript'>
        $(".ucoz-editor-bottom").after('<tr><td colspan="2"><div id="additional_fields"><input onclick="dopsadd()" type="button" value="Добавить поля"/></div></td></tr>');
        function dopsadd()
        {
    	adres1 = location.href.split('/');
    	ext1 = adres1[adres1.length - 1];
    	adres2 = ext1.split('-');
    	ext2 = adres2[adres2.length - 2];
    	if (ext1 != 0) {
    	    var idm = "?id=" + ext2 + "&mod=$MODULE_ID$";
    	} else {
    	    var idm = "";
    	}
    	$.ajax({
    	    type: "GET",
    	    url: "/php/fields/naredakt.php" + idm,
    	    success: function(html) {
    		$("#additional_fields").empty();
    		$("#additional_fields").append(html);
    	    }
    	});
        }
        $("#addEntForm").submit(function () {
    	setTimeout(function () {
    	    var f = true;
    	    if (document.getElementById('chtitles')) {
    		$("div.myWinSuccess").each(function () {
    		    if (this.innerHTML.indexOf("успешно") !== -1) this.innerHTML += '';
    		});
    	    }
    	    $("a").each(function () {
    		if (this.innerHTML.indexOf("Перейти на страницу материала") !== -1) {
    		    $("div[class*='xt-close']").css("display", "none");
    		    adres = this.href.split('/');
    		    ext = adres[adres.length - 1];
    		    ext2 = ext.split('-');
    		    ext3 = ext2[ext2.length - 1];
    		    var fields = $(":input[name$='mess']").serializeArray();
    		    $("#serialize").empty();
    		    jQuery.each(fields, function(i, field){
    			$("#serialize").append(field.value);
    		    });
    		    if ($("#serialize").text() != 0){
    			$.ajax({
    			    url: encodeURI('/php/fields/savefiledops.php?id=' + ext3 + '&mod=$MODULE_ID$&cid=' + ext),
    			    type: "POST",
    			    data: $("#chtitles").serialize(),
    			    timeout: 10000,
    			    dataType: "json",
    			    success: function (data) {
    				$("#loaderphp").html(data.SCRIPTDATA);
    				$("div[class*='xt-close']").css("display", "block");
    			    }
    			});
    		    } else {
    			$.post("/php/fields/deletedops.php", {
    			    mod: "$MODULE_ID$",
    			    id: ext3,
    			    cid: ext
    			}, function (data) {
    			    if (data) {
    				$('#loaderphp').html(data.SCRIPTDATA);
    				$("div[class*='xt-close']").css("display", "block");
    			    }
    			}, "json")
    			    }
    		    f = false;
    		}
    	    });
    	    f && setTimeout(arguments.callee, 100);
    	}, 100);
        });
    </script>

Далее, перейдите в шаблон «Форма добавления/редактирования материала», найдите в этом шаблоне код:

    <?if($MESSAGE_FL$)?>
     <tr><td class="manTd2" colspan="2">$MESSAGE_FL$</td></tr>
     <tr><td height="10" class="manTdSep" colspan="2"><hr class="manHr" /></td></tr>
    <?endif?>

и после этого кода разместите следующее:

     <tr><td class="manTd2" colspan="2"><div id="additional_fields"></div></td></tr>
     <tr><td height="10" class="manTdSep" colspan="2"><hr class="manHr" /></td></tr>

# Пятый шаг: настройка и использование

## Создание страниц для сортировки полей и их переменования.

Перейдите в Панель управления » Редактор страниц » Управление страницами сайта: Добавить страницу. На открывшейся странице нам нужно заполнить поля. В поле «Название страницы» введите, например, "Сортировка доп. полей". Затем в поле «Содержимое страницы» вставьте следующий код в HTML-режиме:

    <select id="module">
        <option value="load">Каталог файлов</option>
        <option value="news">Новости</option>
        <option value="blog">Блог</option>
        <option value="stuff">Онлайн-игры</option>
    </select>
    <input type="button" onClick="mod()" value="Выбрать модуль"><div id="phpdivmain"></div>
    <script type="text/javascript">
        function mod() {
    	$('#phpdivmain').html('<img src="/.s/img/wd/6/ajax.gif" />');
    	var moduleop = $("#module :selected").val();
    	$.ajax({
    	    url: "/php/fields/admindops.php",
    	    type: "GET",
    	    data: "mod="+moduleop,
    	    timeout: 12000,
    	    success: function(data){
    		if (data) $('#phpdivmain').html(data);
    		$.getScript("/.s/src/jquery-ui/jquery-ui.min.js", function(){
    		    $( "#sortable1, #sortable2" ).sortable({
    			connectWith: ".connectedSortable"
    		    }).disableSelection();
    		});
    	    }
    	});
        }
        function save () {
    	var order = $("#sortable1").sortable("serialize") + '&update=update&';
    	var order2 = $("#sortable2").sortable("serialize");
    	var mod = $("#opred").html();
    	jQuery.ajax({
    	    url: "/php/fields/admindops.php?mod="+mod,
    	    type: "POST",
    	    data: order + order2,
    	    timeout: 12000,
    	    dataType: "html",
    	    success: function(data){
    		if (data) $('#phpdivmain').html(data);
    		$( "#sortable1, #sortable2" ).sortable({
    		    connectWith: ".connectedSortable",
    		    placeholder: "ui-state-highlight1"
    		}).disableSelection();
    		$( "#sortable1" ).sortable({ opacity: 0.6 });
    	    }
    	});
        }
        function addtext () {
    	$("#sortable2").append('<li class="ui-state-highlight" id="name_text"><div class="ui-state-highlight3"></div><input value="text" style="width:95%" type="text" /></li>')
    	    }
        function addarea () {
    	$("#sortable2").append('<li class="ui-state-highlight" id="name_textarea"><div class="ui-state-highlight3"></div><textarea style="width:95%"></textarea></li>')
    	    }
    </script>

При этом галочка у пункта "Заменять переводы строк тегом <BR>" должна быть неактивна. Также можете отметить галочками группы, которым будет доступна эта страницы для просмотра. Однако напомним, что сохранение полей доступно только администратору (ID указывается в файле конфигурации).
Далее, по предыдущей схеме создайте страницу с названием, например, "Названия полей". Затем в поле «Содержимое страницы» вставьте следующий код в HTML-режиме:

    <select id="module">
        <option value="load">Каталог файлов</option>
        <option value="news">Новости</option>
        <option value="blog">Блог</option>
        <option value="stuff">Онлайн-игры</option>
    </select><input type="button" onClick="mod()" value="Перейти">
    <script type="text/javascript">
        function mod() {
    	$('#phpdivmain').html('<img src="/.s/img/wd/6/ajax.gif" />');
    	var moduleop = $("#module :selected").val();
    	jQuery.ajax({
    	    url: "/php/fields/editdops.php",
    	    type: "GET",
    	    data: "mod=" + moduleop,
    	    timeout: 12000,
    	    success: function(data){
    		if (data) $('#phpdivmain').html(data);
    	    }
    	});
        }
    </script><div id="phpdivmain"></div>

Опять же, галочка у пункта "Заменять переводы строк тегом <BR>" должна быть неактивна.

## Настройка скрипта.

Вся настройка и управление происходит в конфиг-файле configdops.php, который мы загружали на FTP PHP вместе с папкой «fields». Давайте рассмотрим настройки детально:

- `$site` – адрес вашего сайта в пуникоде (если у вас сайт в кириллическом домене) без "http:/www." и слеша в конце. Конвертация в Punycode доступна по адресу: http://faq.ucoz.ru/punycode/
- `$site2` – если у вас сайт в кириллическом домене, то здесь указать адрес кириллическими символами, например сайт.рф
  ОДНАКО если адрес вашего сайта не с кириллическим доменом, то и в $site и в $site2 необходимо просто указать адрес сайта, например, "site.ru"
- `$adminid` – ID администратора, который имеет доступ к редактированию названий доп. полей и их сортировке. Допускается указать только одного
- `$moderid` – ID пользователей (модераторов), которым разрешено редактировать дополнительные поля. Перечислить через запятую, пример: 100, 200
- `$apikey` – API key из админ-панели, например "335HyufTrbGe042W". Если не используете ключ, то нужно оставить поле пустым

## Изменение надписей.

Если вы хотите изменить текст «Дополнительная информация», который встречается на странице материала и при добавлении\редактировании материала, откройте файлы readdops.php и naredakt.php в папке fields (которую мы загружали на FTP PHP), найдите следующее:

    Дополнительная информация

и замените на нужный вам текст.

## Добавление дополнительных полей.

В том случае, если вы желаете добавить ещё поля, зайдите в папку configs (которая расположена в папке fields на FTP PHP), откройте текстовой файл нужного нам модуля:

- `blog.txt` – модуль "блог";
- `news.txt` – модуль "новости сайта";
- `load.txt` – модуль "каталог файлов";
- `stuff.txt` – модуль "онлайн-игры".

Рассмотрим на примере. Имеем следующее содержание файла:

    a	area1	Дополнительное поле 1
    a	text2	Дополнительное поле 2
    a	area3	Дополнительное поле 3
    a	text4	Дополнительное поле 4
    a	area5	Дополнительное поле 5
    n	area6	Дополнительное поле 6
    n	area7	Дополнительное поле 7
    n	text8	Дополнительное поле 8
    n	text9	Дополнительное поле 9
    n	text10	Дополнительное поле 10

Добавляем следующим принципом (сохраняя при этом табуляцию):

    n	area11	Дополнительное поле 11
    n	text12	Дополнительное поле 12
    n	text13	Дополнительное поле 13
    n	text14	Дополнительное поле 14

выделенное зеленым цветом является типом расширенного поля (textarea), а красного цвета – типом обычного поля (input type="text"). Серым – ID-поля, который должен быть уникальным.
Активировать созданные поля вы можете на странице сортировки.
ВАЖНО ЗНАТЬ:
1) В дополнительных полях вызаются все html-теги. Т.е. вместо введенных "<b>Привет,</b> это я!" сохранится и отобразится только "Привет, это я!". Настоятельно не рекомендуется убирать обрезание html-тегов в целях безопасности сайта и пользоваталей.
2) Скрипт умеет сохранять текст только в одну строчку.
Установка завершена. Если у вас возникли вопросы, которые не затрагивались в документации, спрашивайте в комментариях к товару.