Статьи

Silverlighting Your PHP, часть 3: перевод PHP в Visual Studio

Смешивание PHP с Silverlight может показаться безобразным объединением. Прежде всего, Visual Studio до сих пор не поддерживает разработку PHP без надстройки. Во-вторых, вам нужен Windows-бокс для запуска .NET-кода. Но если вы захотите отложить трепет, вы обнаружите, что разработка Silverlight в Visual Studio может многое предложить разработчику PHP.

Первые две статьи этой серии посвящены использованию PHP для создания XAML и использованию Expression Blend для создания более сложного XAML для вашего PHP . Целью обеих этих демонстраций было показать, что вы можете сделать без каких-либо сборок .NET. Другими словами, используя XAML и JavaScript, вы можете создать приложение Silverlight, которое будет работать на любой платформе.

Прочитайте другие части этой серии:

 

Но столько, сколько вы можете сделать с этими инструментами, бесплатная загрузка Visual Studio Web Developer 2010 Express дает вам еще больше строительных блоков для полнофункционального приложения Silverlight, управляемого данными, которое использует, а не заменяет существующий код PHP.

Чтобы продемонстрировать это, вот пошаговое руководство, которое по-другому представит Silverlight ваш PHP. Вместо генерации XAML вы начнете с приложения PHP, которое в качестве конечного продукта создает простой файл данных XML. Затем вы создадите очень простое приложение Silverlight, которое использует один из множества предварительно свернутых элементов управления Silverlight, который поставляется вместе с Visual Studio, элемент управления DataGrid. Немного сумасшествия в C #, вы привяжете элемент управления DataGrid к вашему XML-файлу, сгенерированному PHP, что обеспечит вам очень классное отображение данных на основе PHP. Наконец, вы также будете практиковать простую технику для включения вашего PHP-кода в проект Visual Studio таким образом, чтобы вы могли развернуть все приложение за один раз.

Обратите внимание, что, поскольку это приложение Visual Studio и будет использовать сборки .NET, вам необходимо будет развернуть его в IIS на Windows-компьютере с установленным .NET Framework 3.5.

 

Форма регистрации участника в PHP

Начните с базовой формы регистрации участников PHP. Член чего — кто знает. Но целью этой страницы будет сохранение типичных регистрационных данных во внешний XML-файл.

Создайте папку с именем «MemberGrid» в своем веб-корне, например C: / inetput / wwwroot / MemberGrid. Под этим создайте подпапку с именем «xmldata». В качестве примера данных для начала сохраните следующее в файле members.xml в папке xmldata:

<?xml version="1.0"?>
<members>
<member>
<memberName>Apollo</memberName>
<memberFunction>God of Music</memberFunction>
<memberStatus>God</memberStatus>
<memberDescription>Rides a chariot all day, dances all night.</memberDescription>
</member>
<member>
<memberName>Athena</memberName>
<memberFunction>Goddess of Wisdom</memberFunction>
<memberStatus>God</memberStatus>
<memberDescription>Currently living as Tina Fey.</memberDescription>
</member>
</members>

 

Затем сохраните следующий код PHP в memberForm.php в MembersGrid. Эта форма просто собирает данные о членах и добавляет их в members.xml. PHP предоставляет несколько методов для чтения и записи данных XML во внешний файл. Эта форма читает файл в DOMDocument и создает новые элементы из данных формы.

<html>
<head>
<title>PHP Entry Form</title>
</head>
<body>

<?php

