Файловый менеджер - Редактировать - /home/harasnat/www/labour/wp-content/plugins/events-manager/includes/js/bookingsform.min.js
Назад
document.querySelectorAll("#em-booking-form").forEach(el=>el.classList.add("em-booking-form"));var em_booking_form_observer;document.addEventListener("em_booking_form_js_loaded",function(e){let container=e.detail.container;container.querySelectorAll("form.em-booking-form").forEach(function(booking_form){if(!("id"in booking_form.dataset)){let event_id_el=booking_form.querySelector('input[name="event_id"]');if(event_id_el){let event_id=event_id_el.value;booking_form.setAttribute("data-id",event_id);booking_form.setAttribute("id","em-booking-form-"+event_id);booking_form.parentElement.setAttribute("data-id",event_id);booking_form.parentElement.setAttribute("id","event-booking-form-"+event_id);booking_form.querySelectorAll('.em-booking-submit, input[type="submit"]').forEach(button=>button.classList.add("em-form-submit"))}}em_booking_form_init(booking_form)});if("bookings_form_observer"in EM&&EM.bookings_form_observer){em_booking_form_observer=new MutationObserver(function(mutationList){mutationList.forEach(function(mutation){if(mutation.type==="childList"){mutation.addedNodes.forEach(function(node){if(node instanceof HTMLDivElement&&node.classList.contains("em-event-booking-form")){em_booking_form_init(node.querySelector("form.em-booking-form"))}})}})});em_booking_form_observer.observe(container,{childList:true,attributes:false,subtree:true})}container.addEventListener("em_booking_success",e=>{if(e.detail.response.success){e.target.closest(".em-booking-recurrence-form")?.querySelector(".em-booking-recurrence-picker")?.classList.add("hidden")}});em_init_booking_recurring_form(container)});var em_init_booking_recurring_form=function(container){let fetchEM=function(data,responseType="text"){return fetch(EM.bookingajaxurl,{method:"POST",body:data}).then(function(response){if(response.ok){return responseType==="json"?response.json():response.text()}return Promise.reject(response)})};let breakpoints={xsmall:425,small:650,medium:890,large:false};EM_ResizeObserver(breakpoints,container.querySelectorAll(".em-booking-recurrence-picker"));container.querySelectorAll(".em-booking-recurring").forEach(function(recurringBooking){let nonces;let recurrenceBooking=recurringBooking.querySelector(".em-booking-recurrence-form");let recurrenceDates=recurringBooking.querySelector(".em-booking-recurrences");if(!(nonces instanceof Object)){if(EM.cached){nonces={};fetchEM(new URLSearchParams({action:"booking_form_nonces"}),"json").then(json=>{nonces=json}).catch(error=>console.log("Error fetching booking form:",error))}else{nonces={booking_form:recurrenceBooking.dataset.nonce,booking_recurrences:recurringBooking.querySelector(".em-booking-recurrence-picker")?.dataset.nonce}}}let gettingRecurrences;recurringBooking.addEventListener("click",function(e){if(e.target.closest(".em-calendar .eventful, .em-calendar .eventful-pre, .em-calendar .eventful-post, .em-calendar .eventful-today")){e.preventDefault();if(!gettingRecurrences){let date=e.target.closest(".em-cal-day-date");if(date&&recurrenceDates.dataset.date!==date?.dataset.date){date.closest(".em-cal-body").querySelectorAll(".em-cal-day-date").forEach(calDate=>calDate.classList.toggle("selected",calDate===date));gettingRecurrences=getDateRecurrences(date?.dataset.date).finally(()=>{gettingRecurrences=null})}}}});let getDateRecurrences=function(date=false){let data={action:"booking_recurrences",event_id:recurringBooking.dataset.event,day:date||"",nonce:nonces.booking_recurrences,timezone:recurringBooking.querySelector(".em-calendar")?.dataset.timezone||""};let skeleton=recurringBooking.querySelector(".em-booking-recurrences-skeleton")?.content.cloneNode(true);if(skeleton){let count=recurrenceDates.querySelectorAll(".em-booking-recurrence").length;let skeletonRecurrenceDates=skeleton.querySelectorAll(".em-booking-recurrence");if(count&&count!==skeletonRecurrenceDates.length){if(skeletonRecurrenceDates.length>count){for(let i=count;i<skeletonRecurrenceDates.length;i++){skeletonRecurrenceDates[i].remove()}}else if(skeletonRecurrenceDates.length<count){let templateDate=skeletonRecurrenceDates[0];for(let i=skeletonRecurrenceDates.length;i<count;i++){skeleton.querySelector(".em-booking-recurrence").append(templateDate.cloneNode(true))}}}recurrenceDates.innerHTML="";recurrenceDates.append(skeleton);recurrenceDates.classList.add("skeleton")}return fetchEM(new URLSearchParams(data)).then(function(html){recurrenceDates.innerHTML=html;recurrenceDates.innerHTML=recurrenceDates.firstElementChild.innerHTML;recurrenceDates.dataset.date=date}).catch(error=>console.log("Error fetching booking form recurrences:",error)).finally(()=>{if(recurrenceDates){recurrenceDates.classList.remove("skeleton");em_setup_selectize(recurrenceDates);let selected;if(recurrenceDates.classList.contains("selected")&&recurrenceDates.dataset.selectedEvent){selected=recurrenceDates.querySelector(`[data-event="${recurrenceDates.dataset.selectedEvent}"]`)}if(selected){selected.classList.add("selected")}else{recurrenceDates.classList.remove("selected");delete recurrenceDates.dataset.selectedEvent}recurrenceDates.dispatchEvent(new CustomEvent("booking_recurrences_loaded",{bubbles:true,detail:{date:date[0],time:date[1]||null}}))}})};recurringBooking.addEventListener("change",function(e){if(e.target.matches(".em-booking-recurrences .em-timezone")&&e.detail.target.value){let calendar=recurringBooking.querySelector(".em-calendar");if(calendar){calendar.dataset.timezone=e.detail.selectize.getValue();calendar.dispatchEvent(new CustomEvent("reload",{bubbles:true}))}getDateRecurrences(recurrenceDates.dataset.date).finally(function(){if(recurrenceDates.dataset.selectedEvent){recurrenceDates.querySelector(`[data-event="${recurrenceDates.dataset.selectedEvent}"]`).classList.add("selected")}})}});let fetchBookingForm=function(event_id){if(!Number(event_id)){recurrenceBooking.innerHTML=""}else if(recurrenceBooking&&recurrenceBooking.dataset.event!==event_id){let data={action:"booking_form",event_id:event_id,nonce:nonces.booking_form};let skeleton=recurringBooking.querySelector(".em-booking-summary-skeleton")?.content.cloneNode(true);if(skeleton){recurrenceBooking.innerHTML="";recurrenceBooking.append(skeleton);window.scroll({top:recurrenceBooking.getBoundingClientRect().top+window.scrollY-EM.booking_offset,behavior:"smooth"})}if(recurrenceDates){recurrenceDates.classList.add("selected");recurrenceDates.dataset.selectedEvent=event_id;recurrenceDates.querySelectorAll(".em-booking-recurrence").forEach(function(recurrenceDate){recurrenceDate.classList.toggle("selected",recurrenceDate.dataset.event===`${event_id}`)})}fetchEM(new URLSearchParams(data)).then(function(html){recurrenceBooking.innerHTML=html;recurrenceBooking.dataset.event=event_id;const scripts=recurrenceBooking.querySelectorAll('script:not([type]), script[type="text/javascript"]');scripts.forEach(script=>{if(!script.src){const newScript=document.createElement("script");newScript.textContent=script.textContent;script.parentElement.replaceChild(newScript,script)}});let bookingForm=recurrenceBooking.querySelector("form.em-booking-form");if(bookingForm){em_setup_ui_elements(bookingForm);em_setup_scripts(bookingForm);em_booking_form_init(bookingForm)}}).catch(error=>console.log("Error fetching booking form recurrences:",error))}};recurringBooking.querySelector(".em-booking-recurrence-picker.mode-select")?.addEventListener("change",function(e){fetchBookingForm(e.detail.target.value)});recurringBooking.querySelector(".em-booking-recurrences")?.addEventListener("click",function(e){let recurrenceDate=e.target.closest(".em-booking-recurrence");if(recurrenceDate&&!recurrenceDate.hasAttribute("disabled")){fetchBookingForm(recurrenceDate.dataset.event)}});let handleHashChange=function(e){if(e&&e.type==="hashchange"&&window.lastClickedHashLink){window.lastClickedHashLink=false;return}let hash=window.location.hash.substring(1);if(hash.match(/^\d{4}-\d{2}-\d{2}(@\d{2}:\d{2}:\d{2})?$/)){let date=hash.split("@")[0];if(recurrenceDates){let recurrenceDate=recurringBooking.querySelector(`.em-booking-recurrence[href="#${hash}"]`);if(recurrenceDate){recurrenceDate.click()}else{if(recurrenceDates?.dataset.date!==date){getDateRecurrences(date).then(()=>{recurringBooking.querySelector(`.em-booking-recurrence[href="#${hash}"]`)?.click()})}}let calendar=recurringBooking.querySelector(".em-calendar");if(calendar){let dateObj=new Date(date);if(calendar.dataset.year!==dateObj.getFullYear()||calendar.dataset.month!==dateObj.getMonth()+1){calendar.dataset.month=dateObj.getMonth()+1;calendar.dataset.year=dateObj.getFullYear()}calendar.dispatchEvent(new CustomEvent("reload",{bubbles:true}))}}}};container.addEventListener("click",function(e){if(e.target.closest('a[href^="#"]')){window.lastClickedHashLink=true;setTimeout(()=>{window.lastClickedHashLink=false},100)}});handleHashChange();window.addEventListener("hashchange",handleHashChange)})};var em_booking_form_count_spaces=function(booking_form){let tickets_selected=0;let booking_data=new FormData(booking_form);for(const pair of booking_data.entries()){if(pair[0].match(/^em_tickets\[[0-9]+\]\[spaces\]/)&&parseInt(pair[1])>0){tickets_selected++}}booking_form.setAttribute("data-spaces",tickets_selected);return tickets_selected};var em_booking_form_init=function(booking_form){booking_form.dispatchEvent(new CustomEvent("em_booking_form_init",{bubbles:true}));booking_form.addEventListener("change",function(e){if(e.target.matches(".em-ticket-select")||EM.bookings.update_listener&&e.target.matches(EM.bookings.update_listener)){em_booking_form_count_spaces(booking_form);booking_form.dispatchEvent(new CustomEvent("em_booking_form_updated"))}});let em_booking_form_updated_listener;booking_form.addEventListener("em_booking_form_updated",function(e){em_booking_form_updated_listener=true;em_booking_summary_ajax(booking_form).finally(function(){em_booking_form_updated_listener=false})});if(jQuery){jQuery(booking_form).on("em_booking_form_updated",function(){if(!em_booking_form_updated_listener){em_booking_summary_ajax(booking_form)}})}booking_form.addEventListener("em_booking_summary_updated",function(e){let booking_intent=e.detail.response.querySelector("input.em-booking-intent");em_booking_form_update_booking_intent(booking_form,booking_intent)});booking_form.addEventListener("submit",function(e){if(typeof booking_form.dataset.noajax==="undefined"){e.preventDefault();em_booking_form_submit(e.target)}});let booking_intent=booking_form.querySelector("input.em-booking-intent");em_booking_form_update_booking_intent(booking_form,booking_intent);booking_form.dispatchEvent(new CustomEvent("em_booking_form_loaded",{bubbles:true}))};var em_booking_form_scroll_to_message=function(booking_form){let messages=booking_form.parentElement.querySelectorAll(".em-booking-message");if(messages.length>0){let message=messages[0];window.scroll({top:message.getBoundingClientRect().top+window.scrollY-EM.booking_offset,behavior:"smooth"})}};var em_booking_form_add_message=function(booking_form,content=null,opts={}){let options=Object.assign({type:"success",replace:true,scroll:content!==null},opts);if(options.replace){booking_form.parentElement.querySelectorAll(".em-booking-message").forEach(message=>message.remove())}if(content!==null){let div=document.createElement("div");div.classList.add("em-booking-message","em-booking-message-"+options.type);div.innerHTML=content;booking_form.parentElement.insertBefore(div,booking_form)}if(options.scroll){em_booking_form_scroll_to_message(booking_form)}};var em_booking_form_add_error=function(booking_form,error,opts={}){let options=Object.assign({type:"error"},opts);if(error!=null){if(Array.isArray(error)||typeof error==="object"){let error_msg="";if(typeof error==="object"){Object.entries(error).forEach(function(entry){let[id,err]=entry;error_msg+='<p data-field-id="'+id+'">'+err+"</p>"})}else{error.forEach(function(err){error_msg+="<p>"+err+"</p>"})}if(error_msg){em_booking_form_add_message(booking_form,error_msg,options)}console.log(error)}else{em_booking_form_add_message(booking_form,error,options)}}};var em_booking_form_add_confirm=function(booking_form,message,opts={}){let options=Object.assign({hide:false},opts);em_booking_form_add_message(booking_form,message,options);if(options.hide){em_booking_form_hide_success(booking_form)}};var em_booking_form_hide_success=function(booking_form,opts={}){let options=Object.assign({hideLogin:true},opts);let booking_summary_sections=booking_form.querySelectorAll(".em-booking-form-summary-title, .em-booking-form-summary-title");if(booking_summary_sections.length>0){booking_form.querySelectorAll("section:not(.em-booking-form-section-summary)").forEach(section=>section.classList.add("hidden"));booking_form.parentElement.querySelectorAll(".em-booking-form > h3.em-booking-section-title").forEach(section=>section.classList.add("hidden"))}else{booking_form.classList.add("hidden")}booking_form.dispatchEvent(new CustomEvent("em_booking_form_hide_success",{detail:{options:options},bubbles:true}));if(options.hideLogin){booking_form.parentElement.querySelectorAll(".em-login").forEach(login=>login.classList.add("hidden"))}};var em_booking_form_unhide_success=function(booking_form,opts={}){let options=Object.assign({showLogin:true},opts);let booking_summary_sections=booking_form.querySelectorAll(".em-booking-form-summary-title, .em-booking-form-summary-title");if(booking_summary_sections.length>0){booking_form.querySelectorAll("section:not(.em-booking-form-section-summary)").forEach(section=>section.classList.remove("hidden"));booking_form.parentElement.querySelectorAll(".em-booking-form > h3.em-booking-section-title").forEach(section=>section.classList.remove("hidden"))}else{booking_form.classList.remove("hidden")}booking_form.dispatchEvent(new CustomEvent("em_booking_form_unhide_success",{detail:{options:options},bubbles:true}));if(options.showLogin){booking_form.parentElement.querySelectorAll(".em-booking-login").forEach(login=>login.classList.add("hidden"))}};var em_booking_form_hide_spinner=function(booking_form){booking_form.parentElement.querySelectorAll(".em-loading").forEach(spinner=>spinner.remove())};var em_booking_form_show_spinner=function(booking_form){let spinner=document.createElement("div");spinner.classList.add("em-loading");booking_form.parentElement.append(spinner)};var em_booking_form_enable_button=function(booking_form,show=false){let button=booking_form.querySelector("input.em-form-submit");button.disabled=false;button.classList.remove("disabled");if(show){button.classList.remove("hidden")}return button};var em_booking_form_disable_button=function(booking_form,hide=false){let button=booking_form.querySelector("input.em-form-submit");button.disabled=true;button.classList.add("disabled");if(hide){button.classList.add("hidden")}return button};var em_booking_form_update_booking_intent=function(booking_form,booking_intent=null){booking_form.querySelectorAll("input.em-booking-intent").forEach(function(intent){if(booking_intent!==intent){intent.remove()}});if(booking_intent){booking_form.append(booking_intent)}let button=booking_form.querySelector("input.em-form-submit");if(button){if(booking_intent&&booking_intent.dataset.spaces>0){em_booking_form_enable_button(booking_form);if(booking_intent.dataset.amount>0){if(button.getAttribute("data-text-payment")){button.value=EM.bookings.submit_button.text.payment.replace("%s",booking_intent.dataset.amount_formatted)}}else{button.value=EM.bookings.submit_button.text.default}}else if(!booking_intent&&em_booking_form_count_spaces(booking_form)>0){button.value=EM.bookings.submit_button.text.default;em_booking_form_enable_button(booking_form)}else{button.value=EM.bookings.submit_button.text.default;em_booking_form_disable_button(booking_form)}}booking_form.querySelectorAll(".em-booking-form-confirm-title").forEach(title=>title.classList.add("hidden"));if(booking_intent&&booking_intent.dataset.spaces>0){if(booking_intent.dataset.amount>0){booking_form.querySelectorAll(".em-booking-form-confirm-title-paid").forEach(title=>title.classList.remove("hidden"))}else{booking_form.querySelectorAll(".em-booking-form-confirm-title-free").forEach(title=>title.classList.remove("hidden"))}}let intent={uuid:0,event_id:null,spaces:0,amount:0,amount_base:0,amount_formatted:"$0",taxes:0,currency:"$"};if(booking_intent){intent=Object.assign(intent,booking_intent.dataset);intent.id=booking_intent.id}booking_form.dispatchEvent(new CustomEvent("em_booking_intent_updated",{detail:{intent:intent,booking_intent:booking_intent},cancellable:true,bubbles:true}))};var em_booking_summary_ajax_promise;var em_booking_summary_ajax=async function(booking_form){let summary_section=booking_form.querySelector(".em-booking-form-section-summary");let summary;if(summary_section){summary=summary_section.querySelector(".em-booking-form-summary")}let booking_data=new FormData(booking_form);booking_data.set("action","booking_form_summary");if(em_booking_summary_ajax_promise){em_booking_summary_ajax_promise.abort()}if(summary){booking_form.dispatchEvent(new CustomEvent("em_booking_summary_updating",{detail:{summary:summary,booking_data:booking_data},cancellable:true,bubbles:true}));let template=booking_form.querySelector(".em-booking-summary-skeleton");if(template){let skeleton=template.content.cloneNode(true);if(booking_form.dataset.spaces>1){let tickets=skeleton.querySelector(".em-bs-section-items");let ticket_row=tickets.querySelector(".em-bs-row.em-bs-row-item");for(let i=1;i<booking_form.dataset.spaces;i++){tickets.append(ticket_row.cloneNode(true))}}booking_form.dispatchEvent(new CustomEvent("em_booking_summary_skeleton",{detail:{skeleton:skeleton},bubbles:true}));summary.replaceChildren(skeleton)}}em_booking_summary_ajax_promise=fetch(EM.bookingajaxurl,{method:"POST",body:booking_data}).then(function(response){if(response.ok){return response.text()}return Promise.reject(response)}).then(function(html){let parser=new DOMParser;let response=parser.parseFromString(html,"text/html");let summary_html=response.querySelector(".em-booking-summary");if(summary&&summary_html){summary.querySelectorAll(".em-loading").forEach(spinner=>spinner.remove());if(typeof summary.replaceChildren==="function"){summary.replaceChildren(summary_html)}else{summary.innerHTML="";summary.append(summary_html)}em_setup_tippy(summary);em_booking_summary_ajax_promise=false}booking_form.dispatchEvent(new CustomEvent("em_booking_summary_updated",{detail:{response:response,summary:summary},cancellable:true,bubbles:true}))}).catch(function(error){booking_form.querySelectorAll("input.em-booking-intent").forEach(intent=>intent.remove());booking_form.dispatchEvent(new CustomEvent("em_booking_summary_ajax_error",{detail:{error:error,summary:summary},cancellable:true,bubbles:true}))}).finally(function(){em_booking_summary_ajax_promise=false;if(summary){summary.querySelectorAll(".em-loading").forEach(spinner=>spinner.remove())}booking_form.dispatchEvent(new CustomEvent("em_booking_summary_ajax_complete",{detail:{summary:summary},cancellable:true,bubbles:true}))});return em_booking_summary_ajax_promise};var em_booking_form_doing_ajax=false;var em_booking_form_submit=function(booking_form,opts={}){let options=em_booking_form_submit_options(opts);if(em_booking_form_doing_ajax){alert(EM.bookingInProgress);return false}em_booking_form_doing_ajax=true;if(options.doStart){em_booking_form_submit_start(booking_form,options)}let $response=null;let data=new FormData(booking_form);if("data"in opts&&typeof opts.data==="object"){for(const[key,value]of Object.entries(opts.data)){data.set(key,value)}}return fetch(EM.bookingajaxurl,{method:"POST",body:data}).then(function(response){if(response.ok){return response.json()}return Promise.reject(response)}).then(function(response){if(!("success"in response)&&"result"in response){response.success=response.result}if(options.doSuccess){$response=response;em_booking_form_submit_success(booking_form,response,options)}return response}).catch(function(error){if($response){if(options.showErrorMessages===true){let $error="errors"in $response&&$response.errors?$response.errors:$response.message;em_booking_form_add_error(booking_form,$error)}}else{if(options.doCatch){em_booking_form_submit_error(booking_form,error)}}}).finally(function(){$response=null;if(options.doFinally){em_booking_form_submit_finally(booking_form,options)}})};var em_booking_form_submit_start=function(booking_form){booking_form.querySelectorAll(".em-booking-message").forEach(message=>message.remove());em_booking_form_show_spinner(booking_form);let booking_intent=booking_form.querySelector("input.em-booking-intent");let button=booking_form.querySelector("input.em-form-submit");if(button){button.setAttribute("data-current-text",button.value);if(booking_intent&&"dataset"in booking_intent){button.value=EM.bookings.submit_button.text.processing.replace("%s",booking_intent.dataset.amount_formatted)}else{button.value=EM.bookings.submit_button.text.processing}}};var em_booking_form_submit_success=function(booking_form,response,opts={}){let options=em_booking_form_submit_options(opts);if(options.hideSpinner===true){em_booking_form_hide_spinner(booking_form)}if("result"in response&&!("success"in response)){response.success=response.result}if(response.success){if(options.showSuccessMessages===true){em_booking_form_add_confirm(booking_form,response.message)}if(options.hideForm===true){em_booking_form_hide_success(booking_form,options)}if(options.triggerEvents===true){if(jQuery){jQuery(document).trigger("em_booking_success",[response,booking_form]);if(response.gateway!==null){jQuery(document).trigger("em_booking_gateway_add_"+response.gateway,[response])}}booking_form.dispatchEvent(new CustomEvent("em_booking_success",{detail:{response:response},cancellable:true,bubbles:true}))}if(options.redirect===true&&response.redirect){window.location.href=response.redirect}}else{if(options.showErrorMessages===true){if(response.errors!=null){em_booking_form_add_error(booking_form,response.errors)}else{em_booking_form_add_error(booking_form,response.message)}}if(options.triggerEvents===true){if(jQuery){jQuery(document).trigger("em_booking_error",[response,booking_form])}booking_form.dispatchEvent(new CustomEvent("em_booking_error",{detail:{response:response},cancellable:true,bubbles:true}))}}if(!response.success&&typeof Recaptcha!="undefined"&&typeof RecaptchaState!="undefined"){try{Recaptcha.reload()}catch(error){}}else if(!response.success&&typeof grecaptcha!="undefined"){try{grecaptcha.reset()}catch(error){}}if(options.triggerEvents===true){if(jQuery){jQuery(document).trigger("em_booking_complete",[response,booking_form])}booking_form.dispatchEvent(new CustomEvent("em_booking_complete",{detail:{response:response},cancellable:true,bubbles:true}))}};var em_booking_form_submit_error=function(booking_form,error){if(jQuery){jQuery(document).trigger("em_booking_ajax_error",[null,null,null,booking_form])}booking_form.dispatchEvent(new CustomEvent("em_booking_ajax_error",{detail:{error:error},cancellable:true,bubbles:true}));em_booking_form_add_error(booking_form,"There was an unexpected network error, please try again or contact a site administrator.");console.log(error)};var em_booking_form_submit_finally=function(booking_form,opts={}){let options=em_booking_form_submit_options(opts);em_booking_form_doing_ajax=false;let button=booking_form.querySelector("input.em-form-submit");if(button){if(button.getAttribute("data-current-text")){button.value=button.getAttribute("data-current-text");button.setAttribute("data-current-text",null)}else{button.value=EM.bookings.submit_button.text.default}}if(options.hideSpinner===true){em_booking_form_hide_spinner(booking_form)}if(options.showForm===true){em_booking_form_unhide_success(booking_form,opts)}if(jQuery){jQuery(document).trigger("em_booking_ajax_complete",[null,null,booking_form])}booking_form.dispatchEvent(new CustomEvent("em_booking_complete",{cancellable:true}))};var em_booking_form_submit_options=function(opts){return Object.assign({doStart:true,doSuccess:true,doCatch:true,doFinally:true,showErrorMessages:true,showSuccessMessages:true,hideForm:true,hideLogin:true,showForm:false,hideSpinner:true,redirect:true,triggerEvents:true},opts)};
| ver. 1.4 |
Github
|
.
| PHP 8.1.33 | Генерация страницы: 0.02 |
proxy
|
phpinfo
|
Настройка