You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: ru/02_Разработка/07_Elements/20_Modules/10_Как создать свой модуль в Evolution.md
+32-28Lines changed: 32 additions & 28 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,22 +3,19 @@
3
3
4
4
#### Главная страница модуля ####
5
5
Список товаров из нужного раздела, у каждого товара есть заголовок, аннотация и редактирование. Тв-параметры мы брать не будем, это всё же модуль для обучения.
Основная папка модуля — contentEditor. В ней всего 1 файл — это core.php. Ядро и основной функционал нашего будущего модуля. В css будут стили, в templates шаблоны, в lang языковые версии.
24
21
@@ -29,10 +26,11 @@
29
26
Создаём файл main.html. У всех файлов указывать кодировку utf-8 (без BOM)!
30
27
Давайте ещё раз глянем на стартовую страницу нашего будущего модуля и определимся, что нужно верстать.
Едем дальше. Как мы видим, наверху модуля у нас есть заголовок, аннотация и кнопка «Обновить». Давайте их сделаем. Открываем body и пишем:
56
-
```
55
+
56
+
```html
57
57
<h1>[+store_name+]</h1>
58
58
<divid="actions">
59
59
<ulclass="actionButtons">
@@ -75,7 +75,7 @@ Hint: Если полазать в папке media/style/папка темы/im
75
75
76
76
Делаем тело страницы. Посмотрите на макет — нам нужны две вкладки. В первой из них будет таблица с ячейкой заголовков и содержимым. Во второй только текст.
77
77
78
-
```
78
+
```html
79
79
<divclass="sectionBody">
80
80
<p>[+module_description+]</p>
81
81
<divclass="tab-pane"id="tabPanel">
@@ -119,26 +119,29 @@ Hint: Если полазать в папке media/style/папка темы/im
119
119
Класс sectionBody — это стиль Эво и используется он для тела модуля.
120
120
121
121
Создадим разметку табов. Она начинается созданием слоя-оболочки с классом tab-pane и идентификатором tabPanel. Идентификатор может быть произвольным. Сразу же после открывающего тега запускаем стандартный скрипт Эво для панелей. Это вызов функции WebFXTabPane, которой мы передаём в качестве аргумента id созданного слоя-оболочки.
122
+
122
123
Сделаем вкладки. Каждая из них должна иметь уникальный id и класс tab-page. Сразу же внутри вкладки нужно разместить заголовок панели
123
124
124
-
```
125
+
```html
125
126
<h2class="tab">[+tab1_header+]</h2>
126
127
```
127
128
128
129
Что такое [+tab1_header+] вы уже догадались? Правильно, это название панели, которое мы позже зададим в файлах языка.
129
130
130
131
Промотайте код до 27-й линии. Мы создаём 2-ю вкладку:
131
132
132
-
```
133
+
```html
133
134
<divclass="tab-page"id="startTab2">
134
135
```
135
136
136
137
Всё по аналогии с первой, за исключением id. Напомню, у каждой вкладки он должен быть уникален. Для того, чтобы вкладки работали и переключались, нужно их добавить в обработчик.
Строку надо вызывать в теге script внутри каждой из вкладок. Как видите, в первой вкладке мы использовали id первой вкладки, во втором — второй.
143
146
144
147
Сразу закончим со вкладкой номер два, так как она попроще. Единственное содержимое там это плейсхолдер [+tab1_text+]. Это некий статичный текст, который также будет подгружен сюда позже.
Зададим несколько переменных, которые нам понадобятся в работе со скриптом
161
+
```php
158
162
$Template=new Template;//новый класс. О нём позже
159
163
$bigAction = $_GET['a'];//текущее значение аргумента a из урла
160
164
$moduleId = $_GET['id'];//айди модуля
161
165
$FullTableName = $modx->getFullTableName('site_content');//полное имя таблицы контента
162
166
```
163
167
164
168
Пишем класс для шаблонизации.
165
-
```
169
+
```php
166
170
class Template{
167
171
public $lang;
168
172
function __construct(){
@@ -195,7 +199,7 @@ class Template{
195
199
Он подключает языковые файлы, исходя из того, какая версия языка выбрана в админке, инициализирует переменную-массив lang. В этот массив мы будем писать наши плейсхолдеры, кстати. Далее он парсит переданный ему шаблон, ищет соответствия между плейсхолдером в шаблоне и значением в lang-файле и возвращает результат — собранную страницу. Как пользоваться классом, мы рассмотрим чуть ниже. Пока же просто скопируйте его в core.php
196
200
197
201
Теперь начинаем думать над функционалом. Модуль должен делать 2 вещи. Первая — показать нам список товаров. Вторая — редактировать выбранный товар. Конечно, можно заморочиться с серьёзной шаблонизацией, роутингом и классами для каждого действия, но задача сейчас проще. Поэтому все наши действия заворачиваем в switch-case и получаем вот такой большой скрипт.
198
-
```
202
+
```php
199
203
switch($_REQUEST['action']){
200
204
default: // Действия при загрузке модуля
201
205
$section=$params['sectionId']; // Получаем из конфига id раздела
Это параметры модуля, особенность Эво. Скрипт модуля всегда их получает в массиве $params. Как задать параметр? Для начала надо создать новый модуль. Перейти во вкладку «Свойства» и там задать параметры в формате json. Нам нужен только 1 параметр, sectionId. В него будем писать, из какого раздела брать документы. Заполняем свойства
Заполняйте название и описание. Можно смело обновлять страницу админки, модуль будет установлен. А мы продолжим разбираться со скриптом.
275
279
276
280
Как видите, в действии по-умолчанию мы делаем запрос к базе, разбираем его и в цикле присваиваем переменной lang['phpwork'] результат работы, строчка за строчкой. А phpwork — ничего не напоминает? Это наш плейсхолдер, заданный в шаблоне. Т.е. мы будем выводить на его месте результаты работы скрипта.
277
281
278
282
А как будем это делать, скажут эти 2 строчки вызова класса.
В действии edit мы проверяем, пришёл ли пост-запрос. Если да, то обновляем содержимое полей в базе и выводим отчёт о работе, либо положительный, либо отрицательный. Если запрос не пришёл, рисуем форму. Ловим переданный нам параметр editDoc, делаем запрос, отображаем поля для редактирования и в них текущие значения pagetitle и introtext.
286
290
287
291
Пора сделать языковой файл. Если вы обратили внимание на код класса, то могли заметить, что подключение языка происходит по вот такой схеме:
Как видите, внутри массива $_field мы создали элементы массива, ключи которых полностью совпадают с теми плейсхолдерами, которые заданы в шаблоне main.html.
320
+
Как видите, внутри массива $\_field мы создали элементы массива, ключи которых полностью совпадают с теми плейсхолдерами, которые заданы в шаблоне main.html.
317
321
318
322
Попробуйте запустить модуль. У вас должны работать табы, отображаться товары. Но пока что не работает редактирование. Давайте это исправим.
319
323
320
324
Посмотрите внимательно на вызов парсера при действии edit. Мы вызываем практически всё точно также, за исключением шаблона. Для редактирования применим новый шаблон, edit.html. Создайте такой файл в папке templates
Дальше никаких изменений нет, и в phpwork подставляется содержимое переменных из секции case 'edit': файла core.php.
381
385
382
-
Конечно, в этот модуль можно было добавить ТВ-параметры, аякс-редактирование и многие другие интересные вещи, однако, статья получилась и без того объёмная.
386
+
Конечно, в этот модуль можно было добавить ТВ-параметры, аякс-редактирование и многие другие интересные вещи, однако, статья получилась и без того объёмная.
0 commit comments