94 (+1)

Выпуск №7

Версия для распечатки (Часть II)
Скопировать, вставить, скопировать, вставить, скопировать...

Поиск по сайтуДля желающих написать письмоПослать ссылку другуВерсия для распечатки


Здравствуйте! Завтра у нас День Святого Валентина, и по этому случаю я сподобился нарисовать новый логотип для сайта открыток. Так что одна половина человечества приглашается поздравить другую! Будем считать это моим небольшим вкладом в сей праздник. Хорошо? :)

Спасибо всем, кто высказал свое мнение о необходимости создания страничек для распечатки. Теперь можно подвести итоги, которые заключаются в следующем: 73% склоняются к тому, что версии для распечатки очень удобны, и постоянно ими пользуются; 19% считают этот сервис удобным, но необязательным, и лишь 8% ответили, что абсолютно этим не пользуются. Таким образом, можно сделать вывод, что усилия, потраченные на внедрение этого сервиса, будут востребованы посетителями сайтов.

А сегодня я закончу статью о создании версий страничек для распечатки (на этот раз мы остановимся на технической части) и расскажу об очень приятной утилитке, которая поможет сберечь кучу времени при выполнении самого популярного действия в компьютерах, а именно, операции копирования и вставки.



Web-сайт

Версия для распечатки (Часть II)

Продолжаем разговор о создании страничек для распечаток. Прошлая часть была теоретическая, а эта у нас будет практическая. Рассмотрим способы создания таких страничек, используя SSI и PHP. На примере SSI я покажу, как можно легко внедрить странички для распечатки в динамический сайт, т.е. сайт, использующий формирование страничек на лету. PHP же послужит для иллюстрации способа внедрения механизма формирования страничек для распечатки в существующий статический сайт, не меняя ничего в нем самом.


Генерация страничек с использованием SSI



Итак, предположим, что ваш сайт генерирует странички динамически. В самом простом случае вы используете технологию SSI и оформление шапки и низа странички вынесены в отдельные файлы. В этом случае типичная страничка изнутри выглядит примерно следующим образом:

<!--#include virtual="/includes/_header.shtml" -->

<p>Здесь расположен основной текст странички.</p>

<!--#include virtual="/includes/_footer.shtml" -->

Т.е., упрощенно говоря, весь дизайн как раз и находится в файлах, формирующих верх и низ странички. Поэтому, для того чтобы получить версию для распечатки, нам достаточно скорректировать два этих файла. А точнее, сделать их копии с другими именами и минималистическим дизайном, как это было описано в предыдущей статье. А для того чтобы отслеживать, какую версию запросил пользователь - полную или для печати, нам придется ввести некую переменную. Например, print, которую и отслеживать при помощи SSI-команд. Самый простой способ - воспользоваться методом GET. При этом для добавления версии для распечатки нам достаточно будет где-нибудь в начале статьи добавить следующую ссылку:

<a href="<!--#echo var="DOCUMENT_URI" -->?print">Версия для распечатки</a>

Переменная окружения DOCUMENT_URI хранит адрес текущей странички.

Осталось только обработать эту переменную, и если она присутствует, то подключать версии файлов для распечатки. Если нет, то обычные. Это можно сделать следующим фрагментом кода:

<!--#if expr="$QUERY_STRING=/print/" -->
<!--#include virtual="/includes/_header_printed.shtml" -->
<!--#else -->
<!--#include virtual="/includes/_header_full.shtml" -->
<!--#endif -->

В данном фрагменте я вынес описание стандартной шапки страницы в файл _header_full.shtml, а версии для распечатки в файл _header_printed.shtml. Впрочем, если вам удобнее, то можно объединить все три файла в один. Единственное, на чем это сказывается, - на удобстве чтения исходных файлов. Нижняя шапка странички подключается точно так же, только везде вместо header пишите в вышеприведенном коде footer.

Я описал этот способ, используя технологию SSI, но в общем он применим для широкого круга серверных технологий, которые имеют встроенный язык и позволяют подключать внешние файлы. Это может быть и PHP и ASP (Active Server Pages - технология от Microsoft) и ColdFusion (скриптовый язык от Allaire, т.е. уже от Macromedia) и JSP (Java Server Pages) и еще десятки других серверных скриптовых языков.


Генерация страничек с использованием PHP



