Статьи

Начало работы с Umbraco: Часть 2

В .NET masterpage — это шаблон для страниц содержимого, где все серии страниц ASPX, которые используют одну и masterpage же masterpage могут совместно использовать один и тот же базовый код.


  1. Начало работы с Umbraco: Часть 1
  2. Начало работы с Umbraco: Часть 2
  3. Начало работы с Umbraco: Часть 3
  4. Начало работы с Umbraco: часть 4
  5. Начало работы с Umbraco: часть 5

Тогда для masterpage может быть определен один или несколько contentPlaceHolders и каждая страница ASPX, использующая эту masterpage страницу, должна определять только код, который находится внутри contentPlaceHolder . Masterpages также могут быть вложенными, как они будут структурированы на нашем примере сайта.


Base Page , помните, что это Template и Document Type , от которого будут наследоваться все последующие страницы, должна содержать только те элементы, которые являются общими для всех страниц сайта. Откройте файл BasePage.master в Visual Web Developer Express (VWD). В нем уже будет небольшой ASPX-код, включая элемент <asp:Content> . Этот элемент указывает на элемент <asp:ContentPlaceHolder> в одной из masterpages Umbraco.

Можно добавить код в masterpages полностью через masterpages Umbraco; когда вы выбираете один из Templates в области « Settings , он загружает копию файла в правую панель серверной части для редактирования, эта функция более полезна для внесения небольших изменений и обновлений в masterpages , а также для вставки макросы или элементы Когда мы используем полную IDE .Net, мы получаем intellisense и ряд других функций, которых нет в Umbraco, поэтому создание masterpages обычно требует редактирования в обеих областях.

Добавьте следующий код в элемент <asp:Content> :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<!DOCTYPE HTML>
   <html lang=»en»>
       <meta charset=»utf-8″ />
       <head>
           <title><umbraco:Macro Alias=»pageTitle» runat=»server»></umbraco:Macro></title>
           <!—[if lt IE 9]>
               <script src=»http://html5shiv.googlecode.com/svn/trunk/html5.js»></script>
           <![endif]—>
           <link rel=»Stylesheet» href=»/css/site.css» />
       </head>
       <body>
           <form runat=»server»>
               <header>
                   <hgroup>
                       <h1><a class=»accessible-hidden logo» href=»/» title=»Return To Home Page»>The company name</a></h1>
                       <h2>This is the company’s tag line</h2>
                   </hgroup>
                   <nav>
                       <ul>
                           <li><a href=»/» title=»Home»>Home</a></li>
                           <li><a href=»/» title=»About Us»>About Us</a></li>
                           <li><a href=»/» title=»News»>News</a></li>
                           <li><a href=»/» title=»Contact Us»>Contact Us</a></li>
                       </ul>
                   </nav>
               </header>
 
               <div id=»innerContent» class=»clear-float»>
                   <asp:ContentPlaceHolder id=»BaseContent» runat=»server»></asp:ContentPlaceHolder>
               </div>
               <footer>
                   <nav>
                       <ul>
                           <li><a href=»/» title=»Home»>Home</a></li>
                           <li><a href=»/» title=»About Us»>About Us</a></li>
                           <li><a href=»/» title=»News»>News</a></li>
                           <li><a href=»/» title=»Contact Us»>Contact Us</a></li>
                       </ul>
                   </nav>
                   <p>Copyright The Company <%=DateTime.Now.Year %></p>
               </footer>
           </form>
           <script src=»http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js»></script>
       </body>
   </html>

Сохраните файл. Давайте посмотрим на то, что у нас есть. Это в формате HTML5, как мы можем сказать прямо из минимального DOCTYPE и элемента meta charset . Это не обязательно использовать HTML5, но мы можем также правильно? В <head> страницы мы связались с таблицей стилей (которую мы еще не создали, но сделаем через некоторое время) и элементом <title> . <title> содержит наш первый тег Umbraco и указывает на макрос. Пока не беспокойтесь об этом, мы еще не обсуждали макросы, и они будут рассмотрены более подробно в следующей части серии. Содержимое страницы заключено в элемент <form> с атрибутом runat установленным на server , что является стандартной практикой для сайтов .Net. Мы также включили ссылку на файл HTML5shiv в HTML5shiv Google, чтобы IE8 или ниже мог правильно отображать наши элементы HTML5.