if (!isset($_POST['memberName'])) {

?>

<form action="index.php" method="post">
<p>Member Name: <input type="text" name="memberName" /></p>
<p>Member Function: <input type="text" name="memberFunction" /></p>

<p>Member Status
<input type="radio" name="memberStatus" value="Titan" /> Titan
<input type="radio" name="memberStatus" value="God" checked="checked" /> God
<input type="radio" name="memberStatus" value="Demigod" /> Demigod
<input type="radio" name="memberStatus" value="Hero" /> Hero</p>

<p>Member Description::<br />
<textarea rows="5" cols="50" name="memberDescription" ></textarea></p>

<p><input type="submit" value="Add Member"></p>

</form>

<?php

}
else {

$memberFile = new DOMDocument;
$memberFile->Load('xmldata/members.xml');

$memberList = $memberFile->getElementsByTagName('members')->item(0);

$newMember = $memberFile->createElement('member');

$memberName = $memberFile->createElement('memberName');
$textNode = $memberFile->createTextNode($_POST['memberName']);
$memberName->appendChild($textNode);

$memberFunction = $memberFile->createElement('memberFunction');
$textNode = $memberFile->createTextNode($_POST['memberFunction']);
$memberFunction->appendChild($textNode);

$memberStatus = $memberFile->createElement('memberStatus');
$textNode = $memberFile->createTextNode($_POST['memberStatus']);
$memberStatus->appendChild($textNode);


$memberDescription = $memberFile->createElement('memberDescription');
$textNode = $memberFile->createTextNode($_POST['memberDescription']);
$memberDescription->appendChild($textNode);

$newMember->appendChild($memberName);
$newMember->appendChild($memberFunction);
$newMember->appendChild($memberStatus);
$newMember->appendChild($memberDescription);

$memberList->appendChild($newMember);

unlink('xmldata/members.xml');
$appended = $memberFile->save('xmldata/members.xml');

echo('<p>New data added (return code: ' . $appended . ')</p>');

}

?>

</body>
</head>

 

Поскольку этот код выполняет запись во внешний файл, вам необходимо открыть права на запись в папке xmldata, как показано на рисунке 1.

 

Найдите минутку, чтобы просмотреть код. Как уже упоминалось, это базовый обработчик формы, т.е. он либо представляет форму, либо обрабатывает данные. В этом случае «процесс» означает добавить его в сводный файл. Здесь ничего необычного не происходит — ни правок, ни удалений, ни проверок форм.

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

Прежде чем двигаться дальше, протестируйте свое приложение PHP. Отправьте несколько новых данных и проверьте полученный XML-файл. Ваши результаты должны быть добавлены в качестве нового узла <member> в корне <members>.

 

Проект Silverlight в Visual Studio

Как уже упоминалось, Microsoft предоставляет Express версию Visual Studio для бесплатной загрузки. К счастью для веб-разработчиков, это все, что вам нужно для создания приложения Silverlight.   Фактически, если вы новичок в этой области Интернета, вы можете использовать установщик веб-платформы Microsoft для загрузки Visual Studio, Silverlight, SQL Server Express   и механизма PHP. Посетите страницу «Начало работы» в Silverlight для получения дополнительной информации. Или вы можете загрузить Visual Studio 2010 Express для Интернета по адресу http://www.microsoft.com/express/Web/ . Сюда также входит предустановленный Silverlight SDK.

Как только вы настроитесь и будете готовы к работе, запустите новый проект Silverlight и назовите его MemberGrid.

 (Нажмите для увеличения изображения)

 

Установите флажок «Размещать приложение Silverlight на новом веб-сайте».

 (Нажмите для увеличения изображения)

 

Когда ваш новый пустой проект открывается впервые, все, что вы получаете, это пустой холст. Технически говоря, это фактически пустой элемент управления Grid, а не элемент управления Canvas. Вы увидите на панели инструментов слева список других элементов управления. Подобно Expression Blend, Visual Studio предлагает огромный набор предварительно запеченных функций, которые вы можете добавить в свое приложение, такие как элементы управления формой, средство выбора даты, календарь и элементы управления мультимедиа.

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

 (Нажмите для увеличения изображения)

 

 

DataGrid делает только то, на что это похоже — тянет данные в предварительно отформатированную сетку. Эта сетка представляет данные в столбцах с изменяемыми размерами фиксированной или переменной ширины, которые, начиная с Silverlight 4, можно сортировать в порядке возрастания или убывания. Все, что вам нужно сделать, чтобы включить эту функцию, это подключить ее к источнику данных, обычно к базе данных SQL Server.

В этом случае вы собираетесь подключить его к внешнему XML-файлу. Да, файл, который вы только что создали в своем приложении PHP.

