39 public function run($rid = 0) {
42 $rid = (int)
dbx()->get_request_var(
'rid', 0,
'int');
44 $db =
dbx()->get_system_obj(
'dbxDB');
46 $data = $rid ?
$db->select1($this->ddUser, $rid, array(
'id',
'avatar')) : array();
47 if (!is_array($data)) {
51 $uid = (int)($data[
'id'] ?? 0);
52 $avatar = $this->avatar_file($data[
'avatar'] ??
'');
54 $oForm = new \dbxForm();
55 $oForm->init(
'dbxUser_admin_avatar_' . (
int) $rid,
'form-avatar');
56 $oForm->set_workflow_scope(
'admin-avatar-' . (
int) $rid);
57 $oForm->_data = $data;
58 $oForm->_dd = $this->ddUser;
59 $oForm->_rid = (int) $rid;
60 $oForm->_action =
'?dbx_modul=dbxUser_admin&dbx_run1=user&dbx_run2=edit_avatar&rid=' . (int) $rid;
61 $oForm->_msg_info =
'';
62 $oForm->set_state_value(
'rid', (
int) $rid);
63 $oForm->add_rep(
'rid', (
int) $rid);
64 $oForm->add_rep(
'can_upload', ($rid > 0 && $uid > 0) ? 1 : 0);
65 $oForm->add_rep(
'cannot_upload', ($rid > 0 && $uid > 0) ? 0 : 1);
67 if ($oForm->submit()) {
68 if ($rid <= 0 || $uid <= 0) {
69 $oForm->_msg_error =
'Ein Avatar kann nach dem ersten Speichern des Benutzers hochgeladen werden.';
70 } elseif (!$this->has_upload_file(
'upload_file')) {
71 $oForm->_msg_error =
'Bitte waehlen Sie eine Bilddatei aus.';
73 $oUpload =
dbx()->get_system_obj(
'dbxUpload');
74 $oUpload->upload($_FILES[
'upload_file']);
75 $oUpload->allowed = array(
'image/jpeg',
'image/jpg',
'image/pjpeg',
'image/png',
'image/x-png',
'image/webp',
'image/x-webp',
'image/gif');
76 $oUpload->file_max_size = 2 * 1024 * 1024;
77 $oUpload->file_overwrite =
true;
78 $oUpload->file_new_name_body =
'avatar-' . $uid;
79 $oUpload->image_resize =
true;
80 $oUpload->image_ratio_crop =
true;
81 $oUpload->image_x = 640;
82 $oUpload->image_y = 640;
83 $oUpload->process($this->avatar_dir());
85 if ($oUpload->processed) {
86 $ok =
$db->update($this->ddUser, array(
'avatar' => $oUpload->file_dst_name), $rid);
88 $avatar = $oUpload->file_dst_name;
89 $oForm->_msg_success =
'Profilbild gespeichert.';
91 $oForm->_msg_error =
'Profilbild konnte nicht gespeichert werden.';
94 $oForm->_msg_error =
'Upload fehlgeschlagen: ' . $oUpload->error;
101 if ($rid <= 0 || $uid <= 0) {
102 $oForm->_msg_info =
'Ein Avatar kann nach dem ersten Speichern des Benutzers hochgeladen werden.';
105 $oForm->add_obj(
'avatar_preview',
'obj-value',
'<img src="' . $this->avatar_url($avatar) .
'?' . time() .
'" alt="Avatar" class="dbx-avatar-img">');
106 $oForm->add_js_code(<<<
'JS'
108 var drop = document.getElementById(
'admin_avatar_uploader_{i}');
109 var form = document.getElementById(
'dbx_form_{i}');
110 if (!drop || !form || drop.dataset.ready ===
'1')
return;
111 drop.dataset.ready =
'1';
113 var input = form.querySelector(
'input[type="file"][name="upload_file"]');
114 var title = drop.querySelector(
'.dbx-avatar-drop-title');
115 var meta = drop.querySelector(
'.dbx-avatar-drop-meta');
116 var defaultTitle = title ? title.textContent :
'';
117 var defaultMeta = meta ? meta.textContent :
'';
120 function setBusy(active) {
122 drop.classList.toggle(
'is-active', active);
123 drop.classList.toggle(
'is-uploading', active);
124 drop.setAttribute(
'aria-busy', active ?
'true' :
'false');
125 form.querySelectorAll(
'.dbx-form-save, button[type="submit"], input[type="submit"]').forEach(
function (button) {
126 button.disabled = active;
128 if (title) title.textContent = active ?
'Upload laeuft...' : (drop.dataset.fileName || defaultTitle);
129 if (meta && active) meta.textContent =
'Bitte warten, das Bild wird gespeichert.';
132 function setMessage(message) {
133 if (meta && message) meta.textContent = message;
136 function setSelected(file) {
138 drop.dataset.fileName = file.name || defaultTitle;
139 drop.classList.add(
'has-file');
140 if (title) title.textContent = file.name || defaultTitle;
141 if (meta) meta.textContent =
'Bereit zum Hochladen.';
144 function syncInput(file) {
145 if (!input || !file)
return false;
147 var transfer =
new DataTransfer();
148 transfer.items.add(file);
149 input.files = transfer.files;
150 return input.files && input.files.length === 1;
156 function refresh(html) {
157 var targetId = drop.getAttribute(
'data-dbx_target');
158 var target = targetId ? document.getElementById(targetId) :
null;
163 target.innerHTML = html;
164 if (window.dbx && typeof window.dbx.scan ===
'function') {
165 window.dbx.scan(target);
169 function requestUrl(raw) {
171 var url =
new URL(raw || form.getAttribute(
'action') || form.action || window.location.href, window.location.href);
173 (url.protocol ===
'http:' || url.protocol ===
'https:') &&
174 url.hostname === window.location.hostname &&
175 url.port === window.location.port &&
176 url.protocol !== window.location.protocol
178 url.protocol = window.location.protocol;
182 return raw || form.getAttribute(
'action') || form.action;
186 function directUpload(file) {
187 if (typeof window.fetch !==
'function') {
188 return Promise.reject(
new Error(
'fetch_unavailable'));
191 var data =
new FormData(form);
192 data.set(
'upload_file', file);
193 return fetch(requestUrl(drop.getAttribute(
'data-dbx_get') || form.getAttribute(
'action') || form.action), {
196 credentials:
'same-origin'
197 }).then(
function (response) {
198 if (!response.ok)
throw new Error(
'HTTP ' + response.status);
199 return response.text();
203 function nativeSubmit() {
204 if (typeof HTMLFormElement !==
'undefined' && HTMLFormElement.prototype.submit) {
205 HTMLFormElement.prototype.submit.call(form);
211 function send(file, fileAlreadyOnInput) {
212 if (!file || busy)
return;
214 var inputReady = fileAlreadyOnInput || syncInput(file);
223 setMessage(
'Upload konnte nicht gestartet werden. Bitte erneut versuchen.');
226 .
finally(
function () { setBusy(
false); });
229 function openPicker() {
230 if (!input || busy)
return;
232 if (title) title.textContent = defaultTitle;
233 if (meta) meta.textContent = defaultMeta;
234 drop.classList.remove(
'has-file');
238 drop.addEventListener(
'click', openPicker);
239 drop.addEventListener(
'keydown',
function (event) {
240 if (event.key ===
'Enter' || event.key ===
' ') {
241 event.preventDefault();
247 input.addEventListener(
'change',
function () {
248 send(input.files && input.files[0],
true);
252 form.addEventListener(
'submit',
function (event) {
254 event.preventDefault();
255 event.stopPropagation();
259 var file = input && input.files && input.files[0];
261 event.preventDefault();
262 event.stopPropagation();
263 setMessage(
'Bitte waehlen Sie zuerst eine Bilddatei aus.');
268 event.preventDefault();
269 event.stopPropagation();
273 [
'dragenter',
'dragover'].forEach(
function (eventName) {
274 drop.addEventListener(eventName,
function (event) {
275 event.preventDefault();
280 [
'dragleave',
'drop'].forEach(
function (eventName) {
281 drop.addEventListener(eventName,
function (event) {
282 event.preventDefault();
287 drop.addEventListener(
'drop',
function (event) {
288 event.preventDefault();
289 event.stopPropagation();
290 var files =
event.dataTransfer &&
event.dataTransfer.files;
291 send(files && files[0],
false);
296 return $oForm->run();