Затем у нас есть элемент <header> который содержит элемент <hgroup> для заголовка основного сайта и строки тега (состоит из тегов <h1> и <h2> соответственно) и элемент <nav> содержащий основную навигацию для сайта. , который будет построен из стандартного неупорядоченного списка. HTML, показанный для основной навигации, на самом деле не будет использоваться в окончательной форме сайта, он приведен здесь как руководство к тому, каким должен быть HTML, когда он автоматически создается с использованием другого макроса. Полезно добавить базовую структуру для динамически создаваемых элементов на случай, если их нужно стилизовать до добавления динамических битов. Это особенно важно, если вы работаете в команде, а кто-то еще будет заниматься всеми (веселыми) внутренними задачами.

Затем у нас есть элемент <div> который содержит <asp:ContentPlaceHolder> . У <div> есть id для стилизации, а у <asp:ContentPlaceHolder> есть атрибут id чтобы его можно было заполнять другими страницами (или masterpages ). Он также имеет runat="server" потому что это элемент ASPX, обрабатываемый сервером. Обратите внимание, что некоторым нашим элементам присваиваются имена классов, когда мы подходим к стилю сайта ближе к концу серии.

У нас также есть элемент <footer> который содержит еще одну копию навигации (опять же, HTML предоставляется на этом этапе в основном в целях стилизации и в качестве примера того, как он в конечном итоге будет отображаться в браузере при обслуживании страниц), и заявление об авторских правах. Заявление об авторских правах содержит небольшой фрагмент C# ; все, что нужно сделать, это вывести текущий год в стандартном 4-значном формате, чтобы он всегда отражал год просмотра страницы. Наконец, мы ссылаемся на размещенную в Google-CDN версию jQuery, так как она понадобится нам, чтобы добавить поведение на наш сайт в заключительной части серии.


Далее мы можем добавить код, который будет составлять домашнюю страницу. Если мы откроем файл HomePage.master в VWD, то увидим, что он уже вложен в BasePage.master (файл BasePage.master установлен как MasterPageFile в объявлении Master в верхней части файла), нам просто нужно изменить ContentPlaceHolderID элемента <asp:Content> так, чтобы он <asp:ContentPlaceHolder> элемент <asp:ContentPlaceHolder> мы добавили в BasePage.master :

1
2
3
<asp:Content ContentPlaceHolderID=»BaseContent» runat=»server»>
 
   </asp:Content>

Теперь добавьте следующий код в элемент <asp:Content> показанный выше:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<p id=»introText»><umbraco:Item field=»introText» runat=»server» /></p>
 
   <umbraco:Item field=»bannerImage» xslt=»concat(‘&\lt;img src=&\quot;’,umbraco.library:GetMedia({0}, false())/umbracoFile, ‘&\quot; alt=&\quot;’,umbraco.library:GetMedia({0}, false())/@nodeName, ‘&\quot; /&\gt;’)» xsltDisableEscaping=»true» runat=»server»/>
 
   <div id=»hero»>
       <div id=»viewer»>
           <div id=»slider»>
               <umbraco:Macro Alias=»heroPanels» runat=»server»></umbraco:Macro>
           </div>
       </div>
       <ul id=»ui» class=»clear-float»>
           <li id=»prev»><a href=»#» title=»View Previous Panel»>Previous</a></li>
           <li id=»next»><a href=»#» title=»View Next Panel»>Next</a></li>
       </ul>
   </div>

Эта мастер-страница содержит другой тип элемента Umbraco — Item . Первый элемент, который мы используем, устанавливает вводный текст на странице. Помните, мы определили это как свойство типа документа Home Page в первой части этой серии и установили для него тип Richtext editor . Элемент <umbraco:Item> здесь в шаблоне будет отображать содержимое всего, что вводится в редакторе форматированного текста, когда мы создаем узел содержимого для домашней страницы в серверной части.

