phpBB 3.1.10 - восстановить превью thumb_ для древних вложений phpBB2

Полезные скрипты
Ответить
Аватара пользователя
mihas
Администратор
Сообщения: 1368
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

phpBB 3.1.10 - восстановить превью thumb_ для древних вложений phpBB2

Сообщение mihas »

При конвертации форума из 2 версии в 3 потерялись превьюшки для вложенных картинок. Вторая причина телодвижений, на мобильной версии форума мне не понравились размеры имеющихся превьюшек (слишком мелкие), созданных в 3 версии, и захотелось их все перегенерить для красивого представления на телефоне.
Вторая задача решается легко: скачиваем себе всю папку вложений, выделяем все файлы со странными именами вроде 2_6528b86408e87fe6c87b7a551c8fac72 без расширения имени. Это файлы изображений в формате jpg, png, gif. И к ним в той же папке есть превью в jpg с теми же странными именами и префиксом "thumb_". Генерим на локальной машине в фотошопе или там в FastStone нужные превьюшки и с нужными именами. У меня было не много, чуть больше сотни таких файлов, и я прогнал из экшном Automate/Fit Image на уменьшение, ну и чуть подшарпил для красоты. И сохранил все жпегами. Потом добавляем к имени новых файлов префикс "thumb_" и удаляем расширение jpg, все это пакетно. Заменяем старые файлы превью на новые с теми же именами на сервере.

Первую проблему - старые картинки без превьюшек - тоже решил, решение на крохотном яваскрипте. Расскажу по порядку в деталях.
Изображения от второй версии форума хранятся в папке вложений с осмысленными именами, но так же не совпадающими с названием файла по базе {_file.DOWNLOAD_NAME}. Их характерные особенности таковы: расширение есть и всегда маленькими буквами, все символы в файле маленькими буквами, вместо пробела в названиях стоит подчеркивание "_", на конце файла четыре символа - подчеркивание и трехзначное число.
Берем все эти файлы и генерим на своем компе в фотошопе или FastStone или ACDSee или в чем хотите нужные превьюшки для них с теми же именами в отдельную папку. Причем превью png так же сохраняем в png, а gif - в gif, в моем решении я не загонял все превью в jpg.
Потом пакетно переименовываем все файлы в этой папке: добавляем префикс "thumb_" и убираем 4 символа справа в имени до расширения. Расширения jpg, gif. png оставляем как есть - главное все расширения маленькими буквами.
У меня таких файлов без превью от старого форума набралось 170 штук. И с одинаковыми именами, типа untitled_1, различающимися лишь 4 последними символами у меня не было к счастью.
Кладем эту папку на сервер, но не в каталог форума, а на уровень выше, рядом с папкой форума (форум может капризничать с правами доступа к папке внутри него).
И теперь делаем пару маленьких правочек в шаблонах стилей в файле attachment.html из папки styles/prosilver(subsilver и проч)/template:

Для стиля prosilver и базирующихся на нем в файле attachment.html находим блок аттачей файлов и дописываем к нему условие на JavaScript. Найти:

Код: Выделить всё

		<!-- IF _file.S_FILE -->
		<dl class="file">
			<dt><!-- IF _file.UPLOAD_ICON -->{_file.UPLOAD_ICON} <!-- ENDIF --><a class="postlink" href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a></dt>
			<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->
			<dd>({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}</dd>
		</dl>
		<!-- ENDIF -->
и заменить на следующее:

Код: Выделить всё

		<!-- IF _file.S_FILE -->
        <script type="text/javascript">
		var fileUrlUp = "{_file.DOWNLOAD_NAME}";
		var fileLink = fileUrlUp.toLowerCase().replace(/\ /gi, "_");
		var fileLinkar = fileLink.split('.'); 
		var ext = fileLinkar[fileLinkar.length-1];  
		if(ext == 'png' || ext == 'jpg' || ext == 'gif') {
		document.write('<dl class="thumbnail">');
		document.write('<dt><a href="{_file.U_DOWNLOAD_LINK}"><img src="../../forum_files_thumb/thumb_'+fileLink+'" class="postimage" alt="{_file.DOWNLOAD_NAME}" title="{_file.DOWNLOAD_NAME} • ({_file.FILESIZE} {_file.SIZE_LANG}) • {_file.L_DOWNLOAD_COUNT}" /></a></dt>');
		document.write('<!-- IF _file.COMMENT --><dd> {_file.COMMENT}</dd><!-- ENDIF -->');
		document.write('</dl>');
	} else {
			document.write('<dl class="file">');
			document.write('<dt><!-- IF _file.UPLOAD_ICON -->{_file.UPLOAD_ICON} <!-- ENDIF --><a class="postlink" href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a></dt>');
			document.write('<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->');
			document.write('<dd>• ({_file.FILESIZE} {_file.SIZE_LANG}) • {_file.L_DOWNLOAD_COUNT}</dd>');
			document.write('</dl>');
			}
			</script>
            <noscript>
            <dl class="file">
			<dt><!-- IF _file.UPLOAD_ICON -->{_file.UPLOAD_ICON} <!-- ENDIF --><a class="postlink" href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a></dt>
			<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->
			<dd>• {_file.FILESIZE} {_file.SIZE_LANG} • {_file.L_DOWNLOAD_COUNT}</dd>
		</dl>
            </noscript>	
		<!-- ENDIF -->
Замечу, что мы полностью сохраняем родной код в тегах <noscript> на всякий. А яваскрипт находит имя и расширение файла, если расширение совпадает с png, jpg, gif - берет для них превьюшку из нашей папки на одном уровне с папкой форума с именем forum_files. Ну и соответственно уменьшает регистр, убирает пробелы - то есть все то, что проделал с файлами старый форум 2 версии.

Для стиля subsilver и основанных на нем исправление attachment.html выглядит так, находим блок:

Код: Выделить всё

		<!-- IF _file.S_FILE -->
			<span class="genmed">
				<!-- IF _file.UPLOAD_ICON -->{_file.UPLOAD_ICON} <!-- ENDIF -->
				<a href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a> [{_file.FILESIZE} {_file.SIZE_LANG}]
			</span><br />
			<span class="gensmall">{_file.L_DOWNLOAD_COUNT}</span>
		<!-- ENDIF -->
и заменяем на:

Код: Выделить всё

		<!-- IF _file.S_FILE -->
        <script type="text/javascript">
		var fileUrlUp = "{_file.DOWNLOAD_NAME}";
		var fileLink = fileUrlUp.toLowerCase().replace(/\ /gi, "_");
		var fileLinkar = fileLink.split('.'); 
		var ext = fileLinkar[fileLinkar.length-1];  
		if(ext == 'png' || ext == 'jpg' || ext == 'gif') {
		document.write('<a href="{_file.U_DOWNLOAD_LINK}"><img src="../../forum_files_thumb/thumb_'+fileLink+'" class="postimage" alt="{_file.DOWNLOAD_NAME}" /></a><br />');
		document.write('<span class="gensmall">{_file.DOWNLOAD_NAME} [ {_file.FILESIZE} {_file.SIZE_LANG} | {_file.L_DOWNLOAD_COUNT} ]</span>');
	} else {
			document.write('<span class="genmed">');
			document.write('<!-- IF _file.UPLOAD_ICON -->{_file.UPLOAD_ICON} <!-- ENDIF -->');
			document.write('<a href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a> [{_file.FILESIZE} {_file.SIZE_LANG}]');
			document.write('</span><br />');
			document.write('<span class="gensmall">{_file.L_DOWNLOAD_COUNT}</span>');
			}
			</script>
            <noscript>
            <span class="genmed">
				<!-- IF _file.UPLOAD_ICON -->{_file.UPLOAD_ICON} <!-- ENDIF -->
				<a href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a> [{_file.FILESIZE} {_file.SIZE_LANG}]
			</span><br />
			<span class="gensmall">{_file.L_DOWNLOAD_COUNT}</span>
            </noscript>
		<!-- ENDIF -->
Если почему-то яваскрипт на клиентской машине выключен - ничего страшного - отработает стандартный нетронутый нами код из блока <noscript>. Просто будет штатно ссылка без превьюшки.
При желании закрываем доступ к листингу нашей папки с превьюшками строчкой в файле .htaccess для этой папки: Options -Indexes. Все задача решена, решение работает целиком на клиенсткой машине и никак не затрагивает ни базы данных ни php-скриптов форума. Хотелось бы и в форуме как в gallery иметь возможность перегенерить сервером скопом все превьюшки, но пока таких экстеншнов нет, я все перерыл, прежде чем решать задачку самостоятельно на яваскрипте.
Ответить

Вернуться в «JavaScript»