На главную Назад
Добро пожаловать, уважаемый посетитель!

 

ГЛАВА 15

JavaScript и COM

Какнеоднократно упоминалось в книге, одной изсамых замечательных особенностей РНРявляется простота его интеграции с другимитехнологиями. Примеры такой интеграции ужевстречались при описании работы с базамиданных, ODBC и XML. В этой главе будет показано,как просто организуется работа РНР вкомбинации с JavaScript и приложениями на базеСОМ. Ниже приводятся общие сведения о JavaScriptи СОМ, подкрепленные примерами ихиспользования в РНР. К концу главы выузнаете немало полезного об этихзамечательных технологиях и о том, как ониприменяются в РНР.

JavaScript

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

Любойпрограммист с опытом работы на РНР, Pascal илиC++ освоит JavaScript без особого труда. Если вы непрограммировали на этих языках, неогорчайтесь - JavaScript изучается легко.Разработчики JavaScript (как, впрочем, иразработчики РНР) в первую очередьориентировались на решение реальных,практических задач.

Если выхотите воспользоваться средствамиобработки,событий JavaScript, сохранив при этоммногочисленные преимущества РНР, могу васобрадовать - РНР интегрируется с JavaScript также легко, как и с HTML. В сущности, JavaScriptнеплохо дополняет РНР - на нем удобноделать то, что неудобно делать в РНР, инаоборот.

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

Проверкаподдержки JavaScript

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

get_browser( )

Функцияget_browser( ) возвращает информацию овозможностях браузера в виде объекта.Синтаксис:

object get_browser([string агент])

Необязательныйпараметр агент используется для полученияхарактеристик конкретного браузера. Какправило, функция get_browser( ) вызывается безпараметров, поскольку по умолчанию онаиспользует глобальную переменную РНР$HTTP_USER_AGENT.

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

;browcap= extra/browcap.ini

Файл browser.iniбыл разработан компанией cyScape, Inc. Последняяверсия этого файла находится по адресу http://www.cyscape.com/browcap.Загрузите и распакуйте этот файл в каталогна сервере. Запомните имя каталога, онопонадобится вам для обновления параметраbrowcap в файле php.ini.

В принципе,после загрузки browcap.ini и редактированияфайла php.ini вы можете включать в своипрограммы проверку возможностей браузера.Впрочем, я рекомендую сначала открыть файлbrowser.ini и ознакомиться с его структурой, азатем просмотреть листинги 15.1 и 15.2. Влистинге 15.1 приведен очень простой примеротображения всех возможностей браузера всамом браузере. Листинг 15.2 ограничиваетсялишь одной возможностью - поддержкой JavaScript.

Листинг 15.1.Отображениевсех атрибутов браузера

<?

// Получитьинформацию о браузере

$browser = get_browser();

//Преобразовать $browser в массив

Sbrowser = (array) Sbrowser;

while (list ($key,$value) = each ($browser)) :

// Присвоитьнули пустым элементам массива

if ($value =="") : $value = 0;

endif;

print "$key :$value <br>";

endwhile;

?>

Для браузераMicrosoft Internet Explorer 5.0 листинг 15.1 выводитследующий результат:

browser_name_pattern :Mozilla/4\.0 (compatible; MSIE 5\..*)

parent IE 5.0

browser : 5.0

version :15

majorver : #5

minorver : #5

frames : 1

tables : 1

cookies : 1

backgroundsounds : 1

vbscript : 1

javascript : 1

javaapplets : 1

activexcontrols : 1

win16 : 0

beta :0

ak : 0

sk : 0

aol : 0

crawler : 0

cdf : 1

В листинге15.2 приведен простой, но эффективныйсценарий, который при помощи файла browcap.iniопределяет, включена ли поддержка JavaScript вбраузере.

Листинг15.2. Проверкаподдержки JavaScript

<?

$browser = get_browser();

//Преобразовать $browser в массив $browser = (array) $browser;