Теперь должно быть немного яснее, как свойства в типах документов соотносятся с элементами, которые попадают на наши страницы, но не беспокойтесь, если на данный момент это не на 100% кристально ясно — мы до сих пор не создали никаких реальных страниц пока нет, но когда мы сделаем заключительную часть головоломки, нужно аккуратно защелкнуться на месте.

Далее у нас есть элемент изображения; потому что мы используем медиа-медиатор (я точно объясню, что такое медиа-медиатор при создании страницы), код для этого гораздо сложнее, чем то, что мы видели до сих пор. Один из разделов в бэкэнде Umbraco — это раздел « Media », в который можно загружать и хранить весь мультимедийный контент для сайта. Как и другие ресурсы для сайта, каждый элемент мультимедиа является узлом в дереве узлов, и ему присваивается имя при добавлении элемента мультимедиа в CMS.

Когда мы добавляем элемент <img> , мы используем <umbraco:Item> похожий на introText , но нам нужно использовать фрагмент встроенного XSLT-кода и пару фрагментов HTML, чтобы фактически получить путь к изображению, хранящемуся в медиа библиотека. Фрагмент XSLT использует метод concat() , который принимает массив строк с разделителями-запятыми для объединения, чтобы создать элемент <img> . В этом массиве мы используем сущности HTML и разметку, чтобы создать элемент вручную, а также используем функцию из класса umbraco.library . Функция GetMedia и позволяет нам получить путь к магу в библиотеке мультимедиа (в файловой системе Umbraco есть соответствующая папка, в которой хранятся все элементы мультимедиа) с использованием свойства umbracoFile и имени узла используя @nodeName . Обратите внимание, что для правильного отображения приведенного выше примера кода мне пришлось вставить символы \ в сущности HTML. Удалите их, если скопируйте и вставьте в свои файлы.

Наконец, мы добавляем некоторую базовую разметку для панели hero, включая внешний контейнер ( <div> с id hero ), каждый элемент <div> для элементов #viewer и #slider и простой пользовательский интерфейс, который позволит различные панели контента для навигации. Элемент #slider также содержит элемент <umbraco:Macro> , поэтому мы <umbraco:Macro> эту часть панели героя с помощью макроса XSLT, который создадим в более поздней части серии. Панель героя будет изначально построена из XSLT и разметки, показанной здесь, а затем будет настроена для работы со скриптом.


Наши контентные страницы относительно просты и построены с использованием одного свойства из Типа Content . В файле главной страницы измените ContentPlaceHolderID элемента <asp:Content> на BaseContent точно так же, как мы сделали для домашней страницы:

1
2
3
<asp:Content ContentPlaceHolderID=»BaseContent» runat=»server»>
  
</asp:Content>

Затем добавьте следующий код в элемент <asp:Content> :

1
<div id=»pageCopy»><umbraco:Item field=»pageCopy» runat=»server» /></div>

Вот и все, это все, что мы будем использовать в нашем шаблоне страницы контента. На самом деле, контентная страница, вероятно, будет гораздо более сложной, но для нашего простого примера этого должно быть достаточно. Мы использовали внешний элемент, содержащий <div> для этого <umbraco:Item> потому что элемент связан с Richtext editor и может содержать много разных типов контента.


Наш шаблон NewsList будет почти таким же базовым, как и шаблон Content как страница будет в основном построена динамически с использованием макроса XSLT. Не забудьте обновить ContenPlaceHolderID до BaseContent как у нас в других наших шаблонах, а затем добавить следующие элементы в заполнитель:

1
2
3
4
<section id=»newsList»>
       <h1>Recent News from The Company</h1>
       <umbraco:Macro Alias=»newsList» runat=»server» />
   </section>