В обозревателе решений справа под MemberGrid.Web создайте новую папку с именем xmldata. В этой папке добавьте существующий файл: members.xml.

 

Опять же, вам может понадобиться перейти к этой папке в проводнике Windows и добавить разрешения безопасности для записи в папку, которая понадобится вам позже. Кроме того, вы можете заметить на панели свойств, что ваш файл members.xml был добавлен в развернутый проект как «Содержимое». Это хорошая вещь. Обычно элементы в решении связываются в файле приложения .xap при развертывании, что облегчает развертывание проекта, но затрудняет редактирование с помощью внешнего скрипта. Но так как ваш файл members.xml был добавлен с установленным для «Действие сборки» «Содержимое», это означает, что он будет скопирован в место назначения развертывания, но не включен в .xap. Единственное другое свойство, которое вам нужно изменить, — это установить «Копировать в выходной каталог» в «Копировать, если новее».Это должно удерживать Visual Studio от перезаписи ваших данных, если вы внедряете изменения после того, как ваше приложение работает некоторое время.

Последнее, что нужно сделать, прежде чем начать кодирование. Вам нужно будет добавить ссылку на библиотеку System.Xml.Linq. Вы должны иметь возможность добавить компонент v4.0, щелкнув правой кнопкой мыши на папке Reference в обозревателе решений и выбрав компонент System.Xml.Linq .NET.

 

 

Но вам может понадобиться перейти к справочному файлу вручную. Если это так, перейдите на вкладку «Обзор» и перейдите к / Program Files / Microsoft SDKs / Silverlight / v4.0 / Libraries / Client и выберите System.Xml.Linq.dll.

 

 

 

Добавить код C #

Прежде чем добавлять код PHP, продолжайте и подключите ваш источник данных. Это требует немного кодирования, поэтому начните с именования элемента управления DataGrid. В коде XAML под вашим холстом найдите имя вашей DataGrid и измените его на «dgMemberGrid».

 

 

Пока вы там, измените AutoGenerateColumns на True, иначе ваши данные будут подключены, но фактически не появятся в сетке.

 

 

В обозревателе решений щелкните правой кнопкой мыши элемент MemberGrid и добавьте новый класс. Назовите это MemberRecord.

 (Нажмите для увеличения изображения)

 

Откройте MemberRecord.cs. В конструкторе добавьте следующее:

public string Name { get; set; }
public string Function { get; set; }
public string Status { get; set; }
public string Description { get; set; }

 

Откройте код позади MainPage, то есть MainPage.xaml.cs. В списке ссылок добавьте эту ссылку в библиотеку Linq:

using System.Xml.Linq;

 

Замените оставшуюся часть кода следующим:

namespace MemberGrid
{
public partial class MainPage : UserControl
{
DataGrid memberGrid;
XDocument xMembers;

public MainPage()
{
InitializeComponent();
loadXMLFile();
}

private void loadXMLFile()
{
WebClient xmlClient = new WebClient();
xmlClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(membersLoaded);
xmlClient.DownloadStringAsync(new Uri("../xmldata/members.xml", UriKind.Relative));
}

private void membersLoaded(object sender, DownloadStringCompletedEventArgs e)
{
xMembers = XDocument.Parse(e.Result);
setGridDatasource();
}

private void setGridDatasource()
{
var memberList = from memberXml in xMembers.Descendants("member")
select new MemberRecord
{
Name = Convert.ToString(memberXml.Element("memberName").Value),
Function = Convert.ToString(memberXml.Element("memberFunction").Value),
Status = Convert.ToString(memberXml.Element("memberStatus").Value),
Description = Convert.ToString(memberXml.Element("memberDescription").Value)
};
memberGrid = this.FindName("dgMemberGrid") as DataGrid;
memberGrid.ItemsSource = memberList;
}
}
}

 

Внимательно посмотрите на этот код, и вы увидите, что происходит несколько вещей.