if ($browser["javascript"]== 1) :

print "Javascriptenabled!";

else :

print "Nojavascript allowed!";

endif;

?>

Листинг 15.2проверяет, присутствует ли ключ javascript длязаданного браузера. Если ключ присутствуети равен 1, в браузере выводится сообщение оподдержке JavaScript. В противном случаевыводится сообщение об ошибке. Конечно, вреальной программе вместо выдачи сообщенияследует выполнить какие-нибудь полезныедействия.

Следующиедва примера показывают, как легко РНР,интегрируетсяс JavaScript. Листинг 15.3 определяет параметрыэкрана (разрешение и цветовую глубину)средствами JavaScript и затем выводит ихсредствами РНР. Листинг 15.4 (см. следующийраздел) показывает, как при помощи шаблонаРНР во временном (pop-up) окне, вызванном изкода JavaScript, выводится информация о ссылке,на которой щелкнул пользователь.

Листинг15.3. Определениецветовой глубины и разрешения экрана

<html>

<head>

<title>BrowserInformation</title>

</head>

<body>

<script language="Javascriptl.2">

<!--//

document.write('<formmethod=POST action ="<? echo $PHP_SELF; ?>">');

document.write('<inputtype=hidden name=version value=' + navigator.appVersion + '>');

document.write('<inputtype=hidden name=type value=' + navigator.appName + '>');

document.write('<inputtype=hidden name-screenWidth value=' + screen.width +'>');

document.write('<inputtype=hidden name=screenHeight value=' + screen.height + '>'};

document.write('<inputtype=hidden name=browserHeight value=' + window.innerWidth + '>');

document.write('<inputtype=hidden name=browserWidth value=' + window.innerHeight + '>');

//-->

</script>

<input type="submit"value="Get browser information"><p>

</form>

<?

echo "<b>Browser:</b>$type Version: $version<br>";

echo "<b>ScreenResolution:</b> $screenWidth x $screenHeight pixels.<br>";

if ($browserWidth != 0):

echo "<b>Browserresolution:</b> $browserWidth x $browserHeight pixels.";

else :

echo "Nojavascript browser resolution support for Internet Explorer";

endif;

?>

</body>

</html>

Динамическоесоздание временных окон

В JavaScriptпредусмотрены простые и удобные средствадля работы с окнами браузера. В частности,JavaScript позволяет отображать временные окнас вспомогательной информацией, неоправдывающей создания и загрузкиотдельной страницы. Напрашиваетсяочевидная идея - построить универсальныйшаблон, который будет использоваться длявсех временных окон. Все, что для этогопотребуется, - РНР. В листинге 15.4 показано,как файл РНР window.php вызывается из JavaScript. Вэтом файле реализован очень простой шаблонс директивой INCLUDE для включения файла,идентификатор которого передается window.phpпри вызове из JavaScript.

Длячитателей, не имеющих опытапрограммирования на JavaScript, я включил впрограмму подробные комментарии. Значениепеременной winld, передаваемой сценарию РНРwindow.php, задается внутри ссылкив основном коде HTML. Когдапользователь щелкает на ссылке, вызываетсяфункция newWindow( ), определенная в JavaScript. Чтобывы лучше поняли, как это происходит,рассмотрим следующую ссылку:

<а href="#"onClick="newWindow(1):">Contact us</a><br>

Как видите, япросто включаю в href значение "#",поскольку ссылка генерируетсяобработчиком события onClick в JavaScript.Установка обработчика приводит к тому, чтопри щелчке на ссылке вызывается функцияnewWindow( ). Обратите внимание на параметр,передаваемый при вызове этой функции (вприведенном примере - 1). Содержащийся в немидентификатор используется сценарием РНРдля выбора отображаемой информации. Выможете передать любое число - при условии,что оно соответствует имени файла,отображаемого в сценарии РНР. Внимательнопросмотрите листинг 15.4. Чтобы вам былолегче ориентироваться, я создал три простыхфайла *.inc, соответствующих ссылкам в этомлистинге.