На этой странице у нас есть элемент <section> , в котором находится заголовок главной страницы и макрос, который создает список новостей. Это все, что нам нужно в этом шаблоне, так что давайте перейдем к следующему и последнему; NewsItem . Снова измените BaseContent на BaseContent а затем добавьте следующий код в заполнитель:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<article id=»newsItem»>
       <header>
           <h1><umbraco:Item field=»headline» runat=»server» /></h1>
           <ul class=»clear-float»>
               <li>Posted on <umbraco:Item field=»date» formatAsDate=»true» runat=»server» /></li>
               <li>By <umbraco:Item field=»creatorName» runat=»server» /></li>
           </ul>
       </header>
       <div id=»newsContent»>
       <umbraco:Item field=»storyImage» xslt=»concat(‘&\lt;img src=&\quot;’,umbraco.library:GetMedia({0}, false())/umbracoFile, ‘&\quot; alt=&\quot;’,umbraco.library:GetMedia({0}, false())/@nodeName, ‘&\quot; /&\gt;’)» xsltDisableEscaping=»true» runat=»server»/>
       <div id=»newsText»><umbraco:Item field=»newsText» runat=»server» /></div>
       </div>
   </article>
 
   <nav id=»newsNav»>
       <umbraco:Macro Alias=»newsNav» runat=»server» />
   </nav>

Наш шаблон NewsItem немного сложнее, чем большинство других. Основным контейнером для новостной статьи является <article> , который содержит <header> для заголовка и некоторую информацию о новостной <article> , такую ​​как ее date и author . Дата, показанная в первом <li> , связана с полем Datepicker мы добавили в соответствующий тип документа для этого типа страницы. Мы устанавливаем для атрибута formatAsDate значение true, которое вместо этого форматирует дату без добавления строки времени в конец. author получается с creatorName свойства creatorName , которое автоматически добавляется к узлам (страницам) при их создании в creatorName .

Тело статьи — это внешний контейнер <div> котором используется поле newsImage (по сути это то же самое, что и изображение баннера на домашней странице, где также используется средство выбора медиафайлов. Опять же, у объектов HTML есть обратная косая черта в них, чтобы они отображали правильно) и <div> который использует <umbraco:Item> связанный с полем newsText . Мы также создаем дополнительный элемент <nav> , который позволит посетителю переходить непосредственно с текущей страницы новостей на другие страницы новостей, не возвращаясь к списку новостей. Это будет построено из макроса, который мы рассмотрим в следующей части этой серии.


Итак, мы потратили, по крайней мере, пару часов на настройку (больше, если вам пришлось установить VWD + SQL Server), так что давайте добавим несколько страниц! На сайте Umbraco фактически нет отдельных «страниц» как таковых. Не думайте про себя: «Мне нужна эта страница, чтобы сделать что-то уникальное, чтобы я мог добавить то или иное к базовой странице» — она ​​просто так не работает, нет базовых страниц. Вместо страниц у нас есть узлы контента в дереве узлов (в частности, узлы в разделе Content серверной части CMS) и данные в базе данных. В базе данных хранятся отдельные URL, и каждый узел сопоставляется с URL, поэтому, когда посетитель набирает адрес страницы или перемещается по сайту, CMS будет проверять, какой URL был запрошен, и создавать страницу на лету. , используя его Тип документа и шаблон.

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


Как только мы Create кнопку « Create в диалоговом окне, новый узел будет создан и отображен в верхней левой панели CMS, и справа от него будет маленькая оранжевая звездочка. Это указывает на то, что узел был сохранен, но не опубликован. На правой панели CMS мы видим вкладки и поля, которые мы определили в Типе документа в части 1. Вкладка « Content » отображается по умолчанию, так как это первая вкладка, первым определенным нами свойством было свойство Intro Text , который отображается непосредственно в текстовое поле в верхней части вкладки « Content ». Мы также определили свойство Banner Image , которое отображается непосредственно на элемент управления Media picker, показанный под текстовой областью.

Узел содержимого домашней страницы также будет наследовать свойство от типа документа Base PageDomain Name — которое можно увидеть на вкладке Properties . Теперь Properties вкладку Properties . Здесь есть несколько важных свойств, которые автоматически создаются Umbraco, включая Имя узла, которое является редактируемым полем, чтобы мы могли легко изменить имя узла в любой точке, а также Document Type и используемый Template . Есть и другие полезные свойства, такие как создатель узла и дата публикации. Введите The Company в поле « Domain Name (может принимать формат The Company или фактический URL-адрес, такой как www.thecompany.com, это не имеет значения, поскольку оно будет просто использоваться для заголовка страницы).