Предыдущий способ хорош в случаях, если ваш сайт динамический и позволяет использовать технологии, подобные SSI. Если же ваш сайт существует достаточно давно, написан с использованием чистого HTML и его объем слишком внушителен, чтобы затевать глобальную переделку, то в этом случае может помочь способ генерации версий для распечаток при помощи отдельного скрипта. Подобный способ я использовал на сайте "Cherry-Design" для добавления к статьям по web-дизайну возможности получить версию для распечатки. Открыв любую статью, вы увидите слева иконку принтера и ссылку на скрипт, который сгенерирует версию для распечатки.

В чем заключается идея? Она состоит в том, чтобы передать специально написанному скрипту адрес существующей странички и, вычленив из нее интересующие нас фрагменты, сформировать страничку для печати и вывести ее в броузер.

Начнем с первой задачи - как передать скрипту, для какой именно странички нам необходимо создать версию для распечатки? Т.к. сайт у нас статический, то ссылку на скрипт и адрес странички нам придется добавить самим. Причем на каждой страничке, которую мы хотим представить в виде, удобном для распечатки. Используем для этого метод GET, т.е. передадим параметры в адресной строке:

<a href="php/print.php?id=mypage.htm>Версия для распечатки</a>

Код написан в предположении, что страничка, на которую мы внедряем этот фрагмент, имеет название mypage.htm и расположена в корневом каталоге. Подразумевается также, что скрипт, генерирующий страничку, расположен в подкаталоге php/ и называется print.php.

С первой задачей мы справились, скрипт вызывается, но самого скрипта еще нет. Сейчас мы и займемся его написанием. Первый этап будет заключаться в чтении нужной странички. Мы передали имя файла в скрипт в переменной $id, поэтому нам осталось только проверить ее наличие и считать в переменную:

// Проверяем что переменная передана в скрипт и что такая страничка существует
if (!empty($id) && file_exists("../".$id)) { 
    $string = @file("../".$id);     // считываем содержимое файла в массив
    $string = implode("", $string); // преобразуем массив в строку
} else {
    die("Не передан адрес странички для распечатки!");
}

Следующим шагом будет вычленение из исходного файла нужных нам фрагментов текста. Для этого нам придется использовать регулярные выражения. Это очень мощное средство для поиска и обработки строк в текстах, и я расскажу о нем подробнее в следующих статьях, а пока я просто приведу готовый код с использованием регулярных выражений и расскажу, как они работают.

Но вначале мы поговорим о том, как устроена наша страничка. А точнее, как идентифицировать нужные нам фрагменты. Я буду исходить из того, что базовая страничка, которую мы анализируем, устроена примерно так:

<html>
<head>
<title>Заголовок страницы</title>
.....
</head>

<body>
.....
<!-- Text begin -->

<p>Содержательная часть страницы, которую мы хотим напечатать.</p>

<!-- Text end -->
....
</body>
</html>

Точками я обозначил несущественные в данном случае фрагменты кода. Основываясь на этом представлении странички, мы можем словесно обозначить нужные нам фрагменты текста:

  • Название статьи - расположено между тегами <title></title>
  • Текст статьи - находится между комментариями, помечающими в коде начало и конец содержательной части страницы.

А теперь переведем словесные описания в форму, понятную компьютеру:

// Вытаскиваем название статьи
ereg("<title>([^<]*)</title>", $string, $regs);
$title = ereg_replace("<br>", " ", $regs[1]);

// Вытаскиваем текст статьи
ereg("<!-- Text begin -->(.*)<!-- Text end -->", $string, $regs);
$text = $regs[1];

В вышеприведенном коде я использовал два регулярных выражения для вычленения соответственно названия статьи (оно теперь хранится в переменной $title) и его содержимого (хранится в переменной $text). В обоих случаях механизм регулярных выражений ищет на страничке нужные фрагменты согласно ранее описанным правилам.

Будем считать, что автор всех статей один человек (а для частных проектов это, как правило, так и есть), поэтому имя автора просто присвоим переменной. Но вы должны понимать, что нет никаких принципиальных ограничений, не позволяющих вытащить из текста имя автора при помощи регулярных выражений.

$author = "Михаил Мельников";

Дату распечатки мы также сформируем автоматически, используя текущее время:

$date = date("j/n/Y H:i:s");

Осталась самая простая часть работы, а именно формирование самой странички для распечатки. Ее написание не отличается от любой другой, за исключением того, что в нужных местах мы вставим значения рассчитанных переменных. Это можно сделать, например, вот так:

<html>
<head>
<title><? echo htmlspecialchars($title); ?></title>
</head>