Листинг15.4.Динамическоепостроение временных окон

<html>

<head>

<title>Listing15-4</title>

<SCRIPT language="Javascript">

// Объявитьпеременную Javascript

var popWindow;

// Объявитьфункцию newWindow

function newWindow(winID)

{

// Объявитьпеременную winURL. Присвоить ей

// имя файлаРНР с последующими данными.

var winURL ="Listingl5-5.php?winID=" + winID;

// Есливременное окно не существует или закрыто.

// открытьего.

if (! popWindow |popWindow.closed) {

// Открытьновое окно шириной 200 пикселов и высотой

// 300 пикселов,расположенное на расстоянии 150 пикселов

// от левогокрая и 100 пикселов от верхнего края

// основногоокна.

popWindow = window.open(winURL.'popWindow',

dependent.width=200.height=300.left=150,top=100');

}

// Есливременное окно уже открыто.

//активизировать его и обновить содержимое

//в соответствии с winURL.

else {

popWindow.focus();

popWindow.location = winURL;

}

}

//-->

</SCRIPT>

</head>

<body bgcolor="#ffffff"text="#000000" link="#808040"'vlink="#808040"alink="#808040">

<a href="#"onClick="newWindow(1);">Contact Us</a><br>

<a href="#"onClick="newWindow(2):">Driving Directions</a><br>

<a href="#"onClick="newWindow(3);">Weather Report</a><br>

</body>

</html>

Когдапользователь щелкает на одной из ссылок влистинге 15.4, программа создает временноеокно и загружает в него содержимое,полученное в результате вызова window.php.Сценарию window.php передается переменная winID,по которой определяется файл, включаемый всценарий РНР. Сценарий window.php приведен влистинге 15.5.

Листинг15.5. Сценарийwindow.php

<html>

<head>

<title>Popup Window Fun</title>

</head>

<body bgcolor="#ffffff"text="#000000" link="black" vlink="gray" alink="#808040">

<table width="100%"border="0" cellpadding="0" cellspacing="0">

<tr>

<td>

<?

// Включитьфайл, имя которого определяется

// переданнымпараметром.

INCLUDE("$winID.inc");

?>

</td>

</tr>

<tr>

<td>

<a href="#"onClick="parent.self.closet);

">close window</a>

</td>

</tr>

</table>

</body>

</html>

Остаетсялишь создать файлы для ссылок в листинге 15.4.Поскольку в ссылках передаются триуникальных идентификатора (1, 2 и 3), мы должнысоздать три файла. Первый файл, содержащийконтактную информацию, сохраняется сименем Line:

<td>

<h4>Contact Us</h4>

<table> <tr>

<li>email: <ahref="mailto:wj@wjgilmore.com">wj@wjgilmore.com</a> <li>phone:(555) 867 5309 <li>mobile: (555) 555 5555 </ul> </td>

</tr> </table>

Следующийфайл (местонахождение) сохраняется с именем2.inс.

<table>

<tr>

<td>

<h4>DrivingDirections</h4>

<ol>

<li>Turn left on1st avenue.

<li>Enter the oldGrant building.

<li>Take elevatorto 4th floor.

<li>We're in room444.

</td>

</tr>

</table>

Последнийфайл (сводка погоды) сохраняется с именем3.inc. Обратите внимание на вызов функции РНР,возвращающей текущую дату, - этот примернаглядно показывает, как легко РНРинтегрируется с JavaScript: ,

<table>

<tr>

<td>

<h4>WeatherReport <?=date("m-d-Y");?></h4>

<b>Today:</b>Birr... Brisk, with blowing and drifting snow.<br><br>

<b>Tonight:</b>Winter Weather Advisory. 7-10 inches snow expected.

</td>

</tr>

</table>

На рис. 15.1показано, как выглядит временное окно,открываемое по третьей ссылке.

 

Рис. 15.1. Сводкапогоды во временном окне

Нашекороткое знакомство с интеграцией PHP/JavaScriptподходит к концу. Мы рассмотрели несколькопростых, но вполне реальных примеров,которые при желании легко адаптируются дляболее сложных целей. При объединении РНР сJavaScript или любой другой технологией,ориентированной на работу на сторонесервера, необходимо правильно определитьвозможности браузера, чтобы предотвратитьслучайные ошибки. Всегда полезнопоэкспериментировать с другимитехнологиями, интегрируемыми с кодом РНР;только проследите за тем, чтобы неотпугнуть пользователей от сайтанедоступными возможностями илисодержанием, которое невозможнопросмотреть.

Следующийраздел посвящен СОМ - еще одной технологии,с которой легко работать средствами РНР.

СОМ

ТехнологияСОМ (сокращение от , то есть <модельсоставного объекта>) обеспечиваетвзаимодействие между приложениями,работающими на разных языках и платформах.Такое взаимодействие в значительной мереспособствует идее построения многократноиспользуемых, легко сопровождаемых иадаптируемых программных компонентов (впоследнее время к этим трем принципампроявляется повышенное внимание в областикомпьютерных технологий).Хотя СОМ обычно рассматривается какспецификация, ориентированная в первуюочередь на продукты Microsoft, поддержка СОМ ужереализована во многих языках (например, вРНР, Java, C++ и Delphi) и существует на многихплатформах, включая Windows, Linux и Macintosh.

Что же вамдаст объединение СОМ с РНР? Во-первых,средства СОМ позволяют напрямуювзаимодействовать со многими приложениямиMicrosoft. Ниже рассмотрен интересный пример -форматирование и вывод в Microsoft Word записейбазы данных, полученных из Web. В следующемразделе вы увидите, как легко решается этазадача.

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

РНРсодержит несколько стандартных функций дляработы с СОМ. Учтите, эти функцииподдерживаются только вверсии РНР для Windows! Прежде чем переходить кпримерам, мы рассмотрим все эти функции.

ПоддержкаСОМ в РНР

Стандартныефункции РНР, предназначенные для работы сСОМ, создают объекты СОМ и используют ихсвойства и методы. Пожалуйста, не забывайтео том, что эта поддержка присутствуеттолько в версии РНР для Windows. Следующиепримеры были протестированы для Microsoft Word 2000.За информацией об объектах, методах исобытиях, используемых в программе,обращайтесь на web-сайт MSDN (http://msdn.microsoft.com/library/officedev/off2000/wotocobjectmodelapplication.htm).

Созданиеэкземпляров объектов СОМ

Экземплярыобъектов СОМ создаются вызовом new, как приобычном объектно-ориентированномпрограммировании. Синтаксис:

object new СОМ("обьекг.класс"[, string удаленный_адрес])

Параметробъект.класс определяет модуль СОМ,присутствующий на сервере. Необязательныйпараметр удаленный_адрес используется втом случае, если объект СОМ создается наудаленном компьютере. Допустим, вы хотитесоздать экземпляр объекта для приложения MSWord. При этом приложение Microsoft Word запускаетсятак, словно вы запустили его вручную (разумеется,для этого MS Word должен быть установлен накомпьютере). Команда имеет следующийсинтаксис:

$word=new COM("word.application")or die("Couldn't start Word!");

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

$word->visible = 1:

Heогорчайтесь, если эта команда выглядитнепонятной. Вызов методов объектов СОМрассматривается в следующем разделе.

Вызовметодов объекта СОМ

Методыобъектов СОМ вызываются в типичном для ООПформате, с использованием ссылки изобъектной переменной. Синтаксис:

объект->имя_метода([значение,...])

Объектсоответствует экземпляру объекта СОМ,созданному описанным выше способом.Параметр имя_метода определяет имя метода,определенного в классе объект.Необязательный параметр значениепозволяет передавать параметры при вызовеметодов, допускающих (или требующих)дополнительных данных. Как и при вызовеобычных функций, параметры разделяютсязапятыми. Если после создания экземпляраобъекта СОМ, представляющего MS Word, вызахотите создать в приложении новыйдокумент, просто вызовите соответствующийметод. Задача решается методом add( )субкласса Documents экземпляра $word:

$word->Documents->Add( );

Обратитевнимание: для вызова методов используетсяочень логичный синтаксис в стиле ООП. Врезультате выполнения этой команды в окнеприложения MS Word открывается новый документ.

com_get( )

Функция com_get() возвращает значение свойства объектов СОМ.Синтаксис:

mixed com_get(resourceобъект,string свойство)

Первыйпараметр определяет экземпляр объекта СОМ,а второй - атрибут класса, к которомуотносится данный экземпляр.

<?

// Создатьэкземпляр объекта для приложения MS Word

$word=new COM("word.application")or die("Couldn't start Word!");

// Режим CapsLockлибо включен (свойство CapsLock = 0),

// либовыключен (свойство CapsLock = 1).

$flag = com_get(Sword->Application.CapsLock)

//Преобразовать значение Sflag (0 или 1) влогическое значение

if ($flag == 1) :

$flag = "YES";

else :

$flag = "NO";

endif;

// Вывести сообщение

print "CAPS Lockactivated: $flag";

$word->Quit();

?>

Существует идругое решение - значение атрибута CapsLockможно получить при помощи стандартного дляООП синтаксиса обращения к атрибутам. Впредыдущем примере для этого следуетзаменить строку

$flag = com_get($word->Application,CapsLock)

следующейстрокой:

$flag = $word->Application->CapsLock:

Атрибутыобъекта позволяют получать разнообразнуюинформацию о характеристиках приложения.Более того, многим атрибутам можноприсваивать новые значения. Это делаетсяпри помощи функции com_set( ).

com_set( )

Функцияcom_set( ) присваивает атрибуту объекта новоезначение:

void com_set(resourceобъект,string свойство, mixed значение)

Первыйпараметр определяет экземпляр объекта СОМ,а второй - атрибут класса, к которомуотносится данный экземпляр. Третийпараметр определяет новое значениесвойства.

Следующаяпрограмма (листинг 15.6) запускает Microsoft Word иактивизирует окно приложения. Затем онасоздает новый документ, добавляет в негостроку текста и выбирает режим сохранениядокумента (атрибут DefaultSaveFormat) в текстовомформате. Результат виден при открытии окнаСохранить как (Save As) - в списке Тип файла (SaveAs Type) автоматически выбирается строкаТолько текст (Text Only). После сохранениядокумента приложение Microsoft Word закрывается.

Листинг15.6. Выбортипа документа по умолчанию

<?

// Создатьэкземпляр объекта для приложения MS Word

$word-newCOMC'word.application") or die("Couldn't start Word!");

//Активизировать окно MS Word $word->visible = 1;

// Создатьновый документ $word->Documents->Add();

// Вставить вдокумент фрагмент текста

$word->Selection->Typetext("php'scom functionality is cool\n");

// Выбратьтекстовый режим сохранения

$ok = com_set($word->Application,DefaultSaveFormat, "Text");

// Запроситьу пользователя имя и сохранить документ.

//Обратите внимание: по умолчанию документсохраняется

// в текстовом формате! $word->Documents[l]->Save;

// Выйти из MSWord

$word->Quit();

?>

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

$ok = com_set($word->Application,DefaultSaveFormat, "Text");

следующей строкой:

$word->Application->DefaultSaveFormat= "Text";

Итак, выполучили общее представление об управленииприложениями Windows через поддержку СОМ в РНР.Мы переходим к занимательному примеру, кото-

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

Записьинформации в документ Microsoft Word

Допустим,вам потребовалось отформатироватьинформацию, загруженную из базы данных, вдокументе Word для построения отчета. Весьпроцесс автоматизируется всего внескольких строках кода РНР. Длядемонстрационных целей я воспользуюсьтаблицей addressbook из проекта адресной книги,приведенного в конце главы 12. Алгоритмработы сценария выглядит следующим образом:

  1. Подключиться к серверу MySQL и выбрать нужнуюбазу данных.
  2. Выбратьвсе данные из таблицы с сортировкой пофамилиям.
  3. Открытьприложение Microsoft Word и создать новыйдокумент.
  4. Отформатировать и вывести все записи вдокументе.
  5. Запроситьу пользователя имя для сохранениядокумента.
  6. ЗакрытьMicrosoft Word.

Программныйкод приведен в листинге 15.7.

Листинг15.7. Записьинформации в документ Microsoft Word <?

<?

// Создатьсоединение с сервером MySQL

$host = "localhost";

$user = "root";

$pswd = "";

$db = "book";

$address_table = "addressbook";

mysql_connect($host. $user,$pswd)

or die("Couldn'tconnect to MySQL server!");

mysql_select_db($db) or die("Couldn'tselect database!");

// Выбрать избазы данных все записи

$query = "SELECT *FROM $address_table ORDER BY lastjiame";

Sresult = mysql_query($query):

// Создатьновый объект COM для приложения MS Word

$word=new COM("word.application")or die("Couldn't start Word!");

//Активизировать окно MS Word $word->visible = 1;

// Открытьпустой документ. $word->Documents->Add( );

// Перебратьзаписи из таблицы адресов

while($row = mysql_fetch_array($result));

$last_name = $row["last_name"];

$first_name = $row["first_name"];

$tel = $row["tel"];

$email = $row["email"];

// Вывестиданные таблицы в открытый документ Word.

$word->Selection->Typetext("$last_name.$first_name\n"); $word->Selection->Typetext("tel. $tel\n"):$word->Selection->Typetext("email. $email:\n");

endwhile;

// Запроситьу пользователя имя документа.

$word->Documents[l]->Save;

// Выйти из MSWord

$word->Quit();

?>

При всейпростоте рассмотренный пример нагляднопоказывает, как писать приложения РНР дляпересылки содержимого базы данных вприложения Windows. Можно написать и болеесложное приложение, обеспечивающеесинхронизацию данных, полученных из Web, изMicrosoft Outlook. Все, что для этого нужно -получить ссылку на объекты, свойства иметоды Outlook, после чего можно переходить кэкспериментам (обзор объектной модели всехприложений семейства Office приведен поадресу http://www.microsoft.com/officedev/articles/Opg/toc/PGTOC.htm).

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

Нижеперечислены ссылки на некоторые полезныересурсы, посвященные СОМ и найденные мной вИнтернете:

Итоги

Эта глава вочередной раз показала, как легко РНРинтегрируется с внешними технологиями - аименно, JavaScript и COM (Component Object Model). В частности,были рассмотрены следующие темы:

  • общиесведения о JavaScript;
  • проверкаподдержки JavaScript в браузерах;
  • получениеинформации о возможностях браузера;
  • использованиевременных окон в сочетании с РНР;
  • общиесведения о технологии СОМ;
  • стандартныесредства РНР для работы с СОМ;
  • использованиеподдержки СОМ в РНР для передачи информациииз базы данных в Microsoft Word.

Интеграцияэтих технологий с РНР способна расширитьфункциональные возможности вашихприложений по нескольким направлениям.JavaScript позволяет выполнять на сторонеклиента различные операции с окном ибраузером, а также производит проверкуданных при заполнении форм. При помощи СОМможно создавать программы, напрямуюработающие с многими распространеннымиприложениями (например, из семейства Office),благодаря чему ваши программы становятсяболее удобными и обретают новыевозможности. Последняя глава посвященатеме, постоянно занимающей умы многихпрограммистов и администраторов, -безопасности. В этой главе будутпредставлены ключевые проблемы из областибезопасности - защита сценариев,шифрование и коммерческие средствапроверки данных.