И Intro Text и Banner Image являются обязательными свойствами, поэтому их необходимо заполнить, прежде чем мы сможем опубликовать страницу. Intro Text прост; мы просто начинаем печатать в текстовой области. Мы можем выполнить базовое форматирование с помощью Richtext editor в верхней части вкладки, но, по сути, мы просто заполняем это свойство или поле, набирая текст. Banner Image немного (но не намного) сложнее, и для его завершения нам нужно кратко поработать с другим разделом CMS — библиотекой мультимедиа.


Медиа-библиотека — это хранилище для всех медиа-ресурсов, таких как изображения, видео, звуковые файлы или другие встроенные файлы или документы. В нашем поле « Banner Image для Home Page используется средство Media picker , которое открывает диалоговое окно с библиотекой мультимедиа и позволяет конечному администратору сайта визуально выбирать изображение, которое они хотят использовать. Однако, прежде чем это произойдет, в библиотеке мультимедиа должны быть элементы, которые можно выбрать.

Чтобы добавить элемент в библиотеку мультимедиа, мы просто выбираем раздел « Media », щелкая значок в левой нижней части фоновой панели, а затем, как только узел мультимедийного раздела загрузился в верхнем левом разделе, мы щелкаем правой кнопкой мыши папку «Медиа». и выберите Create из меню. В появившемся диалоговом окне мы можем установить имя для изображения (помните, что имя, которое мы даем узлу, используется в атрибуте alt изображения, когда оно отображается на домашней странице), и выберите Media Type . Есть три предопределенных типа, из которых мы можем выбрать; папка, которая может быть полезна, когда у нас есть много различных медиа-элементов, которые мы хотим упорядоченно классифицировать и хранить, тип File или Image , которые мы будем использовать в этом случае. Другие типы медиа могут быть легко созданы в разделе « Settings ».

После нажатия кнопки « Create в диалоговом окне будет создан новый элемент изображения, а правая панель редактора будет заполнена некоторыми свойствами, включая кнопку загрузки. Мы должны нажать кнопку загрузки, чтобы выбрать файл с нашего компьютера, который мы хотим загрузить (на моем рабочем столе уже готовое изображение для загрузки). После того как вы выбрали изображение для загрузки и щелкнули значок сохранения на панели инструментов в верхней части правой панели, изображение станет частью библиотеки мультимедиа и будет отображаться как узел в дереве узла мультимедиа. Миниатюра для изображения также будет создана и показана на панели properties справа вместе с некоторыми атрибутами изображения:


Теперь изображение готово к выбору, поэтому вернитесь в раздел Content и выберите узел Home который мы создали ранее. В поле Banner image под текстовой областью щелкните ссылку choose чтобы открыть средство выбора, которое появится в диалоговом окне. Нажмите The Company Does This! узел в окне выбора, и он будет установлен в поле « Banner imag . Теперь узел Home можно опубликовать, поэтому щелкните значок мира с диском перед ним, чтобы сохранить и опубликовать страницу.

Это оно; Вы сделали свою первую страницу Umbraco! Вы можете просмотреть новую страницу, щелкнув значок предварительного просмотра (страница с увеличительным стеклом на нем), чтобы увидеть ее в режиме предварительного просмотра, или вы можете просто открыть новую вкладку в браузере, скопировать URL-адрес серверной части, вставьте его в новую вкладку и выбейте все после номера порта.

На этом этапе страница полностью не стилизована, но вы должны обнаружить, что вводный текст и изображение, которые мы установили в бэк- Home.master , отображаются на странице вместе с разметкой вверх из Home.master и Base Page . Все <umbraco:Item> уже заполнены, но любые <umbraco:Macro> не будут заполнены, так как нам нужно написать для них XSLT.


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

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