<body>

<h1><? echo htmlspecialchars($title); ?></h1>
Автор: <? echo htmlspecialchars($author); ?><br>
Дата распечатки: <? echo $date; ?><br>
<hr>

<? echo $text; ?>

<hr>

<p align=center>Copyright (C) 2003 Web-studio "Cherry-Design"</p>

</body>
</html>

Вот и все. Выше я описал методику, основываясь на внутренней структуре своей странички, у вас она может несколько отличаться, поэтому, возможно, придется кое-что подкорректировать в регулярных выражениях.

Вы можете скачать архив с примерами скриптов, использованных в статье:

Для проверки скриптов вам необходим локально установленный web-сервер с поддержкой PHP. Скрипты необходимо распаковывать в корневой каталог.



Утилиты

Скопировать, вставить, скопировать, вставить, скопировать...

Существует достаточно много утилит, которые позволяют облегчить и автоматизировать такую часто встречающуюся при работе на компьютере операцию, как копирование и вставка (Cut'n'Paste). Но, как всегда, сложно найти такую, чтобы была и удобной, и несложной, и без "крутого интерфейса", и свободная от ненужных функций. Смею надеяться, что мне это удалось! Я видел много подобных программ, но ни одна из них по удобству и скорости доступа к ней не приближается. Итак, позвольте представить, герой дня - Clipomatic!


Clipomatic



Clipomatic - вот такое меню появляется при нажатии комбинации Ctrl-Alt-V

Автор: Mike Lin
Домашняя страничка: http://www.mlin.net/
Объем дистрибутива: 98 KB (Загрузить)
Статус программы: Freeware

Замечательная утилитка! Одна из самых полезных, которые я знаю. Сделана очень удобно, а дизайн приближается к идеальному, т.е. не виден, когда не нужен.

Оцените, как гениально все сделано. Обычное копирование и вставка, как вы знаете, делается соответственно командами Ctrl-C и Ctrl-V. Clipomatic запоминает последние скопированные фрагменты текста (по умолчанию 10) и помещает их в свой буфер. Не знаю, как у вас, но у меня очень часто возникает ситуация, когда информацию в буфере обмена терять не хочется, потому как она понадобится через пару секунд, а кое-что нужно до этого момента как скопировать, так и вставить. Clipomatic это позволяет! Вы просто копируете и вставляете новый фрагмент как обычно, а потом, возвращаясь к предыдущей работе, можете вызвать ранее скопированный фрагмент, нажав комбинацию Ctrl-Alt-V. Перед вами выпадет список последних скопированных фрагментов, из которого можно выбрать нужный - мышкой или нажав цифровую клавишу от 0 до 9. При этом выбранный фрагмент вставится в текст и переместится в списке наверх, т.е. повторно вставить вы его сможете стандартной комбинацией Ctrl-V.

Но и это, как говорится в надоедливой телевизионной рекламе, еще не все. Вы можете организовывать свои наборы так называемых клипсетов (clipsets), т.е. наборы ранее скопированных фрагментов. Это удобно для определенных задач. К примеру, если вы часто заполняете в интернете формы (а кто же их не заполняет?), то можно создать клипсет со своими данными (имя, e-mail, URL своей странички, город и т.д.). Ведь мы часто вводим почти одно и тоже, теряя на этом кучу времени. Теперь же достаточно выбрать нужный клипсет - и форму можно заполнить буквально в несколько щелчков. А можно составить набор наиболее часто вводимых команд для различных языков программирования или написания HTML.

В дополнение к обычным клипсетам, Clipomatic поддерживает и т.н. постоянный клипсет (permanent clipset). Его отличие от остальных заключается в том, что он всегда присутствует в списке фрагментов сразу после основного клипсета. Вызвать нужный фрагмент можно нажатием буквенной клавиши (основной клипсет, как вы помните, использует цифры) или опять же перемещением мышки. Берегите свое время, организовывайте свою работу, и тогда вдруг окажется, что в забитом под завязку дне можно выкроить полчасика на чашку горячего чая в компании с другом. :)


Предыдущий выпускНаверхСледующий выпуск


Свои мнения, пожелания и вопросы по выпускам Вы можете присылать по адресу mike@cherry-design.ru.
Я оставляю за собой право цитировать письма, пришедшие по вышеуказанному адресу.
Copyright © 2001-2008 Михаил Мельников. Перепечатка без разрешения запрещена.