Skip to content

Commit 942ad18

Browse files
committed
Документация modxProVueCore
1 parent be4c57b commit 942ad18

File tree

3 files changed

+982
-0
lines changed

3 files changed

+982
-0
lines changed
Lines changed: 364 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,364 @@
1+
# API Composables
2+
3+
ModxProVueCore предоставляет готовые composables (хелперы) для работы с MODX из Vue компонентов.
4+
5+
## useLexicon
6+
7+
Работа с лексиконами MODX.
8+
9+
### Импорт
10+
11+
```javascript
12+
import { useLexicon } from '@modxprovuecore/useLexicon'
13+
```
14+
15+
### API
16+
17+
```javascript
18+
const { _, has, getByPrefix } = useLexicon()
19+
```
20+
21+
| Метод | Описание |
22+
|-------|----------|
23+
| `_(key, params?)` | Получить значение лексикона по ключу |
24+
| `has(key)` | Проверить существование ключа |
25+
| `getByPrefix(prefix)` | Получить все ключи с указанным префиксом |
26+
27+
### Примеры
28+
29+
```javascript
30+
const { _, has, getByPrefix } = useLexicon()
31+
32+
// Простое получение значения
33+
const title = _('my_component_title')
34+
// "Мой компонент"
35+
36+
// С параметрами подстановки
37+
const message = _('my_component_welcome', { name: 'John', count: 5 })
38+
// Лексикон: "Привет, {name}! У вас {count} сообщений"
39+
// Результат: "Привет, John! У вас 5 сообщений"
40+
41+
// Проверка существования ключа
42+
if (has('my_component_optional_feature')) {
43+
// Ключ существует
44+
}
45+
46+
// Получить все ключи с префиксом
47+
const allMyKeys = getByPrefix('my_component_')
48+
// { 'my_component_title': 'Мой компонент', 'my_component_desc': 'Описание', ... }
49+
```
50+
51+
### Загрузка лексиконов
52+
53+
Лексиконы ищутся в `window.MODx.lang`. Загрузите топики в PHP контроллере:
54+
55+
```php
56+
public function getLanguageTopics()
57+
{
58+
return ['mycomponent:default', 'mycomponent:manager'];
59+
}
60+
```
61+
62+
## useModx
63+
64+
Доступ к глобальному объекту MODX.
65+
66+
### Импорт
67+
68+
```javascript
69+
import { useModx } from '@modxprovuecore/useModx'
70+
```
71+
72+
### API
73+
74+
```javascript
75+
const { modx, config, siteId } = useModx()
76+
```
77+
78+
| Свойство | Тип | Описание |
79+
|----------|-----|----------|
80+
| `modx` | `Object` | Полный объект `window.MODx` |
81+
| `config` | `Object` | Конфигурация `MODx.config` |
82+
| `siteId` | `String` | Токен авторизации `MODx.siteId` |
83+
84+
### Примеры
85+
86+
```javascript
87+
const { modx, config, siteId } = useModx()
88+
89+
// Доступ к конфигурации
90+
const assetsUrl = config.assets_url
91+
const connectorUrl = config.connector_url
92+
const baseUrl = config.base_url
93+
94+
// MODX Site ID для авторизации API
95+
console.log(siteId) // "modx68ed50b266b7e9.17779601_168f40d849ba6b1.18395696"
96+
97+
// Использование MODX методов
98+
modx.msg.alert('Заголовок', 'Сообщение')
99+
modx.msg.confirm({
100+
title: 'Подтверждение',
101+
text: 'Вы уверены?',
102+
url: config.connector_url,
103+
params: { action: 'myaction' }
104+
})
105+
```
106+
107+
### Типичные config свойства
108+
109+
| Свойство | Описание |
110+
|----------|----------|
111+
| `config.assets_url` | URL папки assets |
112+
| `config.connector_url` | URL коннектора |
113+
| `config.base_url` | Базовый URL сайта |
114+
| `config.manager_url` | URL менеджера |
115+
| `config.template` | ID текущего шаблона |
116+
117+
## usePermission
118+
119+
Проверка прав пользователя.
120+
121+
### Импорт
122+
123+
```javascript
124+
import { usePermission } from '@modxprovuecore/usePermission'
125+
```
126+
127+
### API
128+
129+
```javascript
130+
const { hasPermission, hasAnyPermission, hasAllPermissions } = usePermission()
131+
```
132+
133+
| Метод | Описание |
134+
|-------|----------|
135+
| `hasPermission(perm)` | Проверить одно право |
136+
| `hasAnyPermission(perms)` | Проверить наличие любого из прав |
137+
| `hasAllPermissions(perms)` | Проверить наличие всех прав |
138+
139+
### Примеры
140+
141+
```javascript
142+
const { hasPermission, hasAnyPermission, hasAllPermissions } = usePermission()
143+
144+
// Проверить одно право
145+
if (hasPermission('my_component_edit')) {
146+
// Пользователь может редактировать
147+
}
148+
149+
// Проверить любое из прав
150+
if (hasAnyPermission(['edit', 'save', 'delete'])) {
151+
// Пользователь имеет хотя бы одно право
152+
}
153+
154+
// Проверить все права
155+
if (hasAllPermissions(['view', 'edit'])) {
156+
// Пользователь имеет оба права
157+
}
158+
```
159+
160+
### Использование в шаблоне
161+
162+
```vue
163+
<script setup>
164+
import { computed } from 'vue'
165+
import { usePermission } from '@modxprovuecore/usePermission'
166+
167+
const { hasPermission } = usePermission()
168+
169+
const canEdit = computed(() => hasPermission('my_component_edit'))
170+
const canDelete = computed(() => hasPermission('my_component_delete'))
171+
</script>
172+
173+
<template>
174+
<Button v-if="canEdit" label="Редактировать" />
175+
<Button v-if="canDelete" label="Удалить" severity="danger" />
176+
</template>
177+
```
178+
179+
## useApi
180+
181+
HTTP клиент для **стандартного** MODX connector API.
182+
183+
### Импорт
184+
185+
```javascript
186+
import { useApi } from '@modxprovuecore/useApi'
187+
```
188+
189+
### API
190+
191+
```javascript
192+
const { get, post, put, delete: del } = useApi()
193+
```
194+
195+
| Метод | Описание |
196+
|-------|----------|
197+
| `get(action, params?)` | GET запрос |
198+
| `post(action, data?)` | POST запрос |
199+
| `put(action, data?)` | PUT запрос |
200+
| `delete(action, data?)` | DELETE запрос |
201+
202+
### Примеры
203+
204+
```javascript
205+
const { get, post, put, delete: del } = useApi()
206+
207+
// GET запрос
208+
const users = await get('security/user/getlist', { limit: 20 })
209+
210+
// POST запрос
211+
const result = await post('security/user/create', {
212+
username: 'newuser',
213+
email: 'user@example.com'
214+
})
215+
216+
// PUT запрос
217+
await put('security/user/update', {
218+
id: 1,
219+
fullname: 'New Name'
220+
})
221+
222+
// DELETE запрос
223+
await del('security/user/remove', { id: 1 })
224+
```
225+
226+
### Формат запроса
227+
228+
useApi работает со стандартным форматом MODX connector:
229+
230+
```
231+
POST /connectors/index.php?action=security/user/getlist
232+
```
233+
234+
::: warning Для компонентов с роутером
235+
Если ваш компонент использует собственный роутер (FastRoute и др.), создайте локальный `request.js`. См. [Собственный API клиент](integration#собственный-api-клиент).
236+
:::
237+
238+
## Комплексный пример
239+
240+
Компонент, использующий все composables:
241+
242+
```vue
243+
<script setup>
244+
import { ref, computed, onMounted } from 'vue'
245+
import { useLexicon } from '@modxprovuecore/useLexicon'
246+
import { useModx } from '@modxprovuecore/useModx'
247+
import { usePermission } from '@modxprovuecore/usePermission'
248+
import { useApi } from '@modxprovuecore/useApi'
249+
250+
import DataTable from 'primevue/datatable'
251+
import Column from 'primevue/column'
252+
import Button from 'primevue/button'
253+
import Toast from 'primevue/toast'
254+
import { useToast } from 'primevue/usetoast'
255+
256+
// Composables
257+
const { _ } = useLexicon()
258+
const { config } = useModx()
259+
const { hasPermission } = usePermission()
260+
const { get, post } = useApi()
261+
const toast = useToast()
262+
263+
// State
264+
const users = ref([])
265+
const loading = ref(false)
266+
267+
// Computed
268+
const canCreate = computed(() => hasPermission('new_user'))
269+
const canEdit = computed(() => hasPermission('save_user'))
270+
271+
// Methods
272+
async function loadUsers() {
273+
loading.value = true
274+
try {
275+
const response = await get('security/user/getlist', { limit: 50 })
276+
users.value = response.results || []
277+
} catch (error) {
278+
toast.add({
279+
severity: 'error',
280+
summary: _('error'),
281+
detail: error.message,
282+
life: 3000
283+
})
284+
} finally {
285+
loading.value = false
286+
}
287+
}
288+
289+
async function createUser() {
290+
try {
291+
await post('security/user/create', {
292+
username: 'newuser',
293+
email: 'new@example.com'
294+
})
295+
toast.add({
296+
severity: 'success',
297+
summary: _('success'),
298+
detail: _('user_created'),
299+
life: 3000
300+
})
301+
await loadUsers()
302+
} catch (error) {
303+
toast.add({
304+
severity: 'error',
305+
summary: _('error'),
306+
detail: error.message,
307+
life: 3000
308+
})
309+
}
310+
}
311+
312+
// Lifecycle
313+
onMounted(() => {
314+
loadUsers()
315+
})
316+
</script>
317+
318+
<template>
319+
<div class="user-management">
320+
<Toast />
321+
322+
<div class="header">
323+
<h1>{{ _('user_management') }}</h1>
324+
<Button
325+
v-if="canCreate"
326+
:label="_('create_user')"
327+
icon="pi pi-plus"
328+
@click="createUser"
329+
/>
330+
</div>
331+
332+
<DataTable
333+
:value="users"
334+
:loading="loading"
335+
paginator
336+
:rows="10"
337+
>
338+
<Column field="id" :header="_('id')" sortable />
339+
<Column field="username" :header="_('username')" sortable />
340+
<Column field="email" :header="_('email')" sortable />
341+
<Column v-if="canEdit" :header="_('actions')">
342+
<template #body="{ data }">
343+
<Button
344+
icon="pi pi-pencil"
345+
severity="secondary"
346+
text
347+
rounded
348+
@click="editUser(data.id)"
349+
/>
350+
</template>
351+
</Column>
352+
</DataTable>
353+
</div>
354+
</template>
355+
356+
<style scoped>
357+
.header {
358+
display: flex;
359+
justify-content: space-between;
360+
align-items: center;
361+
margin-bottom: 1rem;
362+
}
363+
</style>
364+
```

0 commit comments

Comments
 (0)