Во-первых, у вас есть много способов подключения данных. Если вы собираетесь использовать статический XML-файл, который никогда не менялся, вероятно, самый простой способ сделать это — перенести его в проект как встроенный ресурс, чтобы он был упакован в файл .xap, а затем ссылаться на него в коде. как местный ресурс. Но поскольку файл будет обновляться из-за пределов приложения Silverlight, вы захотите ссылаться на него как на внешний файл, что означает создание объекта WebClient, как вы можете видеть в loadXMLFile ().

Преимущество использования этого метода заключается в том, что вы также можете использовать его для ссылки на удаленный канал XML, например канал RSS.

Как видно из потока этого кода, инстанцирование страницы запускает загрузку XML-файла асинхронно. Когда это завершено, он запускает процедуру membersLoaded (), которая анализирует XML-документ и запускает setGridDataSource ().

И вот где происходит доброта. Подобно DOMDocument-> getElementsByTagName в PHP, вы используете Linq, чтобы выбрать все элементы-элементы из вашего XML-документа, а затем перебрать их, создав для каждого новый объект MemberRecord. По-прежнему используя Linq, вы затем подключаете различные узлы XML к соответствующим им свойствам MemberRecord.

Как только ваша коллекция объектов MemberRecord была создана, ваш последний шаг — установить источник вашей dgMemberGrid для этой коллекции. Как только это будет сделано, Bang — DataGrid.

Попробуйте запустить решение. Вы должны получить простую веб-страницу с DataGrid, которая отображает две записи примера в вашем файле members.xml. Уже сейчас вы можете начать видеть силу Silverlight в добавлении огромного количества функциональности в ваше PHP-приложение. При относительно небольшом кодировании у вас есть сетка данных с изменяемыми размерами, которая может динамически отображать ваш источник данных.

 

Смешайте в некотором PHP

Чтобы настроить для развертывания, вы можете смешать ваш PHP-файл, фактически не выполняя его. Щелкните правой кнопкой мыши на MemberGrid.Web и выберите Добавить -> Существующий элемент. Перейдите к memberForm.php и добавьте его. Это копирует файл в каталог вашего проекта. В свойствах файла установите для параметра «Действие сборки» значение «Содержимое» и для параметра «Копировать в выходной каталог» значение «Всегда копировать».

 

 

Для реального теста разверните все приложение в исходном веб-каталоге для этой вещи. Щелкните правой кнопкой мыши MemberGrid.Web в обозревателе решений и выберите «Опубликовать». В профиле публикации выберите «Файловая система» в качестве метода публикации и перейдите в каталог развертывания для цели. Нажмите Опубликовать.

 

 

Пока вы не можете на самом деле код и отладки PHP скрипт с помощью Visual Studio без 3 — й партии надстройку, это хороший способ , чтобы собрать весь кощунственный сверток в одном месте для удобства развертывания.

 

Запустите приложение

Попробуй! Перейдите на свою страницу memberForm.php и введите некоторые тестовые данные.

 

 

После того как вы отправите его, перейдите к MemberGridTestPage.html. Если все прошло хорошо, вы должны увидеть что-то вроде этого:

 

 

Хотя в этом пошаговом руководстве показаны некоторые возможности Visual Studio по созданию приложения Silverlight с вашим PHP-кодом, в нем даже не рассматривается весь вопрос параллельной разработки. С помощью кодера на одном конце офиса, работающего в Visual Studio, и дизайнера на другом конце, работающего в Expression Bend, обе стороны могут работать над одним приложением одновременно. И смирись с этим, это нужно немного нарядить.

Используя некоторые приемы из предыдущих пошаговых руководств в этой серии, а также DZone Refcardz « Начало работы с Silverlight и Expression Blend », вы или ваш ближайший дизайнер могли бы создать пользовательский интерфейс, пока кодирование еще продолжается. Вы можете добавить больше элементов XAML, немного анимации, возможно, некоторые новые события, такие как запуск всплывающих окон с деталями, когда вы щелкаете по строке в сетке данных.

Но в основном вы можете продолжать использовать свой PHP-код по-новому, практически не вкладывая средств в обучение и разработку программного обеспечения.