├── .editorconfig ├── .env ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── incorrect.md │ └── request.md ├── pull_request_template.md └── workflows │ ├── deploy.yml │ └── lint.yml ├── .gitignore ├── .markdownlint.jsonc ├── .markdownlintignore ├── .vitepress ├── config │ ├── en.ts │ ├── index.ts │ ├── rewrites.ts │ └── ru.ts └── theme │ ├── components │ ├── DocsAuthorWidget.vue │ ├── DocsBreadcrumbs.vue │ ├── DocsButton.vue │ ├── DocsComponentTree.vue │ ├── DocsComponentWidget.vue │ ├── DocsComponentsList.vue │ ├── DocsDocFooter.vue │ ├── DocsFeature.vue │ ├── DocsFeatures.vue │ ├── DocsHome.vue │ ├── DocsHomeHero.vue │ ├── DocsLayout.vue │ ├── DocsList.vue │ ├── DocsNavBar.vue │ ├── DocsNavBarTranslations.vue │ ├── DocsNavScreenTranslations.vue │ ├── DocsNotFound.vue │ ├── DocsScreenAuthorWidget.vue │ ├── DocsSearchBar.vue │ ├── DocsSidebar.vue │ ├── DocsSponsors.vue │ ├── DocsTeam.vue │ ├── DocsTree.vue │ └── DocsTreeItem.vue │ ├── composables │ ├── langs.ts │ ├── prev-next.ts │ ├── sponsor.ts │ └── zoom.ts │ ├── index.ts │ ├── plugins │ ├── component.ts │ ├── markdown.ts │ └── sidebar.ts │ ├── styles │ ├── glightbox.css │ └── global.css │ ├── syntaxes │ └── index.ts │ ├── types │ └── index.ts │ └── utils.ts ├── .vscode ├── extensions.json └── settings.json ├── README.md ├── bun.lock ├── docs ├── authors.json ├── authors.ts ├── components │ ├── abtest.md │ ├── ajaxform.md │ ├── ajaxformitlogin │ │ ├── events.md │ │ ├── hooks │ │ │ └── ajaxidentification.md │ │ ├── index.md │ │ ├── scripts-and-styles.md │ │ ├── settings.md │ │ ├── snippets │ │ │ ├── aflactivateuser.md │ │ │ ├── ajaxformitlogin.md │ │ │ └── custom-snippets.md │ │ └── validators │ │ │ ├── aflcheckpasslength.md │ │ │ ├── aflpasswordconfirm.md │ │ │ ├── aflrequiredif.md │ │ │ ├── afluserexists.md │ │ │ └── aflusernotexists.md │ ├── ajaxlogin.md │ ├── ajaxsnippet.md │ ├── allgifts │ │ ├── index.md │ │ ├── problem-solving.md │ │ └── quick-start.md │ ├── amocrm │ │ ├── common-mistakes.md │ │ ├── events.md │ │ ├── index.md │ │ ├── setup.md │ │ ├── submitting-forms.md │ │ └── webhook.md │ ├── autoredirector.md │ ├── bannery │ │ ├── index.md │ │ └── interface │ │ │ ├── banners.md │ │ │ └── positions.md │ ├── cabinet.md │ ├── callback.md │ ├── cityfields │ │ ├── data-management.md │ │ ├── index.md │ │ ├── price-management.md │ │ ├── setup.md │ │ ├── sitemap.md │ │ ├── snippets │ │ │ ├── cfcities.md │ │ │ └── cffield.md │ │ └── using.md │ ├── cityselect.md │ ├── clicktocall.md │ ├── comparison │ │ ├── addcomparison.md │ │ ├── comparelist.md │ │ ├── getcomparison.md │ │ └── index.md │ ├── crontabmanager │ │ ├── command.md │ │ ├── index.md │ │ ├── interface.md │ │ ├── setting.md │ │ └── сrontab.md │ ├── currencyrate.md │ ├── customextra.md │ ├── debugparser.md │ ├── digitalsignage.md │ ├── easycomm │ │ ├── description.md │ │ ├── index.md │ │ ├── interface.md │ │ ├── multiple-rating-fields.md │ │ ├── plugins-and-customization.md │ │ ├── rating-in-pdoresources-and-msproducts.md │ │ ├── settings.md │ │ ├── snippets.md │ │ └── solutions.md │ ├── easyredirects.md │ ├── epochta.md │ ├── fetchit │ │ ├── examples │ │ │ ├── form │ │ │ │ ├── bootstrap.md │ │ │ │ ├── bulma.md │ │ │ │ ├── cirrus.md │ │ │ │ ├── fomantic.md │ │ │ │ ├── index.md │ │ │ │ ├── pico.md │ │ │ │ ├── turretcss.md │ │ │ │ ├── uikit.md │ │ │ │ └── vanilla.md │ │ │ ├── modals │ │ │ │ ├── bootstrap.md │ │ │ │ ├── index.md │ │ │ │ ├── micromodaljs.md │ │ │ │ └── tinglejs.md │ │ │ ├── notifications │ │ │ │ ├── alertifyjs.md │ │ │ │ ├── awesome-notifications.md │ │ │ │ ├── index.md │ │ │ │ ├── izitoast.md │ │ │ │ ├── jgrowl.md │ │ │ │ ├── notie.md │ │ │ │ ├── notiflix-notify.md │ │ │ │ ├── noty.md │ │ │ │ ├── notyf.md │ │ │ │ ├── pnotify.md │ │ │ │ ├── sweetalert2.md │ │ │ │ ├── toastifyjs.md │ │ │ │ └── toastr.md │ │ │ └── validation │ │ │ │ ├── index.md │ │ │ │ ├── iodine.md │ │ │ │ └── yup.md │ │ ├── frontend │ │ │ ├── class.md │ │ │ ├── events.md │ │ │ └── instance.md │ │ ├── index.md │ │ ├── migration-from-ajaxform.md │ │ ├── parts │ │ │ └── validation.warning.md │ │ ├── quick-start.md │ │ ├── selectors.md │ │ ├── settings.md │ │ └── snippets │ │ │ ├── custom.md │ │ │ └── fetchit.md │ ├── fileattach.md │ ├── fileman │ │ ├── index.md │ │ ├── interface.md │ │ ├── settings.md │ │ └── snippets.md │ ├── flatfilters │ │ ├── chunks.md │ │ ├── development.md │ │ ├── events.md │ │ ├── index.md │ │ └── snippets.md │ ├── formalicious │ │ ├── categories.md │ │ ├── creating-form.md │ │ ├── faqs.md │ │ ├── field-types.md │ │ ├── index.md │ │ ├── media-sources.md │ │ └── setup.md │ ├── frontendeditor.md │ ├── fronttabs.md │ ├── googlesheets │ │ ├── auth.md │ │ ├── development │ │ │ ├── events.md │ │ │ └── index.md │ │ ├── export │ │ │ ├── categories.md │ │ │ ├── customers.md │ │ │ ├── index.md │ │ │ ├── msoptionsprice2.md │ │ │ ├── msproductremains.md │ │ │ ├── orders.md │ │ │ ├── products.md │ │ │ ├── resources.md │ │ │ ├── users.md │ │ │ └── vendors.md │ │ ├── import │ │ │ ├── categories.md │ │ │ ├── index.md │ │ │ ├── msoptionsprice2.md │ │ │ ├── msproductremains.md │ │ │ ├── products.md │ │ │ ├── resources.md │ │ │ └── vendors.md │ │ ├── index.md │ │ ├── migx │ │ │ └── index.md │ │ └── snippets │ │ │ ├── googlesheets.md │ │ │ ├── googlesheetsfront.md │ │ │ └── googlesheetssaveform.md │ ├── hybridauth │ │ ├── index.md │ │ ├── providers │ │ │ ├── disqus.md │ │ │ ├── facebook.md │ │ │ ├── foursquare.md │ │ │ ├── github.md │ │ │ ├── goodreads.md │ │ │ ├── google.md │ │ │ ├── index.md │ │ │ ├── instagram.md │ │ │ ├── lastfm.md │ │ │ ├── live.md │ │ │ ├── mailru.md │ │ │ ├── odnoklassniki.md │ │ │ ├── twitter.md │ │ │ ├── vkontakte.md │ │ │ └── yandex.md │ │ └── snippets │ │ │ ├── haprofile.md │ │ │ └── hybridauth.md │ ├── ideas.md │ ├── idimage │ │ ├── crontab.md │ │ ├── index.md │ │ ├── indexed │ │ │ ├── category.md │ │ │ ├── index.md │ │ │ └── type.md │ │ ├── quick-start.md │ │ ├── requirements-and-dependencies.md │ │ └── snippets.md │ ├── index.md │ ├── localizator │ │ ├── events.md │ │ ├── hreflang-attribute.md │ │ ├── import-in-localization.md │ │ ├── index.md │ │ ├── seotemplates.md │ │ ├── sitemap-formation.md │ │ ├── snippet-localizator.md │ │ └── switch-languages.md │ ├── lxquiz │ │ ├── index.md │ │ └── snippets │ │ │ ├── lxquiz.md │ │ │ └── lxquizlist.md │ ├── magicthemes │ │ ├── index.md │ │ └── themes │ │ │ └── handyshop │ │ │ ├── example-things.md │ │ │ ├── index.md │ │ │ └── setup.md │ ├── mapex2.md │ ├── mddocs.md │ ├── migxpageconfigurator │ │ ├── chunks.md │ │ ├── contacts.md │ │ ├── elements.md │ │ ├── forms.md │ │ ├── images.md │ │ ├── index.md │ │ ├── regions.md │ │ ├── setup.md │ │ └── snippets.md │ ├── minifyx.md │ ├── minishop2 │ │ ├── development │ │ │ ├── events.md │ │ │ ├── product-plugins.md │ │ │ ├── scripts-and-styles.md │ │ │ └── services │ │ │ │ ├── cart.md │ │ │ │ ├── connection.md │ │ │ │ ├── delivery.md │ │ │ │ ├── order.md │ │ │ │ └── payment.md │ │ ├── index.md │ │ ├── interface │ │ │ ├── category.md │ │ │ ├── gallery.md │ │ │ ├── orders.md │ │ │ ├── product.md │ │ │ ├── settings.md │ │ │ ├── task-manager.md │ │ │ └── utilities │ │ │ │ ├── gallery.md │ │ │ │ ├── import.md │ │ │ │ └── index.md │ │ ├── modules.md │ │ ├── parts │ │ │ └── tip-general-properties.md │ │ ├── payments.md │ │ ├── quick-start.md │ │ ├── requirements-and-dependencies.md │ │ ├── snippets │ │ │ ├── index.md │ │ │ ├── mscart.md │ │ │ ├── msgallery.md │ │ │ ├── msgetorder.md │ │ │ ├── msminicart.md │ │ │ ├── msoptions.md │ │ │ ├── msorder.md │ │ │ ├── msproductoptions.md │ │ │ └── msproducts.md │ │ └── useful-queries │ │ │ ├── count-category-products.md │ │ │ ├── get-categories-links.md │ │ │ ├── get-categories.md │ │ │ ├── get-product-id-by-option.md │ │ │ ├── get-products-by-options.md │ │ │ ├── get-resource-tree.md │ │ │ └── get-vendors.md │ ├── mixedimage.md │ ├── moddevtools.md │ ├── modretailcrm │ │ ├── examples-api │ │ │ ├── create-new-contact.md │ │ │ ├── quick-order-product.md │ │ │ ├── search-order-retailcrm.md │ │ │ └── search-product-retailcrm.md │ │ ├── index.md │ │ ├── modules │ │ │ └── example-class-extend.md │ │ ├── presetup │ │ │ ├── upload-orders.md │ │ │ ├── upload-products.md │ │ │ └── upload-users.md │ │ └── triggers │ │ │ └── order-status-change.md │ ├── modtree.md │ ├── modvkmarket.md │ ├── ms2form.md │ ├── ms2gallery │ │ ├── examples │ │ │ ├── bootstrap3-slider.md │ │ │ └── console-import.md │ │ ├── index.md │ │ ├── integration.md │ │ ├── output.md │ │ ├── preview-generation.md │ │ └── snippets │ │ │ ├── ms2gallery.md │ │ │ └── ms2galleryresources.md │ ├── msaddlinked.md │ ├── msaltcart │ │ ├── events.md │ │ ├── index.md │ │ ├── inputnumber.md │ │ ├── javascript.md │ │ └── snippets.md │ ├── msbonus2 │ │ ├── api.md │ │ ├── cases │ │ │ ├── additional-bonuses.md │ │ │ ├── email-inform.md │ │ │ └── mspromocode2-or-msbonus2.md │ │ ├── events │ │ │ ├── examples.md │ │ │ ├── msb2onactionbonus.md │ │ │ ├── msb2onbeforesetbonus.md │ │ │ ├── msb2onsetbonus.md │ │ │ └── msb2onunsetbonus.md │ │ ├── index.md │ │ ├── jquery-events.md │ │ ├── quick-start.md │ │ └── snippets │ │ │ ├── msbonus2form.md │ │ │ ├── msbonus2logs.md │ │ │ └── msbonus2productbonus.md │ ├── msbuynow.md │ ├── mscaddress.md │ ├── mscategoryoptions.md │ ├── mscdek2 │ │ ├── development.md │ │ ├── events.md │ │ ├── index.md │ │ └── snippets.md │ ├── mscdistance.md │ ├── msczone.md │ ├── msdadata.md │ ├── msdellin.md │ ├── msdiscount │ │ ├── coupons.md │ │ ├── discounts.md │ │ ├── index.md │ │ ├── snippets │ │ │ ├── msdbuynow.md │ │ │ └── msdgetdiscount.md │ │ └── stock.md │ ├── msearch2 │ │ ├── extension │ │ │ ├── filtration-methods.md │ │ │ └── filtration-product-example.md │ │ ├── index.md │ │ ├── interface │ │ │ ├── dictionaries.md │ │ │ ├── indexes.md │ │ │ ├── queries.md │ │ │ ├── search.md │ │ │ └── synonyms.md │ │ ├── snippets │ │ │ ├── mfilter2.md │ │ │ ├── msearch2.md │ │ │ └── msearchform.md │ │ └── solutions │ │ │ ├── category-filtration.md │ │ │ └── dependent-filters.md │ ├── msems.md │ ├── msextrafields │ │ ├── features.md │ │ ├── index.md │ │ ├── interface.md │ │ ├── plugins.md │ │ ├── settings.md │ │ ├── setup.md │ │ └── snippets.md │ ├── msfavorites │ │ ├── index.md │ │ ├── quick-start.md │ │ └── update.md │ ├── msgallerysearch │ │ ├── find-in-google.md │ │ ├── find-in-images.md │ │ ├── index.md │ │ ├── load-from-link.md │ │ └── settings.md │ ├── msgoodslink.md │ ├── msimportexport │ │ ├── index.md │ │ ├── msimportexport-1.md │ │ └── msimportexport-2.md │ ├── msliveinform.md │ ├── msmanagerordermap.md │ ├── msmarketingstatuses.md │ ├── msmcd.md │ ├── msmerchant.md │ ├── msnewprice.md │ ├── msocial │ │ ├── index.md │ │ ├── msocialfb.md │ │ └── msocialvk.md │ ├── msoneclick.md │ ├── msoptionsprice.md │ ├── mspassistbelarus.md │ ├── mspbepaid.md │ ├── mspointsissue │ │ ├── index.md │ │ ├── interface │ │ │ ├── index.md │ │ │ ├── orders.md │ │ │ └── settings.md │ │ └── snippets │ │ │ ├── index.md │ │ │ └── mspointsissue-order.md │ ├── msppayanyway.md │ ├── msppaypal.md │ ├── msppayselectionwidget.md │ ├── msppayu.md │ ├── mspre │ │ ├── features.md │ │ ├── index.md │ │ └── interface │ │ │ ├── combo.md │ │ │ ├── index.md │ │ │ ├── list-editing.md │ │ │ ├── list-field-settings.md │ │ │ ├── ms2-options.md │ │ │ ├── product-and-prices.md │ │ │ ├── transactions.md │ │ │ └── tv.md │ ├── msproductdiscounts │ │ ├── cases.md │ │ ├── development.md │ │ ├── discounts.md │ │ ├── events.md │ │ ├── index.md │ │ ├── javascript.md │ │ └── promocodes.md │ ├── msproductremains │ │ ├── examples.md │ │ ├── getremains.md │ │ ├── index.md │ │ ├── remains-page.md │ │ ├── remains-tab.md │ │ └── settings.md │ ├── msprofile │ │ ├── index.md │ │ ├── interface.md │ │ ├── plugin.md │ │ └── snippets │ │ │ ├── msprofile.md │ │ │ └── msprofilecharge.md │ ├── mspromocode │ │ ├── cases │ │ │ ├── cancel-promo-code.md │ │ │ ├── email-inform.md │ │ │ ├── index.md │ │ │ └── personalized-promo-codes.md │ │ ├── events │ │ │ ├── index.md │ │ │ ├── mspconbeforesetcoupon.md │ │ │ ├── mspconbeforesetproductdiscount.md │ │ │ ├── mspconbindcoupontoorder.md │ │ │ ├── mspconsetcoupon.md │ │ │ └── mspconsetproductdiscount.md │ │ ├── functionality │ │ │ ├── conditions.md │ │ │ ├── fixed-cart-discount.md │ │ │ ├── referral-promo-codes.md │ │ │ └── stocks.md │ │ ├── index.md │ │ ├── jquery-events.md │ │ ├── setup.md │ │ └── snippets │ │ │ ├── mspcform.md │ │ │ └── mspcrefcoupon.md │ ├── mspromocode2 │ │ ├── api.md │ │ ├── cases │ │ │ ├── email-inform.md │ │ │ ├── generate-promocode.md │ │ │ ├── index.md │ │ │ ├── mspromocode2-or-msbonus2.md │ │ │ └── set-promocode.md │ │ ├── events │ │ │ ├── examples.md │ │ │ ├── index.md │ │ │ ├── mspc2onbeforegetcoupon.md │ │ │ ├── mspc2onbeforesetcoupon.md │ │ │ ├── mspc2ongetcoupon.md │ │ │ ├── mspc2onsetcoupon.md │ │ │ ├── mspc2onsetproductdiscountprice.md │ │ │ └── mspc2onunsetcoupon.md │ │ ├── index.md │ │ ├── jquery-events.md │ │ ├── quick-start.md │ │ └── snippets │ │ │ ├── mspc2cartkey.md │ │ │ ├── mspc2generate.md │ │ │ └── mspromocode2.md │ ├── mspup.md │ ├── mspwebpay.md │ ├── mspyacassa.md │ ├── msquickview.md │ ├── mssaleprice.md │ ├── mssetincart.md │ ├── mssms.md │ ├── mswallpapers │ │ ├── cases │ │ │ └── modal-form.md │ │ ├── events │ │ │ ├── examples.md │ │ │ ├── index.md │ │ │ ├── mswpongetproductcost.md │ │ │ └── mswpongetproductprice.md │ │ ├── index.md │ │ ├── setup.md │ │ └── snippets │ │ │ └── mswp-form.md │ ├── msymarket.md │ ├── msync │ │ ├── events-and-plugins.md │ │ ├── index.md │ │ ├── interface.md │ │ ├── settings.md │ │ └── setup.md │ ├── multilingual │ │ ├── index.md │ │ ├── interface │ │ │ ├── add-language-field.md │ │ │ └── add-language.md │ │ ├── problem-solving.md │ │ ├── snippets │ │ │ └── mllanguageslinks.md │ │ └── translation-principle.md │ ├── myfavorites.md │ ├── notfoundparamalert.md │ ├── office │ │ ├── additional-functionality.md │ │ ├── controllers │ │ │ ├── auth-remote.md │ │ │ ├── auth.md │ │ │ ├── orders-history-minishop2.md │ │ │ └── profile.md │ │ ├── index.md │ │ ├── logic.md │ │ └── quick-start.md │ ├── orderprint │ │ ├── index.md │ │ ├── setup.md │ │ └── templates.md │ ├── ordersunformed.md │ ├── orphoman.md │ ├── pagebreaker │ │ ├── index.md │ │ ├── settings.md │ │ └── tinymce-support.md │ ├── pagespeed.md │ ├── payandsee │ │ ├── development │ │ │ ├── events.md │ │ │ ├── extensions.md │ │ │ ├── scripts-and-styles.md │ │ │ └── services │ │ │ │ ├── cart.md │ │ │ │ ├── delivery.md │ │ │ │ ├── order.md │ │ │ │ └── payment.md │ │ ├── index.md │ │ ├── integrations │ │ │ ├── msdiscount.md │ │ │ └── mspromocode.md │ │ ├── interface │ │ │ ├── clients.md │ │ │ ├── content.md │ │ │ ├── index.md │ │ │ ├── notifications.md │ │ │ ├── orders.md │ │ │ ├── rates.md │ │ │ ├── resource.md │ │ │ ├── settings.md │ │ │ ├── statuses.md │ │ │ └── subscriptions.md │ │ └── snippets │ │ │ ├── index.md │ │ │ ├── pas-content.md │ │ │ ├── pas-get-order.md │ │ │ ├── pas-order.md │ │ │ └── pas-subscription.md │ ├── pdotools │ │ ├── classes │ │ │ ├── index.md │ │ │ ├── pdofetch.md │ │ │ ├── pdoparser.md │ │ │ └── pdotools.md │ │ ├── file-elements.md │ │ ├── general-properties.md │ │ ├── index.md │ │ ├── parser.md │ │ └── snippets │ │ │ ├── pdoarchive.md │ │ │ ├── pdocrumbs.md │ │ │ ├── pdofield.md │ │ │ ├── pdomenu.md │ │ │ ├── pdoneighbors.md │ │ │ ├── pdopage.md │ │ │ ├── pdoresources.md │ │ │ ├── pdositemap.md │ │ │ ├── pdotitle.md │ │ │ └── pdousers.md │ ├── plaffiliates.md │ ├── platron.md │ ├── promods.md │ ├── quiz │ │ ├── events.md │ │ ├── examples.md │ │ ├── index.md │ │ ├── methods.md │ │ └── snippets │ │ │ ├── quiz.md │ │ │ ├── quizdata.md │ │ │ ├── quizresult.md │ │ │ ├── quizsteps.md │ │ │ └── seoimg.md │ ├── rbk-money │ │ ├── choosing-payment-method.md │ │ └── index.md │ ├── reachgoal.md │ ├── resourcegrabber │ │ ├── development │ │ │ ├── events.md │ │ │ └── services │ │ │ │ ├── getter.md │ │ │ │ ├── grabber.md │ │ │ │ └── setter.md │ │ ├── index.md │ │ └── interface │ │ │ ├── data.md │ │ │ ├── index.md │ │ │ ├── settings.md │ │ │ └── snippets.md │ ├── resvideogallery │ │ ├── adding-custom-video-parser.md │ │ ├── events.md │ │ ├── index.md │ │ ├── setup │ │ │ └── vkontakte.md │ │ └── snippets │ │ │ ├── resvideogallery.md │ │ │ ├── resvideogallerytags.md │ │ │ └── resvideogalleryupload.md │ ├── save2page.md │ ├── scheduler │ │ ├── create-a-task.md │ │ ├── index.md │ │ ├── installation.md │ │ ├── job-scheduling.md │ │ └── task-development.md │ ├── sendex │ │ ├── index.md │ │ └── interface │ │ │ ├── queue.md │ │ │ └── subscriptions.md │ ├── sendit │ │ ├── development.md │ │ ├── events.md │ │ ├── fileuploader.md │ │ ├── identification.md │ │ ├── index.md │ │ ├── notify.md │ │ ├── pagination.md │ │ ├── quizform.md │ │ ├── saveformdata.md │ │ ├── sending.md │ │ └── snippets.md │ ├── seodomains.md │ ├── seofilter │ │ ├── additional-features.md │ │ ├── index.md │ │ ├── objects │ │ │ ├── dictionary.md │ │ │ ├── field.md │ │ │ ├── rule.md │ │ │ └── url-table.md │ │ ├── quick-start-mfilter2.md │ │ ├── quick-start-without-mfilter2-and-minishop2.md │ │ ├── snippets │ │ │ ├── index.md │ │ │ ├── sflink.md │ │ │ ├── sfmenu.md │ │ │ ├── sfsitemap.md │ │ │ └── sfword.md │ │ └── substitutions-in-seo.md │ ├── seosuite.md │ ├── seotabs │ │ ├── index.md │ │ └── snippet-seotabs.md │ ├── shoppingcart.md │ ├── simplequeue.md │ ├── smartsessions.md │ ├── socialtools │ │ ├── index.md │ │ └── snippets │ │ │ ├── socdialogform.md │ │ │ ├── socdialoglist.md │ │ │ └── socdialogreceive.md │ ├── staticsaver.md │ ├── textadvs │ │ ├── how-to-add-a-tag.md │ │ └── index.md │ ├── tickets │ │ ├── index.md │ │ ├── interface │ │ │ ├── create-ticket-section.md │ │ │ ├── create-ticket.md │ │ │ └── setup-permissions.md │ │ ├── parts │ │ │ ├── tip-general-properties.md │ │ │ └── warning-demo.md │ │ ├── snippets │ │ │ ├── gettickets.md │ │ │ ├── getticketssections.md │ │ │ ├── subscribeauthor.md │ │ │ ├── ticketcomments.md │ │ │ ├── ticketform.md │ │ │ ├── ticketlatest.md │ │ │ └── ticketmeta.md │ │ └── ticketformit.md │ ├── tvtable.md │ ├── userauthhash │ │ ├── development │ │ │ ├── events.md │ │ │ └── extensions.md │ │ └── index.md │ ├── userevents │ │ ├── development │ │ │ ├── events.md │ │ │ ├── extensions.md │ │ │ ├── scripts-and-styles.md │ │ │ └── services │ │ │ │ ├── delivery.md │ │ │ │ ├── order.md │ │ │ │ └── payment.md │ │ ├── index.md │ │ ├── interface │ │ │ ├── events.md │ │ │ ├── index.md │ │ │ ├── notifications.md │ │ │ ├── orders.md │ │ │ ├── settings.md │ │ │ └── statuses.md │ │ └── snippets │ │ │ ├── index.md │ │ │ ├── ue-get-order.md │ │ │ └── ue-order.md │ ├── userlocation │ │ ├── development │ │ │ └── events.md │ │ └── index.md │ ├── usermarker.md │ ├── usersonline.md │ ├── viewsonline.md │ ├── voteforms.md │ ├── webdav.md │ ├── webmoney.md │ ├── xcalc │ │ ├── cases │ │ │ ├── ajaxform-results.md │ │ │ └── calculator-sill.md │ │ ├── field-types.md │ │ ├── index.md │ │ ├── jquery-events.md │ │ └── snippets │ │ │ └── xcalc.md │ ├── xparser │ │ ├── cron.md │ │ ├── events │ │ │ ├── examples.md │ │ │ ├── index.md │ │ │ ├── xparseronafterpagescollected.md │ │ │ ├── xparseronbeforetaskactions.md │ │ │ ├── xparseronbeforetaskparse.md │ │ │ ├── xparseronfiltersourceitems.md │ │ │ ├── xparserontaskitemparse.md │ │ │ ├── xparserontaskparsedone.md │ │ │ └── xparserontaskrowsprepared.md │ │ ├── gallery.md │ │ ├── index.md │ │ ├── minishop2.md │ │ ├── nodejs-demon.md │ │ ├── pagination.md │ │ ├── parser-html.md │ │ ├── parser-rss.md │ │ └── regex.md │ ├── yandex-money.md │ ├── yandexmaps.md │ ├── yandexmaps2 │ │ ├── cases │ │ │ ├── disable-elements.md │ │ │ ├── migx-integration.md │ │ │ ├── parent-data-in-balloons.md │ │ │ └── parent-data-in-baloons.md │ │ ├── events │ │ │ ├── examples.md │ │ │ ├── index.md │ │ │ └── ymonloadobjects.md │ │ ├── index.md │ │ ├── jquery-events.md │ │ ├── map-constructor.md │ │ ├── mfilter2-integration.md │ │ ├── quick-start.md │ │ └── snippets │ │ │ └── yandexmaps2.md │ └── zoomx.md ├── en │ ├── components │ │ ├── ajaxsnippet.md │ │ ├── bannery │ │ │ ├── index.md │ │ │ └── interface │ │ │ │ ├── banners.md │ │ │ │ └── positions.md │ │ ├── clicktocall.md │ │ ├── debugparser.md │ │ ├── digitalsignage.md │ │ ├── fetchit │ │ │ ├── examples │ │ │ │ ├── form │ │ │ │ │ ├── bootstrap.md │ │ │ │ │ ├── bulma.md │ │ │ │ │ ├── cirrus.md │ │ │ │ │ ├── fomantic.md │ │ │ │ │ ├── index.md │ │ │ │ │ ├── pico.md │ │ │ │ │ ├── turretcss.md │ │ │ │ │ ├── uikit.md │ │ │ │ │ └── vanilla.md │ │ │ │ ├── modals │ │ │ │ │ ├── bootstrap.md │ │ │ │ │ ├── index.md │ │ │ │ │ ├── micromodaljs.md │ │ │ │ │ └── tinglejs.md │ │ │ │ ├── notifications │ │ │ │ │ ├── alertifyjs.md │ │ │ │ │ ├── awesome-notifications.md │ │ │ │ │ ├── index.md │ │ │ │ │ ├── izitoast.md │ │ │ │ │ ├── jgrowl.md │ │ │ │ │ ├── notie.md │ │ │ │ │ ├── notiflix-notify.md │ │ │ │ │ ├── noty.md │ │ │ │ │ ├── notyf.md │ │ │ │ │ ├── pnotify.md │ │ │ │ │ ├── sweetalert2.md │ │ │ │ │ ├── toastifyjs.md │ │ │ │ │ └── toastr.md │ │ │ │ └── validation │ │ │ │ │ ├── index.md │ │ │ │ │ ├── iodine.md │ │ │ │ │ └── yup.md │ │ │ ├── frontend │ │ │ │ ├── class.md │ │ │ │ ├── events.md │ │ │ │ └── instance.md │ │ │ ├── index.md │ │ │ ├── migration-from-ajaxform.md │ │ │ ├── parts │ │ │ │ ├── action.info.md │ │ │ │ ├── notifier.tip.md │ │ │ │ └── validation.warning.md │ │ │ ├── quick-start.md │ │ │ ├── selectors.md │ │ │ ├── settings.md │ │ │ └── snippets │ │ │ │ ├── custom.md │ │ │ │ └── fetchit.md │ │ ├── fileattach.md │ │ ├── formalicious │ │ │ ├── categories.md │ │ │ ├── creating-form.md │ │ │ ├── faqs.md │ │ │ ├── field-types.md │ │ │ ├── index.md │ │ │ ├── media-sources.md │ │ │ └── setup.md │ │ ├── frontendeditor.md │ │ ├── hybridauth │ │ │ ├── index.md │ │ │ └── snippets │ │ │ │ ├── haprofile.md │ │ │ │ └── hybridauth.md │ │ ├── index.md │ │ ├── minifyx.md │ │ ├── minishop2 │ │ │ ├── index.md │ │ │ ├── interface │ │ │ │ ├── category.md │ │ │ │ ├── orders.md │ │ │ │ ├── product.md │ │ │ │ └── settings.md │ │ │ ├── parts │ │ │ │ └── tip-general-properties.md │ │ │ ├── quick-start.md │ │ │ ├── snippets │ │ │ │ ├── index.md │ │ │ │ ├── mscart.md │ │ │ │ ├── msgallery.md │ │ │ │ ├── msgetorder.md │ │ │ │ ├── msminicart.md │ │ │ │ ├── msoptions.md │ │ │ │ ├── msorder.md │ │ │ │ ├── msproductoptions.md │ │ │ │ └── msproducts.md │ │ │ └── upgrade.md │ │ ├── moddevtools.md │ │ ├── modtree.md │ │ ├── ms2gallery │ │ │ ├── examples │ │ │ │ ├── bootstrap3-slider.md │ │ │ │ └── console-import.md │ │ │ ├── index.md │ │ │ ├── integration.md │ │ │ ├── output.md │ │ │ ├── preview-generation.md │ │ │ └── snippets │ │ │ │ ├── ms2gallery.md │ │ │ │ └── ms2galleryresources.md │ │ ├── msearch2 │ │ │ ├── extension │ │ │ │ ├── filtration-methods.md │ │ │ │ └── filtration-product-example.md │ │ │ ├── index.md │ │ │ ├── interface │ │ │ │ ├── dictionaries.md │ │ │ │ ├── indexes.md │ │ │ │ ├── queries.md │ │ │ │ ├── search.md │ │ │ │ └── synonyms.md │ │ │ ├── snippets │ │ │ │ ├── mfilter2.md │ │ │ │ ├── msearch2.md │ │ │ │ └── msearchform.md │ │ │ └── solutions │ │ │ │ ├── category-filtration.md │ │ │ │ └── dependent-filters.md │ │ ├── msproductremains │ │ │ ├── examples.md │ │ │ ├── getremains.md │ │ │ ├── index.md │ │ │ ├── remains-page.md │ │ │ ├── remains-tab.md │ │ │ └── settings.md │ │ ├── notfoundparamalert.md │ │ ├── office │ │ │ ├── additional-functionality.md │ │ │ ├── controllers │ │ │ │ ├── auth-remote.md │ │ │ │ ├── auth.md │ │ │ │ ├── orders-history-minishop2.md │ │ │ │ └── profile.md │ │ │ ├── index.md │ │ │ ├── logic.md │ │ │ └── quick-start.md │ │ ├── pagebreaker │ │ │ ├── index.md │ │ │ ├── settings.md │ │ │ └── tinymce-support.md │ │ ├── pagespeed.md │ │ ├── pdotools │ │ │ ├── classes │ │ │ │ ├── index.md │ │ │ │ ├── pdofetch.md │ │ │ │ └── pdotools.md │ │ │ ├── general-properties.md │ │ │ ├── index.md │ │ │ ├── parser.md │ │ │ └── snippets │ │ │ │ ├── pdocrumbs.md │ │ │ │ ├── pdofield.md │ │ │ │ ├── pdomenu.md │ │ │ │ ├── pdoneighbors.md │ │ │ │ ├── pdopage.md │ │ │ │ ├── pdoresources.md │ │ │ │ ├── pdositemap.md │ │ │ │ └── pdousers.md │ │ ├── sendex │ │ │ ├── index.md │ │ │ └── interface │ │ │ │ ├── queue.md │ │ │ │ └── subscriptions.md │ │ ├── seosuite.md │ │ ├── smartsessions.md │ │ ├── solo.md │ │ ├── staticsaver.md │ │ ├── tickets │ │ │ ├── index.md │ │ │ ├── interface │ │ │ │ ├── create-ticket-section.md │ │ │ │ ├── create-ticket.md │ │ │ │ └── setup-permissions.md │ │ │ ├── parts │ │ │ │ └── tip-general-properties.md │ │ │ └── snippets │ │ │ │ ├── gettickets.md │ │ │ │ ├── getticketssections.md │ │ │ │ ├── ticketcomments.md │ │ │ │ ├── ticketform.md │ │ │ │ ├── ticketlatest.md │ │ │ │ └── ticketmeta.md │ │ ├── usersonline.md │ │ └── webdav.md │ ├── guide │ │ ├── about.md │ │ ├── frontmatter.md │ │ ├── getting-started.md │ │ ├── markdown.md │ │ ├── parts │ │ │ └── one-space.md │ │ └── vitepress.md │ └── index.md ├── faq │ ├── ace │ │ └── modx-ace-material-theme.md │ ├── categories.json │ ├── index.md │ ├── manager-customize │ │ └── rename.md │ ├── moxi │ │ ├── customize.md │ │ └── index.md │ ├── scripts │ │ ├── plugin-template-list.md │ │ ├── update-table-prefix.md │ │ └── version.md │ ├── tinymce-rte │ │ └── add-custom-buttons.md │ └── zoomx │ │ └── custom-folder.md ├── guide │ ├── about.md │ ├── frontmatter.md │ ├── getting-started.md │ ├── markdown.md │ ├── parts │ │ └── one-space.md │ └── vitepress.md ├── icons.ts ├── index.md ├── public │ ├── apple-touch-icon.png │ ├── codesolution.svg │ ├── favicon.ico │ ├── icon-192.png │ ├── icon-512.png │ ├── icon.svg │ ├── logo-dark.svg │ ├── logo.svg │ ├── modhost.svg │ ├── og-default.png │ ├── placeholder-logo.png │ ├── rewrites.json │ ├── robots.txt │ └── site.webmanifest └── system │ ├── basics │ ├── input-filters.md │ ├── modifiers │ │ ├── conditional.md │ │ ├── custom.md │ │ ├── index.md │ │ ├── string.md │ │ └── userinfo.md │ ├── output-filters.md │ └── tag-syntax.md │ ├── utilities │ └── teleport │ │ ├── extension │ │ └── extract-templates.md │ │ ├── index.md │ │ └── usage.md │ └── xpdo │ ├── index.md │ ├── object-model.md │ └── xpdo-class.md ├── globals.d.ts ├── license.txt ├── package.json ├── plop-templates ├── landing.md └── multi │ ├── events.md │ ├── index.md │ ├── interface │ ├── categories.md │ └── items.md │ ├── quick-start.md │ └── snippets │ ├── getcategories.md │ ├── getitems.md │ └── index.md ├── plopfile.js └── tsconfig.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | indent_style = space 10 | tab_width = 4 11 | max_line_length = off 12 | 13 | [*.{js,ts,vue,css,json,yml}] 14 | indent_style = space 15 | tab_width = 2 16 | 17 | [*.md] 18 | indent_style = space 19 | tab_width = 2 20 | max_line_length = off 21 | trim_trailing_whitespace = false 22 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | SPONSOR_LINK=https://modx.pro/about 2 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ["https://www.tinkoff.ru/sl/2V9U9RrcJZP", "https://yoomoney.ru/fundraise/RPkkYwNcL7A.230131", "http://qiwi.com/p/77012827737"] 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/incorrect.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Неверная информация 3 | about: Сообщить о проблеме, когда страница неправильно или неопределенно описывает что-то, что должно быть улучшено. 4 | --- 5 | 6 | ## Затронутые страницы 7 | 8 | Пожалуйста, предоставьте ссылку на страницу (страницы), у которой есть проблема, или, что еще лучше, ссылку на исходный файл в хранилище. Для длинных страниц, пожалуйста, укажите приблизительно, где проблема (номера заголовков или строк) 9 | 10 | ## Что нужно улучшить? 11 | 12 | Будьте максимально конкретны: есть ли опечатка, неправильная заглавная буква MODX, или весь раздел нуждается в работе? Что неясно или неправильно? Если на форумах обсуждалась неточность или неясное описание или неточность, добавьте ссылку на это обсуждение. 13 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Запрос новой документации 3 | about: Запросить документацию о том, что в настоящее время полностью отсутствует в документации. 4 | --- 5 | 6 | ## Запрос новой документации 7 | 8 | В какой теме отсутствует документация, которую вы бы хотели добавить? В каком разделе документации это должно указываться? На какого типа пользователей должна ориентироваться документация? 9 | 10 | ## Соответствующие источники 11 | 12 | Если есть какой-либо соответствующий источник уже доступен, пожалуйста, включите ссылки. Это могут быть сообщения в блогах или статьи на сторонних сайтах, темы форумов, разговоры в социальных сетях и т. Д. 13 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## Описание улучшений 2 | 3 | Есть какая-то конкретная причина для этого изменения? 4 | Если недавнее изменение в ядре MODX вызвало изменение, пожалуйста, включите ссылку на соответствующий запрос на pull-request. 5 | 6 | ## Актуальные проблемы 7 | 8 | Если возможно, укажите ссылку или id соответствующих проблем, чтобы их можно было закрыть после вливания. 9 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | on: 3 | workflow_dispatch: {} 4 | push: 5 | branches: 6 | - master 7 | jobs: 8 | deploy: 9 | if: github.repository_owner == 'modx-pro' 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v4 13 | with: 14 | fetch-depth: 0 15 | - uses: oven-sh/setup-bun@v2 16 | with: 17 | bun-version: latest 18 | - run: bun install --frozen-lockfile 19 | - name: Build 20 | run: bun run build 21 | - uses: easingthemes/ssh-deploy@main 22 | env: 23 | SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} 24 | ARGS: '--archive --compress --delete --exclude="/redirect.php"' 25 | SOURCE: ".vitepress/dist/" 26 | REMOTE_HOST: ${{ secrets.REMOTE_HOST }} 27 | REMOTE_USER: ${{ secrets.REMOTE_USER }} 28 | TARGET: ${{ secrets.REMOTE_TARGET }} 29 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: Lint 2 | 3 | on: 4 | pull_request: 5 | types: [opened, synchronize] 6 | 7 | jobs: 8 | markdownlint: 9 | runs-on: ubuntu-latest 10 | 11 | permissions: 12 | contents: read 13 | pull-requests: write 14 | 15 | steps: 16 | - uses: actions/checkout@v1 17 | - uses: reviewdog/action-markdownlint@v0 18 | with: 19 | github_token: ${{ secrets.GITHUB_TOKEN }} 20 | reporter: github-pr-review 21 | filter_mode: file 22 | fail_on_error: true 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | .yarn 4 | 5 | .env.local 6 | .env.*.local 7 | 8 | .vitepress/cache 9 | .vitepress/dist 10 | 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | .temp 16 | .idea 17 | 18 | package-lock.json 19 | -------------------------------------------------------------------------------- /.markdownlint.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "line-length": false, 3 | "link-fragments": false, 4 | "no-inline-html": { 5 | "allowed_elements": [ 6 | "Badge", 7 | "DocsComponentsList", 8 | "ul", 9 | "ol", 10 | "li", 11 | "small", 12 | "sub", 13 | "sup", 14 | "br" 15 | ] 16 | }, 17 | "fenced-code-language": false, 18 | "no-duplicate-heading": { 19 | "siblings_only": true 20 | }, 21 | "single-title": { 22 | "front_matter_title": "" 23 | }, 24 | "no-blanks-blockquote": false 25 | } 26 | -------------------------------------------------------------------------------- /.markdownlintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | plop-templates 3 | **/parts/**/*.md 4 | -------------------------------------------------------------------------------- /.vitepress/theme/components/DocsComponentTree.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 20 | 21 | 26 | -------------------------------------------------------------------------------- /.vitepress/theme/components/DocsFeature.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | 17 | 57 | -------------------------------------------------------------------------------- /.vitepress/theme/components/DocsHome.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 22 | 23 | 31 | -------------------------------------------------------------------------------- /.vitepress/theme/components/DocsLayout.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 36 | -------------------------------------------------------------------------------- /.vitepress/theme/components/DocsList.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 35 | 36 | 46 | -------------------------------------------------------------------------------- /.vitepress/theme/components/DocsTree.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 20 | 21 | 27 | -------------------------------------------------------------------------------- /.vitepress/theme/composables/sponsor.ts: -------------------------------------------------------------------------------- 1 | import { computed } from 'vue' 2 | 3 | export interface Sponsors { 4 | tier: string 5 | size?: 'medium' | 'big' 6 | items: Sponsor[] 7 | } 8 | 9 | export interface Sponsor { 10 | name: string 11 | img: string 12 | url: string 13 | } 14 | 15 | export function useSponsor(lang) { 16 | return computed(() => { 17 | return [ 18 | { 19 | tier: lang.value === 'ru' ? 'Технические спонсоры' : 'Technical sponsors', 20 | size: 'big', 21 | items: [ 22 | { 23 | name: 'modhost.pro', 24 | img: '/modhost.svg', 25 | url: 'https://modhost.pro', 26 | }, 27 | { 28 | name: 'codesolution.io', 29 | img: '/codesolution.svg', 30 | url: 'https://codesolution.io', 31 | }, 32 | ], 33 | } 34 | ] 35 | }) 36 | } 37 | -------------------------------------------------------------------------------- /.vitepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | import { type Router, inBrowser } from 'vitepress' 2 | import { type App, watch } from 'vue' 3 | import { createZoom } from './composables/zoom' 4 | import DefaultTheme from 'vitepress/theme-without-fonts' 5 | import DocsLayout from './components/DocsLayout.vue' 6 | import DocsComponentsList from './components/DocsComponentsList.vue' 7 | import './styles/global.css' 8 | import './styles/glightbox.css' 9 | 10 | export default { 11 | extends: DefaultTheme, 12 | Layout: DocsLayout, 13 | 14 | enhanceApp({ app, router }: { app: App, router: Router }) { 15 | app.component('DocsComponentsList', DocsComponentsList) 16 | createZoom(app, router) 17 | 18 | if ( 19 | import.meta.env.PROD && 20 | inBrowser && 21 | window.ym 22 | ) { 23 | watch( 24 | () => router.route.data.relativePath, 25 | (path, oldPath) => { 26 | if (!oldPath) { // Skip initial change 27 | return 28 | } 29 | 30 | const url = '/' + path.replace(/(^|\/)index\.md$/, '$1').replace(/\.md$/, '') 31 | window.ym(24242593, 'hit', url) 32 | } 33 | ) 34 | } 35 | }, 36 | } 37 | -------------------------------------------------------------------------------- /.vitepress/theme/syntaxes/index.ts: -------------------------------------------------------------------------------- 1 | import { LanguageInput } from 'shiki' 2 | import { createRequire } from 'module' 3 | 4 | const require = createRequire(import.meta.url) 5 | 6 | const modx = require('modx-tmlanguage') 7 | const fenomGrammar = require('fenom-tmlanguage') 8 | const smartyGrammar = require('@modix/smarty-tmlanguage/smarty.tmLanguage.json') 9 | 10 | const fenom = { 11 | ...fenomGrammar, 12 | aliases: ['fenom'] 13 | } 14 | 15 | const smarty = { 16 | ...smartyGrammar, 17 | aliases: ['smarty'] 18 | } 19 | 20 | export default [ 21 | modx, 22 | fenom, 23 | smarty, 24 | ] as LanguageInput[] 25 | -------------------------------------------------------------------------------- /.vitepress/theme/types/index.ts: -------------------------------------------------------------------------------- 1 | import { DefaultTheme } from 'vitepress' 2 | import type { ComponentData } from '../plugins/component' 3 | 4 | export namespace DocsTheme { 5 | export interface Sponsor { 6 | message?: string 7 | linkText?: string 8 | link?: string 9 | } 10 | 11 | export interface Config extends DefaultTheme.Config { 12 | titleSeparator?: string 13 | components?: Array 14 | teamSectionTitle?: string 15 | 16 | sponsorLink?: string 17 | sponsor?: Sponsor 18 | } 19 | 20 | export interface TeamMember extends Omit { 21 | name: Record 22 | } 23 | } 24 | 25 | declare global { 26 | interface Window { 27 | ym?: Function; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["DavidAnson.vscode-markdownlint"] 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "yaml.schemas": { 3 | "https://json.schemastore.org/github-workflow.json": "file:///d%3A/GitHub/docs/.github/workflows/deploy.yml" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /docs/components/ajaxformitlogin/events.md: -------------------------------------------------------------------------------- 1 | # Системные события 2 | 3 | Компонент вызывает всего два системных события и оба они связаны с процессом регистрации пользователя. 4 | 5 | ## OnUserActivate {#OnUserActivate} 6 | 7 | Срабатывает при успешной активации пользователя. 8 | 9 | ### Параметры OnUserActivate 10 | 11 | 1. `$user` - объект пользователя. 12 | 2. `$profile` - объект профиля пользователя. 13 | 3. `$data` - все данные пользователя в виде массива. 14 | 15 | ## aiOnUserUpdate {#aiOnUserUpdate} 16 | 17 | Срабатывает при обновлении данных пользователя через форму в личном кабинете. 18 | 19 | ### Параметры aiOnUserUpdate 20 | 21 | 1. `$user` - объект пользователя. 22 | 2. `$profile` - объект профиля пользователя. 23 | 3. `$data` - все данные переданные в массиве $_POST. 24 | 25 | ::: warning 26 | Не пытайтесь что-то вернуть из ваших плагинов на эти события, так как результаты вызовов этих событий никак не обрабатываются, события инициализируются только для возможности сделать что-то с пользователем и его профилем ПОСЛЕ обновления и активации. 27 | ::: 28 | -------------------------------------------------------------------------------- /docs/components/ajaxformitlogin/snippets/aflactivateuser.md: -------------------------------------------------------------------------------- 1 | # aflActivateUser 2 | 3 | Сниппет активации аккаунта пользователя. Если ссылка активации просрочена - профиль будет удалён. 4 | 5 | Этот сниппет не принимает никаких параметров. 6 | 7 | ## Пример использования 8 | 9 | ```fenom 10 | {set $user = '!aflActivateUser' | snippet} 11 | {if $user} 12 |

Уважаемый, {$user.username}, Ваш аккаунт успешно активирован!

13 | {/if} 14 | ``` 15 | 16 | В случае успешной активации будет возвращён массив со всеми данными пользователя, если активация будет неудачной - вернётся false. 17 | -------------------------------------------------------------------------------- /docs/components/ajaxformitlogin/snippets/custom-snippets.md: -------------------------------------------------------------------------------- 1 | # Кастомные сниппеты 2 | 3 | ## Написание своих сниппетов для AjaxFormitLogin 4 | 5 | Как и в случае с `AjaxForm` вам доступна возможность использовать для обработки форм, любые сниппеты, в том числе и написанные вами. В кастомных сниппетах доступен 6 | объект `AjaxFormitLogin` с помощью которого можно возвращать сообщения об успехе или неудаче. Например так: 7 | 8 | ```php 9 | 18) { 11 | return $AjaxFormitLogin->success('Взрослый', array('age' => (int)$_POST['age'])); 12 | } else { 13 | return $AjaxFormitLogin->error('Малыш', array('errors' => ['age' => 'Ваш возраст слишком мал.'])); 14 | } 15 | ``` 16 | 17 | Вы можете возвращать любую информацию из своего сниппета, но чтобы работал штатный механизм отображения ошибок, в ответе обязательно должен присутствовать массив `errors`, 18 | состоящий из пар имя поля - текст сообщения об ошибке. 19 | -------------------------------------------------------------------------------- /docs/components/ajaxformitlogin/validators/aflcheckpasslength.md: -------------------------------------------------------------------------------- 1 | # aflCheckPassLength 2 | 3 | Сниппет для проверки длины пароля. Используйте именно его, а не стандартный валидатор `minLength`, так как в компоненте доступна автоматическая генерация пароля, если пользователь его не укажет. При использовании `minLength` и пустом поле с паролем будет возвращаться ошибка валидации, в то время как `aflCheckPassLength` проверяет длину только в случае, когда пароль задан. При этом в качестве параметра можно передать минимальную длину, если этого не сделать будет взято значение системной настройки `password_min_length` или `8`. 4 | 5 | ## Пример использования 6 | 7 | ```fenom 8 | ... 9 | 'customValidators' => 'aflCheckPassLength', 10 | 'validate' => 'password:aflCheckPassLength=^10^', 11 | ... 12 | ``` 13 | -------------------------------------------------------------------------------- /docs/components/ajaxformitlogin/validators/aflpasswordconfirm.md: -------------------------------------------------------------------------------- 1 | # aflPasswordConfirm 2 | 3 | Сниппет для проверки совпадения паролей. Используйте именно его, а не стандартный валидатор `password_confirm`, так как в компоненте доступна автоматическая генерация пароля, если пользователь его не укажет. При использовании `password_confirm` и пустом поле с паролем будет возвращаться ошибка валидации, в то время как `aflPasswordConfirm` проверяет длину только в случае, когда пароль задан. При этом в качестве параметра **НУЖНО** передать имя поля с паролем. 4 | 5 | ## Пример использования 6 | 7 | ```fenom 8 | ... 9 | 'customValidators' => 'aflPasswordConfirm', 10 | 'validate' => 'password_confirm:aflPasswordConfirm=^password^', 11 | ... 12 | ``` 13 | -------------------------------------------------------------------------------- /docs/components/ajaxformitlogin/validators/aflrequiredif.md: -------------------------------------------------------------------------------- 1 | # aflRequiredIf 2 | 3 | Позволяет делать проверяемое поле обязательным в зависимости от значения в другом поле. 4 | 5 | ## Пример использования 6 | 7 | ```fenom 8 | ... 9 | 'customValidators' => 'aflRequiredIf', 10 | 'validate' => 'ogrn:aflRequiredIf=^legal_form|2^', 11 | ... 12 | ``` 13 | 14 | В примере поле с именем `ogrn` будет обязательным, если поле именем `legal_form` имеет значение `2`. 15 | -------------------------------------------------------------------------------- /docs/components/ajaxformitlogin/validators/afluserexists.md: -------------------------------------------------------------------------------- 1 | # aflUserExists (устарел с версии 1.0.9) 2 | 3 | Сниппет проверяет существование пользователя с таким username на сайте. Возвращает ошибку если пользователь **НАЙДЕН**. Используется при регистрации пользователя на сайте. 4 | 5 | ## Пример использования 6 | 7 | ```fenom 8 | ... 9 | 'customValidators' => 'aflUserExists', 10 | 'validate' => 'email:required:aflUserExists', 11 | ... 12 | ``` 13 | -------------------------------------------------------------------------------- /docs/components/ajaxformitlogin/validators/aflusernotexists.md: -------------------------------------------------------------------------------- 1 | # aflUserNotExists 2 | 3 | Сниппет проверяет существование пользователя с таким username на сайте. Возвращает ошибку, если пользователь **НЕ НАЙДЕН**. Используется при восстановлении доступа на сайт. 4 | 5 | ## Пример использования 6 | 7 | ```fenom 8 | ... 9 | 'customValidators' => 'aflUserNotExists', 10 | 'validate' => 'email:required:aflUserNotExists', 11 | ... 12 | ``` 13 | -------------------------------------------------------------------------------- /docs/components/allgifts/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: allGifts 3 | description: Выгрузка товаров с Gifts.ru и других сервисов 4 | logo: https://modstore.pro/assets/extras/allgifts/logo-lg.jpg 5 | author: gvozdb 6 | modstore: https://modstore.pro/packages/import-and-export/allgifts 7 | 8 | items: [ 9 | { text: 'Быстрый старт', link: 'quick-start' }, 10 | { text: 'Решение проблем', link: 'problem-solving' }, 11 | ] 12 | 13 | dependencies: ['miniShop2', 'msOptionsPrice2'] 14 | --- 15 | 16 | # allGifts 17 | 18 | ## Описание 19 | 20 | Компонент предназначен для выгрузки товаров с [gifts.ru](https://gifts.ru), [oasiscatalog.com](https://oasiscatalog.com), [stan.su](https://stan.su), [xindaorussia.ru](https://xindaorussia.ru) через предоставляемое API. 21 | 22 | ## Зависимости 23 | 24 | Компонент **не работает без** miniShop2 и msOptionsPrice2. 25 | 26 | Я понимаю, что второй платный, но писать функционал модификаций в ядро allGifts сделало бы его дороже на 40-50%, поэтому пришлось воспользоваться готовым решением. 27 | -------------------------------------------------------------------------------- /docs/components/allgifts/problem-solving.md: -------------------------------------------------------------------------------- 1 | # Решение проблем 2 | 3 | ## Нехватка оперативной памяти 4 | 5 | Если в логах PHP ошибка `Allowed memory size of … bytes exhausted`, то необходимо увеличить `memory_limit` в конфиге PHP. 6 | 7 | - Рекомендуемый: `512M` 8 | - Минимальный: `256M` (его может не хватить) 9 | 10 | ## 502 ошибка 11 | 12 | Хоть у компонента есть интерфейс в бек-энде, я настоятельно рекомендую запускать выгрузку только в терминале! 13 | Потому что иногда скрипту не хватает времени на выполнение итерации и его выбивает 502 ошибкой. 14 | -------------------------------------------------------------------------------- /docs/components/amocrm/events.md: -------------------------------------------------------------------------------- 1 | # События 2 | 3 | При работе компонента вызываются события, позволяющие модифицировать данные или обработать ответы amoCRM: 4 | 5 | - amocrmOnBeforeOrderSend 6 | - amocrmOnOrderSend 7 | - amocrmOnBeforeUserSend 8 | - amocrmOnUserSend 9 | - amocrmOnWebhookProcess 10 | - amocrmOnBeforeWebhookProcess 11 | 12 | При всех плагинах доступен объект **$amoCRM**, содержащий экземпляр класса _amoCRM_. 13 | -------------------------------------------------------------------------------- /docs/components/amocrm/webhook.md: -------------------------------------------------------------------------------- 1 | # Настройка Webhook 2 | 3 | Для получения изменений из amoCRM на сайт в блоке **Webhook** введите адрес `/assets/components/amocrm/webhook.php`, заменив `` на URL Вашего сайта. 4 | 5 | ![Настройка Webhook - 1](https://file.modx.pro/files/f/8/c/f8cc515579f8ba122c7ae846d8698b81.png) 6 | 7 | После этого в выпадающем списке справа отметьте галочками события: 8 | 9 | - Изменить сделку 10 | - Смена статуса сделки 11 | - Добавить контакт 12 | - Изменить контакт 13 | 14 | [![Настройка Webhook - 2](https://file.modx.pro/files/b/c/3/bc3d6226748b6d168f1797b7f03665ffs.jpg)](https://file.modx.pro/files/b/c/3/bc3d6226748b6d168f1797b7f03665ff.png) 15 | -------------------------------------------------------------------------------- /docs/components/bannery/interface/positions.md: -------------------------------------------------------------------------------- 1 | # Позиции 2 | 3 | Позиции это рекламные места, в которых предполагается выводить ваши баннеры. Проще говоря, это группа баннеров, которую вы покажете в том или ином месте. 4 | 5 | Один баннер может относиться к разным позициям. 6 | 7 | * Для создания позиции перейдите в **Компоненты** -> **BannerY** 8 | * На вкладке **Позиции** нажмите **Создать** и после изменений сохранить. 9 | * Во всплывающем окне вам нужно будет ввести понятное вам название позиции. К самой позиции вы будете обращаться по ID. 10 | 11 | [![](https://file.modx.pro/files/e/a/d/eada167eaf16509c676548a84430f284s.jpg)](https://file.modx.pro/files/e/a/d/eada167eaf16509c676548a84430f284.png) 12 | [![](https://file.modx.pro/files/2/0/f/20f18bbeae2329f068cb16bc77368388s.jpg)](https://file.modx.pro/files/2/0/f/20f18bbeae2329f068cb16bc77368388.png) 13 | [![](https://file.modx.pro/files/f/7/8/f7833d45e234d2e63d571a9d71b933e4s.jpg)](https://file.modx.pro/files/f/7/8/f7833d45e234d2e63d571a9d71b933e4.png) 14 | -------------------------------------------------------------------------------- /docs/components/cityfields/price-management.md: -------------------------------------------------------------------------------- 1 | # Управление ценами товаров 2 | 3 | Для управления ценами на странице редактирования товара добавляется новая вкладка **Город — Цена**. В ней вы найдете таблицу, где сможете указывать цену товара в зависимости от города. Если для какого-то города цена не указана, то будет браться его цена по умолчанию. 4 | 5 | [![Город - цена](https://file.modx.pro/files/b/a/c/bac1178a12036c2498d8a6af0f693891.png)](https://file.modx.pro/files/b/a/c/bac1178a12036c2498d8a6af0f693891.png) 6 | 7 | Для того, чтобы цена товара в каждом городе выводилась актуальная, необходимо выводить её не кешируемой, то есть таким образом: 8 | 9 | ```modx 10 | [[!+price]] или [[!*price]] 11 | ``` 12 | -------------------------------------------------------------------------------- /docs/components/cityfields/sitemap.md: -------------------------------------------------------------------------------- 1 | # Формирование карты сайта 2 | 3 | Если вы используете поддомены или подкаталоги для городов, то появляется задача корректного формирования карты сайта `sitemap.xml`. Для этого необходимо создать страницу в панели управления сайтом со следующими параметрами: 4 | 5 | * Шаблон: `пустой` 6 | * Псевдоним: `sitemap` 7 | * Тип содержимого: `XML` 8 | * Содержимое: 9 | 10 | ``` modx 11 | [[!pdoSitemap? 12 | &cache=`0` 13 | &scheme=`-1` 14 | &tpl=`tpl.Sitemap` 15 | ]] 16 | ``` 17 | 18 | ![Страница карты сайта](https://file.modx.pro/files/e/1/c/e1c702d8c9c0d8ab4ce2d14926c38d5d.png) 19 | 20 | Так как INLINE чанки не умеют обрабатывать модификаторы и условия, то также создадим чанк `tpl.Sitemap` со следующим содержимым: 21 | 22 | ```modx 23 | 24 | [[!+cf.current_city.url]]{$url != '/' ? $url : ''} 25 | [[+date]] 26 | [[+update]] 27 | [[+priority]] 28 | 29 | ``` 30 | 31 | Таким образом на каждом поддомене или подкаталоге будет формироваться карта сайта `sitemap.xml`. 32 | -------------------------------------------------------------------------------- /docs/components/cityselect.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CitySelect 3 | description: Компонент реализует функцию выбора города 4 | logo: https://modstore.pro/assets/extras/cityselect/logo-lg.jpg 5 | author: vgrish 6 | modstore: https://modstore.pro/packages/maps/cityselect 7 | --- 8 | # CitySelect 9 | 10 | Компонент реализует функцию выбора города. Подсказки города во время набора организованны с помощью kladr-api. Геолокация пользователя с помощью SxGeo. 11 | 12 | ## Настройки модуля 13 | 14 | Для редактирования настроек скрипта перейдите в раздел "Настройки системы" и выберите фильтр "cityselect" 15 | 16 | ![Настройки модуля - 1](https://file.modx.pro/files/a/d/9/ad9bb66a4c426a1ff3e686273d447abd.png) 17 | 18 | - указать ключ kladr-api - необязательно 19 | - имя базы данных SxGeo 20 | - токен kladr-api - необязательно 21 | 22 | ## Вызов сниппета 23 | 24 | При установке доступен чанк example, по умолчанию он и используется при вызове сниппета. 25 | ![Настройки модуля - 2](https://file.modx.pro/files/a/d/6/ad67eed388799117fe0f03a034320120.png) 26 | -------------------------------------------------------------------------------- /docs/components/comparison/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Comparison 3 | description: Компонент для сравнения товаров 4 | logo: https://modstore.pro/assets/extras/comparison/logo-lg.jpg 5 | author: ilyautkin 6 | modstore: https://modstore.pro/packages/ecommerce/comparison 7 | 8 | items: [ 9 | { text: 'addComparison', link: 'addcomparison' }, 10 | { text: 'CompareList', link: 'comparelist' }, 11 | { text: 'getComparison', link: 'getcomparison' }, 12 | ] 13 | --- 14 | # Comparison 15 | 16 | Платный компонент сравнения товаров. 17 | 18 | Разработан по заказу студии [Simple Dream][1] и распространяется через [их репозиторий][2]. 19 | 20 | Демо-версию можно посмотреть на [demo.modx.pro][3], а попробовать перед покупкой на [modhost.pro][4]. 21 | 22 | [1]: http://simpledream.ru 23 | [2]: https://modstore.pro/packages/ecommerce/comparison 24 | [3]: http://demo.modx.pro/comparison/ 25 | [4]: https://modhost.pro 26 | -------------------------------------------------------------------------------- /docs/components/crontabmanager/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: CronTabManager 3 | description: Автоматически запуск скриптов по расписанию 4 | logo: https://modstore.pro/assets/extras/crontabmanager/logo-md.png 5 | author: webnitros 6 | modstore: https://modstore.pro/packages/utilities/crontabmanager 7 | repository: https://github.com/astra-modx/modx-app-crontabmanager 8 | 9 | items: [ 10 | { text: 'Настройки', link: 'setting' }, 11 | { text: 'Интерфейс', link: 'interface' }, 12 | { text: 'Команды', link: 'command' }, 13 | { text: 'Фоновый задания', link: 'сrontab' }, 14 | ] 15 | --- 16 | # CronTabManager 17 | 18 | Это удобный инструмент для автоматического запуска заданий в фоновом режиме прямо из панели управления вашего сайта на MODX Revolution. 19 | 20 | ## Что такое «crontab»? 21 | 22 | Это специальный механизм, который позволяет автоматизировать выполнение задач на сервере, например, отправку писем, обновление данных или запуск скриптов по 23 | расписанию. Вы задаете расписание (например, «каждый час» или «раз в неделю»), а crontab выполняет задания автоматически. 24 | -------------------------------------------------------------------------------- /docs/components/crontabmanager/interface.md: -------------------------------------------------------------------------------- 1 | # Интерфейс 2 | 3 | ## Добавить задание - контроллер 4 | 5 | Через скрипт контроллера 6 | 7 | [![](https://file.modx.pro/files/5/a/6/5a63ac91b0aec4774b2e863e175ba999s.jpg)](https://file.modx.pro/files/5/a/6/5a63ac91b0aec4774b2e863e175ba999.png) 8 | 9 | ## Добавить задание - сниппет 10 | 11 | Создайте сниппет который будет запускать автоматически и привяжите его крон заданию 12 | 13 | [![](https://file.modx.pro/files/d/5/e/d5ecfe8fbc76872995c252d40ee6940fs.jpg)](https://file.modx.pro/files/d/5/e/d5ecfe8fbc76872995c252d40ee6940f.png) 14 | 15 | ### Содержание сниппета 16 | 17 | ```php 18 | { 11 | const { form } = detail; 12 | 13 | // Определите ID нужного окна относительно формы 14 | 15 | MicroModal.close('modal-id'); 16 | }); 17 | ``` 18 | -------------------------------------------------------------------------------- /docs/components/fetchit/examples/modals/tinglejs.md: -------------------------------------------------------------------------------- 1 | # Модальные окна tingle.js 2 | 3 | В данном разделе разберём пример работы с модальными окнами [tingle.js](https://tingle.robinparisi.com/). 4 | 5 | ## Открытие модального окна 6 | 7 | Если у вас есть задача открыть модальное окно после успешной отправки формы, то её можно решить двумя способами: 8 | 9 | 1. С помощью события [`fetchit:success`](/components/fetchit/frontend/events#fetchitsuccess). 10 | 11 | ```js 12 | const successModal = new tingle.modal(); 13 | 14 | document.addEventListener('fetchit:success', ({ detail: { response: { message } } }) => { 15 | successModal.setContent(message); 16 | successModal.open(); 17 | }); 18 | ``` 19 | 20 | 2. С помощью [`FetchIt.Message`](/components/fetchit/frontend/class#fetchitmessage). 21 | 22 | ```js 23 | const successModal = new tingle.modal(); 24 | 25 | FetchIt.Message = { 26 | // ... 27 | success (message) { 28 | successModal.setContent(message); 29 | successModal.open(); 30 | }, 31 | } 32 | ``` 33 | -------------------------------------------------------------------------------- /docs/components/fetchit/examples/validation/index.md: -------------------------------------------------------------------------------- 1 | # Валидация 2 | 3 | Список примеров интеграции FetchIt с популярными библиотеками валидации. 4 | 5 | - [Iodine](/components/fetchit/examples/validation/iodine) 6 | - [yup](/components/fetchit/examples/validation/yup) 7 | -------------------------------------------------------------------------------- /docs/components/fetchit/parts/validation.warning.md: -------------------------------------------------------------------------------- 1 | ::: danger Важно! 2 | Валидация на стороне клиента небезопасна и должна быть реализована только для удобства пользователя. 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/components/fetchit/settings.md: -------------------------------------------------------------------------------- 1 | # Настройки компонента 2 | 3 | Компонент регистрирует несколько настроек для удобства работы. 4 | 5 | ## `fetchit.frontend.js` 6 | 7 | - По умолчанию: `[[+assetsUrl]]js/default.min.js` 8 | 9 | Путь до скрипта в котором объявлен класс обработки форм. 10 | 11 | ## `fetchit.frontend.js.classname` 12 | 13 | - По умолчанию: `FetchIt` 14 | 15 | Название JS класса, чей экземпляр будет отвечать за обработку форм. 16 | 17 | ## `fetchit.frontend.input.invalid.class` 18 | 19 | CSS класс который будет добавлен элементу не прошедшему валидацию. 20 | 21 | ## `fetchit.frontend.custom.invalid.class` 22 | 23 | CSS класс который будет добавлен кастомному элементу по ключу не прошедшему валидацию. 24 | 25 | ## `fetchit.frontend.default.notifier` 26 | 27 | - По умолчанию: `false` 28 | 29 | Настройка отвечающая за подключение дефолтной библиотеки уведомлений. 30 | -------------------------------------------------------------------------------- /docs/components/fileman/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: FileMan 3 | description: FileMan – это компонент для MODX Revolution 3, дающий возможность прикреплять к ресурсам файлы через административную панель. 4 | logo: https://modstore.pro/assets/extras/fileman/logo-lg.png 5 | author: createit-ru 6 | modstore: https://modstore.pro/packages/photos-and-files/fileman 7 | repository: https://github.com/createit-ru/FileMan 8 | 9 | items: [ 10 | { text: 'Интерфейс', link: 'interface' }, 11 | { text: 'Сниппеты', link: 'snippets' }, 12 | { text: 'Настройки', link: 'settings' } 13 | ] 14 | --- 15 | 16 | # FileMan 17 | 18 | FileMan – компонент для MODX Revolution 3, дающий возможность прикреплять к ресурсам файлы через административную панель. 19 | -------------------------------------------------------------------------------- /docs/components/formalicious/categories.md: -------------------------------------------------------------------------------- 1 | # Категории 2 | 3 | Для того, чтобы не заблудиться в ваших формах, вы можете группировать их по категориям. 4 | 5 | Для этого перейдите в раздел **Formalicious** в админке и нажмите там на "Панель управления" в правом-верхнем углу. 6 | Вам откроется режим администратора, в котором вы сможете управлять категориями. 7 | 8 | Дальше, в обычном режиме, вы сможете переключаться по вкладкам категорий и создавать в них формы. 9 | -------------------------------------------------------------------------------- /docs/components/formalicious/faqs.md: -------------------------------------------------------------------------------- 1 | # FAQ 2 | 3 | Мы собираем часто задаваемые вопросы, чтобы ответить на них в этом разделе. 4 | 5 | ## Как я могу вывести свою форму? 6 | 7 | Убедитесь, что вы отметили форму как опубликованную, а затем добавили следующий код, в нужном месте (без пробелов): 8 | 9 | ```modx 10 | [[!renderForm? &form=`ID формы`]] 11 | ``` 12 | 13 | Вы также можете использовать TV для выбора формы и указать его как параметр вызова формы. 14 | 15 | ## Я хочу использовать валидаторы для полей 16 | 17 | Просто укажите нужные валидаторы FormIt в настройке полей в панеле управления Formalicious. 18 | Параметр принимает список валидаторов, через запятую. 19 | 20 | ## Мне не нравится внешний вид писем Formalicious 21 | 22 | Не проблема, вы можете настроить всё как вам угодно, через редактирование чанков. 23 | Для этого просто создайте и отредактируйте копии родных чанков (`emailFormTpl` or `fiarTpl`) под другим именем. 24 | 25 | Затем зайдите в "Продвинутые настройки" формы и добавьте новый параметр FormIt: 26 | **emailTpl** или **fiarTpl** с указанием вашего чанка. 27 | -------------------------------------------------------------------------------- /docs/components/formalicious/media-sources.md: -------------------------------------------------------------------------------- 1 | # Источники медиа 2 | 3 | Formalicious устанавливает одну системную настройку `formalicious.source`, которая равна `1`. 4 | Это файловый источник по умолчанию. 5 | 6 | Если вы хотите выбирать вложения для авто-ответов из другого источника - просто измените его здесь. 7 | 8 | Вы можете увидеть все источники медиа сайта, зайдя в раздел **Медиа** > **Источники файлов** в основном меню. 9 | Первая колонка будет показывать id источника, который вы и можете указать в `formalicious.source`. 10 | -------------------------------------------------------------------------------- /docs/components/googlesheets/export/customers.md: -------------------------------------------------------------------------------- 1 | # Покупатели (msClient) 2 | 3 | ## Поля экспорта 4 | 5 | Поддерживаются все стандартные поля пользователя, но с префиксом **user_**. 6 | Например: user_email,user_fullname 7 | 8 | ## Пример экспорта 9 | 10 | **Поля экспорта:** id,user_id,user_username,user_email 11 | 12 | **Результат в таблице:** 13 | 14 | ![Результат в таблице](https://file.modx.pro/files/0/8/8/0882e77d3b6de64e7588f29f4ae95398.jpg) 15 | 16 | ## Системные события 17 | 18 | Класс **gsUser** генерирует следующие события: 19 | 20 | ```php 21 | event->name) { 23 | // получение списка покупателей 24 | case 'gsOnBeforeGetClients': 25 | // $query - запрос выборки 26 | // $range - название листа таблицы, куда будут экспортироваться данные 27 | break; 28 | case 'gsOnGetClients': 29 | // $users - массив покупателей со всеми полями 30 | // $range - название листа 31 | break; 32 | } 33 | ``` 34 | -------------------------------------------------------------------------------- /docs/components/googlesheets/export/msproductremains.md: -------------------------------------------------------------------------------- 1 | # msProductRemains 2 | 3 | Остатки товара 4 | 5 | ## Стандартные поля 6 | 7 | | Поле | Название | 8 | | ---------- | ------------------- | 9 | | id | id остатка | 10 | | product_id | id товара | 11 | | options | Опции | 12 | | remains | Количество остатков | 13 | 14 | ### Модификации 15 | 16 | | Поле | Название | 17 | | ------------------- | -------------- | 18 | | options.name_option | Значение опции | 19 | 20 | ## Примеры экспорта 21 | 22 | ### 1. Вариант 23 | 24 | **Поля экспорта:** id,product_id,options,remains 25 | 26 | **Результат:** 27 | 28 | ![1. Вариант](https://file.modx.pro/files/9/f/5/9f5b5d30d94f6258825b6f5250ddd4bd.jpg) 29 | 30 | ### 2.Вариант 31 | 32 | **Поля экспорта:** id,product_id,options.color,options.size,remains 33 | 34 | **Результат:** 35 | 36 | ![2.Вариант](https://file.modx.pro/files/4/d/8/4d8e757c7369996cdeb441d0f35ed7aa.jpg) 37 | -------------------------------------------------------------------------------- /docs/components/googlesheets/import/categories.md: -------------------------------------------------------------------------------- 1 | # Категории (msCategory) 2 | 3 | Поддерживаются все поля ресурса 4 | -------------------------------------------------------------------------------- /docs/components/googlesheets/import/msoptionsprice2.md: -------------------------------------------------------------------------------- 1 | # msOptionsPrice2 2 | 3 | Дополнительные опции товара 4 | 5 | ## Стандартные поля 6 | 7 | | Поле | Название | Возможные значения | 8 | | -------------| -------------------- |------------------- | 9 | | name | Название модификации | | 10 | | rid | id ресурса | | 11 | | type | тип модификации | `1 \|\| 2 \|\| 3` | 12 | | price | Цена | | 13 | | old_price | Старая цена | | 14 | | article | Артикул | | 15 | | weight | Вес | | 16 | | count | Количество | | 17 | | image | Картинка | | 18 | | active | Активная модификация | `0 \|\| 1` | 19 | | modification | Опции модификации | | 20 | 21 | ## Пример 22 | 23 | **Поля импорта:** rid,article,name,price,modification 24 | 25 | **Уникальное поле:** rid,article 26 | 27 | **Таблица:** 28 | 29 | ![Пример](https://file.modx.pro/files/0/5/a/05a0e708fd2ff5baa6b40ba49b209362.jpg) 30 | -------------------------------------------------------------------------------- /docs/components/googlesheets/import/msproductremains.md: -------------------------------------------------------------------------------- 1 | # msProductRemains 2 | 3 | Остатки товара 4 | 5 | ## Стандартные поля 6 | 7 | | Поле | Название | 8 | | ---------- | ------------------- | 9 | | id | id остатка | 10 | | product_id | id товара | 11 | | options | Опции | 12 | | remains | Количество остатков | 13 | 14 | ### Модификации 15 | 16 | | Поле | Название | 17 | | ------------------- | -------------- | 18 | | options.name_option | Значение опции | 19 | 20 | ## Примеры импорта 21 | 22 | ### 1. Вариант 23 | 24 | **Поля импорта:** id,product_id,options,remains 25 | 26 | **Уникальное поле:** id 27 | 28 | **Таблица:** 29 | 30 | ![1. Вариант](https://file.modx.pro/files/9/f/5/9f5b5d30d94f6258825b6f5250ddd4bd.jpg) 31 | 32 | ### 2. Вариант 33 | 34 | **Поля импорта:** id,product_id,options.color,options.size,remains 35 | 36 | **Уникальное поле:** id 37 | 38 | **Таблица:** 39 | 40 | ![2. Вариант](https://file.modx.pro/files/4/d/8/4d8e757c7369996cdeb441d0f35ed7aa.jpg) 41 | -------------------------------------------------------------------------------- /docs/components/googlesheets/import/vendors.md: -------------------------------------------------------------------------------- 1 | # Производители (msVendor) 2 | 3 | ## Стандартные поля 4 | 5 | | Поле | Название | 6 | | ----------- | -------- | 7 | | id | id | 8 | | name | Название | 9 | | resource | Ресурс | 10 | | country | Страна | 11 | | logo | Логотип | 12 | | address | Адрес | 13 | | phone | Телефон | 14 | | fax | Факс | 15 | | email | Почта | 16 | | description | Описание | 17 | -------------------------------------------------------------------------------- /docs/components/googlesheets/snippets/googlesheetsfront.md: -------------------------------------------------------------------------------- 1 | # Сниппет GoogleSheetsFront 2 | 3 | Сниппет запускает экспорт/импорт с фронта 4 | 5 | ## Параметры сниппета 6 | 7 | | Поле | Описание | Возможные значения. | 8 | | ---- | ------------------------------ | -------------------------------------------------- | 9 | | id | идентификатор экспорта/импорта | | 10 | | mode | режим работы | export \|\| import \|\| migxExport \|\| migxImport | 11 | 12 | ## Пример 13 | 14 | ```modx 15 | [[!GoogleSheetsFront? 16 | &mode=`export` 17 | &id=`5` 18 | ]] 19 | ``` 20 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/disqus.md: -------------------------------------------------------------------------------- 1 | # Disqus 2 | 3 | Получение ключей в Disqus 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Заполняем поля **Label**, **Description** и **Website** 9 | 10 | [![](https://file.modx.pro/files/0/8/8/0886b4b7f748dc699a892be1ba569e10s.jpg)](https://file.modx.pro/files/0/8/8/0886b4b7f748dc699a892be1ba569e10.png) 11 | 12 | - Сохраняем приложение и переходим в режим редактирования. 13 | - Добавляем следующие настройки: 14 | - **Callback URL** - `http://yoursite.ltd/?hauth.done=Facebook` 15 | 16 | [![](https://file.modx.pro/files/b/2/e/b2e96937b0ed2264414c32dbd4024b93s.jpg)](https://file.modx.pro/files/b/2/e/b2e96937b0ed2264414c32dbd4024b93.png) 17 | 18 | - Копируем **API Key** и **API Secret** 19 | 20 | [![](https://file.modx.pro/files/2/1/e/21eb4c6fe83649effcc5874ecd709375s.jpg)](https://file.modx.pro/files/2/1/e/21eb4c6fe83649effcc5874ecd709375.png) 21 | 22 | [1]: http://disqus.com/api/applications/register/ 23 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/foursquare.md: -------------------------------------------------------------------------------- 1 | # Foursquare 2 | 3 | Получение ключей в Foursquare 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Заполняем поля **Name**, **Download / welcome page url** и **Redirect URI(s)** 9 | 10 | [![](https://file.modx.pro/files/5/6/f/56faea13d7d0f2ed1970321f11bc0c4as.jpg)](https://file.modx.pro/files/5/6/f/56faea13d7d0f2ed1970321f11bc0c4a.png) 11 | 12 | - Сохраняем приложение и копируем **Client id** и **Client secret** 13 | 14 | [![](https://file.modx.pro/files/1/a/b/1ab80d3e1fc11ba271d6a4f2f0d56870s.jpg)](https://file.modx.pro/files/1/a/b/1ab80d3e1fc11ba271d6a4f2f0d56870.png) 15 | 16 | [1]: https://ru.foursquare.com/developers/register 17 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/github.md: -------------------------------------------------------------------------------- 1 | # Github 2 | 3 | Получение ключей в GitHub 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Заполняем поля **Application name**, **Homepage URL**, **Authorization callback URL**, и **Application description** 9 | 10 | [![](https://file.modx.pro/files/9/c/f/9cf2040514cfe441cf85fe4e0edfa3cbs.jpg)](https://file.modx.pro/files/9/c/f/9cf2040514cfe441cf85fe4e0edfa3cb.png) 11 | 12 | - Сохраняем приложение и копируем **Client ID** и **Client Secret** 13 | 14 | [![](https://file.modx.pro/files/3/a/6/3a6403652065e36ea44516e394cd3c28s.jpg)](https://file.modx.pro/files/3/a/6/3a6403652065e36ea44516e394cd3c28.png) 15 | 16 | [1]: https://github.com/settings/applications/new 17 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/goodreads.md: -------------------------------------------------------------------------------- 1 | # Goodreads 2 | 3 | Получение ключей в Goodreads 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Заполняем поля **Application name**, **Company name**, **Application URL** и **Callback URL** 9 | 10 | [![](https://file.modx.pro/files/8/4/5/84567b894ef06f93142acc2ba27c5bfas.jpg)](https://file.modx.pro/files/8/4/5/84567b894ef06f93142acc2ba27c5bfa.png) 11 | 12 | - Сохраняем приложение и копируем **key** и **secret** 13 | 14 | [![](https://file.modx.pro/files/4/c/3/4c33ebe560e3f8cf20244becf2147c31s.jpg)](https://file.modx.pro/files/4/c/3/4c33ebe560e3f8cf20244becf2147c31.png) 15 | 16 | [1]: https://www.goodreads.com/api/keys 17 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/index.md: -------------------------------------------------------------------------------- 1 | # Провайдеры HybridAuth 2 | 3 | Ниже представлен список с инструкциями подключения провайдеров: 4 | 5 | - [Disqus](/components/hybridauth/providers/disqus) 6 | - [Facebook](/components/hybridauth/providers/facebook) 7 | - [Foursquare](/components/hybridauth/providers/foursquare) 8 | - [GitHub](/components/hybridauth/providers/github) 9 | - [Goodreads](/components/hybridauth/providers/goodreads) 10 | - [Google](/components/hybridauth/providers/google) 11 | - [LastFM](/components/hybridauth/providers/lastfm) 12 | - [Live](/components/hybridauth/providers/live) 13 | - [Mailru](/components/hybridauth/providers/mailru) 14 | - [Instagram](/components/hybridauth/providers/instagram) 15 | - [Yandex](/components/hybridauth/providers/yandex) 16 | - [Twitter](/components/hybridauth/providers/twitter) 17 | - [Vkontakte](/components/hybridauth/providers/vkontakte) 18 | - [Odnoklassniki](/components/hybridauth/providers/odnoklassniki) 19 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/instagram.md: -------------------------------------------------------------------------------- 1 | # Instagram 2 | 3 | Получение ключей в Instagram 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Заполняем поля **Application Name**, **Description**, **Website** и **OAuth redirect_uri** 9 | 10 | [![](https://file.modx.pro/files/5/6/f/56faea13d7d0f2ed1970321f11bc0c4as.jpg)](https://file.modx.pro/files/5/6/f/56faea13d7d0f2ed1970321f11bc0c4a.png) 11 | 12 | - Сохраняем приложение и копируем **CLIENT ID** и **CLIENT SECRET** 13 | 14 | [![](https://file.modx.pro/files/1/a/b/1ab80d3e1fc11ba271d6a4f2f0d56870s.jpg)](https://file.modx.pro/files/1/a/b/1ab80d3e1fc11ba271d6a4f2f0d56870.png) 15 | 16 | [1]: http://instagram.com/developer/clients/register/ 17 | 18 | ::: warning 19 | С 31 марта 2020 года больше не доступна авторизация через Instagram используйте авторизацию через Facebook [подробней][2] 20 | ::: 21 | 22 | [2]: https://developers.facebook.com/docs/instagram-basic-display-api 23 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/lastfm.md: -------------------------------------------------------------------------------- 1 | # LastFM 2 | 3 | Получение ключей в LastFM 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Выбираем **Non-commercial Use** и заполняем **Application/Device Name**, **Application Description** и **Application Homepage**. 9 | 10 | [![](https://file.modx.pro/files/f/2/2/f223f1a831768486dc5e12ab822f5615s.jpg)](https://file.modx.pro/files/f/2/2/f223f1a831768486dc5e12ab822f5615.png) 11 | 12 | - Сохраняем приложение и заполняем параметр **Callback URL** 13 | 14 | [![](https://file.modx.pro/files/3/e/b/3eb895a87449ef4e21767e119f08e605s.jpg)](https://file.modx.pro/files/3/e/b/3eb895a87449ef4e21767e119f08e605.png) 15 | 16 | - Копируем **API Key** и **Secret** 17 | 18 | [![](https://file.modx.pro/files/7/b/a/7ba656603e96e4e770667eed7d299b22s.jpg)](https://file.modx.pro/files/7/b/a/7ba656603e96e4e770667eed7d299b22.png) 19 | 20 | [1]: http://www.lastfm.ru/api/account/create 21 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/live.md: -------------------------------------------------------------------------------- 1 | # Windows Live 2 | 3 | Получение ключей в Windows Live 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Заполняем **Имя приложения** и сохраняем. 9 | 10 | [![](https://file.modx.pro/files/a/1/6/a16d0232acf777a27d101186625cdcacs.jpg)](https://file.modx.pro/files/a/1/6/a16d0232acf777a27d101186625cdcac.png) 11 | 12 | - Заполняем параметр **Домен перенаправления** и копируем **ИД клиента** и **Секрет клиента (версия 1)** 13 | 14 | [![](https://file.modx.pro/files/4/b/6/4b605004d5787de4c7119179c39a6b37s.jpg)](https://file.modx.pro/files/4/b/6/4b605004d5787de4c7119179c39a6b37.png) 15 | 16 | [1]: https://account.live.com/developers/applications/create 17 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/mailru.md: -------------------------------------------------------------------------------- 1 | # Mail.Ru 2 | 3 | Получение ключей в Mail.Ru 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Принимаем лицензионное соглашение. 9 | - Заполняем **Название** и **Адрес главной страницы**. 10 | 11 | [![](https://file.modx.pro/files/1/c/6/1c69f4aff18c09cc819464aa78646017s.jpg)](https://file.modx.pro/files/1/c/6/1c69f4aff18c09cc819464aa78646017.png) 12 | 13 | - Сохраняем приложение и копируем **ID** и **Секретный ключ** 14 | 15 | [![](https://file.modx.pro/files/f/6/7/f67e0b1c3ada2a5506848c0e28d7d9ecs.jpg)](https://file.modx.pro/files/f/6/7/f67e0b1c3ada2a5506848c0e28d7d9ec.png) 16 | 17 | [1]: http://api.mail.ru/sites/my/add/ 18 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/odnoklassniki.md: -------------------------------------------------------------------------------- 1 | # Odnoklassniki 2 | 3 | ## Получение ключей в Odnoklassniki 4 | 5 | - [Регистрация в Одноклассниках.][1] 6 | - [Регистрация в качестве разработчика.][2] 7 | - [Регистрация приложения.][3] 8 | - Заполняем поля **Название**, **Короткое имя (на латинице)**. 9 | - Указываем **Тип приложения - External** (Внешнее приложение). 10 | - Указываем в поле **Ссылка на приложение - адрес сайта**. 11 | - Сохранить. 12 | 13 | На почту придут: 14 | 15 | - Application ID: `123456789`. 16 | - Публичный ключ приложения: `ABCDEFGHIJKLMNOPQ`. 17 | - Секретный ключ приложения: `ABCDEFGHIJKLMNOPQ1234A12`. 18 | 19 | Их необходимо указать в настройках системы в ключе **ha.keys.Odnoklassniki** 20 | 21 | ```json 22 | {"keys": 23 | { 24 | "id": "123456789", 25 | "key": "ABCDEFGHIJKLMNOPQ", 26 | "secret": "ABCDEFGHIJKLMNOPQ1234A12" 27 | }, 28 | "scope": "VALUABLE_ACCESS;LONG_ACCESS_TOKEN" 29 | } 30 | ``` 31 | 32 | [1]: https://ok.ru/dk?st.cmd=anonymMain&st.registration=on 33 | [2]: https://ok.ru/devaccess 34 | [3]: https://ok.ru/dk?st.cmd=appEditBasic 35 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/twitter.md: -------------------------------------------------------------------------------- 1 | # Twitter 2 | 3 | Получение ключей в Twitter 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Заполняем поля **Name**, **Description**, **Website** и **Callback URL** 9 | 10 | [![](https://file.modx.pro/files/b/b/c/bbca07c18b67915fffb13157be14a3cfs.jpg)](https://file.modx.pro/files/b/b/c/bbca07c18b67915fffb13157be14a3cf.png) 11 | 12 | - Сохраняем приложение и копируем **Consumer key** и **Consumer secret** 13 | 14 | [![](https://file.modx.pro/files/5/0/b/50bad2338db3ea9841469af73d7a083as.jpg)](https://file.modx.pro/files/5/0/b/50bad2338db3ea9841469af73d7a083a.png) 15 | 16 | [1]: https://dev.twitter.com/apps/new 17 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/vkontakte.md: -------------------------------------------------------------------------------- 1 | # Vkontakte 2 | 3 | Получение ключей в Vkontakte 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Выбираем опцию **Веб-сайт** и заполняем поля **Название**, **Адрес сайта** и **Базовый домен** 9 | 10 | [![](https://file.modx.pro/files/9/a/0/9a08868cfdeeeab7fdeaeb16457f45c9s.jpg)](https://file.modx.pro/files/9/a/0/9a08868cfdeeeab7fdeaeb16457f45c9.png) 11 | 12 | - Сохраняем приложение и копируем **ID приложения** и **Защищенный ключ** 13 | 14 | [![](https://file.modx.pro/files/a/6/4/a64ba18c40d290a2824c0d4f085a256bs.jpg)](https://file.modx.pro/files/a/6/4/a64ba18c40d290a2824c0d4f085a256b.png) 15 | 16 | [1]: http://vk.com/editapp?act=create 17 | -------------------------------------------------------------------------------- /docs/components/hybridauth/providers/yandex.md: -------------------------------------------------------------------------------- 1 | # Yandex 2 | 3 | Получение ключей в Yandex 4 | 5 | ## Регистрация приложения 6 | 7 | - Переходим [по ссылке][1] 8 | - Заполняем поля **Название**, **Описание**, **Права** и **Callback URI** 9 | 10 | [![](https://file.modx.pro/files/4/4/2/4420d0bb15d42dcee4934bdc5f04a985s.jpg)](https://file.modx.pro/files/4/4/2/4420d0bb15d42dcee4934bdc5f04a985.png) 11 | 12 | [![](https://file.modx.pro/files/0/e/0/0e00e84f8a71c22f1efbadb38f3f180fs.jpg)](https://file.modx.pro/files/0/e/0/0e00e84f8a71c22f1efbadb38f3f180f.png) 13 | 14 | - Сохраняем приложение и копируем **Id приложения** и **Пароль приложения** 15 | 16 | [![](https://file.modx.pro/files/4/2/5/425285ebced32d2c122b3f94548b6293s.jpg)](https://file.modx.pro/files/4/2/5/425285ebced32d2c122b3f94548b6293.png) 17 | 18 | [1]: https://oauth.yandex.ru/client/new 19 | -------------------------------------------------------------------------------- /docs/components/idimage/crontab.md: -------------------------------------------------------------------------------- 1 | ## Фоновые задания 2 | 3 | Для выполнения фоновых заданий 4 | 5 | ## CLI 6 | 7 | ```shell 8 | # Задания для загрузки изображения 9 | /usr/local/bin/php /var/www/html/core/components/idimage/cli/upload.php 10 | 11 | # Задания для индексации 12 | /usr/local/bin/php /var/www/html/core/components/idimage/cli/indexed.php 13 | 14 | # Создание товаров и проверка новых изображений 15 | /usr/local/bin/php /var/www/html/core/components/idimage/cli/creation.php 16 | ``` 17 | 18 | ### Команды 19 | 20 | Использование в сторонних решениях 21 | 22 | ```php 23 | # Подключение библиотеки 24 | $idImage = $modx->getService('idimage', 'idImage', MODX_CORE_PATH.'components/idimage/model/'); 25 | 26 | # Создание товаров 27 | $Command = new \IdImage\Command\CreationCommand($idImage, $cli); 28 | $Command->run(); 29 | 30 | # Загрузка изображение и получение векторов 31 | $Command = new UploadCommand($idImage, $cli); 32 | $Command->run(); 33 | 34 | # Индексация товаров 35 | $command = new \IdImage\Command\IndexedCommand($idImage, $cli, 100); 36 | $command->run(); 37 | ``` 38 | -------------------------------------------------------------------------------- /docs/components/idimage/indexed/category.md: -------------------------------------------------------------------------------- 1 | ## Настройка категории (опционально) 2 | 3 | Можно исключить определённые категории из индексации с помощью настроек miniShop2. 4 | 5 | **Шаги по настройке:** 6 | 7 | **Откройте настройки miniShop2** 8 | 9 | - Перейдите в **Пакеты → miniShop2 → Настройки → Опции**. 10 | 11 | **Создайте новую опцию** 12 | 13 | - Нажмите кнопку **Добавить опцию**. 14 | - В поле **Ключ** укажите: `idimage` (в нижнем регистре, без пробелов). 15 | - В поле **Название** введите: **Исключенные категории для индексации**. 16 | 17 | **Выберите категории для исключения** 18 | 19 | - В дереве категорий опции выберите нужные категории, которые не должны индексироваться. 20 | 21 | **Сохраните изменения** 22 | 23 | - Нажмите кнопку **Сохранить**. 24 | 25 | После выполнения этих шагов товары из выбранных категорий **не будут участвовать в индексации и создании векторов**. 26 | 27 | ![Исключение категорий](https://file.modx.pro/files/3/a/d/3adf2be8c7e117e977bcfdc8f845be74.png) 28 | 29 | -------------------------------------------------------------------------------- /docs/components/idimage/requirements-and-dependencies.md: -------------------------------------------------------------------------------- 1 | # Системные требования и зависимости 2 | 3 | ## Минимальные системные требования 4 | 5 | - Компонент idimage работает с MODX 2. 6 | - Минимальная версия PHP 7.4 7 | - На версиях PHP ^8.0 стабильность работы не гарантируется 8 | 9 | ## Зависимости 10 | 11 | **idimage** использует в своей работе компоненты: 12 | 13 | - pdoTools версии ^2 14 | - компонент miniShop2 версии ^2 15 | -------------------------------------------------------------------------------- /docs/components/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Компоненты 3 | layout: page 4 | sidebar: false 5 | --- 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/components/localizator/events.md: -------------------------------------------------------------------------------- 1 | # События 2 | 3 | Доступны следующие события: 4 | 5 | - `OnBeforeSaveLocalization` 6 | - `OnSaveLocalization` - создание/изменение локализации ресурса 7 | - `mode` - 'new' или 'upd' 8 | - `localizatorContent` - экземпляр класса `localizatorContent` 9 | - `id` - ID локализации 10 | - `OnBeforeRemoveLocalization` 11 | - `OnRemoveLocalization` - удаление локализации ресурса 12 | - `localizatorContent` - экземпляр класса `localizatorContent` 13 | - `id` - ID локализации 14 | - `OnBeforeSaveLocalizatorLanguage` 15 | - `OnSaveLocalizatorLanguage` - создание/изменение языков 16 | - `mode` - 'new' или 'upd' 17 | - `localizatorLanguage` - экземпляр класса `localizatorLanguage` 18 | - `id` - ID локализации 19 | - `OnBeforeFindLocalization` 20 | - `OnFindLocalization` - поиск языка 21 | - `language` - ссылка на экземпляр класса `localizatorLanguage` 22 | - `http_host` - `$_SERVER['HTTP_HOST']` 23 | - `request` - `$_REQUEST['q']` 24 | - `OnBuildLocalizationTabs` - построение табов Локализации ресурса в админке 25 | - `localizatorContent` - ссылка на экземпляр класса `localizatorContent` 26 | - `tabs` - массив табов и полей 27 | -------------------------------------------------------------------------------- /docs/components/localizator/seotemplates.md: -------------------------------------------------------------------------------- 1 | # seoTemplates 2 | 3 | Для корректной работы с **seoTemplates** необходимо провести небольшую манипуляцию, а именно перейти в плагин **seoTemplates**, открыть вкладку **Системные требования** и у события _OnLoadWebDocument_ поменять приоритет на `11`, сохранить. 4 | 5 | Теперь дополнение будет работать корректно! 6 | -------------------------------------------------------------------------------- /docs/components/magicthemes/themes/handyshop/index.md: -------------------------------------------------------------------------------- 1 | # handyShop 2 | 3 | ![handyShop](https://file.modx.pro/files/c/e/a/cea37261ae548771e9f8b1ef3c2b4f4d.png) 4 | 5 | > Обновлено 08.02.2023, актуальная версия пакета v1.0.0 beta1 6 | 7 | HandyShop - готовая тема для интернет магазина или каталога. 8 | Позволяет создать сайт-каталог или интернет магазин на основе пакета miniShop2 без глубокого погружения в программирование на MODX Revolution. 9 | -------------------------------------------------------------------------------- /docs/components/minishop2/development/services/delivery.md: -------------------------------------------------------------------------------- 1 | # Доставка 2 | 3 | Класс доставки должен реализовывать интерфейс `msDeliveryInterface` в котором всего 3 метода: 4 | 5 | - **getCost** - считает и возвращает сумму заказа. 6 | - **success** - успешный ответ 7 | - **error** - ошибка 8 | 9 | Последние 2 метода в обычной логике не используются. 10 | 11 | Стандартный класс доставки `msDeliveryHandler` только прибавляет добавочную стоимость, которая указана в настройках в абсолютном выражении или в процентах. 12 | Настройка стоимости за расстояние игнорируется и нужна только для расширяющих классов. 13 | 14 | Для подключения своего собственного класса доставки смотрите [соответствующий раздел][1]. 15 | 16 | [1]: /components/minishop2/development/services/connection 17 | -------------------------------------------------------------------------------- /docs/components/minishop2/interface/utilities/gallery.md: -------------------------------------------------------------------------------- 1 | # Галерея 2 | 3 | **Данный раздел доступен с версии 4.2.2 и выше.** 4 | 5 | Обновление всех изображений товаров согласно указанным параметрам. 6 | 7 | Параметры указываются в настройках источника файлов. 8 | В интерфейсе предусмотренна ссылка для быстрого перехода к необходимому источнику для внесения изменений. 9 | 10 | ## Пошаговая инструкция 11 | 12 | 1. Проверить параметры ресайза изображений 13 | 2. Установить сколько товаров обрабатывать за 1 итерацию 14 | 3. Запустить обработку, нажав на кнопку **Обновить** 15 | 16 | ::: warning 17 | Количество обрабатываемых товаров необходимо устанавливать в зависимости от параметров вашего сервера. 18 | Чем больше изображений в галерее каждого товара, тем меньшее число лучше прописывать. 19 | Если указать слишком большое значение, обработка галереи будет прервана по таймауту. 20 | ::: 21 | 22 | ## Интерфейс 23 | 24 | [![Обновление превью miniShop2](https://file.modx.pro/files/e/a/6/ea60b490b01a83f1f67f7be0217c9a15.png)](https://file.modx.pro/files/e/a/6/ea60b490b01a83f1f67f7be0217c9a15.png) 25 | -------------------------------------------------------------------------------- /docs/components/minishop2/interface/utilities/index.md: -------------------------------------------------------------------------------- 1 | # Утилиты miniShop2 2 | 3 | Удобные утилиты для разработчиков, облегчающие рутинные задачи. 4 | 5 | - [Галерея (обновление превью)](/components/minishop2/interface/utilities/gallery) 6 | - [Импорт](/components/minishop2/interface/utilities/import) -------------------------------------------------------------------------------- /docs/components/minishop2/modules.md: -------------------------------------------------------------------------------- 1 | # Другие дополнения miniShop2 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/components/minishop2/parts/tip-general-properties.md: -------------------------------------------------------------------------------- 1 | ::: tip 2 | Можно использовать и другие [общие параметры pdoTools](/components/pdotools/general-properties) 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/components/minishop2/payments.md: -------------------------------------------------------------------------------- 1 | # Список модулей оплаты 2 | 3 | Ниже представлен список модулей оплаты **miniShop2**: 4 | 5 | 6 | -------------------------------------------------------------------------------- /docs/components/minishop2/requirements-and-dependencies.md: -------------------------------------------------------------------------------- 1 | # Системные требования и зависимости 2 | 3 | ## Минимальные системные требования 4 | 5 | - Компонент miniShop2 работает строго с MODX 2. 6 | - Минимальная версия PHP 7.0 7 | - Рекомендуемая стабильная версия PHP 7.4 8 | - На версиях PHP ^8.0 стабильность работы не гарантируется 9 | 10 | ## Зависимости 11 | 12 | miniShop2 использует в своей работе компонент pdoTools версии ^2 13 | 14 | ## Шаблонизатор Fenom 15 | 16 | **Необязательно**. Настоятельно рекомендуем использовать в оформлении шаблонов и чанков вашего сайта [шаблонизатор fenom](/components/pdotools/parser#shablonizator-fenom), поставляемый в комплекте с компонентом pdoTools. 17 | 18 | Он гораздо удобнее в использовании, имеет больше встроенных возможностей. 19 | -------------------------------------------------------------------------------- /docs/components/minishop2/snippets/index.md: -------------------------------------------------------------------------------- 1 | 2 | # Сниппеты miniShop2 3 | 4 | Все сниппеты miniShop2 работают при помощи pdoTools и рассчитывают на использование [Fenom][2] в чанках. 5 | 6 | То есть, например, они сами не обрабатывают товары корзины, просто передавая массив с ними в чанк. 7 | Это позволяет: 8 | 9 | - сократить общее количество чанков 10 | - повысить удобство работы (вы редактируете корзину в 1 месте, а не в 3х) 11 | - ускорить работу (нужно парсить всего 1 чанк, а не 3 - 10 в зависимости от товаров в корзине) 12 | - делать более сложные чанки, за счёт продвинутой проверки условий через функции Fenom 13 | 14 | miniShop2.4 - первый компонент MODX, использующий только чанки с синтаксисом Fenom. 15 | 16 | - [msProducts](/components/minishop2/snippets/msproducts) 17 | - [msCart](/components/minishop2/snippets/mscart) 18 | - [msOrder](/components/minishop2/snippets/msorder) 19 | - [msMiniCart](/components/minishop2/snippets/msminicart) 20 | - [msGetOrder](/components/minishop2/snippets/msgetorder) 21 | - [msGallery](/components/minishop2/snippets/msgallery) 22 | - [msOptions](/components/minishop2/snippets/msoptions) 23 | - [msProductOptions](/components/minishop2/snippets/msproductoptions) 24 | 25 | [2]: /components/pdotools/parser 26 | -------------------------------------------------------------------------------- /docs/components/minishop2/snippets/msminicart.md: -------------------------------------------------------------------------------- 1 | # msMiniCart 2 | 3 | Простенький сниппет для вывода текущего статуса корзины. 4 | 5 | ![](https://file.modx.pro/files/f/a/3/fa36fb44f79cf689e7f8f9e7a577931f.png) 6 | 7 | ## Параметры 8 | 9 | | Параметр | По умолчанию | Описание | 10 | | -------- | ---------------- | --------------- | 11 | | **tpl** | `tpl.msMiniCart` | Чанк оформления | 12 | 13 | ## Оформление 14 | 15 | Сниппет рассчитывает на работу с [чанком Fenom][1]. Он передаёт в него статус корзины из сессии пользователя. 16 | Обычно там: 17 | 18 | - **total_count** - общее количество товаров корзины 19 | - **total_cost** - общая сумма товаров корзины 20 | 21 | Эти данные могут меняться, если используется расширенный класс корзины* 22 | 23 | Стандартный чанк содержит 2 блока элементов с классами `empty` и `not_empty`, которые выводятся, соответственно, для разных состояний корзины. 24 | 25 | [1]: /components/pdotools/parser 26 | -------------------------------------------------------------------------------- /docs/components/minishop2/useful-queries/count-category-products.md: -------------------------------------------------------------------------------- 1 | # Вывод количества товаров в категории 2 | 3 | Сниппет получает сумму всех товаров в категории, с учетом мультикатегорий MS2. Можно указать нужную категорию параметром `$parent`. 4 | 5 | ```php 6 | resource->id;} 8 | $pids = array_merge(array($parent), $modx->getChildIds($parent)); 9 | $ids = array(); 10 | 11 | $q = $modx->newQuery('msProduct'); 12 | $q->where(array('class_key' => 'msProduct','parent:IN' => $pids,'published' => 1,'deleted' => 0)); 13 | $q->select('`msProduct`.`id`'); 14 | if ($q->prepare() && $q->stmt->execute()) { 15 | $ids = $q->stmt->fetchAll(PDO::FETCH_COLUMN); 16 | } 17 | 18 | $q = $modx->newQuery('msProduct'); 19 | $q->leftJoin('msCategoryMember', 'Member', '`Member`.`product_id` = `msProduct`.`id`'); 20 | $q->where(array('class_key' => 'msProduct','Member.category_id:IN' => $pids,'published' => 1,'deleted' => 0)); 21 | $q->select('`msProduct`.`id`'); 22 | if ($q->prepare() && $q->stmt->execute()) { 23 | $ids2 = $q->stmt->fetchAll(PDO::FETCH_COLUMN); 24 | if (!empty($ids2)) { 25 | $ids = array_unique(array_merge($ids, $ids2)); 26 | } 27 | } 28 | 29 | return count($ids); 30 | ``` 31 | -------------------------------------------------------------------------------- /docs/components/minishop2/useful-queries/get-categories-links.md: -------------------------------------------------------------------------------- 1 | # Вывод ссылок на дополнительные категории товара 2 | 3 | Выборка дополнительных категорий и вывод ссылок на них. 4 | 5 | ```php 6 | resource->id;} 8 | if (empty($tpl)) {$tpl = '@INLINE [[+pagetitle]]';} 9 | $pdo = $modx->getService('pdoFetch'); 10 | 11 | $conditions = array('product_id' => $id); 12 | $options = array( 13 | 'innerJoin' => array( 14 | 'msCategory' => array('on' => 'msCategoryMember.category_id = msCategory.id') 15 | ), 16 | 'select' => array('msCategory' => 'all'), 17 | 'sortby' => 'msCategory.id' 18 | ); 19 | $rows = $pdo->getCollection('msCategoryMember', $conditions, $options); 20 | 21 | $output = ''; 22 | foreach ($rows as $row) { 23 | $output .= $pdo->getChunk($tpl, $row); 24 | } 25 | 26 | return $output; 27 | ``` 28 | -------------------------------------------------------------------------------- /docs/components/minishop2/useful-queries/get-categories.md: -------------------------------------------------------------------------------- 1 | # Вывод всех категорий товара 2 | 3 | Сниппет выбирает и выводит все категории, к которым принадлежит товар — его можно использовать как своеобразные теги. 4 | 5 | ```php 6 | resource->id;} 8 | if (empty($pid)) {$pid = $modx->resource->parent;} 9 | if (empty($delimeter)) {$delimeter = ' , ';} 10 | $scheme = $modx->getOption('link_tag_scheme', null, 'full', true); 11 | 12 | $q = $modx->newQuery('msCategory'); 13 | $q->leftJoin('msCategoryMember', 'msCategoryMember', array( 14 | '`msCategory`.`id` = `msCategoryMember`.`category_id`' 15 | )); 16 | $q->sortby('pagetitle','ASC'); 17 | $q->groupby('id'); 18 | $q->select(array('id','pagetitle')); 19 | $q->where('`msCategoryMember`.`product_id` = ' . $rid . ' OR `id` = ' . $pid); 20 | 21 | $result = array(); 22 | if ($q->prepare() && $q->stmt->execute()) { 23 | while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) { 24 | $url = $modx->makeUrl($row['id'], '', '', $scheme); 25 | $result[] = '' . $row['pagetitle'] . ''; 26 | } 27 | } 28 | return implode($delimeter, $result); 29 | ``` 30 | -------------------------------------------------------------------------------- /docs/components/minishop2/useful-queries/get-product-id-by-option.md: -------------------------------------------------------------------------------- 1 | # Получение id товаров по опции MS2 2 | 3 | Сниппет выбирает все значения указанной опции (теги, цвета) и печатает массив id товаров, у которых оно есть. 4 | 5 | ```php 6 | newQuery('msProductOption'); 11 | $q->innerJoin('msProduct', 'msProduct', 'msProduct.id=msProductOption.product_id'); 12 | $q->sortby('msProductOption.value','ASC'); 13 | $q->select('DISTINCT(msProductOption.value), msProduct.id'); 14 | $q->where(array('msProductOption.key' => $key)); 15 | if (!empty($category)) { 16 | $ids = $modx->getChildIds($category); 17 | $ids[] = $category; 18 | $q->innerJoin('msCategory', 'msCategory', 'msCategory.id=msProduct.parent'); 19 | $q->where(array('msCategory.id:IN' => $ids)); 20 | } 21 | $result = array(); 22 | if ($q->prepare() && $q->stmt->execute()) { 23 | while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) { 24 | $result[$row['value']][] = $row['id']; 25 | } 26 | } 27 | echo '
';
28 | print_r($result);
29 | die;
30 | ```
31 | 


--------------------------------------------------------------------------------
/docs/components/minishop2/useful-queries/get-products-by-options.md:
--------------------------------------------------------------------------------
 1 | # Выбор товаров по опциям
 2 | 
 3 | Указываете имя опции и родителя, откуда искать.
 4 | 
 5 | ```php
 6 | newQuery('msProductOption');
12 | $q->innerJoin('msProduct', 'msProduct', 'msProduct.id=msProductOption.product_id');
13 | $q->where(array('msProductOption.key' => $key, 'msProductOption.value'=> $param1));
14 | $q->sortby('msProductOption.value','ASC');
15 | $q->select('DISTINCT(msProductOption.value), msProduct.id');
16 | $q->where(array('msProductOption.key' => $key));
17 | if (!empty($category)) {
18 |   $ids = $modx->getChildIds($category);
19 |   $ids[] = $category;
20 |   $q->innerJoin('msCategory', 'msCategory', 'msCategory.id=msProduct.parent');
21 |   $q->where(array('msCategory.id:IN' => $ids));
22 | }
23 | $result = array();
24 | if ($q->prepare() && $q->stmt->execute()) {
25 |   while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
26 |     $res['id'][] = $row['id'];
27 |   }
28 |   $result = implode(",", array_unique($res['id'])) ;
29 | }
30 | print_r($result);
31 | ```
32 | 


--------------------------------------------------------------------------------
/docs/components/minishop2/useful-queries/get-resource-tree.md:
--------------------------------------------------------------------------------
 1 | # Дерево ресурсов
 2 | 
 3 | Сниппет, который строит дерево ресурсов глубиной в 2 уровня, от указанного родителя.
 4 | 
 5 | ```php
 6 | getChildIds($parent));
12 | $q = $modx->newQuery('modResource', array('parent:IN' => $ids, 'OR:id:IN' => $ids));
13 | $q->andCondition(array('id:NOT IN' => $exclude_parents, 'template' => $template));
14 | $q->select('id,pagetitle,parent');
15 | $resources = array();
16 | if ($q->prepare() && $q->stmt->execute()) {
17 |   while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
18 |     if ($row['parent'] == $parent) {
19 |       if (isset($resources[$row['id']])) {
20 |         $resources[$row['id']] = array_merge($resources[$row['id']], $row);
21 |       }
22 |       else {
23 |         $resources[$row['id']] = $row;
24 |         $resources[$row['id']]['children'] = array();
25 |       }
26 |     }
27 |     else {
28 |       $resources[$row['parent']]['children'][$row['id']] = $row;
29 |     }
30 |   }
31 | }
32 | echo'
';
33 | print_r($resources);
34 | die;
35 | ```
36 | 


--------------------------------------------------------------------------------
/docs/components/minishop2/useful-queries/get-vendors.md:
--------------------------------------------------------------------------------
 1 | # Вывод производителей товаров MS2
 2 | 
 3 | Сниппет получает всех производителей, у которых есть хоть один активный товар и выводит в виде селектбокса.
 4 | 
 5 | ```php
 6 | newQuery('msVendor');
 8 | $q->innerJoin('msProductData', 'msProductData', '`msProductData`.`vendor` = `msVendor`.`id`');
 9 | $q->innerJoin('msProduct', 'msProduct', array(
10 |   '`msProductData`.`id` = `msProduct`.`id`',
11 |   'msProduct.deleted' => 0,
12 |   'msProduct.published' => 1
13 | ));
14 | $q->groupby('msVendor.id');
15 | $q->sortby('name','ASC');
16 | $q->select(array('msVendor.id', 'name'));
17 | $options = '';
18 | if ($q->prepare() && $q->stmt->execute()) {
19 |   while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
20 |     $options .= '';
21 |   }
22 | }
23 | return '';
24 | ```
25 | 


--------------------------------------------------------------------------------
/docs/components/modretailcrm/examples-api/search-product-retailcrm.md:
--------------------------------------------------------------------------------
 1 | # Ищем товар в базе RetailCRM
 2 | 
 3 | Для поиска заказа в API retailCRM существует метод ***storeProducts***, в который передаются три параметра
 4 | 
 5 | 1. Фильтр. Это обязательно массив каких-то данных о товаре (номер, цена, производитель, различные группы товаров, метки, сегменты и т.п.)
 6 | 2. page - пагинация, номер страницы с результатами. Если результатов много (за один раз возвращается не больше 20 товаров) - параметр page позволяет обратиться с одним запросом несколько раз, как в случае с пагинацией
 7 | 3. limit - количество отдаваемых за один раз заказов. Не больше 20.
 8 | 
 9 | ## Пример поиска по номеру товара в базе сайта (externalId)
10 | 
11 | ```php
12 | $products = $modRetailCrm->request->storeProducts(array('externalId' => 100), 1, 20);
13 | ```
14 | 
15 | Больше информации по доступным фильтрам можно посмотреть в [документации](https://help.retailcrm.ru/Developers/ApiVersion5#get--api-v5-store-products)
16 | 


--------------------------------------------------------------------------------
/docs/components/msaltcart/events.md:
--------------------------------------------------------------------------------
 1 | # События
 2 | ## Системные события
 3 | ### События msAltCart
 4 | ###
 5 | #### msOnBeforeGetProductKey - генерируется перед формированием ключа товара в корзине, позволяет изменить параметры ключа.  
 6 | Доступные параметры:
 7 | * **$product** - массив всех полей товара.
 8 | * **$options** - массив опций товара.
 9 | * **$cart** - экземпляр класса-обработчика корзины.
10 | 
11 | ::: details Пример плагина
12 | В данном примере мы перемещаем опции к основным полям товара, что позволит указать в системной настройке **cart_product_key_fields** ключи конкретных опций.
13 | Таким образом появляется возможность тонко настраивать ключ товара, не включая в него какие-то служебные опции.
14 | ```php:line-numbers
15 | switch($modx->event->name){
16 |     case 'msOnBeforeGetProductKey':
17 |         $values = &$modx->event->returnedValues;
18 |         unset($product['options']);
19 |         $values['product'] = array_merge($product, $options);      
20 |         break;
21 | }
22 | ```
23 | :::
24 | 


--------------------------------------------------------------------------------
/docs/components/msaltcart/snippets.md:
--------------------------------------------------------------------------------
 1 | # Сниппеты
 2 | 
 3 | ## getCarts
 4 | 
 5 | Сниппет предназначен для вывода корзин на странице. Имеет только один параметр **tpls**, который принимает в качестве значения строку в формате JSON.
 6 | 
 7 | ### Fenom
 8 | 
 9 | ```fenom:line-numbers
10 | {'!getCarts' | snippet: [
11 |   'tpls' => '{
12 |     "maincart": {
13 |       "wrapper": "@FILE msac/cart.tpl","row":"@FILE msac/cartrow.tpl"
14 |     }
15 |   }'
16 | ]}
17 | 
18 | {'maincart' | placeholder}
19 | ```
20 | 
21 | ### Стандартный синтаксис
22 | 
23 | ```modx:line-numbers
24 | [[!getCarts?
25 |   &tpls=`{
26 |     "maincart": {
27 |       "wrapper":"@FILE msac/cart.tpl","row":"@FILE msac/cartrow.tpl"
28 |     }
29 |   }`
30 | ]]
31 | 
32 | [[+maincart]]
33 | ```
34 | 
35 | :::danger
36 | Не смешивайте синтаксис: если сниппет вызван на страндартном синтаксисе, то плейсхолдеры вставляйте на стандартном. И не используйте в именах плейсхолдеров ничего кроме цифр и латиницы.
37 | :::
38 | 
39 | :::danger
40 | Ключ объекта в параметре tpls и есть имя плейсхолдера для вставки в шаблоне.
41 | :::
42 | 
43 | ## msacConnector
44 | 
45 | Сниппет предназначен для обработки запросов с фронта. Его никогда и нигде не нужно вызывать.
46 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/api.md:
--------------------------------------------------------------------------------
 1 | # Программное API
 2 | 
 3 | ## Служба msb2Manager
 4 | 
 5 | Данная служба, в контексте публичного API, отвечает за:
 6 | 
 7 | - получение количества баллов пользователя,
 8 | - начисление, списание баллов пользователю,
 9 | - установку, отмену бонусов на корзину,
10 | - установку, отмену бонусов на заказ.
11 | 
12 | ### Подключение
13 | 
14 | ```php
15 | $msb2 = $modx->getService('msbonus2', 'msBonus2',
16 |     MODX_CORE_PATH . 'components/msbonus2/model/msbonus2/');
17 | $msb2->initialize($modx->context->key);
18 | $manager = $msb2->getManager();
19 | ```
20 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/cases/mspromocode2-or-msbonus2.md:
--------------------------------------------------------------------------------
1 | # Применять либо промокод msPromoCode2, либо бонусы msBonus2
2 | 
3 | Кейс описан [в документации компонента msPromoCode2][04].
4 | 
5 | [04]: /components/mspromocode2/cases/mspromocode2-or-msbonus2
6 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/events/examples.md:
--------------------------------------------------------------------------------
 1 | # Примеры
 2 | 
 3 | ## Отменить применение бонусов
 4 | 
 5 | ```php
 6 | $sp = &$scriptProperties;
 7 | switch ($modx->event->name) {
 8 |   case 'msb2OnBeforeSetBonus':
 9 |     $modx->event->output('Не нравишься ты мне, чувачок!');
10 |     break;
11 | }
12 | ```
13 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/events/msb2onactionbonus.md:
--------------------------------------------------------------------------------
 1 | # msb2OnActionBonus
 2 | 
 3 | Срабатывает в момент изменения бонусного баланса пользователя.
 4 | 
 5 | ## Параметры
 6 | 
 7 | - `numeric $order_id` — id заказа, если действие происходит с заказом, иначе `$order_id = 0`
 8 | - `numeric $user_id` — id юзера, с чьим балансом происходит действие
 9 | - `string $action` — символ действия: `+` или `-`
10 | - `string $type` — ключ (тип) действия: `order_writeoff`, `order_accrual`, `order_accrual_expired`, `signup`, `signup_expired`, `dob`, `dob_expired`, итд
11 | - `numeric $amount` — кол-во бонусов фигурирующих в данном действии
12 | - `bool $to_log` — записывается ли действие в лог
13 | - `numeric $createdby` — id юзера, который создал запись в лог файл
14 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/events/msb2onbeforesetbonus.md:
--------------------------------------------------------------------------------
 1 | # msb2OnBeforeSetBonus
 2 | 
 3 | Срабатывает перед применением бонусов к корзине или заказу.
 4 | 
 5 | ## Параметры
 6 | 
 7 | - `numeric $points` — общее кол-во бонусов у юзера
 8 | - `numeric $amount` — кол-во бонусов введённых юзером для списания
 9 | - `null|msOrder $order` — объект заказа `msOrder` или `null`, если бонусы применяются к корзине
10 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/events/msb2onsetbonus.md:
--------------------------------------------------------------------------------
 1 | # msb2OnSetBonus
 2 | 
 3 | Срабатывает после применения бонусов к корзине или заказу.
 4 | 
 5 | ## Параметры
 6 | 
 7 | - `numeric $points` — общее кол-во бонусов у юзера
 8 | - `numeric $amount` — кол-во бонусов введённых юзером для списания
 9 | - `null|msOrder $order` — объект заказа `msOrder` или `null`, если бонусы применяются к корзине
10 | - `numeric $writeoff` - кол-во списанных бонусов
11 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/events/msb2onunsetbonus.md:
--------------------------------------------------------------------------------
1 | # msb2OnUnsetBonus
2 | 
3 | Срабатывает после отмены бонусов у корзины или заказа.
4 | 
5 | ## Параметры
6 | 
7 | - `numeric $writeoff` - кол-во списанных бонусов, которые были возвращены
8 | - `null|msOrder $order` — объект заказа `msOrder` или `null`, если бонусы применяются к корзине
9 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/jquery-events.md:
--------------------------------------------------------------------------------
 1 | # События JQuery
 2 | 
 3 | Подобная логика позволяет навесить свой код на применение или отмену бонусов и выводить пользователям какую-то дополнительную информацию.
 4 | 
 5 | ## msb2_set
 6 | 
 7 | Сработает при применении бонусов к корзине, даже если это было с ошибкой.
 8 | 
 9 | ### Пример msb2_set
10 | 
11 | ```js
12 | $(document).ready(function () {
13 |   $(document).on('msb2_set', function (e, response) {
14 |     console.log('msb2_set response', response);
15 |   });
16 | });
17 | ```
18 | 
19 | ## msb2_unset
20 | 
21 | Сработает при отмене бонусов.
22 | 
23 | ### Пример msb2_unset
24 | 
25 | ```js
26 | $(document).ready(function () {
27 |   $(document).on('msb2_unset', function (e, response) {
28 |     console.log('msb2_unset response', response);
29 |   });
30 | });
31 | ```
32 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/snippets/msbonus2form.md:
--------------------------------------------------------------------------------
 1 | # msBonus2Form
 2 | 
 3 | Выводит форму бонусов. Вызывать сниппет нужно на странице корзины miniShop2.
 4 | 
 5 | Сниппет отработает только для авторизованного пользователя в текущем контексте.
 6 | 
 7 | ## Параметры
 8 | 
 9 | | Название | По умолчанию        | Описание           |
10 | | -------- | ------------------- | ------------------ |
11 | | **tpl**  | `tpl.msBonus2.form` | Чанк вывода формы. |
12 | 
13 | ## Пример
14 | 
15 | ```fenom
16 | {'!msBonus2Form' | snippet}
17 | ```
18 | 


--------------------------------------------------------------------------------
/docs/components/msbonus2/snippets/msbonus2logs.md:
--------------------------------------------------------------------------------
 1 | # msBonus2Logs
 2 | 
 3 | Выводит логи по бонусам и информацию пользователя, такую как кол-во бонусов, уровень пользователя, процент начисления и т.д.
 4 | 
 5 | Сниппет отработает только для авторизованного пользователя в текущем контексте.
 6 | 
 7 | ## Параметры
 8 | 
 9 | | Название  | По умолчанию             | Описание             |
10 | | --------- | ------------------------ | -------------------- |
11 | | **user**  | `$modx->user->get('id')` | Id пользователя.     |
12 | | **limit** | `10`                     | Лимит выборки логов. |
13 | | **tpl**   | `tpl.msBonus2.logs`      | Чанк вывода формы.   |
14 | 
15 | ## Примеры
16 | 
17 | ### Все логи на одной странице
18 | 
19 | ```fenom
20 | {'!msBonus2Logs' | snippet : [
21 |   'limit' => 0,
22 | ]}
23 | ```
24 | 
25 | ### Логи с постраничной навигацией
26 | 
27 | ```fenom
28 | {'!pdoPage' | snippet : [
29 |   'element' => 'msBonus2Logs',
30 | ]}
31 | 
32 | {'page.nav' | placeholder}
33 | ```
34 | 


--------------------------------------------------------------------------------
/docs/components/mscdek2/snippets.md:
--------------------------------------------------------------------------------
 1 | # Сниппеты
 2 | 
 3 | ## mscdekConnector
 4 | 
 5 | ### Назначение
 6 | 
 7 | Принимает запросы комопнента на сервере для получения нужных данные: статуса, списка ПВЗ, подсказок.
 8 | 
 9 | ### Параметры
10 | 
11 | Сниппет берёт параметры из пресетов, путь к файлу с пресетами можно указать в системной настройке `ms_cdek2_presets_path`
12 | 
13 | ### Результат работы
14 | 
15 | Возвращает JSON в зависимости от переданного пресета.
16 | 
17 | ### Пример использования
18 | 
19 | Сниппет используется внутри компонента и не предназначен для самостоятельного использования.
20 | 


--------------------------------------------------------------------------------
/docs/components/msdadata.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: msDaData
 3 | dependencies: miniShop2
 4 | ---
 5 | 
 6 | # msDaData
 7 | 
 8 | Компонент реализует функционал - автодополнение адреса и ФИО при оформлении заказа в minishop.
 9 | 
10 | Вам нужно зайти на сайт [dadata.ru](http://dadata.ru), зарегистрироваться и получить ключ.
11 | 
12 | Затем вызвать сниппет msDaData перед оформлением заказа:
13 | 
14 | ```modx
15 | [[msDaData? &token=`тут ваш токен`]]
16 | 
17 | [[!msCart]]
18 | [[!msOrder? &tplOuter=`tpl.msOrderDaData.outer`]]
19 | ```
20 | 
21 | Для оформления заказа нужно указать шаблон `tpl.msOrderDaData.outer`, идущий в комплекте.
22 | 
23 | Результат:
24 | 
25 | ![Результат](https://file.modx.pro/files/3/9/d/39d379ec493cf148e0b190cdf8ca8812.png)
26 | 


--------------------------------------------------------------------------------
/docs/components/msdiscount/discounts.md:
--------------------------------------------------------------------------------
 1 | # Скидки
 2 | 
 3 | Помимо мощной системы акций, вы можете настроить индивидуальные скидки для групп пользователей или товаров. Для них предусмотрены 2 отдельные вкладки в системе управления.
 4 | 
 5 | Компонент использует встроенные группы ресурсов и пользователей MODX, поэтому добавление элементов в них производится в оригинальном интерфейсе. Вы можете легко перейти на отдельную страницу админки для работы с группами.
 6 | 
 7 | В группы ресурсов вы можете назначать как сами товары, так и **их категории**.
 8 | 
 9 | ![Скидки - 1](https://file.modx.pro/files/2/0/9/209c5e2caf0f178df43b35d8000c7dea.png)
10 | 
11 | А у группы пользователей можно задать сумму покупок, при достижении которой пользователь будет в неё (группу) добавлен. Таким образом можно реализовать накопительные скидки.
12 | 
13 | ![Скидки - 2](https://file.modx.pro/files/e/f/d/efd0216a0e4a11fa028d6790c46bbad6.png)
14 | 
15 | Конечно, **каждой группе можно назначить свою индивидуальную скидку**.
16 | 


--------------------------------------------------------------------------------
/docs/components/msearch2/interface/dictionaries.md:
--------------------------------------------------------------------------------
 1 | # Словари
 2 | 
 3 | При первой установке компонента вы скачиваете русский и английский словарь [phpMorphy][1]. На этой страницы мы можете добавить еще или удалить ненужное.
 4 | 
 5 | [![](https://file.modx.pro/files/4/6/3/463bce72ece4e0c7d08127daac334426s.jpg)](https://file.modx.pro/files/4/6/3/463bce72ece4e0c7d08127daac334426.png)
 6 | 
 7 | Для нормальной работы mSearch2 требуется как минимум один морфологический словарь. Всего же у phpMorphy [есть 5 словарей][2]:
 8 | 
 9 | - Русский
10 | - Английский
11 | - Немецкий
12 | - Украинский
13 | - Эстонский
14 | 
15 | Словари скачиваются с SourceForge и этот процесс зависит от соединения вашего сервера. Поэтому вы можете выбрать ближайшее к нему зеркало.
16 | [![](https://file.modx.pro/files/f/e/2/fe2a6450aaf85a054c506cef07a5ed84s.jpg)](https://file.modx.pro/files/f/e/2/fe2a6450aaf85a054c506cef07a5ed84.png)
17 | 
18 | [1]: http://phpmorphy.sourceforge.net/dokuwiki/
19 | [2]: http://sourceforge.net/projects/phpmorphy/files/phpmorphy-dictionaries/0.3.x/
20 | 


--------------------------------------------------------------------------------
/docs/components/msearch2/interface/queries.md:
--------------------------------------------------------------------------------
 1 | # Запросы
 2 | 
 3 | Страница, показывающая, что ищут ваши посетители.
 4 | 
 5 | [![](https://file.modx.pro/files/c/c/a/cca0d3b1ab820fc40997e80b89cd6323s.jpg)](https://file.modx.pro/files/c/c/a/cca0d3b1ab820fc40997e80b89cd6323.png)
 6 | 
 7 | Здесь вы видите список всех запросов, сколько раз искали, и сколько результатов было найдено.
 8 | Эта информация позволяет вам оптимизировать ваш индекс и [синонимы][1], чтобы пользователь всегда что-то находил.
 9 | 
10 | Кстати говоря, именно эти запросы участвуют в автоподсказках режима **queries** сниппета [mSearchForm][2].
11 | 
12 | [1]: http://phpmorphy.sourceforge.net/dokuwiki/
13 | [2]: /components/msearch2/snippets/msearchform
14 | 


--------------------------------------------------------------------------------
/docs/components/msearch2/interface/search.md:
--------------------------------------------------------------------------------
 1 | # Поиск
 2 | 
 3 | Страница системы управления для проверки работы поиска на сайте.
 4 | 
 5 | [![](https://file.modx.pro/files/f/2/8/f285fee4cd4b72561c289f38fd1677b4s.jpg)](https://file.modx.pro/files/f/2/8/f285fee4cd4b72561c289f38fd1677b4.png)
 6 | 
 7 | Здесь вы проводите поиск ровно тем же алгоритмом, что и сниппеты [mSearch2][1] \\ [mFilter2][2], но при этом можете показать все ресурсы, включая удалённые и неопубликованные.
 8 | В поиске не участвуют ресурсы, у которых не отмечен соответствующий параметр "Участвует в поиске".
 9 | 
10 | Интересной особенностью этой страницы является возможность переходить на страницу найденного результата в админке.
11 | 
12 | То есть, **mSearch2 добавляет полноценный морфологический поиск в вашу систему управления MODX**.
13 | 
14 | [1]: /components/msearch2/snippets/msearch2
15 | [2]: /components/msearch2/snippets/mfilter2
16 | 


--------------------------------------------------------------------------------
/docs/components/msearch2/interface/synonyms.md:
--------------------------------------------------------------------------------
 1 | # Синонимы
 2 | 
 3 | Здесь вы можете указать синонимы для поисковых запросов ваших пользователей.
 4 | 
 5 | Система работает очень просто, если в запросе встречается определённое слово, указанное здесь, то к нему добавляется синоним.
 6 | Синонимов может быть сколько угодно, при этом они могут не только добавляться, но изаменять оригинальное слово.
 7 | 
 8 | Таким образом, вы можете исправлять популярные опечатки в названиях товаров или еще где.
 9 | 
10 | Например, если у вас есть товар whiskas, вы можете добавить для него следующие записи:
11 | 
12 | - wiskas
13 | - уискас
14 | - вискас
15 | - и т.д. - смотрите ваши [запросы][1]
16 | 
17 | [![](https://file.modx.pro/files/b/4/1/b410ec7991a617845ec86913310527fcs.jpg)](https://file.modx.pro/files/b/4/1/b410ec7991a617845ec86913310527fc.png)
18 | 
19 | По каким именно словам проходит поиск вы можете узнать, включив параметр **&showLog** сниппета [mSearch2][2].
20 | 
21 | [1]: /components/msearch2/interface/queries
22 | [2]: /components/msearch2/snippets/msearch2
23 | 


--------------------------------------------------------------------------------
/docs/components/msfavorites/index.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: msFavorites
 3 | description: Создание списков избранного
 4 | logo: https://modstore.pro/assets/extras/msfavorites/logo-lg.jpg
 5 | author: vgrish
 6 | modstore: https://modstore.pro/packages/ecommerce/msfavorites
 7 | 
 8 | items: [
 9 |   { text: 'Быстрый старт', link: 'quick-start' },
10 |   { text: 'Обновление', link: 'update' },
11 | ]
12 | ---
13 | # msFavorites
14 | 
15 | Компонент реализует функционал создания списков избранного.
16 | 
17 | Демо-версию можно посмотреть на [msfavorites.vgrish.ru](http://msfavorites.vgrish.ru), а попробовать перед покупкой на [modhost.pro](https://modhost.pro).
18 | 


--------------------------------------------------------------------------------
/docs/components/msfavorites/update.md:
--------------------------------------------------------------------------------
 1 | # Обновление
 2 | 
 3 | Инструкция по обновлению msFavorites.
 4 | 
 5 | ## Отличия версии 3.x
 6 | 
 7 | Основные отличия - введена работа с любыми объектами, можно составлять различные списки избранного без ограничений.
 8 | Изменения в служебной разметке - дата атрибут `dada-data-id` заменен на `dada-data-key`, но старые вызовы по прежнему будет работать. В целом после обновления все должно работать как и прежде.
 9 | 
10 | ## Порядок действий при обновлении с версии 2.x до 3.x
11 | 
12 | - Деинсталлировать старый пакет через менеджер управления пакетами
13 | - Установить актуальную версию компонента
14 | - Запустить скрипт миграции для переноса данных в новые таблицы
15 | 
16 | ```php
17 | include MODX_CORE_PATH .'components/msfavorites/migration/v2tov3/favorites.php';
18 | ```
19 | 
20 | ::: details Результат работы скрипта
21 | 
22 | ```
23 | Import complete in 2.0370631 s
24 | 
25 | Total idx: 601
26 | Positive: 601
27 | Negative: 0
28 | ```
29 | 
30 | :::
31 | 


--------------------------------------------------------------------------------
/docs/components/msgallerysearch/settings.md:
--------------------------------------------------------------------------------
 1 | # Системные настройки
 2 | 
 3 | Дополнительно для удобства добавлены некоторые настройки компонента
 4 | 
 5 | | Параметр                               | По умолчанию            | Описание                           |
 6 | | -------------------------------------- | ----------------------- | ---------------------------------- |
 7 | | **msgallerysearch_available_buttons**  | download,google,gallery | Кнопки на панели                   |
 8 | | **msgallerysearch_copy_meta**          | Да                      | Копировать мета данные изображений |
 9 | | **msgallerysearch_custom_search**      | Пусто                   | Ссылка на свой поиск               |
10 | | **msgallerysearch_disable_auto_query** | Да                      | Отключить загрузку результатов     |
11 | | **msgallerysearch_disable_minishop2**  | Нет                     | Отключить для miniShop2            |
12 | | **msgallerysearch_disable_ms2gallery** | Нет                     | Отключить для ms2Gallery           |
13 | 
14 | Название кнопок для регистрации
15 | 
16 | - download - ссылка на скачивание
17 | - google - найти в google
18 | - gallery - найти в изображениях
19 | 


--------------------------------------------------------------------------------
/docs/components/msimportexport/index.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: msImportExport
 3 | description: Импорт и экспорт для miniShop2
 4 | logo: https://modstore.pro/assets/extras/msimportexport/logo-lg.png
 5 | author: prihod
 6 | modstore: https://modstore.pro/packages/import-and-export/msimportexport
 7 | 
 8 | items: [
 9 |   { text: 'msImportExport 1.0', link: 'msimportexport-1' },
10 |   { text: 'msImportExport 2.0', link: 'msimportexport-2' },
11 | ]
12 | ---
13 | # msImportExport
14 | 


--------------------------------------------------------------------------------
/docs/components/mspointsissue/interface/settings.md:
--------------------------------------------------------------------------------
 1 | # Настройки msPointsIssue
 2 | 
 3 | Настройки msPointsIssue расположены в **Системные настройки** > **msPointsIssue**
 4 | 
 5 | ## Основные
 6 | 
 7 | Содержит основные настройки:
 8 | 
 9 | - `{front_css}` - файл с css для подключения на фронте.
10 | - `{front_js}` - файл с javascript для подключения на фронте.
11 | - `{map_service}` - сервис карт. Доступны "google", "yandex".
12 | - `{google_maps_script}` - путь к скрипту Google maps.
13 | - `{yandex_maps_script}` - путь к скрипту Yandex maps.
14 | 
15 | ## Geonames
16 | 
17 | Содержит настройки [geonames](http://www.geonames.or):
18 | 
19 | - `{geonames_api_url}` - url для отправки запроса к GeoNames Api..
20 | - `{geonames_api_username}` - пользователь для отправки запроса к GeoNames Api.
21 | - `{geonames_country}` - страна для отправки запроса к GeoNames Api.
22 | - `{geonames_continent_code}` - континент для отправки запроса к GeoNames Api.
23 | - `{geonames_api_limit}` - ограничение для отправки запроса к GeoNames Api.
24 | 


--------------------------------------------------------------------------------
/docs/components/mspointsissue/snippets/index.md:
--------------------------------------------------------------------------------
 1 | # Сниппеты msPointsIssue
 2 | 
 3 | Все сниппеты msPointsIssue работают при помощи pdoTools и рассчитывают на использование [Fenom][010103] в чанках.
 4 | 
 5 | Это позволяет:
 6 | 
 7 | - сократить общее количество чанков
 8 | - повысить удобство работы
 9 | - ускорить работу
10 | - делать более сложные чанки, за счёт продвинутой проверки условий через функции Fenom
11 | 
12 | ---
13 | 
14 | - [msPointsIssue.Order](/components/mspointsissue/snippets/mspointsissue-order)
15 | 
16 | [010103]: /components/pdotools/parser
17 | 


--------------------------------------------------------------------------------
/docs/components/mspre/interface/index.md:
--------------------------------------------------------------------------------
 1 | # Интерфейс msPre
 2 | 
 3 | ## Панель управление ресурсами
 4 | 
 5 | ![Панель управление ресурсами](https://file.modx.pro/files/f/b/3/fb329fcddf01f6c37210a2ea462d6a4b.png)
 6 | 
 7 | ## Консоль массовых действий
 8 | 
 9 | Во время каждого массового действия запускается специальный консоль который информирует вас о процессе обработки записе.
10 | 
11 | С помощью этой возможность компонент может обрабатывать то количество ресурсов которое вы выберите на странице
12 | 
13 | ![компонент может обрабатывать](https://file.modx.pro/files/2/c/7/2c72e09cb959a0c090a8b27752517bdf.png)
14 | 
15 | По ходу обработки ресурсов, рядом с ID будут меняться цифры, это и есть id обрабатываемого ресурса.
16 | 


--------------------------------------------------------------------------------
/docs/components/mspre/interface/transactions.md:
--------------------------------------------------------------------------------
 1 | # Транзакции
 2 | 
 3 | Управление транзакциями с операциями по изменению цены товара
 4 | 
 5 | ![Транзакции](https://file.modx.pro/files/1/0/5/105418fe8680a47d9171d07418f00252.png)
 6 | 
 7 | ## Транзакции: отмена операций
 8 | 
 9 | Для отмены операции выберите нужную операцию и нажмите: **Отменить выбранные операции**, после нажатия в указанные поля вернутся значения из поля старые значения
10 | 
11 | ![Транзакции: отмена операций](https://file.modx.pro/files/d/3/2/d32e7ffe7b84ea8f2c021806bcc9c91f.png)
12 | 


--------------------------------------------------------------------------------
/docs/components/msproductdiscounts/discounts.md:
--------------------------------------------------------------------------------
1 | # Создание скидок
2 | 


--------------------------------------------------------------------------------
/docs/components/msproductdiscounts/promocodes.md:
--------------------------------------------------------------------------------
1 | # Создание промокодов
2 | 


--------------------------------------------------------------------------------
/docs/components/msproductremains/remains-page.md:
--------------------------------------------------------------------------------
 1 | # Страница остатков
 2 | 
 3 | Кроме редактирования остатков непосредственно при редактировании товара, управлять остатками возможно на странице компонента, которую можно найти в верхнем меню панели управления сайтом по пути `Приложения -> miniShop2 -> Остатки`.
 4 | 
 5 | ![Страница остатков](https://file.modx.pro/files/6/7/8/6782f3a9e0bb917e6bb5ac150027fd12.png)
 6 | 
 7 | В данной таблице выводятся все записи из таблицы остатков. Поэтому здесь можно найти и комбинации свойств, которые уже не актуальны. Такие варианты можно удалять из таблицы, если они больше не понадобятся.
 8 | 
 9 | Для редактирования остатков необходимо совершить двойной клик левой кнопкой мыши на число, которое вы хотите изменить, после чего появится поле для ввода количества остатков. После ввода нового числа остатков, нажмите Enter и новое число остатков автоматически сохранится в базе данных.
10 | 


--------------------------------------------------------------------------------
/docs/components/msproductremains/remains-tab.md:
--------------------------------------------------------------------------------
 1 | # Вкладка остатков
 2 | 
 3 | После активации компонента в ресурсе товара miniShop2 появится новая вкладка "Остатки". В ней находится таблица, с помощью которой можно редактировать остатки.
 4 | 
 5 | ![Вкладка остатков](https://file.modx.pro/files/0/7/f/07fabf8b1eebd0e5ee0c48b5a5c4d6fa.png)
 6 | 
 7 | Для получения заполненной таблицы остатков предварительно необходимо заполнить свойства товара (по умолчанию, цвет и размер), сохранить его и обновить таблицу остатков (или перезагрузить страницу).
 8 | 
 9 | Для редактирования остатков необходимо совершить двойной клик левой кнопкой мыши на число, которое вы хотите изменить, после чего появится поле для ввода количества остатков. После ввода нового числа остатков, нажмите Enter и новое число остатков автоматически сохранится в базе данных.
10 | 


--------------------------------------------------------------------------------
/docs/components/msprofile/index.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: msProfile
 3 | description: "Работа с профилями: оплата товаров с внутреннего счета пользователя"
 4 | logo: https://modstore.pro/assets/extras/msprofile/logo-lg.jpg
 5 | author: biz87
 6 | modstore: https://modstore.pro/packages/users/msprofile
 7 | repository: https://github.com/modx-pro/msProfile
 8 | 
 9 | items: [
10 |   { text: 'Интерфейс', link: 'interface' },
11 |   {
12 |     text: 'Сниппеты',
13 |     items: [
14 |       { text: 'msProfile', link: 'snippets/msprofile' },
15 |       { text: 'msProfileCharge', link: 'snippets/msprofilecharge' },
16 |     ],
17 |   },
18 |   { text: 'Плагин', link: 'plugin' },
19 | ]
20 | 
21 | dependencies: miniShop2
22 | ---
23 | 
24 | # msProfile
25 | 


--------------------------------------------------------------------------------
/docs/components/msprofile/plugin.md:
--------------------------------------------------------------------------------
 1 | # Плагин msProfile
 2 | 
 3 | Плагин msProfile нужен для обработки пополнений счета и проверки суммы при создании нового заказа.
 4 | 
 5 | Он реагирует на 3 события:
 6 | 
 7 | - **OnManagerPageBeforeRender** - подключает [дополнительную вкладку с профилями][1] на панель управления заказами.
 8 | - **msOnBeforeCreateOrder** - проверка, есть ли требуемая сумма для заказа на счете пользователя. Если нет - заказ не будет оформлен и покупатель получит ошибку.
 9 | - **msOnChangeOrderStatus** - списание со счета пользователя, при оформлении заказа, если был выбран метод оплаты CustomerAccount.
10 | 
11 | [![](https://file.modx.pro/files/c/0/0/c004f06da5a54dc4be2fa592148a6af0s.jpg)](https://file.modx.pro/files/c/0/0/c004f06da5a54dc4be2fa592148a6af0.png)
12 | 
13 | [1]: /components/msprofile/interface
14 | 


--------------------------------------------------------------------------------
/docs/components/msprofile/snippets/msprofile.md:
--------------------------------------------------------------------------------
 1 | # msProfile
 2 | 
 3 | Сниппет для вывода дынных профиля пользователя на фронтенде.
 4 | 
 5 | | Название | По умолчанию | Описание                                                                                                           |
 6 | | -------- | ------------ | ------------------------------------------------------------------------------------------------------------------ |
 7 | | **&id**  | `0`          | Id пользователя для вывода профиля, если не указан - выводится текущий.                                            |
 8 | | **&tpl** |              | Чанк для оформления вывода профиля пользователя. Можно использовать @INLINE чанки без вызова фильтров и сниппетов. |
 9 | 
10 | У сниппета нет чанка по умолчанию, так что при вызове без него, вы увидите все имеющиеся плейсхолдеры и их значения.
11 | 
12 | ![msProfile](https://file.modx.pro/files/1/d/e/1deffe60407585f33df0b3da6eedbd5a.png)
13 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/cases/index.md:
--------------------------------------------------------------------------------
 1 | # Кейсы
 2 | 
 3 | Расширенная пользовательская кастомизация компонента при помощи [jQuery триггеров][1] и [событий плагинов][2] позволяет реализовать почти любые "хотелки".
 4 | 
 5 | - [Вывод информации по промо-коду в письме](/components/mspromocode/cases/email-inform)
 6 | - [Именные промокоды для пользователя](/components/mspromocode/cases/personalized-promo-codes)
 7 | - [Отменить промо-код при наличии в корзине запрещённых товаров](/components/mspromocode/cases/cancel-promo-code)
 8 | 
 9 | [1]: /components/mspromocode/jquery-events
10 | [2]: /components/mspromocode/events/
11 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/events/index.md:
--------------------------------------------------------------------------------
 1 | # События плагинов
 2 | 
 3 | Благодаря этим событиям плагинов можно:
 4 | 
 5 | - Увеличивать/применять скидку на товар в зависимости от кол-ва единиц товара в корзине,
 6 | - Давать скидку только на конкретную опцию товара, например на рубашку размера XXL,
 7 | - Получить итоговую стоимость товара, за вычетом скидки, равной скидке за одну единицу, вне зависимости от кол-ва единиц данной позиции в корзине,
 8 | - И **много чего ещё**, на что хватит вашей фантазии!
 9 | 
10 | _Список событий прописан в порядке их исполнения при работе компонента._
11 | 
12 | - [mspcOnBeforeSetCoupon](/components/mspromocode/events/mspconbeforesetcoupon)
13 | - [mspcOnSetCoupon](/components/mspromocode/events/mspconsetcoupon)
14 | - [mspcOnBeforeSetProductDiscount](/components/mspromocode/events/mspconbeforesetproductdiscount)
15 | - [mspcOnSetProductDiscount](/components/mspromocode/events/mspconsetproductdiscount)
16 | - [mspcOnBindCouponToOrder](/components/mspromocode/events/mspconbindcoupontoorder)
17 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/events/mspconbeforesetcoupon.md:
--------------------------------------------------------------------------------
 1 | # mspcOnBeforeSetCoupon
 2 | 
 3 | Событие срабатывает **перед применением** купона к корзине.
 4 | 
 5 | Если купона не существует, событие не запустится.
 6 | 
 7 | ## Параметры
 8 | 
 9 | - `msPromoCode $mspc` — ссылка на основной класс msPromoCode
10 | - `array $coupon` — массив промо-кода
11 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/events/mspconbindcoupontoorder.md:
--------------------------------------------------------------------------------
 1 | # mspcOnBindCouponToOrder
 2 | 
 3 | Событие срабатывает **в момент создания** заказа с купоном.
 4 | 
 5 | Если к заказу не был привязан купон, то событие не сработает.
 6 | 
 7 | ## Параметры
 8 | 
 9 | - `msPromoCode $mspc` — ссылка на основной класс msPromoCode
10 | - `msOrder $msOrder` — объект заказа miniShop2
11 | - `mspcOrder $mspcOrder` — объект заказа msPromoCode, связывающий данные заказа miniShop2 и msPromoCode
12 | - `mspcCoupon $mspcCoupon` — объект промо-кода
13 | - `array $coupon` — массив промо-кода
14 | - `float $discount_amount` — сумма скидки
15 | 
16 | ## Пример вызова
17 | 
18 | ```php
19 | switch ($modx->event->name) {
20 |   case "mspcOnBindCouponToOrder":
21 |     // Проверяем, является ли купон реферальным
22 |     if ($mspcCoupon->referrer_id) {
23 |       // Какие-то действия...
24 |       $modx->log(1, print_r('Активирован купон "' . $mspcCoupon->code . '" по реферальной программе. Скидка составила ' . $mspcOrder->discount_amount . ' денег.', 1));
25 |     }
26 |     break;
27 | }
28 | ```
29 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/events/mspconsetcoupon.md:
--------------------------------------------------------------------------------
 1 | # mspcOnSetCoupon
 2 | 
 3 | Событие срабатывает **в момент применения** купона к корзине.
 4 | 
 5 | Если купона не существует, событие не запустится.
 6 | 
 7 | ## Параметры
 8 | 
 9 | - `msPromoCode $mspc` — ссылка на основной класс msPromoCode
10 | - `array $coupon` — массив промо-кода
11 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/functionality/conditions.md:
--------------------------------------------------------------------------------
 1 | # Условия применения
 2 | 
 3 | Любому одиночному купону не привязанному к акции, можно указать при каких условиях будет применяться скидка промо-кода к заказу.
 4 | 
 5 | [![](https://modx.pro/assets/images/tickets/8405/24346f91041dddc1f6da9f560611f334dddf7b82.png)](https://modx.pro/assets/images/tickets/8405/24346f91041dddc1f6da9f560611f334dddf7b82.png)
 6 | 
 7 | ## Список условий
 8 | 
 9 | - Сумма корзины (от)
10 | - Сумма корзины (до)
11 | - Кол-во товаров в корзине (от)
12 | - Кол-во товаров в корзине (до)
13 | 
14 | Каждое из этих условий для купона можно использовать как по одиночке, так и совмещая.
15 | 
16 | [![](https://modx.pro/assets/images/tickets/8405/4a2dc9c3c4f9cf25c6a551c4e691c42010543dde.png)](https://modx.pro/assets/images/tickets/8405/4a2dc9c3c4f9cf25c6a551c4e691c42010543dde.png)
17 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/functionality/fixed-cart-discount.md:
--------------------------------------------------------------------------------
 1 | # Фиксированная скидка на всю корзину
 2 | 
 3 | В версиях до 1.3.0, если указать скидку без процентов (например, 4000) на весь промо-код, то эта сумма отнимется от каждой единицы товара. Это происходило, потому что промо-код применяется к каждому товару непосредственно. Не смотря на это, часто требуется дать скидку не процентную, а фиксированную сумму.
 4 | 
 5 | В версии 1.3.0 появилась возможность создать промо-код, который будет применяться к целой корзине.
 6 | 
 7 | В этом случае у нас пропадает возможность отметить товары/разделы, на которые действует скидка. Это и логично, т.к. целочисленная скидка отнимается от корзины. Теперь, если указать у такого типа промо-кода скидку без процентов, то от корзины отнимется именно эта сумма, вне зависимости от кол-ва товаров в корзине.
 8 | 
 9 | Из-за некоторых особенностей в таком типе скидки, чтобы работала фиксированная скидка на всю корзину, надо при создании купона указать галочку `Скидка на всю корзину` и в поле `Скидка` указать число без процента на конце.
10 | 
11 | ![Фиксированная скидка на всю корзину](https://file.modx.pro/files/e/d/3/ed35439fa6202d922ce83a98a55eee33.png)
12 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/functionality/stocks.md:
--------------------------------------------------------------------------------
1 | # Акции
2 | 
3 | Для каждой акции можно сгенерировать пачку купонов по указанной маске.
4 | 
5 | Можно указать скидку для всех купонов, дату начала и окончания действия акции, товары и категории, на которые распространяется акция. А в любом из сгенерированных купонов можно переопределить эти настройки, отметив галочку `Заморозить` (это позволит при сохранении акции купон оставлять нетронутым).
6 | 
7 | У акции можно скачать список купонов в CSV формате.
8 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/jquery-events.md:
--------------------------------------------------------------------------------
 1 | # jQuery события
 2 | 
 3 | Подобная логика позволяет навесить свой JS код на применение купона и выводить пользователям какую-то дополнительную информацию, связанную со скидкой.
 4 | 
 5 | ## mspc_set
 6 | 
 7 | Сработает при успешном/неуспешном применении промо-кода.
 8 | 
 9 | ### Пример mspc_set
10 | 
11 | ```js
12 | $(document).ready(function () {
13 |   $(document).on('mspc_set', function (e, response) {
14 |     console.log('mspc_set response', response);
15 |   });
16 | });
17 | ```
18 | 
19 | ## mspc_remove
20 | 
21 | Сработает при отмене промо-кода.
22 | 
23 | ### Пример mspc_remove
24 | 
25 | ```js
26 | $(document).ready(function () {
27 |   $(document).on('mspc_remove', function (e, response) {
28 |     console.log('mspc_remove response', response);
29 |   });
30 | });
31 | ```
32 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode/snippets/mspcform.md:
--------------------------------------------------------------------------------
 1 | # mspcForm
 2 | 
 3 | Основной сниппет компонента, который реализует вывод формы для применения промо-кода на фронте.
 4 | 
 5 | ## Параметры
 6 | 
 7 | | Название | По умолчанию   | Описание           |
 8 | | -------- | -------------- | ------------------ |
 9 | | **tpl**  | `tpl.mspcForm` | Чанк вывода формы. |
10 | 
11 | ## Пример
12 | 
13 | ```fenom
14 | {'!mspcForm' | snippet}
15 | ```
16 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/cases/index.md:
--------------------------------------------------------------------------------
1 | # Кейсы
2 | 
3 | Расширенная пользовательская кастомизация и программное API позволяют реализовать очень многие кейсы при помощи компонента.
4 | 
5 | - [Вывод информации по промо-коду в письме](/components/mspromocode2/cases/email-inform)
6 | - [Установка промо-кода программно при входе на сайт](/components/mspromocode2/cases/set-promocode)
7 | - [Генерация промо-кода в письме на следующий заказ](/components/mspromocode2/cases/generate-promocode)
8 | - [Применять либо промокод msPromoCode2, либо бонусы msBonus2](/components/mspromocode2/cases/mspromocode2-or-msbonus2)
9 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/events/examples.md:
--------------------------------------------------------------------------------
 1 | # Примеры
 2 | 
 3 | ## Отменить применение промо-кода
 4 | 
 5 | ```php
 6 | $sp = &$scriptProperties;
 7 | switch ($modx->event->name) {
 8 |   case 'mspc2OnBeforeGetCoupon':
 9 |     $modx->event->output('Мне не нравится этот промо-код!');
10 |     break;
11 | }
12 | ```
13 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/events/index.md:
--------------------------------------------------------------------------------
 1 | # События плагинов
 2 | 
 3 | Обратите внимание, что некоторые события, например `mspc2OnBeforeGetCoupon` и `mspc2OnGetCoupon` могут быть вызваны множество раз, поэтому необходимо добавлять в ваш плагин дополнительные проверки.
 4 | 
 5 | - [mspc2OnBeforeGetCoupon](/components/mspromocode2/events/mspc2onbeforegetcoupon)
 6 | - [mspc2OnGetCoupon](/components/mspromocode2/events/mspc2ongetcoupon)
 7 | - [mspc2OnBeforeSetCoupon](/components/mspromocode2/events/mspc2onbeforesetcoupon)
 8 | - [mspc2OnSetCoupon](/components/mspromocode2/events/mspc2onsetcoupon)
 9 | - [mspc2OnUnsetCoupon](/components/mspromocode2/events/mspc2onunsetcoupon)
10 | - [mspc2OnSetProductDiscountPrice](/components/mspromocode2/events/mspc2onsetproductdiscountprice)
11 | - [Примеры](/components/mspromocode2/events/examples)
12 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/events/mspc2onbeforegetcoupon.md:
--------------------------------------------------------------------------------
 1 | # mspc2OnBeforeGetCoupon
 2 | 
 3 | Срабатывает перед получением промо-кода в методе `mspc2Manager::getCoupon`.
 4 | Будет запущено, даже если такого промо-кода не существует.
 5 | 
 6 | Данный метод при работе компонента вызывается довольно часто, даже в момент применения промо-кода к уже оформленному заказу.
 7 | 
 8 | В связи с особенностью работы метода `mspc2Manager::getCoupon` два параметра у данного события формируются динамически.
 9 | 
10 | ## Параметры
11 | 
12 | - `string $key` — ключ, по которому запрашивается промо-код
13 | - `int $id` - динамический параметр, передаётся только если промо-код запрошен по числовому id
14 | - `string $code` - динамический параметр, передаётся только если промо-код запрошен по строковому коду
15 | 
16 | ## Пример
17 | 
18 | ```php
19 | $sp = &$scriptProperties;
20 | switch ($modx->event->name) {
21 |   case 'mspc2OnBeforeGetCoupon':
22 |     $key = $sp['key'];
23 |     if (is_int($sp[$key])) {
24 |       // Передан $id купона
25 |     } elseif (is_string($sp[$key])) {
26 |       // Передан $code купона
27 |     }
28 |     break;
29 | }
30 | ```
31 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/events/mspc2onbeforesetcoupon.md:
--------------------------------------------------------------------------------
1 | # mspc2OnBeforeSetCoupon
2 | 
3 | Срабатывает перед применением промо-кода к корзине или заказу.
4 | 
5 | ## Параметры
6 | 
7 | - `array $coupon` — массив с промо-кодом
8 | - `null|msOrder $order` — объект заказа `msOrder` или `null`, если промо-код применяется к корзине
9 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/events/mspc2ongetcoupon.md:
--------------------------------------------------------------------------------
 1 | # mspc2OnGetCoupon
 2 | 
 3 | Срабатывает после получения промо-кода и всех проверок в методе `mspc2Manager::getCoupon`.
 4 | Будет запущено, только если такой промо-код существует и пройдены проверки времени жизни, активности, количества, и т.д.
 5 | 
 6 | Данный метод при работе компонента вызывается довольно часто, даже в момент применения промо-кода к уже оформленному заказу.
 7 | 
 8 | ## Параметры
 9 | 
10 | - `array $coupon` — массив с промо-кодом
11 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/events/mspc2onsetcoupon.md:
--------------------------------------------------------------------------------
 1 | # mspc2OnSetCoupon
 2 | 
 3 | Срабатывает после применения промо-кода к корзине или заказу.
 4 | 
 5 | ## Параметры
 6 | 
 7 | - `array $coupon` — массив с промо-кодом
 8 | - `null|msOrder $order` — объект заказа `msOrder` или `null`, если промо-код применён к корзине
 9 | - `float $discount_amount` - сумма скидки
10 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/events/mspc2onunsetcoupon.md:
--------------------------------------------------------------------------------
1 | # mspc2OnUnsetCoupon
2 | 
3 | Срабатывает после отмены промо-кода у корзины или заказа.
4 | 
5 | ## Параметры
6 | 
7 | - `array $coupon` — массив с промо-кодом
8 | - `null|msOrder $order` — объект заказа `msOrder` или `null`, если промо-код отменён у корзины
9 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/jquery-events.md:
--------------------------------------------------------------------------------
 1 | # События jQuery
 2 | 
 3 | Подобная логика позволяет навесить свой код на применение купона и выводить пользователям какую-то дополнительную информацию, связанную со скидкой.
 4 | 
 5 | ## mspc2_set
 6 | 
 7 | Сработает при применении промо-кода, даже если это было с ошибкой.
 8 | 
 9 | ### Пример mspc2_set
10 | 
11 | ```js
12 | $(document).ready(function () {
13 |   $(document).on('mspc2_set', function (e, response) {
14 |     console.log('mspc2_set response', response);
15 |   });
16 | });
17 | ```
18 | 
19 | ## mspc2_unset
20 | 
21 | Сработает при отмене промо-кода.
22 | 
23 | ### Пример mspc2_unset
24 | 
25 | ```js
26 | $(document).ready(function () {
27 |   $(document).on('mspc2_unset', function (e, response) {
28 |     console.log('mspc2_unset response', response);
29 |   });
30 | });
31 | ```
32 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/snippets/mspc2cartkey.md:
--------------------------------------------------------------------------------
 1 | # mspc2CartKey
 2 | 
 3 | Из-за специфики работы корзины, в компонент был добавлен вспомогательный сниппет `mspc2CartKey`, который используется исключительно как модификатор.
 4 | 
 5 | ::: warning
 6 | Как самостоятельный сниппет не используется.
 7 | :::
 8 | 
 9 | ## Параметры
10 | 
11 | | Название  | По умолчанию | Описание                                                                         |
12 | | --------- | ------------ | -------------------------------------------------------------------------------- |
13 | | **input** |              | Массив с данными товара. Обязательно должен содержать элементы `id` и `options`. |
14 | 
15 | Про использование данного модификатора читайте в разделе [Быстрый старт][02].
16 | 
17 | [02]: /components/mspromocode2/quick-start
18 | 


--------------------------------------------------------------------------------
/docs/components/mspromocode2/snippets/mspromocode2.md:
--------------------------------------------------------------------------------
 1 | # msPromoCode2
 2 | 
 3 | Выводит форму для применения промо-кода. Можно вызывать не только в корзине, но и на любой странице сайта.
 4 | 
 5 | ## Параметры
 6 | 
 7 | | Название | По умолчанию            | Описание           |
 8 | | -------- | ----------------------- | ------------------ |
 9 | | **tpl**  | `tpl.msPromoCode2.form` | Чанк вывода формы. |
10 | 
11 | ## Пример
12 | 
13 | ```fenom
14 | {'!msPromoCode2' | snippet}
15 | ```
16 | 


--------------------------------------------------------------------------------
/docs/components/mswallpapers/events/examples.md:
--------------------------------------------------------------------------------
 1 | # Примеры
 2 | 
 3 | ## Подменим цену товара в зависимости от выбранной текстуры
 4 | 
 5 | ```php
 6 | switch ($modx->event->name) {
 7 |   case 'mswpOnGetProductPrice':
 8 |     $price = $product->getPrice();
 9 |     if (!empty($data['texture'])) {
10 |       switch ($data['texture']) {
11 |         case 'smooth':
12 |           $price = $product->getPrice() + 500;
13 |           break;
14 | 
15 |         case 'sand':
16 |           $price = $product->getPrice() + 1000;
17 |           break;
18 | 
19 |         case 'jacquard':
20 |           $price = $product->getPrice() + 1500;
21 |           break;
22 |       }
23 |     }
24 |     $modx->event->returnedValues = [
25 |       'price' => $price,
26 |     ];
27 |     break;
28 | }
29 | ```
30 | 


--------------------------------------------------------------------------------
/docs/components/mswallpapers/events/index.md:
--------------------------------------------------------------------------------
 1 | # События плагинов
 2 | 
 3 | С версии 1.1.0 пакет приобрёл **события плагинов**.
 4 | 
 5 | _Список событий прописан в порядке их исполнения при работе компонента._
 6 | 
 7 | - [mswpOnGetProductPrice](/components/mswallpapers/events/mswpongetproductprice)
 8 | - [mswpOnGetProductCost](/components/mswallpapers/events/mswpongetproductcost)
 9 | - [Примеры](/components/mswallpapers/events/examples)
10 | 


--------------------------------------------------------------------------------
/docs/components/mswallpapers/events/mswpongetproductcost.md:
--------------------------------------------------------------------------------
 1 | # mswpOnGetProductCost
 2 | 
 3 | Вызывается в методе `msWallpapers::getCost`, который в свою очередь отрабатывает при:
 4 | 
 5 | 1. Вызове сниппета `mswp.form`
 6 | 2. Отправке формы
 7 | 3. Добавлении изделия в корзину
 8 | 
 9 | ## Параметры
10 | 
11 | - `msProduct $product` — класс товара,
12 | - `array $data` — массив формы.
13 | 


--------------------------------------------------------------------------------
/docs/components/mswallpapers/events/mswpongetproductprice.md:
--------------------------------------------------------------------------------
 1 | # mswpOnGetProductPrice
 2 | 
 3 | Вызывается в методе `msWallpapers::getPrice`, который в свою очередь отрабатывает при:
 4 | 
 5 | 1. Вызове сниппета `mswp.form`
 6 | 2. Отправке формы
 7 | 3. Добавлении изделия в корзину
 8 | 
 9 | Запускается перед вычетом стоимости за изделие.
10 | 
11 | ## Параметры
12 | 
13 | - `msProduct $product` — класс товара,
14 | - `array $data` — массив формы.
15 | 


--------------------------------------------------------------------------------
/docs/components/msync/index.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: mSync
 3 | description: Компонент для синхронизации товаров, предложений и заказов с 1С
 4 | logo: https://modstore.pro/assets/extras/msync/logo-lg.png
 5 | author: argnist
 6 | modstore: https://modstore.pro/packages/import-and-export/msync
 7 | 
 8 | items: [
 9 |   { text: 'Установка', link: 'setup' },
10 |   { text: 'Интерфейс', link: 'interface' },
11 |   { text: 'Настройки', link: 'settings' },
12 |   { text: 'События и плагины', link: 'events-and-plugins' },
13 | ]
14 | ---
15 | # mSync
16 | 
17 | Компонент позволяет импортировать товары и торговые предложения из **1С, Класс365 и МойСклад** по протоколу **CommerceML**
18 | в интернет-магазин на основе **miniShop2**.
19 | 
20 | Описание протокола обмена с сайтом можно прочитать [здесь](http://v8.1c.ru/edi/edi_stnd/131/#1).
21 | 
22 | [Инструкция](http://class365.ru/help/modx) по интеграции Класс365 (консультации по этой инструкции спрашивайте в техподдержке Класс365).
23 | 


--------------------------------------------------------------------------------
/docs/components/multilingual/interface/add-language-field.md:
--------------------------------------------------------------------------------
 1 | # Добавление переводов к полям
 2 | 
 3 | ## Интерфейс для добавления переводов к полям ресурса (вкладка "Переводы")
 4 | 
 5 | ![Интерфейс для добавления переводов к полям ресурса (вкладка "Переводы")](https://file.modx.pro/files/b/e/f/befd37a119fdde443ad2a4b716ac4a78.png)
 6 | 
 7 | После установки компонента у каждого ресурса появляется дополнительная вкладка "Переводы".
 8 | 
 9 | На данной вкладке вы можете увидеть все поля, которые уже переведены на другие языки, а также добавить переводы
10 | для непереведенных полей.
11 | 
12 | При нажатии на кнопку "Добавить перевод" или при клике правой кнопкой мыши по одному из существующих переводов и выбора пункта "Обновить перевод" появится всплывающее окно, в котором можно выбрать поле, для которого создается перевод, язык (из тех, которые ранее были добавлены в интерфейсе управления языковыми версиями), а также указать, собственно, сам перевод.
13 | 


--------------------------------------------------------------------------------
/docs/components/multilingual/interface/add-language.md:
--------------------------------------------------------------------------------
 1 | # Добавление языковых версий
 2 | 
 3 | ## Интерфейс редактирования языковых версий
 4 | 
 5 | ![Интерфейс редактирования языков](https://file.modx.pro/files/0/4/f/04ff112b9debbe2a7721ea639087082d.png)
 6 | 
 7 | Синтаксис шаблона URL (site_url) при создании нового языка допускает несколько вариантов:
 8 | 
 9 | 1. Указание только правой части url
10 | 
11 |     Например для английской версии мы можем указать `/eng/` - в этом случае все адреса ресурсов в английской версии будут иметь вид `http://mydomian.com/eng/resource/full/url.html`
12 | 
13 | 2. Указание точного соответствия url
14 | 
15 |     Например: `http://mydomain.com/` При таком варианте вы жестко привязаны к адресу сайта. В этом случае разные языковые версии сайта могут находиться на разных доменах.
16 |     Например русская на `http://mydomainrussia.ru/`, а английская на `http://mydomainusa.com/`
17 | 
18 | 3. С помощью плейсхолдеров `[[+schema]]` и `[[+base_domain]]`
19 | 
20 |     Например: `[[+schema]]eng.[[+base_domain]]/`, `[[+schema]]english.[[+base_domain]]/`
21 | 
22 |     Данный вариант более удобен, если языковые версии строятся на поддоменах. Например `http://mybasedomain.ru/` и `http://eng.mybasedomain.ru/`
23 | 


--------------------------------------------------------------------------------
/docs/components/multilingual/problem-solving.md:
--------------------------------------------------------------------------------
 1 | # Решение проблем с miniShop2
 2 | 
 3 | ## Вывод сообщений корзины на текущем языке
 4 | 
 5 | Чтобы при добавлении в корзину и изменении прочих параметров, вы получали всплывающие сообщения на текущем языке,
 6 | необходимо в плагине minishop2 поставить приоритет на событие OnHandleRequest больше, чем у плагина mlSetLanguage, чтобы
 7 | плагин mlSetLanguage срабатывал раньше, чем плагин minishop2
 8 | 
 9 | Затем, необходимо добавить системную настройку (укажите путь до файла action.php в соответствии с вашим проектом):
10 | 
11 | | Настройка            | Значение                                                          |
12 | | -------------------- | ----------------------------------------------------------------- |
13 | | minishop2.action_url | `assets/components/minishop2/action.php`  // (без слэша в начале) |
14 | 
15 | ## Вывод названий товаров в корзине
16 | 
17 | Сниппет msCart, используемый для вывода товаров в корзине, не поддерживает настроку pdofetch_class_path, поэтому для того, чтобы в корзине выводить названия товаров на текущем языке, необходимо в чанке вывода товаров, вместо `{$product.pagetitle}`
18 | использовать конструкцию:
19 | 
20 | ```fenom
21 | {'pdoField' | snippet : ['id' => $product.id, 'field' => 'pagetitle']}
22 | ```
23 | 


--------------------------------------------------------------------------------
/docs/components/multilingual/snippets/mllanguageslinks.md:
--------------------------------------------------------------------------------
 1 | # mlLanguagesLinks
 2 | 
 3 | Данный сниппет выводит элемент для переключения языков на фронтенде
 4 | 
 5 | ## Параметры
 6 | 
 7 | - **&wrapperTpl** - шаблон обертки
 8 | - **&tpl** - основной шаблон
 9 | - **&mod** - стилевой модификатор для проброса в каждую ссылку
10 | - **&activeClass** - активный класс
11 | - **&scheme** - схема формирования URL (аналогично параметру $scheme метода $modx->makeUrl)
12 | - **&showActive** - показывать ли ссылку текущего языка
13 | 
14 | ## Доступные плейсхолдеры внутри чанка wrapperTpl
15 | 
16 | - **&output** - содержимое
17 | 
18 | ## Доступные плейсхолдеры внутри чанка tpl
19 | 
20 | - **&culture_key** - ключ языка на ссылке
21 | - **&link** - ссылка
22 | - **&site_url** - базовый URL сайта
23 | - **&classes** - набор классов ссылки
24 | - **&mod** - стилевой модификатор, указанный в параметре mod
25 | 


--------------------------------------------------------------------------------
/docs/components/office/index.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: Office
 3 | description: Универсальный личный кабинет покупателя
 4 | logo: https://modstore.pro/assets/extras/office/logo-lg.png
 5 | author: ilyautkin
 6 | modstore: https://modstore.pro/packages/users/office
 7 | 
 8 | items: [
 9 |   { text: 'Быстрый старт', link: 'quick-start' },
10 |   { text: 'Логика работы', link: 'logic' },
11 |   { text: 'Дополнительный функционал', link: 'additional-functionality' },
12 |   {
13 |     text: 'Контроллеры',
14 |     items: [
15 |       { text: 'Авторизация', link: 'controllers/auth' },
16 |       { text: 'Профиль', link: 'controllers/profile' },
17 |       { text: 'История заказов MS2', link: 'controllers/orders-history-minishop2' },
18 |       { text: 'Удаленная авторизация', link: 'controllers/auth-remote' },
19 |     ],
20 |   },
21 | ]
22 | ---
23 | # Office
24 | 
25 | Личный кабинет пользователя MODX.
26 | 
27 | Покупатель может регистрироваться и авторизоваться на сайте через email и соцсети, обновлять свойства своего профиля и просматривать историю заказов miniShop2.
28 | 
29 | Благодаря [модульной архитектуре дополнения][2], вы можете добавлять свои контроллеры для создания уникального функционала.
30 | 
31 | [2]: /components/office/logic
32 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/development/services/cart.md:
--------------------------------------------------------------------------------
1 | # Корзина
2 | 
3 | Не реализован.
4 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/development/services/delivery.md:
--------------------------------------------------------------------------------
1 | # Доставка
2 | 
3 | Класс доставки реализовывает интерфейс `msDeliveryInterface`
4 | 
5 | Никак не используется, нужен только для задания обязательный полей заказа и наименования доставки в заказе.
6 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/development/services/payment.md:
--------------------------------------------------------------------------------
1 | # Оплата
2 | 
3 | Стандартный [miniShop2][0102030304]
4 | 
5 | [0102030304]: /components/minishop2/development/services/payment
6 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/interface/clients.md:
--------------------------------------------------------------------------------
 1 | # Клиенты
 2 | 
 3 | ## Создать клиента
 4 | 
 5 | ![Создать клиента](https://file.modx.pro/files/5/4/6/546c1aa61ab8a310c0beda6e6d162de6.png)
 6 | 
 7 | Для создании клиента необходимо выбрать пользователя сайта, либо указать почту. В случае если пользователя с данной почтой не существует он будет автоматически создан.
 8 | Настройка `client_groups`, в ней можно перечислить группы пользователя через запятую.
 9 | 
10 | ## Изменение клиента
11 | 
12 | ![Изменение клиента](https://file.modx.pro/files/8/7/1/8719151594fef6d34f07b6dbf1dc8c5a.png)
13 | 
14 | Доступен для редактирования статус клиента. Активна для редактирования вкладка [подписки][7].
15 | 
16 | [7]: /components/payandsee/interface/subscriptions
17 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/interface/content.md:
--------------------------------------------------------------------------------
 1 | # Контент
 2 | 
 3 | ## Создать контент
 4 | 
 5 | ![Создать контент](https://file.modx.pro/files/3/a/3/3a32615ed16bb62669d402d487279204.png)
 6 | 
 7 | Для создании контента необходимо указать ресурс к которому он будет привязан. Тарифы и подписки контента будут доступны после его сохранения.
 8 | 
 9 | ## Изменение контента
10 | 
11 | ![Изменение контента](https://file.modx.pro/files/2/c/3/2c3b3e6bef004be17241ca0bc590ff65.png)
12 | 
13 | Доступны для редактирования все поля контента, так же активны вкладки [тарифы][5] и [подписки][7].
14 | 
15 | [5]: /components/payandsee/interface/rates
16 | [7]: /components/payandsee/interface/subscriptions
17 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/interface/notifications.md:
--------------------------------------------------------------------------------
 1 | # Оповещения
 2 | 
 3 | ## Создать / Изменить оповещение
 4 | 
 5 | Оповещение срабатывает в момент смены статуса сущности.
 6 | 
 7 | [![](https://file.modx.pro/files/1/0/8/1081d703c933784602832a7d79c7c9e4s.jpg)](https://file.modx.pro/files/1/0/8/1081d703c933784602832a7d79c7c9e4.png)
 8 | 
 9 | Для создании оповещения необходимо указать класс и статус. Задать почту, тему и тело сообщения.
10 | 
11 | Для каждой сущности определены методы `{getClientEmails}` и `{getManagerEmails}`
12 | Результат набивается в переменные:
13 | 
14 | - `{$client_email}` - почта клиента
15 | - `{$manager_email}` - почта менеджера
16 | 
17 | Таким образом вы можете просто указать `{$client_email | join}` и для сущности клиент это будет почта клиента, для сущности контент это будет почта всех клиентов с активной подпиской на данный контент и тп.
18 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/interface/orders.md:
--------------------------------------------------------------------------------
 1 | # Заказы
 2 | 
 3 | Панель управления заказами PayAndSee представлена в компоненте [miniShop2][020103].
 4 | Заказы контента идентифицируются по ключу **context**
 5 | 
 6 | ![Заказы - 1](https://file.modx.pro/files/4/a/7/4a753fe3c54867ad036ba905ebc60299.png)
 7 | 
 8 | Идентификатор контента и срок подписки сохраняется в опциях продукта заказа.
 9 | 
10 | ![Заказы - 2](https://file.modx.pro/files/9/c/a/9ca642d2e57a0f2fe4cbb08940cfbac1.png)
11 | 
12 | [020103]: /components/minishop2/interface/orders
13 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/interface/rates.md:
--------------------------------------------------------------------------------
1 | # Тарифы
2 | 
3 | ## Создать / Изменить тариф
4 | 
5 | ![Создать / Изменить тариф](https://file.modx.pro/files/7/6/2/762ab8f04b918f2efe8f740e4f4ae558.png)
6 | 
7 | Для создании тарифа необходимо указать стоимость, контент к которому он будет привязан и срок подписки.
8 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/interface/settings.md:
--------------------------------------------------------------------------------
 1 | # Настройки PayAndSee
 2 | 
 3 | Настройки PayAndSee расположены в **Системные настройки** > **PayAndSee**
 4 | 
 5 | ## Основные
 6 | 
 7 | Содержит основные настройки:
 8 | 
 9 | - `{working_templates}` - активные шаблоны. Список id шаблонов через запятую, для которых нужно активировать функционал.
10 | - `{front_css}` - файл с css для подключения на фронте.
11 | - `{front_js}` - файл с javascript для подключения на фронте.
12 | - `{client_groups}` - группы регистрации клиентов, через запятую.
13 | - `{email_manager}` - почтовые адреса менеджеров, через запятую.
14 | 
15 | ## Заказ
16 | 
17 | Содержит настройки необходимые для заказа:
18 | 
19 | - `{order_handler_class}` - имя класса, который реализует логику оформления заказа.
20 | - `{order_delivery_id}` - идентификатор способа доставки [miniShop2][020104], который используется при оформлении заказа.
21 | - `{order_resource_id}` - идентификатор страницы заказа, на которой происходит оформление заказа.
22 | 
23 | [020104]: /components/minishop2/interface/settings
24 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/interface/subscriptions.md:
--------------------------------------------------------------------------------
 1 | # Подписки
 2 | 
 3 | ## Создать подписку
 4 | 
 5 | ![Создать подписку](https://file.modx.pro/files/b/a/2/ba294b5e5f5a03048ec1986788f50dc5.png)
 6 | 
 7 | Для создании подписки необходимо выбрать контент и пользователя сайта. Указать дату начала и окончания подписки.
 8 | 
 9 | ## Изменение подписки
10 | 
11 | ![Изменение подписки](https://file.modx.pro/files/4/8/a/48a40c0b7b1e1b48f2431905f39cf49e.png)
12 | 
13 | Доступен для редактирования контент, клиент, статус подписки. Можно скорректировать срок подписки.
14 | 


--------------------------------------------------------------------------------
/docs/components/payandsee/snippets/index.md:
--------------------------------------------------------------------------------
 1 | # PayAndSee
 2 | 
 3 | Все сниппеты PayAndSee работают при помощи pdoTools и рассчитывают на использование [Fenom][010103] в чанках.
 4 | 
 5 | Это позволяет:
 6 | 
 7 | - сократить общее количество чанков,
 8 | - повысить удобство работы,
 9 | - ускорить работу,
10 | - делать более сложные чанки, за счёт продвинутой проверки условий через функции Fenom.
11 | 
12 | ---
13 | 
14 | - [pas.content](/components/payandsee/snippets/pas-content)
15 | - [pas.order](/components/payandsee/snippets/pas-order)
16 | - [pas.get.order](/components/payandsee/snippets/pas-get-order)
17 | - [pas.subscription](/components/payandsee/snippets/pas-subscription)
18 | 
19 | [010103]: /components/pdotools/parser
20 | 


--------------------------------------------------------------------------------
/docs/components/pdotools/classes/index.md:
--------------------------------------------------------------------------------
 1 | # Классы
 2 | 
 3 | Ядро компонента разделено на 3 класса: общий [pdoTools][1], работа с БД - [pdoFetch][2] и работа с оформлением, то есть [pdoParser][3].
 4 | 
 5 | При установке в систему они регистрируются таким образом, чтобы вы могли быстро их запускать:
 6 | 
 7 | ```php
 8 | $pdoTools = $modx->getService('pdoTools');
 9 | $pdoFetch = $modx->getService('pdoFetch');
10 | $pdoParser = $modx->getService('pdoParser');
11 | ```
12 | 
13 | pdoFetch наследует pdoTools, так что не нужно вызывать эти два класса вместе. Если вы хотите работать с БД, вызывайте один Fetch, а если нет - Tools.
14 | 
15 | Парсер вызывать вообще не нужно, он или включен в настройках MODX, или нет. pdoTools использует его для оформления чанков в любом случае.
16 | 
17 | [1]: /components/pdotools/classes/pdotools
18 | [2]: /components/pdotools/classes/pdofetch
19 | [3]: /components/pdotools/classes/pdoparser
20 | 


--------------------------------------------------------------------------------
/docs/components/quiz/examples.md:
--------------------------------------------------------------------------------
 1 | # Примеры
 2 | 
 3 | ## Меняем сообщения с jgrowl на SweetAlert
 4 | 
 5 | ```js
 6 | $(document).on('Quiz.init.before', function (e, quiz) {
 7 |   quiz.message = function (status, msg) {
 8 |     swal(status, msg, status);
 9 |   };
10 | });
11 | ```
12 | 
13 | ## Меняем кол-во баллов и кол-во правильных ответов
14 | 
15 | ```js
16 | $(document).on('Quiz.result.before', function (e, options, field) {
17 |   options.answer.points = 900; // кол-во баллов
18 |   options.answer.success = 10; // кол-во правильных ответов
19 | });
20 | ```
21 | 
22 | ## Отменяем получение след. раздела
23 | 
24 | ```js
25 | $(document).on('Quiz.next.before', function (e, options) {
26 |   options.eventStop = true;
27 | });
28 | ```
29 | 


--------------------------------------------------------------------------------
/docs/components/quiz/index.md:
--------------------------------------------------------------------------------
 1 | ---
 2 | title: Quiz
 3 | description: Конструктор квизов
 4 | logo: https://modstore.pro/assets/extras/quiz/logo-lg.png
 5 | author: boshnik
 6 | modstore: https://modstore.pro/packages/discounts/quiz
 7 | 
 8 | items: [
 9 |   {
10 |     text: 'Сниппеты',
11 |     items: [
12 |       { text: 'Quiz', link: 'snippets/quiz' },
13 |       { text: 'QuizData', link: 'snippets/quizdata' },
14 |       { text: 'QuizSteps', link: 'snippets/quizsteps' },
15 |       { text: 'QuizResult', link: 'snippets/quizresult' },
16 |       { text: 'SeoImg', link: 'snippets/seoimg' },
17 |     ],
18 |   },
19 |   { text: 'События', link: 'events' },
20 |   { text: 'Методы', link: 'methods' },
21 |   { text: 'Примеры', link: 'examples' },
22 | ]
23 | ---
24 | # Quiz
25 | 


--------------------------------------------------------------------------------
/docs/components/quiz/methods.md:
--------------------------------------------------------------------------------
 1 | # Методы
 2 | 
 3 | Доступны следующие события:
 4 | 
 5 | ```js
 6 | let QuizForm = $('#quiz');
 7 | ```
 8 | 
 9 | ## Start
10 | 
11 | Показываем первый раздел:
12 | 
13 | ```js
14 | QuizForm.quiz('start');
15 | ```
16 | 
17 | ## Next
18 | 
19 | Переходим на следующий раздел:
20 | 
21 | ```js
22 | QuizForm.quiz('next');
23 | ```
24 | 
25 | ## getStep
26 | 
27 | Переходим на следующий раздел минуя валидацию:
28 | 
29 | ```js
30 | QuizForm.quiz('getStep');
31 | ```
32 | 
33 | ## Prev
34 | 
35 | Переходим на предыдущий раздел:
36 | 
37 | ```js
38 | QuizForm.quiz('prev');
39 | ```
40 | 
41 | ## Submit
42 | 
43 | Отправляем форму:
44 | 
45 | ```js
46 | QuizForm.quiz('submit');
47 | ```
48 | 
49 | ## validStep
50 | 
51 | Запускаем валидацию раздела:
52 | 
53 | ```js
54 | QuizForm.quiz('validStep');
55 | ```
56 | 
57 | ## getResult
58 | 
59 | Получаем и показываем результат:
60 | 
61 | ```js
62 | QuizForm.quiz('getResult');
63 | ```
64 | 
65 | ## reset
66 | 
67 | Сброс формы:
68 | 
69 | ```js
70 | QuizForm.quiz('reset');
71 | ```
72 | 
73 | ## message
74 | 
75 | Показываем сообщение:
76 | 
77 | ```js
78 | QuizForm.quiz('message', 'success', 'УРА!!!');
79 | QuizForm.quiz('message', 'error', 'Вы ошиблись!');
80 | QuizForm.quiz('message', 'info', 'Здрасьте!');
81 | ```
82 | 


--------------------------------------------------------------------------------
/docs/components/quiz/snippets/quizdata.md:
--------------------------------------------------------------------------------
 1 | # Сниппет QuizData
 2 | 
 3 | Сниппет предназначен для вывода заполненных данных с формы.
 4 | В основном нужен для вывода данных в письме.
 5 | 
 6 | ## Параметры
 7 | 
 8 | - **id** - id квиза.
 9 | - **param** - параметры формы для получения ответа в виде массива.
10 | 
11 | ## Пример
12 | 
13 | ```fenom
14 | {'!QuizData' | snippet: [
15 |   'id' => 2,
16 |   'param' => [
17 |     'earth' => 'ball',
18 |   ],
19 | ] | print}
20 | ```
21 | 
22 | Ответ:
23 | 
24 | ```php
25 | Array
26 | (
27 |   [0] => Array
28 |     (
29 |       [question] => Какой формы Земля?
30 |       [answer] => Шар
31 |       [name] => earth
32 |     )
33 | )
34 | ```
35 | 


--------------------------------------------------------------------------------
/docs/components/quiz/snippets/quizresult.md:
--------------------------------------------------------------------------------
 1 | # Сниппет QuizResult
 2 | 
 3 | Сниппет предназначен для вывода сохраненных результатов.
 4 | 
 5 | ## Параметры сниппета
 6 | 
 7 | - **quiz** - id квиза.
 8 | - **where** - условия выборки.
 9 | - **tplOuter** - чанк-обёртка раздела. По умолчанию: `@INLINE {$wrapper}`
10 | - **tpl** - чанк для полей раздела.
11 | - **tplFooter** - чанк для футера всех разделов.
12 | 
13 | ### Плейсхолдеры чанков
14 | 
15 | #### tplOuter
16 | 
17 | - **wrapper** - раздел со всеми полями.
18 | - **title** - заголовок раздела(вопроса)
19 | - **total** - кол-во результатов
20 | 
21 | #### tpl
22 | 
23 | - **question** - вопрос
24 | - **value** - кол-во ответов на данный вопрос
25 | - **total** - кол-во результатов
26 | - **procent** - процент
27 | 
28 | #### tplFooter
29 | 
30 | - **total** - кол-во результатов
31 | 
32 | ## Пример
33 | 
34 | ```fenom
35 | {'!QuizResult' | snippet: [
36 |   'quiz' => 1,
37 |   'tplOuter' => '@INLINE 

{$title}

{$wrapper}
', 38 | 'tpl' => '@INLINE {$procent}% {$question}{$value}', 39 | 'tplFooter' => '@INLINE

Проголосовали {$total} пользователей

', 40 | ]} 41 | -------------------------------------------------------------------------------- /docs/components/quiz/snippets/quizsteps.md: -------------------------------------------------------------------------------- 1 | # QuizSteps 2 | 3 | Сниппет предназначен для вывода разделов. 4 | 5 | ## Параметры 6 | 7 | - **id** - id квиза. 8 | - **tplOuter** - чанк обертки для разделов. По умолчанию: `@INLINE
    {$wrapper}
` 9 | - **tpl** - чанк раздела. По умолчанию: `@INLINE
  • {$title}
  • ` 10 | - **where** - условия для вывода. Доступные параметры чанка(tpl): 11 | - **{$id}** - id раздела 12 | - **{$idx}** - индекс раздела 13 | - **{$filter}** - GET параметр 14 | - **{$title}** - Заголовок 15 | - **{$description}** - Описание 16 | - **{$img}** - Картинка 17 | - **{$content}** - Контент 18 | - **{$value_success}** - Значение правильного ответа 19 | - **{$success}** - Сообщение при правильном ответе 20 | - **{$error}** - Сообщение при неправильном ответе 21 | - **{$question}** - Вопрос для условия (id) 22 | - **{$answer}** - Ответ для условия (id) 23 | 24 | ## Пример 25 | 26 | Выводим все разделы, у которых нет условий: 27 | 28 | ```fenom 29 | {'!QuizSteps' | snippet: [ 30 | 'id' => 2, 31 | 'where' => [ 32 | 'question:<' => '1' 33 | ] 34 | ]} 35 | ``` 36 | -------------------------------------------------------------------------------- /docs/components/quiz/snippets/seoimg.md: -------------------------------------------------------------------------------- 1 | # Сниппет SeoImg 2 | 3 | Сниппет предназначен для формирования изображение с текстом при выводе результата. 4 | 5 | ## Параметры 6 | 7 | - **img** - ссылка на изображение 8 | - **points** - баллы 9 | - **title** - заголовок 10 | - **description** - описание 11 | 12 | ## Пример 13 | 14 | ```fenom 15 | {set $img = '!SeoImg' | snippet: [ 16 | 'img' => 'assets/img/quiz/1.jpg', 17 | 'title' => 'SEOIMG', 18 | 'description' => 'Описание', 19 | ]} 20 | ``` 21 | 22 | ![SEOIMG](https://file.modx.pro/files/b/2/7/b27da551764eab74ab332402354b3a98.png) 23 | -------------------------------------------------------------------------------- /docs/components/resourcegrabber/development/services/getter.md: -------------------------------------------------------------------------------- 1 | # Геттер 2 | 3 | Процессом получения данных занимается специальный класс **rgContentGetter**, который реализует интерфейс **rgGetterInterface**. 4 | Конечно, вы можете подключить собственный класс и указать его в сниппете **getter** 5 | 6 | Итак, обязательные методы интерфейса `rgGetterInterface`: 7 | 8 | - `init` - Инициализирует класс. 9 | - `client` - Возвращает экземпляр класса обработчика. 10 | - `run` - Запускает обработку и возвращает данные. 11 | -------------------------------------------------------------------------------- /docs/components/resourcegrabber/development/services/grabber.md: -------------------------------------------------------------------------------- 1 | # Граббер 2 | 3 | Процессом получения парсинга данных занимается специальный класс **rgContentGrabber**, который реализует интерфейс **rgGrabberInterface**. 4 | Конечно, вы можете подключить собственный класс и указать его в сниппете **grabber**. 5 | 6 | Итак, обязательные методы интерфейса `rgGrabberInterface`: 7 | 8 | - `init` - Инициализирует класс. 9 | - `client` - Возвращает экземпляр класса обработчика. 10 | - `run` - Запускает обработку и возвращает данные. 11 | -------------------------------------------------------------------------------- /docs/components/resourcegrabber/development/services/setter.md: -------------------------------------------------------------------------------- 1 | # Сеттер 2 | 3 | Процессом записи данных занимается специальный класс **rgResourceSetter**, который реализует интерфейс **rgSetterInterface**. 4 | Класс подгружается согласно поля `class_key` ресурса. 5 | 6 | Реализованы: 7 | 8 | - `rgResourceSetter` - базовый класс. 9 | - `rgMsProductSetter` - продукта **minishop**. 10 | 11 | Если для вашего `class_key` не реализован соответствующий класс - будет подгружен базовый. 12 | 13 | Итак, обязательные методы интерфейса `rgSetterInterface`: 14 | 15 | - `init` - Инициализирует класс. 16 | - `get` - Возвращает ресурс. 17 | - `create` - Создает ресурс. 18 | - `update` - Обновляет ресурс. 19 | -------------------------------------------------------------------------------- /docs/components/resourcegrabber/interface/data.md: -------------------------------------------------------------------------------- 1 | # Данные 2 | 3 | ## Загрузить / Создать / Изменить данные 4 | 5 | По указанной ссылке будут подгружены данные обработанные сниппетом. 6 | 7 | ![Загрузить / Создать / Изменить данные](https://file.modx.pro/files/9/6/1/961f24958e221fbfb5109f0bc56a2a61.png) 8 | 9 | Выбор `типа` корректирует подгружаемые данные с помощью настроек: 10 | 11 | - `fields_on_create` - поля доступные при создании. 12 | - `fields_on_update` - поля доступные при обновлении. 13 | -------------------------------------------------------------------------------- /docs/components/resourcegrabber/interface/index.md: -------------------------------------------------------------------------------- 1 | # Панель управления 2 | 3 | Панель управления находится на странице ресурса, доступна через меню и сочетание клавиш [[Alt]]+[[g]]. 4 | Содержит следующие вкладки: 5 | 6 | ## Основное 7 | 8 | Вкладка, на которой доступны полученные [данные][2]. 9 | Действия: **загрузить**/**создать**/**изменить** данные. 10 | 11 | ![Основное](https://file.modx.pro/files/1/e/9/1e9d05d759ccf7a3abfc7b28c4746b95.png) 12 | 13 | ## Сниппеты 14 | 15 | Вкладка, на которой собраны [сниппеты][3]. 16 | Действия: **создать**/**изменить**/**удалить** сниппет. 17 | 18 | [2]: /components/resourcegrabber/interface/data 19 | [3]: /components/resourcegrabber/interface/snippets 20 | -------------------------------------------------------------------------------- /docs/components/resourcegrabber/interface/settings.md: -------------------------------------------------------------------------------- 1 | # Настройки 2 | 3 | Настройки `ResourceGrabber` расположены в **Системные настройки** > **ResourceGrabber** 4 | 5 | ## Основные 6 | 7 | Содержит основные настройки: 8 | 9 | - `{working_templates}` - активные шаблоны. Список id шаблонов через запятую, для которых нужно активировать функционал. 10 | - `{fields_on_create}` - список полей доступных при создании ресурса. По умолчанию пуст - доступны все поля. 11 | - `{fields_on_update}` - список полей доступных при обновлении ресурса. По умолчанию "currency,price,old_price". 12 | -------------------------------------------------------------------------------- /docs/components/resourcegrabber/interface/snippets.md: -------------------------------------------------------------------------------- 1 | # Сниппеты 2 | 3 | ## Создать / Изменить сниппет 4 | 5 | Сниппет - фрагмент php кода в котором происходит обработка данных. 6 | Для создании сниппета необходимо задать название и указать код сниппета. Можно указать маску сайта - сработает автоматический поиск сниппета по ссылке. 7 | 8 | ![Создать / Изменить сниппет](https://file.modx.pro/files/a/6/b/a6b22899f14deac867ab4aa831e01094.png) 9 | 10 | Возможно создание своих обработчиков для получения и парсинга данных, за это отвечают соответствующие классы сниппета. 11 | Наличие флага `статичный` позволяет подключить код сниппета из файла. 12 | 13 | В результате сниппет должен вернуть массив загружаемых данных что и будут доступны для **создания**/**обновления** ресурса. 14 | -------------------------------------------------------------------------------- /docs/components/resvideogallery/adding-custom-video-parser.md: -------------------------------------------------------------------------------- 1 | # Добавление своего видео парсера 2 | 3 | Для того чтобы добавить свой видео парсер нужно создать в `core/components/resvideogallery/model/resvideogallery/providers` php файл с классом наследником от RvgProvider в котором определить метод "scrape" и переопределить ряд свойств. 4 | -------------------------------------------------------------------------------- /docs/components/resvideogallery/events.md: -------------------------------------------------------------------------------- 1 | # События 2 | 3 | Доступны следующие события: 4 | 5 | - **rvgOnBeforeVideoAdd** 6 | - `properties` - параметры запроса 7 | - **rvgOnAfterVideoAdd** - добавление видео 8 | - `video` - экземпляр класса RvgVideos 9 | - `properties` - параметры запроса 10 | - **rvgOnBeforeVideoUpdate** 11 | - **rvgOnAfterVideoUpdate** - обновление видео 12 | - `video` - экземпляр класса RvgVideos 13 | - `properties` - параметры запроса 14 | - **rvgOnBeforeVideoRemove** 15 | - **rvgOnAfterVideoRemove** - удаление видео 16 | - `video` - экземпляр класса RvgVideos 17 | - **rvgOnBeforeThumbUpdate** 18 | - **rvgOnAfterThumbUpdate** - обновление превью для видео 19 | - `properties` - параметры запроса 20 | - `video` - экземпляр класса RvgVideos 21 | - **rvgOnGetVideoEmbed** - получения кода вставки видео 22 | - `data` - массив данных о видео 23 | -------------------------------------------------------------------------------- /docs/components/resvideogallery/setup/vkontakte.md: -------------------------------------------------------------------------------- 1 | # Вконтакте 2 | 3 | - Регистрируемся в Вконтакте, авторизовываемся. 4 | - Менеджер приложений находится [тут](https://vk.com/apps?act=manage), переходим. 5 | - Создаем приложение в Вк. 6 | - Указываем название, выбираем тип приложения **Standalone**. 7 | - Включаем приложение, изменив селект *Состояние* и сохраняем изменения. 8 | - Переходим в настройки и копируем ID приложения. Заменяем {ID приложения} в строке `https://oauth.vk.com/authorize?client_id={ID приложения}&scope=offline,video&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.73&response_type=token` на наш ID приложения и вставляем в строку броузера. 9 | - В появившемся окне нажимаем разрешить. 10 | - Получаем строку следующего вида `https://oauth.vk.com/blank.html#access_token=349252841f7c58495dd5692d8b55ab6460ec23aa60dsfdsfdsfdsfdsfdsfdsfsdfsdfsddfsddfcx&expires_in=0&user_id=30314063` копируем access_token в блокнотик. Если появляется ошибка вида `{"error":"invalid_request»,»error_description":"Security Error"}` необходимо выйти из своего аккаунта ВКонтакте и снова в нем авторизоваться. 11 | - Теперь открываем наш сайт. Переходим в Системные настройки / ResVideoGallery и прописываем скопированное значение access_token в опцию "Access Token для Вконтакте". 12 | -------------------------------------------------------------------------------- /docs/components/scheduler/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Scheduler 3 | description: Планирование отложенных задач 4 | logo: https://modstore.pro/assets/extras/scheduler/logo-lg.png 5 | author: modx-pro 6 | modstore: https://modstore.pro/packages/utilities/scheduler 7 | 8 | items: [ 9 | { text: 'Установка', link: 'installation' }, 10 | { text: 'Создание задания', link: 'create-a-task' }, 11 | { text: 'Планирование задания', link: 'job-scheduling' }, 12 | { text: 'Разработка заданий', link: 'task-development' }, 13 | ] 14 | --- 15 | # Scheduler 16 | 17 | Компонент от создателя MODX Марка Хамстра Scheduler - это менеджер отложенных задач. 18 | Предназначен для планирования задач, которые должны быть запущены по расписанию в фоновом режиме. 19 | Импорт и Экспорт, отправка писем, уведомления и все задачи, не требующие выполнения здесь и сейчас. 20 | 21 | Позволяет очень просто запустить любой сниппет, процессор или просто PHP файл с вашим скриптом в указанное вами время. 22 | -------------------------------------------------------------------------------- /docs/components/seofilter/snippets/index.md: -------------------------------------------------------------------------------- 1 | # Сниппеты 2 | 3 | На данный момент в компоненте 4 сниппета. С их описанием можете ознакомиться на соответствующих страницах по ссылкам внизу страницы. Также вы можете предлагать свои решения для сниппетов. Те решения, которые понадобятся многим - будут написаны и выложены в последующих версиях. 4 | 5 | - [sfWord](/components/seofilter/snippets/sfword) 6 | - [sfLink](/components/seofilter/snippets/sflink) 7 | - [sfMenu](/components/seofilter/snippets/sfmenu) 8 | - [sfSitemap](/components/seofilter/snippets/sfsitemap) 9 | -------------------------------------------------------------------------------- /docs/components/socialtools/snippets/socdialogform.md: -------------------------------------------------------------------------------- 1 | # socDialogForm 2 | 3 | Сниппет предназначен для вывода формы отправки сообщения. 4 | 5 | ## Параметры 6 | 7 | Всего есть 1 параметр это шаблон формы **tplFormCreate**, по умолчанию **soc.sendForm** 8 | 9 | Так же есть проверка в массиве *$_REQUEST* параметра `recipient`, это id пользователя. 10 | Если он есть, то поле username пользователя будет установлен в плейсхолдер `recipient`. 11 | 12 | ## Примеры 13 | 14 | Простейший пример вывода формы 15 | 16 | ```modx 17 | [[!socDialogForm]] 18 | ``` 19 | -------------------------------------------------------------------------------- /docs/components/socialtools/snippets/socdialogreceive.md: -------------------------------------------------------------------------------- 1 | # socDialogReceive 2 | 3 | Сниппет предназначен для вывода формы чтения сообщения. 4 | 5 | Сниппет проверяет наличие параметров **msgID** и **action** в `$_REQUEST` и если их нет, или сообщение не принадлежит авторизированному пользователю - сниппет выдаст ошибку. 6 | 7 | Пример ссылки на ресурс со сниппетом чтения сообщения: 8 | 9 | ```modx 10 | Сообщение 11 | ``` 12 | 13 | ## Параметры 14 | 15 | | Название | По умолчанию | Описание | 16 | | ---------------------- | -------------------- | -------------------------------------- | 17 | | **&tplFormReadInbox** | `soc.readFormInbox` | Шаблон для вывода входящего сообщений | 18 | | **&tplFormReadOutbox** | `soc.readFormOutbox` | Шаблон для вывода исходящего сообщений | 19 | 20 | ### Примеры 21 | 22 | Простейший пример вывода формы 23 | 24 | ```modx 25 | [[!socDialogReceive]] 26 | ``` 27 | -------------------------------------------------------------------------------- /docs/components/textadvs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: textAdvs 3 | description: Умная реклама в контенте страницы 4 | logo: https://modstore.pro/assets/extras/textadvs/logo-lg.png 5 | author: gvozdb 6 | modstore: https://modstore.pro/packages/content/textadvs 7 | 8 | items: [ 9 | { text: 'Как добавить тег', link: 'how-to-add-a-tag' }, 10 | ] 11 | --- 12 | # textAdvs 13 | 14 | **textAdvs** - это компонент для встраивания блоков рекламы в `content` ресурса при отображении страницы пользователю. 15 | 16 | ## Умеет 17 | 18 | - Размещаться до/после определённого по счёту тега, 19 | - Работать только на определённом шаблоне, 20 | - Отображать блоки объявлений один за другим (по мере обновления страницы), 21 | - Подтягивать кастомные теги. 22 | 23 | ![textAdvs](https://file.modx.pro/files/2/2/d/22d43278a36228c5a54741593ed2f7ed.png) 24 | -------------------------------------------------------------------------------- /docs/components/tickets/parts/tip-general-properties.md: -------------------------------------------------------------------------------- 1 | ::: tip 2 | Список может быть расширен общими параметрами [pdoTools](/components/pdotools/general-properties) так как Tickets работает на этой библиотеке. 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/components/tickets/parts/warning-demo.md: -------------------------------------------------------------------------------- 1 | ::: warning Важно 2 | Важно помнить что компонент Tickets поставляется без демо данных и без шаблонов. По этому вам нужно предварительно их создать. Так же секция тикетов и сам тикет это расширенный стандартный «modDocument» по этому имеет все те же TV поля, плейсхолдеры и логика работы. 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/components/tickets/snippets/ticketmeta.md: -------------------------------------------------------------------------------- 1 | # TicketMeta 2 | 3 | Выводит информацию о текущем тикете, так же позволяет голосовать за тикет на его собственной странице. 4 | 5 | ::: tip 6 | С версии 1.4.0 Сниппет может использоваться с любыми ресурсами MODX 7 | ::: 8 | 9 | ## Параметры вызова сниппета 10 | 11 | | Название | По умолчанию | Описание | 12 | | --------------- | ------------------ | --------------------------------------------------------------------- | 13 | | **&getSection** | `1` | Сделать дополнительный запрос в БД для получения родительской секции? | 14 | | **&getUser** | `1` | Сделать дополнительный запрос в БД для получения профиля автора? | 15 | | **&tpl** | `tpl.Tickets.meta` | Чанк оформления информации о тикете. | 16 | 17 | ## Примеры вызова 18 | 19 | - Стандартный вызов сниппета 20 | 21 | ```modx 22 | [[!TicketMeta]] 23 | ``` 24 | 25 | - Что бы посмотреть все доступные стандартные плейсхолдеры 26 | 27 | ```modx 28 | [[!TicketMeta? &tpl=``]] 29 | ``` 30 | -------------------------------------------------------------------------------- /docs/components/userauthhash/development/events.md: -------------------------------------------------------------------------------- 1 | # События UserAuthHash 2 | 3 | Доступны следующие события: 4 | 5 | * `uahOnBeforeGetAuthHash` 6 | * `uahOnGetAuthHash` - получение хэш-кода 7 | *`object` - хэш-код объект 8 | *`user` - пользователь объект 9 | * `uahOnBeforeProcessAuthHash` 10 | * `uahOnProcessAuthHash` - обработка хэш-кода 11 | *`object` - хэш-код объект 12 | *`user` - пользователь объект 13 | * `uahOnBeforeRemoveAuthHash` 14 | * `uahOnRemoveAuthHash` - удаление хэш-кода 15 | *`user` - пользователь объект 16 | -------------------------------------------------------------------------------- /docs/components/userauthhash/development/extensions.md: -------------------------------------------------------------------------------- 1 | # Расширения 2 | 3 | Использование в сторонних компонентах: 4 | 5 | ## Создание хэш-кода авторизации 6 | 7 | ```php 8 | $options = [ 9 | 'user' => 'test@gmail.com', 10 | 'lifeTime' => '1m' // срок жизни хэш-кода 1 месяц 11 | ]; 12 | /** @var UserAuthHash $UserAuthHash */ 13 | if ($UserAuthHash = $modx->getService('userauthhash.UserAuthHash', '', MODX_CORE_PATH.'components/userauthhash/model/')) { 14 | $hash = $UserAuthHash->getAuthHash($options); 15 | } 16 | ``` 17 | 18 | ## Удаление хэш-кода авторизации 19 | 20 | ```php 21 | $options = [ 22 | 'user' => 'test@gmail.com', 23 | ]; 24 | /** @var UserAuthHash $UserAuthHash */ 25 | if ($UserAuthHash = $modx->getService('userauthhash.UserAuthHash', '', MODX_CORE_PATH.'components/userauthhash/model/')) { 26 | $hash = $UserAuthHash->removeAuthHash($options); 27 | } 28 | ``` 29 | -------------------------------------------------------------------------------- /docs/components/userevents/development/extensions.md: -------------------------------------------------------------------------------- 1 | # Расширения 2 | 3 | Доступны следующие расширения: 4 | 5 | ## Событие `event` 6 | 7 | - `changeStatus` - сменить "статус" события 8 | 9 | ## Пользователь `user` 10 | 11 | - `getUserId` - получить "идентификатор" пользователя 12 | - `getUserLang` - получить "язык" пользователя 13 | -------------------------------------------------------------------------------- /docs/components/userevents/development/services/delivery.md: -------------------------------------------------------------------------------- 1 | # Доставка 2 | 3 | Класс доставки реализовывает интерфейс `msDeliveryInterface` 4 | 5 | Никак не используется, нужен только для задания обязательный полей заказа и наименования доставки в заказе. 6 | -------------------------------------------------------------------------------- /docs/components/userevents/development/services/payment.md: -------------------------------------------------------------------------------- 1 | # Оплата 2 | 3 | Стандартный [miniShop2][0102030304] 4 | 5 | [0102030304]: /components/minishop2/development/services/payment 6 | -------------------------------------------------------------------------------- /docs/components/userevents/interface/events.md: -------------------------------------------------------------------------------- 1 | # Событие 2 | 3 | ## Создать событие 4 | 5 | ![Создать событие](https://file.modx.pro/files/5/2/8/5288681d9f84a9ddc7cda49fc738bf13.jpg) 6 | 7 | Для создании события необходимо указать ресурс и пользователя к которому оно будет привязано. Опции события будут доступны после его сохранения. 8 | 9 | ## Изменение события 10 | 11 | ![Изменение события](https://file.modx.pro/files/6/2/d/62dac397370b87d391bf90f980284858.jpg) 12 | -------------------------------------------------------------------------------- /docs/components/userevents/interface/index.md: -------------------------------------------------------------------------------- 1 | # Интерфейс 2 | 3 | Основная панель управления находятся в отдельном разделе сайта, доступном через меню. 4 | Содержит следующие вкладки: 5 | 6 | ## События 7 | 8 | Вкладка, на которой собраны [события][4]. Доступна сортировка и поиск. 9 | Действия: **создать**/**изменить**/**удалить** событие. 10 | 11 | ![События](https://file.modx.pro/files/2/9/e/29ef5c704b769c501e91c6f9021abd00.jpg) 12 | 13 | ## Статусы 14 | 15 | Вкладка, на которой собраны [статусы][8]. 16 | Действия: **создать**/**изменить**/**удалить** статус. 17 | 18 | ![Статусы](https://file.modx.pro/files/2/6/2/262a170102ccddd6bcefad4bc45fc195.jpg) 19 | 20 | [4]: /components/userevents/interface/events 21 | [8]: /components/userevents/interface/statuses 22 | -------------------------------------------------------------------------------- /docs/components/userevents/interface/orders.md: -------------------------------------------------------------------------------- 1 | # Заказы 2 | 3 | Панель управления заказами UserEvents представлена в компоненте [miniShop2][020103]. 4 | Заказы контента идентифицируются по ключу **context** 5 | 6 | ![Заказы - 1](https://file.modx.pro/files/b/e/c/bec372efc0d99bdbd326b44cf9950142.jpg) 7 | 8 | Идентификатор и опция события сохраняется в опциях продукта заказа. 9 | 10 | ![Заказы - 2](https://file.modx.pro/files/5/b/e/5be8ad9bdc844869bee3483f4c06b732.jpg) 11 | 12 | [020103]: /components/minishop2/interface/orders 13 | -------------------------------------------------------------------------------- /docs/components/userevents/interface/settings.md: -------------------------------------------------------------------------------- 1 | # Настройки UserEvents 2 | 3 | Настройки UserEvents расположены в **Системные настройки** > **UserEvents** 4 | 5 | ## Основные 6 | 7 | Содержит основные настройки: 8 | 9 | - `{working_templates}` - активные шаблоны. Список id шаблонов через запятую, для которых нужно активировать функционал. 10 | - `{front_css}` - файл с css для подключения на фронте. 11 | - `{front_js}` - файл с javascript для подключения на фронте. 12 | 13 | ## Заказ 14 | 15 | Содержит настройки необходимые для заказа: 16 | 17 | - `{order_handler_class}` - имя класса, который реализует логику оформления заказа. 18 | - `{order_resource_id}` - - идентификатор страницы, на которую будет произведен редирект после оформление заказа. 19 | -------------------------------------------------------------------------------- /docs/components/userevents/interface/statuses.md: -------------------------------------------------------------------------------- 1 | # Статусы 2 | 3 | ## Создать / Изменить статус 4 | 5 | Для создании статусы необходимо задать название. Указать флаг активности и резерва. 6 | Дефолтные статусы: 7 | 8 | - `новое` - задается при создании 9 | - `активно` - характеризует активность 10 | - `завершено` - характеризует завершенность 11 | - `отменено` - характеризует неактивность 12 | 13 | Возможно создание статусов для реализации своей логики работы компонента. 14 | Наличие флага `резерв` у события запрещает создание другого события на данное время. 15 | 16 | ## Смена статуса 17 | 18 | Сменить статус можно из админки сайта, либо задействовав какой либо обработчик. 19 | -------------------------------------------------------------------------------- /docs/components/userevents/snippets/index.md: -------------------------------------------------------------------------------- 1 | # Сниппеты 2 | 3 | Все сниппеты UserEvents работают при помощи pdoTools и рассчитывают на использование [Fenom][010103] в чанках. 4 | 5 | Это позволяет: 6 | 7 | - сократить общее количество чанков 8 | - повысить удобство работы 9 | - ускорить работу 10 | - делать более сложные чанки, за счёт продвинутой проверки условий через функции Fenom 11 | 12 | [010103]: /components/pdotools/parser 13 | -------------------------------------------------------------------------------- /docs/components/xcalc/field-types.md: -------------------------------------------------------------------------------- 1 | # Типы полей 2 | 3 | Компонент имеет список типов полей, каждое из которых работает по своему. 4 | 5 | ## Radio 6 | 7 | Одиночный выбор. Пожалуй, самый востребованный тип поля во многих калькуляторах. Тип msProducts частично реализован на нём. 8 | 9 | ## Checkbox 10 | 11 | Множественный выбор или вообще без выбора значения. Можно использовать для каких-то дополнительных опций. 12 | 13 | ## msProducts 14 | 15 | Данный тип поля позволяет вывести список товаров с возможностью выбора одного из них для использования его цены в расчёте. 16 | 17 | ## Number 18 | 19 | Числовое поле. Можно использовать для указания длины/ширины/высоты/кол-ва и т.п. 20 | 21 | ## Text 22 | 23 | Текстовое поле. Можно использовать для указания комментария или чего-то подобного. 24 | -------------------------------------------------------------------------------- /docs/components/xcalc/jquery-events.md: -------------------------------------------------------------------------------- 1 | # jQuery события 2 | 3 | Подобная логика позволяет навесить свой JS код на фронт-энд события калькулятора. 4 | 5 | ## xccResultsResponse 6 | 7 | Сработает при успешном/неуспешном расчёте. 8 | 9 | ## Пример 10 | 11 | ```js 12 | $(document).ready(function() { 13 | $(document).on('xccResultsResponse', function (e, response, $form, propkey) { 14 | if (response.success) { 15 | console.log('response', response); // ответ сервера 16 | console.log('$form', $form); // jQuery объект формы 17 | console.log('propkey', propkey); // ключ текущего калькулятора 18 | 19 | let $wrap = $form.closest('[data-xcc-propkey="' + propkey + '"]'); 20 | console.log('$wrap', $wrap); // блок-обёртка 21 | } 22 | }); 23 | }); 24 | ``` 25 | -------------------------------------------------------------------------------- /docs/components/xcalc/snippets/xcalc.md: -------------------------------------------------------------------------------- 1 | # xCalc 2 | 3 | Основной сниппет компонента, который реализует вывод формы калькулятора на фронт-энде. 4 | 5 | ## Параметры 6 | 7 | | Название | По умолчанию | Описание | 8 | | -------------- | ------------------- | ----------------------------------------- | 9 | | **id** | `0` | ID калькулятора, который будем рендерить. | 10 | | **tplOuter** | `tpl.xCalc.outer` | Чанк вывода калькулятора. | 11 | | **tplResults** | `tpl.xCalc.results` | Чанк вывода результатов расчёта. | 12 | 13 | ## Пример 14 | 15 | ```fenom 16 | {'!xCalc' | snippet : [ 17 | 'id' => 1, 18 | 'tplOuter' => 'tpl.xCalc.outer', 19 | 'tplResults' => 'tpl.xCalc.results', 20 | ]} 21 | ``` 22 | -------------------------------------------------------------------------------- /docs/components/xparser/cron.md: -------------------------------------------------------------------------------- 1 | # Скрипт запуска заданий из Cron 2 | 3 | Скрипт, запускающий задания на парсинг. Можно запускать, как из консоли (например, крон), так и из веба. 4 | 5 | ## Пример задания для крона 6 | 7 | ```shell 8 | 0 2 * * * php /home_path/core/components/xparser/cron/parser.php ids debug_mode 9 | ``` 10 | 11 | - **ids** - id задания, которое необходимо запустить. Можно несколько, через запятую. Можно не указывать (будет запущено всё активное). 12 | - **debug_mode** - 1 или 0, в зависимости от того, запускаем ли мы скрипт в дебаг режиме. 13 | -------------------------------------------------------------------------------- /docs/components/xparser/events/xparseronafterpagescollected.md: -------------------------------------------------------------------------------- 1 | # xParserOnAfterPagesCollected 2 | 3 | **Событие доступно с версии 1.11.25**. 4 | 5 | После обхода всех страниц задания и получения обработанных полей, но **перед** получением полей подзаданий. 6 | 7 | Одно из интересных событий, т.к. позволяет менять данные статей, возвращая массив `$rows` в плагине: 8 | 9 | ```$modx->event->returnedValues['rows'] = $rows;``` 10 | 11 | 12 | ## Параметры 13 | 14 | - `xParser $xp` — экземпляр основного класса компонента, 15 | - `xpParser $parser` — экземпляр класса парсера, 16 | - `array $task` — массив задания, 17 | - `array $rows` — массив со списком обработанных статей. 18 | -------------------------------------------------------------------------------- /docs/components/xparser/events/xparseronbeforetaskactions.md: -------------------------------------------------------------------------------- 1 | # xParserOnBeforeTaskActions 2 | 3 | После формирования списка статей с данными из подзаданий. Перед добавлением ресурсов. 4 | 5 | _Пожалуй, самое интересное событие, т.к. позволяет менять данные у статей либо вообще остановить задание парсинга, ничего при этом не добавив._ 6 | 7 | ## Параметры 8 | 9 | - `xParser $xp` — экземпляр основного класса компонента, 10 | - `xpParser $parser` — экземпляр класса парсера, 11 | - `array $task` — массив задания, 12 | - `array $rows` — массив со списком обработанных статей. 13 | -------------------------------------------------------------------------------- /docs/components/xparser/events/xparseronbeforetaskparse.md: -------------------------------------------------------------------------------- 1 | # xParserOnBeforeTaskParse 2 | 3 | После получения данных страницы и разбора её на список статей для парсинга. Перед обработкой списка полей. 4 | 5 | Срабатывает, только если это не подзадача и не в режиме "Вернуть значение поля". 6 | 7 | **С версии 1.8.11** позволяет скорректировать список статей для парсинга изменив возвращаемый параметр `$items`. 8 | 9 | ## Параметры 10 | 11 | - `xParser $xp` — экземпляр основного класса компонента, 12 | - `xpParser $parser` — экземпляр класса парсера, 13 | - `array $task` — массив задания, 14 | - `array $items` — массив со списком необработанных статей, 15 | - `array $fields` — массив со списком полей для обработки статей и получения необходимых данных. 16 | -------------------------------------------------------------------------------- /docs/components/xparser/events/xparseronfiltersourceitems.md: -------------------------------------------------------------------------------- 1 | # xParserOnFilterSourceItems 2 | 3 | ::: tip 4 | Событие доступно с версии 1.8.12 5 | ::: 6 | 7 | Сразу после получения чистых данных из источника и разбиения их на список статей. 8 | 9 | Срабатывает в любом случае: и для подзадач, и в режиме "Вернуть значение поля", и для всего остального. 10 | 11 | Не сработает, только если из источника ничего не получено, то есть параметр `$items` пуст. 12 | 13 | Позволяет скорректировать список статей для парсинга изменив возвращаемый параметр `$items`. 14 | 15 | ## Параметры 16 | 17 | - `xParser $xp` — экземпляр основного класса компонента, 18 | - `xpParser $parser` — экземпляр класса парсера, 19 | - `array $task` — массив задания, 20 | - `array $items` — массив со списком необработанных статей. 21 | -------------------------------------------------------------------------------- /docs/components/xparser/events/xparserontaskitemparse.md: -------------------------------------------------------------------------------- 1 | # xParserOnTaskItemParse 2 | 3 | После обработки списка полей. Перед получением данных из подзадания, если таковое есть. 4 | 5 | ## Параметры 6 | 7 | - `xParser $xp` — экземпляр основного класса компонента, 8 | - `xpParser $parser` — экземпляр класса парсера, 9 | - `array $task` — массив задания, 10 | - `string $item` — строка с необработанным кодом статьи, 11 | - `array $row` — массив с обработанными полями статьи. 12 | -------------------------------------------------------------------------------- /docs/components/xparser/events/xparserontaskparsedone.md: -------------------------------------------------------------------------------- 1 | # xParserOnTaskParseDone 2 | 3 | **Событие доступно с версии 1.8.15**. 4 | 5 | По окончанию парсинга задания. 6 | 7 | Будет запущено один раз, если пагинация выключена или включен режим пагинации _"Сначала собрать все данные, а потом перейти к действиям с ресурсами"_. 8 | 9 | Будет запущено для каждой страницы отдельно при включённом режиме пагинации _"Выполнять действия с ресурсами, по мере посещения страниц парсером"_. 10 | 11 | ## Параметры 12 | 13 | - `xParser $xp` — экземпляр основного класса компонента, 14 | - `xpParser $parser` — экземпляр класса парсера, 15 | - `array $task` — массив задания, 16 | - `array $stats` — массив со статистикой отработанного задания. 17 | -------------------------------------------------------------------------------- /docs/components/xparser/events/xparserontaskrowsprepared.md: -------------------------------------------------------------------------------- 1 | # xParserOnTaskRowsPrepared 2 | 3 | **Событие доступно с версии 1.11.8**. 4 | 5 | После формирования обработанных данных ресурса, но **перед** скачиванием медиа-контента. 6 | 7 | Одно из интересных событий, т.к. позволяет менять данные статей, возвращая массив `$rows` в плагине: 8 | 9 | ```$modx->event->returnedValues['rows'] = $rows;``` 10 | 11 | 12 | ## Параметры 13 | 14 | - `xParser $xp` — экземпляр основного класса компонента, 15 | - `xpParser $parser` — экземпляр класса парсера, 16 | - `array $task` — массив задания, 17 | - `array $rows` — массив со списком обработанных статей. 18 | -------------------------------------------------------------------------------- /docs/components/xparser/gallery.md: -------------------------------------------------------------------------------- 1 | # Работа с галереями 2 | 3 | С версии 1.5.0 компонент поддерживает работу с ms2Gallery и miniShop2 галереями. 4 | 5 | ## Пример 6 | 7 | Выгружать изображения в компонент-галерею достаточно просто. Нужно все изображения собрать в JSON массив при помощи Fenom. 8 | 9 | Таким кодом я собрал все изображения, используемые в контенте спарсенной записи, в JSON массив: 10 | 11 | ```fenom 12 | @INLINE {($content | preg_get_all : '!https?://[^"]+\.(?:jpe?g|png|gif)!Ui') | toJSON} 13 | ``` 14 | 15 | На выходе, компонент превращает его в обычный массив PHP и по-очереди выгружает в галерею. 16 | 17 | Важно, чтобы отдаваемый в поле галереи JSON, был такого вида: 18 | 19 | ```json 20 | ["http://site.ru/image1.jpg","http://site.ru/image2.jpg", ...] 21 | ``` 22 | 23 | Тогда все эти изображения попадут в выбранную вами галерею. 24 | -------------------------------------------------------------------------------- /docs/components/xparser/minishop2.md: -------------------------------------------------------------------------------- 1 | # Работа с miniShop2 товарами 2 | 3 | С версии 1.5.0 в компонент добавлена поддержка свойств/опций miniShop2 товаров. 4 | Начиная с этой версии появилась возможность парсить товары магазина. 5 | 6 | ## Особенности 7 | 8 | Есть ряд особенностей, которые следует соблюдать, при создании miniShop2 товаров при помощи xParser. 9 | 10 | 1. В конфигурации задания нужно выбрать раздел с типом «Категория товаров». 11 | 2. В полях задания нужно создать поле **resource | class_key**, со значением по-умолчанию: `msProduct` 12 | 3. Для корректной выгрузки таких полей, как `tags`, `color`, `size` и т.п. при создании полей задания была добавлена настройка **Раскодировать JSON строку в массив**. Дело в том, что при создании товаров через процессор, miniShop2 ждет от нас PHP массив для этих полей, поэтому для корректной выгрузки полей такого типа, нужно раскодировать JSON в PHP. К примеру, вот: 13 | 14 | ![Особенности](https://file.modx.pro/files/4/0/f/40ffc7e65359342dd91976e475c6bd38.png) 15 | 16 | Все остальные действия типовые. Почитать подробнее можно в разделах: 17 | 18 | - [Парсер RSS лент][1] 19 | - [Парсер HTML контента + Совмещенные задания][2] 20 | 21 | [1]: /components/xparser/parser-rss 22 | [2]: /components/xparser/parser-html 23 | -------------------------------------------------------------------------------- /docs/components/xparser/pagination.md: -------------------------------------------------------------------------------- 1 | # Пагинация 2 | 3 | С версии 1.4.0 внедрена поддержка пагинации на сайте-источнике. Теперь можно выкачивать все записи, включая самые старые. 4 | 5 | ## Интерфейс 6 | 7 | В основном окне задания появилась вкладка "Пагинация", в которой можно указать: 8 | 9 | 1. УРЛ с параметром страницы, 10 | 2. Диапазон страниц, по которым пройтись, 11 | 3. Поле со списком исключенных страниц (через запятую или пробел). *К слову, сюда пакет записывает страницы, по которым он прошел.* 12 | 13 | ![Интерфейс](https://file.modx.pro/files/c/5/0/c5063e99805184729cdac698fff24049.png) 14 | 15 | ## Особенности 16 | 17 | Есть некоторые особенности по использованию и заполнению первых трёх полей. 18 | 19 | ### УРЛ с параметром страницы 20 | 21 | В этом поле можно использовать 2 параметра: 22 | 23 | 1. `{$url}` или `[[+url]]` - это основной УРЛ задания, 24 | 2. `{$page}` или `[[+page]]` - это номер страницы. 25 | 26 | ### Диапазон страниц 27 | 28 | Можно указать *от меньшего к большему* или *от большего к меньшему*, что соответственно укажет компоненту, в каком направлении производить проход. 29 | -------------------------------------------------------------------------------- /docs/components/yandexmaps2/events/examples.md: -------------------------------------------------------------------------------- 1 | # Примеры 2 | 3 | ## Проверка карты в плагине 4 | 5 | С помощью параметра `$snippetProperties` можно проверить, из какой карты был вызван плагин: 6 | 7 | Вызов сниппета: 8 | 9 | ```fenom 10 | {'!YandexMaps2' | snippet : [ 11 | 'map' => 'custom-map', 12 | ... 13 | ]} 14 | ``` 15 | 16 | Код плагина: 17 | 18 | ```php 19 | switch ($modx->event->name) { 20 | case 'ymOnLoadObjects': 21 | if ($snippetProperties['map'] != 'custom-map') { 22 | break; 23 | } 24 | 25 | /** 26 | * Логика плагина 27 | */ 28 | 29 | break; 30 | } 31 | ``` 32 | -------------------------------------------------------------------------------- /docs/components/yandexmaps2/events/index.md: -------------------------------------------------------------------------------- 1 | # События плагинов 2 | 3 | С версии 1.1.0 пакет приобрёл **события плагинов**. Благодаря этому появилась возможность внедрять свою логику перед выдачей объектов карте. Например, можно изменить заголовок метки или вовсе добавить свой объект в массив уже существующих объектов карты. 4 | 5 | _Список событий прописан в порядке их исполнения при работе компонента._ 6 | 7 | - [ymOnLoadObjects](/components/yandexmaps2/events/ymonloadobjects) 8 | - [Примеры](/components/yandexmaps2/events/examples) 9 | -------------------------------------------------------------------------------- /docs/components/yandexmaps2/events/ymonloadobjects.md: -------------------------------------------------------------------------------- 1 | # ymOnLoadObjects 2 | 3 | Плагин запускается на каждый ресурс отдельно. У ресурса может быть сколько угодно объектов карты. 4 | 5 | Срабатывает после загрузки списка объектов карты из базы, перед обработкой текстовых данных у объектов. 6 | 7 | ## Параметры 8 | 9 | - `array $data` — данные выборки, обычно имеют структуру: 10 | 11 | ```php 12 | Array 13 | ( 14 | parent => (int) 15 | class => (string) 16 | list => (string) 17 | ) 18 | ``` 19 | 20 | - `array $objects` — список объектов карты, 21 | - `array $snippetProperties` — параметры сниппета, из которого вызывается подгрузка объектов. 22 | -------------------------------------------------------------------------------- /docs/components/yandexmaps2/jquery-events.md: -------------------------------------------------------------------------------- 1 | # jQuery события 2 | 3 | С версии 1.2.0 в компонент были добавлены jQuery триггеры. 4 | Подобная логика позволяет навесить свой JS код на фронт-энд события карты. 5 | 6 | ## ymOnLoadMap 7 | 8 | Сработает при загрузке карты. 9 | 10 | ### Пример 11 | 12 | ```js 13 | $(document).ready(function() { 14 | $(document).on('ymOnLoadMap', function(e, ym2, map) { 15 | console.log('ym2', ym2); // Экземпляр класса YandexMaps2 16 | console.log('map', map); // Объект карты 17 | }); 18 | }); 19 | ``` 20 | -------------------------------------------------------------------------------- /docs/components/yandexmaps2/map-constructor.md: -------------------------------------------------------------------------------- 1 | # Конструктор карт 2 | 3 | Вся основная работа компонента заключена в конструкторе карт. Любая карта начинается отсюда. 4 | Конструктор поддерживает 4 типа объектов: 5 | 6 | 1. Точки, метки 7 | 2. Ломаные линии 8 | 3. Многоугольники 9 | 4. Круги 10 | 11 | **Важной особенностью** использования конструктора карт в бэкенде при редактировании ресурсов/пользователей является то, что после всех изменений, необходимо сохранить объект ресурса/пользователя. Иначе изменения на карте применены **не будут**! 12 | 13 | _P.S. Библиотека конструктора для Яндекс Карт писалась мной с нуля и, вскоре, есть планы выложить ее в открытый доступ для общего пользования разработчиками._ 14 | -------------------------------------------------------------------------------- /docs/en/components/bannery/interface/banners.md: -------------------------------------------------------------------------------- 1 | # Ads 2 | 3 | - To create a Ads go to **Components** -> **BannerY** 4 | - On the tab **Ads** click **New ad** and then save the changes. 5 | 6 | [![](https://file.modx.pro/files/e/6/1/e610c64fcbe0bcfc66f1e692e9cb551bs.jpg)](https://file.modx.pro/files/e/6/1/e610c64fcbe0bcfc66f1e692e9cb551b.png) 7 | 8 | In the pop-up window you will need to fill: 9 | 10 | - **Name** 11 | - **Media source** 12 | - **Active** 13 | - **New image** 14 | - **URL** 15 | - **Text of banner** 16 | - **Positions** *First you need to create them.* 17 | 18 | [![](https://file.modx.pro/files/b/4/1/b4158c92313074ea19310728d83191c9s.jpg)](https://file.modx.pro/files/b/4/1/b4158c92313074ea19310728d83191c9.png) 19 | 20 | [![](https://file.modx.pro/files/b/4/7/b477805bf083372d0f4647f55330638es.jpg)](https://file.modx.pro/files/b/4/7/b477805bf083372d0f4647f55330638e.png) 21 | -------------------------------------------------------------------------------- /docs/en/components/bannery/interface/positions.md: -------------------------------------------------------------------------------- 1 | # Positions 2 | 3 | - To create a position, go to **Components** -> **BannerY** 4 | - On the tab **Positions** click **New position** and then save the changes. 5 | 6 | [![](https://file.modx.pro/files/e/a/d/eada167eaf16509c676548a84430f284s.jpg)](https://file.modx.pro/files/e/a/d/eada167eaf16509c676548a84430f284.png) 7 | 8 | [![](https://file.modx.pro/files/2/0/f/20f18bbeae2329f068cb16bc77368388s.jpg)](https://file.modx.pro/files/2/0/f/20f18bbeae2329f068cb16bc77368388.png) 9 | 10 | [![](https://file.modx.pro/files/f/7/8/f7833d45e234d2e63d571a9d71b933e4s.jpg)](https://file.modx.pro/files/f/7/8/f7833d45e234d2e63d571a9d71b933e4.png) 11 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/examples/form/index.md: -------------------------------------------------------------------------------- 1 | # Form Layouts 2 | 3 | Below is a list of the form markup of popular CSS frameworks. 4 | 5 | - [Bootstrap](/en/components/fetchit/examples/form/bootstrap) 6 | - [Bulma](/en/components/fetchit/examples/form/bulma) 7 | - [UIkit](/en/components/fetchit/examples/form/uikit) 8 | - [Fomantic-UI](/en/components/fetchit/examples/form/fomantic) 9 | - [Pico.css](/en/components/fetchit/examples/form/pico) 10 | - [Cirrus CSS](/en/components/fetchit/examples/form/cirrus) 11 | - [turretcss](/en/components/fetchit/examples/form/turretcss) 12 | - [Vanilla](/en/components/fetchit/examples/form/vanilla) 13 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/examples/modals/index.md: -------------------------------------------------------------------------------- 1 | # Modals 2 | 3 | This section provides a list of examples of FetchIt integration with modal window plugins. 4 | 5 | - [Bootstrap](/en/components/fetchit/examples/modals/bootstrap) 6 | - [tingle.js](/en/components/fetchit/examples/modals/tinglejs) 7 | - [Micromodal.js](/en/components/fetchit/examples/modals/micromodaljs) 8 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/examples/modals/micromodaljs.md: -------------------------------------------------------------------------------- 1 | # Micromodal.js 2 | 3 | In this section, let's take a few examples with [Micromodal.js](https://micromodal.vercel.app/) modals. 4 | 5 | ## Closing a modal 6 | 7 | If your form is in a modal window and you would like to close it after a successful form submission, you should use the [`fetchit:success`](/en/components/fetchit/frontend/events#fetchitsuccess) event to solve the issue. 8 | 9 | ```js 10 | document.addEventListener('fetchit:success', ({ detail }) => { 11 | const { form } = detail; 12 | 13 | // Define the ID of the window relative to the form 14 | 15 | MicroModal.close('modal-id'); 16 | }); 17 | ``` 18 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/examples/modals/tinglejs.md: -------------------------------------------------------------------------------- 1 | # tingle.js 2 | 3 | In this section, let's see an example of working with modal windows [tingle.js](https://tingle.robinparisi.com/). 4 | 5 | ## Opening a modal 6 | 7 | If you have the task of opening a modal window after a successful form submission, it can be solved in two ways: 8 | 9 | 1. Using the [`fetchit:success`](/en/components/fetchit/frontend/events#fetchitsuccess) event. 10 | 11 | ```js 12 | const successModal = new tingle.modal(); 13 | 14 | document.addEventListener('fetchit:success', ({ detail: { response: { message } } }) => { 15 | successModal.setContent(message); 16 | successModal.open(); 17 | }); 18 | ``` 19 | 20 | 2. With [`FetchIt.Message`](/en/components/fetchit/frontend/class#fetchitmessage). 21 | 22 | ```js 23 | const successModal = new tingle.modal(); 24 | 25 | FetchIt.Message = { 26 | // ... 27 | success (message) { 28 | successModal.setContent(message); 29 | successModal.open(); 30 | }, 31 | } 32 | ``` 33 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/examples/notifications/index.md: -------------------------------------------------------------------------------- 1 | # Notifications 2 | 3 | Although **FetchIt** doesn't have any dependencies, everything is prepared to plug in any off-the-shelf or your own library for displaying messages with minimal code. 4 | 5 | 6 | 7 | - [Notyf](/en/components/fetchit/examples/notifications/notyf) 8 | - [SweetAlert2](/en/components/fetchit/examples/notifications/sweetalert2) 9 | - [iziToast](/en/components/fetchit/examples/notifications/izitoast) 10 | - [Notiflix.Notify](/en/components/fetchit/examples/notifications/notiflix-notify) 11 | - [Notie](/en/components/fetchit/examples/notifications/notie) 12 | - [Awesome Notifications](/en/components/fetchit/examples/notifications/awesome-notifications) 13 | - [Toastify JS](/en/components/fetchit/examples/notifications/toastifyjs) 14 | - [AlertifyJS](/en/components/fetchit/examples/notifications/alertifyjs) 15 | - [PNotify](/en/components/fetchit/examples/notifications/pnotify) 16 | - [toastr](/en/components/fetchit/examples/notifications/toastr) 17 | - [jGrowl](/en/components/fetchit/examples/notifications/jgrowl) 18 | - [NOTY](/en/components/fetchit/examples/notifications/noty) 19 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/examples/validation/index.md: -------------------------------------------------------------------------------- 1 | # Validation 2 | 3 | List of examples of FetchIt integration with popular validation libraries. 4 | 5 | - [Iodine](/en/components/fetchit/examples/validation/iodine) 6 | - [yup](/en/components/fetchit/examples/validation/yup) 7 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/parts/action.info.md: -------------------------------------------------------------------------------- 1 | ::: info INFO 2 | Markup validators still swear by the empty `action` attribute, so you must specify a link to the page in it. 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/parts/notifier.tip.md: -------------------------------------------------------------------------------- 1 | ::: tip TIP 2 | From version 1.1.0 and 3.1.0 a system setting [`fetchit.frontend.default.notifier`](/en/components/fetchit/settings#fetchitfrontenddefaultnotifier) is available, if enabled, which will display popup notifications [Notyf](/en/components/fetchit/examples/notifications/notyf). 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/parts/validation.warning.md: -------------------------------------------------------------------------------- 1 | ::: danger DANGER 2 | Client-side validation is insecure and should only be implemented for the convenience of the user. 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/en/components/fetchit/settings.md: -------------------------------------------------------------------------------- 1 | # Settings 2 | 3 | FetchIt has several settings for ease of use. 4 | 5 | ## `fetchit.frontend.js` 6 | 7 | - Default: `[[+assetsUrl]]js/default.min.js` 8 | 9 | The JavaScript file to include on the frontend. 10 | 11 | ## `fetchit.frontend.js.classname` 12 | 13 | - Default: `FetchIt` 14 | 15 | The JavaScript class name whose instance will be responsible for form processing. 16 | 17 | ## `fetchit.frontend.input.invalid.class` 18 | 19 | CSS class that will be added to invalid input field. 20 | 21 | ## `fetchit.frontend.custom.invalid.class` 22 | 23 | CSS class that will be added to invalid custom element. 24 | 25 | ## `fetchit.frontend.default.notifier` 26 | 27 | - Default: `false` 28 | 29 | Load the default notification library. 30 | -------------------------------------------------------------------------------- /docs/en/components/formalicious/categories.md: -------------------------------------------------------------------------------- 1 | # Categories 2 | 3 | Organising your forms from the start is highly recommended. You can do this by creating Form Categories. 4 | Categories allow you to group forms into tabs. 5 | 6 | Create tabs by going to the Formalicious page in the Extras-menu and click on **Admin panel**. 7 | 8 | Manage your **Categories** in the first tab. The category-name will be displayed as the tab-name, followed by the description, 9 | which can be used to explain to your users what the category is used for. 10 | -------------------------------------------------------------------------------- /docs/en/components/formalicious/faqs.md: -------------------------------------------------------------------------------- 1 | # FAQs 2 | 3 | We're collecting the questions we get most often into a list of FAQs. 4 | 5 | ## How do I show my created form? 6 | 7 | Make sure that you marked your form as Published, and then add the following snippet call where you want the form to appear (without the spaces): 8 | 9 | ```modx 10 | [[!renderForm? &form=`FORM ID HERE`]] 11 | ``` 12 | 13 | You can also use a template variable to select the form, and to place the template variable value in the form property. 14 | 15 | ## I want to setup custom validation per field 16 | 17 | This can be accomplished by going to the creating (or editing) a field-type in the admin-panel. 18 | You can mention a comma-separated list of FormIt-validators in the **Validation** field in the dialog-window. 19 | 20 | ## I don't like the emails sent by Formalicious 21 | 22 | Everything is customizable by using chunks or FormIt parameters. 23 | First, create a duplicate of the email-chunk (`emailFormTpl` or `fiarTpl`) you wish to change and rename it. 24 | Then go to the form which should use this new chunk. 25 | 26 | Go to the **Advanced** section and click **Add parameter**. 27 | Set the parameter-key to **emailTpl** or **fiarTpl** and set the value to the chunk you just made. 28 | -------------------------------------------------------------------------------- /docs/en/components/formalicious/media-sources.md: -------------------------------------------------------------------------------- 1 | # Media Sources 2 | 3 | Formalicious contains one **System Setting**: `formalicious.source`, which defaults to `1`. 4 | This is the default **Filesystem** media source. 5 | 6 | Set this to the media source ID you wish to use when selecting email-attachments for auto-replies. 7 | 8 | You can find an overview of all your media sources by clicking **Media Sources** in the **Media** menu. 9 | 10 | The first column in the media sources table can be used as the ID of the `formalicious.source` setting. 11 | -------------------------------------------------------------------------------- /docs/en/components/hybridauth/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: HybridAuth 3 | description: Authorization through social networks and other services 4 | logo: https://modstore.pro/assets/extras/hybridauth/logo-lg.jpg 5 | author: biz87 6 | modstore: https://en.modstore.pro/packages/users/hybridauth 7 | modx: https://extras.modx.com/package/hybridauth 8 | repository: https://github.com/modx-pro/modx-hybridauth 9 | 10 | items: [ 11 | { 12 | text: 'Snippets', 13 | items: [ 14 | { text: 'HybridAuth', link: 'snippets/hybridauth', }, 15 | { text: 'haProfile', link: 'snippets/haprofile', }, 16 | ], 17 | }, 18 | ] 19 | --- 20 | # HybridAuth 21 | 22 | Component for authorization through social and other services. 23 | 24 | Main advantage is work with services without moderators, and ability to bind several services to one account. 25 | -------------------------------------------------------------------------------- /docs/en/components/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Extras 3 | layout: page 4 | sidebar: false 5 | --- 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/en/components/minishop2/parts/tip-general-properties.md: -------------------------------------------------------------------------------- 1 | ::: tip Tip 2 | Another [pdoTools general parameters](/en/components/pdotools/general-properties) may be used. 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/en/components/minishop2/snippets/index.md: -------------------------------------------------------------------------------- 1 | # Snippets 2 | 3 | All the snippets of miniShop2 work with [pdoTools][1] and count on [Fenom][2] using in chunks. 4 | 5 | I.e. they, for example, do not process cart goods, but simply transfer product array to the chunk. 6 | This allows: 7 | 8 | - reduce the total number of chunks 9 | - improve convenience (to edit cart in 1 place instead of 3) 10 | - accelerate (to parse only 1 chunk, not 3 - 10 depending of cart goods) 11 | - complicate chunks using advanced verification of conditions through Fenom functions 12 | 13 | miniShop2.4 is the first MODX component which uses Fenom syntax chunks only. 14 | 15 | - [msProducts](/en/components/minishop2/snippets/msproducts) 16 | - [msCart](/en/components/minishop2/snippets/mscart) 17 | - [msOrder](/en/components/minishop2/snippets/msorder) 18 | - [msMiniCart](/en/components/minishop2/snippets/msminicart) 19 | - [msGetOrder](/en/components/minishop2/snippets/msgetorder) 20 | - [msGallery](/en/components/minishop2/snippets/msgallery) 21 | - [msOptions](/en/components/minishop2/snippets/msoptions) 22 | - [msProductOptions](/en/components/minishop2/snippets/msproductoptions) 23 | 24 | [1]: /en/components/pdotools/ 25 | [2]: /en/components/pdotools/parser 26 | -------------------------------------------------------------------------------- /docs/en/components/minishop2/snippets/msminicart.md: -------------------------------------------------------------------------------- 1 | # msMiniCart 2 | 3 | The simple snippet for cart current status display. 4 | 5 | ![](https://file.modx.pro/files/f/a/3/fa36fb44f79cf689e7f8f9e7a577931f.png) 6 | 7 | ## Parameters 8 | 9 | Parameter | By default | Description 10 | ----------|------------------|----------------- 11 | **tpl** | `tpl.msMiniCart` | Formatting chunk 12 | 13 | ## Formatting 14 | 15 | Snippet counts on the work with [chunk Fenom][1]. It transfers the cart status of the user's session there. 16 | As usual there are: 17 | 18 | - **total_count** - total number of goods in the cart 19 | - **total_cost** - total cost of the goods in the cart 20 | 21 | ::: info Info 22 | These data are subject to change, if the expanded cart class is used 23 | ::: 24 | 25 | Standard chunk contains two element blocks with `empty` and `not_empty` classes, displayed for different cart statuses accordingly. 26 | 27 | [1]: /en/components/pdotools/parser 28 | -------------------------------------------------------------------------------- /docs/en/components/ms2gallery/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: ms2Gallery 3 | description: The gallery for any resource in separate tab 4 | logo: https://modstore.pro/assets/extras/ms2gallery/logo-lg.jpg 5 | author: ilyautkin 6 | modstore: https://en.modstore.pro/packages/photos-and-files/ms2gallery 7 | 8 | items: [ 9 | { 10 | text: 'Snippets', 11 | items: [ 12 | { text: 'ms2Gallery', link: 'snippets/ms2gallery' }, 13 | { text: 'ms2GalleryResources', link: 'snippets/ms2galleryresources' }, 14 | ], 15 | }, 16 | { text: 'Preview generation', link: 'preview-generation' }, 17 | { text: 'Integration', link: 'integration' }, 18 | { text: 'Images on a page', link: 'output' }, 19 | { 20 | text: 'Examples', 21 | items: [ 22 | { text: 'Console import', link: 'examples/console-import' }, 23 | { text: 'Bootstrap3 Slider', link: 'examples/bootstrap3-slider' }, 24 | ], 25 | }, 26 | ] 27 | --- 28 | # ms2Gallery 29 | -------------------------------------------------------------------------------- /docs/en/components/msearch2/interface/dictionaries.md: -------------------------------------------------------------------------------- 1 | # Dictionaries 2 | 3 | When you first install the component, you download Russian and English dictionary 4 | phpMorphy][1]. On this page you can add something or delete what you don’t need. 5 | 6 | [![](https://file.modx.pro/files/4/6/3/463bce72ece4e0c7d08127daac334426s.jpg)](https://file.modx.pro/files/4/6/3/463bce72ece4e0c7d08127daac334426.png) 7 | 8 | In order for mSearch2 to work normally you will need at least one morphological dictionary. phpMorphy [has 5 dictionaries][2]: 9 | 10 | - Russian 11 | - English 12 | - German 13 | - Ukrainian 14 | - Estonian 15 | 16 | Dictionaries are downloaded from SourceForge. This process depends on your server connection. You can choose a mirror near to it. 17 | 18 | [![](https://file.modx.pro/files/f/e/2/fe2a6450aaf85a054c506cef07a5ed84s.jpg)](https://file.modx.pro/files/f/e/2/fe2a6450aaf85a054c506cef07a5ed84.png) 19 | 20 | [1]: http://phpmorphy.sourceforge.net/dokuwiki/ 21 | [2]: http://sourceforge.net/pro\jects/phpmorphy/files/phpmorphy-dictionaries/0.3.x/ 22 | -------------------------------------------------------------------------------- /docs/en/components/msearch2/interface/queries.md: -------------------------------------------------------------------------------- 1 | # Queries 2 | 3 | Page that shows what your visitors are looking for. 4 | 5 | [![](https://file.modx.pro/files/c/c/a/cca0d3b1ab820fc40997e80b89cd6323s.jpg)](https://file.modx.pro/files/c/c/a/cca0d3b1ab820fc40997e80b89cd6323.png) 6 | 7 | Here you see a list of all queries, how many times they were made and how many results were found. 8 | This information helps you to optimize your index and [synonyms][1] for your visitors to find something always. 9 | 10 | By the way, these very queries work in autoprompts of **queries** regime of snippet [mSearchForm][2]. 11 | 12 | [1]: http://phpmorphy.sourceforge.net/dokuwiki/ 13 | [2]: /en/components/msearch2/snippets/msearchform 14 | -------------------------------------------------------------------------------- /docs/en/components/msearch2/interface/search.md: -------------------------------------------------------------------------------- 1 | # Search 2 | 3 | Control system page for checking how search through the site works. 4 | 5 | [![](https://file.modx.pro/files/f/2/8/f285fee4cd4b72561c289f38fd1677b4s.jpg)](https://file.modx.pro/files/f/2/8/f285fee4cd4b72561c289f38fd1677b4.png) 6 | 7 | Here you search by that same algorithm that is used by snippets [mSearch2][1] \\ [mFilter2][2], but you can also show all resources, including remote and unpublished ones. 8 | Resources that don’t have the corresponding parameter ‘searchable’ matched don’t participate in search. 9 | 10 | This page has an interesting feature: it gives you an opportunity to go to the page of a result found in admin area. 11 | That is, **mSearch2 adds morphological search of full value to your control system MODX**. 12 | 13 | [1]: /en/components/msearch2/snippets/msearch2 14 | [2]: /en/components/msearch2/snippets/mfilter2 15 | -------------------------------------------------------------------------------- /docs/en/components/msearch2/interface/synonyms.md: -------------------------------------------------------------------------------- 1 | # Synonyms 2 | 3 | Here you can indicate synonyms for your visitors’ queries. 4 | 5 | The system is easy: if there is a word in a query that is indicated here, its synonym is added to it. 6 | There can be as many synonyms as you want. Not only can they be added to the original word, they can also replace it. 7 | 8 | This can help you to correct common misspellings in products’ names and so on. 9 | 10 | For example, if you have whiskas product, you can add following records to it: 11 | 12 | - wiskas 13 | - уискас 14 | - вискас 15 | - etc. – see your [queries][1] 16 | 17 | [![](https://file.modx.pro/files/b/4/1/b410ec7991a617845ec86913310527fcs.jpg)](https://file.modx.pro/files/b/4/1/b410ec7991a617845ec86913310527fc.png) 18 | 19 | You can know by what words search is done if you activate parameter 20 | **&showLog** of snippet [mSearch2][2]. 21 | 22 | [1]: /en/components/msearch2/interface/queries 23 | [2]: /en/components/msearch2/snippets/msearch2 24 | -------------------------------------------------------------------------------- /docs/en/components/msproductremains/remains-page.md: -------------------------------------------------------------------------------- 1 | # Remains Page 2 | 3 | Apart from editing remains directly when editing a product, they can also be managed on an extra page that can be found in the upper menu bar of the website control panel using the following path: `Applications -> miniShop2 -> Remains`. 4 | 5 | [![](https://file.modx.pro/files/6/7/8/6782f3a9e0bb917e6bb5ac150027fd12s.jpg)](https://file.modx.pro/files/6/7/8/6782f3a9e0bb917e6bb5ac150027fd12.png) 6 | 7 | The table displays all entries from the remains table. So you can also find here combinations of properties that are no longer valid. Such entries can be removed from the table unless they are needed. 8 | 9 | To edit remains, double-click the left mouse button on the number you want to change. Then a field for entering remains amounts will appear. Input a new remains amount, press Enter, and the new amount of remains will be saved in the database. 10 | -------------------------------------------------------------------------------- /docs/en/components/msproductremains/remains-tab.md: -------------------------------------------------------------------------------- 1 | # Remains Tab 2 | 3 | After the extra is enabled, a new “Remains” tab will appear in the miniShop2 product resource. It will contain a table for remains editing. 4 | 5 | [![](https://file.modx.pro/files/0/7/f/07fabf8b1eebd0e5ee0c48b5a5c4d6fas.jpg)](https://file.modx.pro/files/0/7/f/07fabf8b1eebd0e5ee0c48b5a5c4d6fa.png) 6 | 7 | To get a complete remains table, it is necessary to fill in products properties in advance (color and size by default) and save and update the remains table (or reload the page). 8 | 9 | To edit remains, double-click the left mouse button on the number you want to change. Then a field for entering remains amounts will appear. Input a new remains amount, press Enter, and the new amount of remains will be saved in the database. 10 | -------------------------------------------------------------------------------- /docs/en/components/office/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Office 3 | description: Ajax login and profile editing. List miniShop2 orders 4 | logo: https://modstore.pro/assets/extras/office/logo-lg.png 5 | author: ilyautkin 6 | modstore: https://en.modstore.pro/packages/users/office 7 | 8 | items: [ 9 | { text: 'Quick Start', link: 'quick-start' }, 10 | { text: 'Work Logic', link: 'logic' }, 11 | { 12 | text: 'Controllers', 13 | items: [ 14 | { text: 'Authorization', link: 'controllers/auth' }, 15 | { text: 'Profile', link: 'controllers/profile' }, 16 | { text: 'MS2 Orders History', link: 'controllers/orders-history-minishop2' }, 17 | { text: 'Remote Authorization', link: 'controllers/auth-remote' }, 18 | ], 19 | }, 20 | { text: 'Extra Functions', link: 'additional-functionality' }, 21 | ] 22 | --- 23 | # Office 24 | 25 | MODX user account. 26 | 27 | The client can register and authorize on site through email and social media, update properties of their profile and view their [miniShop2] orders history. 28 | 29 | Thanks to [the modular architecture][logic] of the extra you can add your own controllers to create unique functions. 30 | 31 | [minishop2]: /en/components/minishop2/ 32 | [logic]: /en/components/office/logic 33 | -------------------------------------------------------------------------------- /docs/en/components/pdotools/classes/index.md: -------------------------------------------------------------------------------- 1 | # Classes 2 | 3 | As you must know, the main point of pdoTools - is speed. 4 | 5 | I developed first version of pdoTools during making of **Tickets**. It should be tickets system but at the end of development it was some kind of simple blog system with awesome ajax comments. And I really don't have enough speed with common MODX extras like getResources. So i developed my own library, without any snippets at the beginning. 6 | 7 | It stands on two ideas: 8 | 9 | 1. The query to database is built with xPDO but executing via PDO. No objects to represent selected rows. 10 | 2. Fast chunk processing. No MODX parser calls if pdoTools can parse chunk yourself. 11 | -------------------------------------------------------------------------------- /docs/en/components/tickets/parts/tip-general-properties.md: -------------------------------------------------------------------------------- 1 | ::: tip TIP 2 | The list can be extended by the common parameters [pdoTools](/en/components/pdotools/general-properties), since Tickets works on this library. 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/en/components/tickets/snippets/ticketmeta.md: -------------------------------------------------------------------------------- 1 | # TicketMeta 2 | 3 | Outputs the information about the present ticket and also allows to vote for a ticket on it's own page. 4 | 5 | ::: info Info 6 | Beginning with version 1.4.0 snippet can be used with any MODX resource 7 | ::: 8 | 9 | ## Parameters of the snippet call 10 | 11 | Name | By default | Description 12 | ----------------|--------------------|------------------------------------------------------ 13 | **&getSection** | `1` | To make a request in DB for getting parent section? 14 | **&getUser** | `1` | To make a request in DB for getting author's profile? 15 | **&tpl** | `tpl.Tickets.meta` | Design chunk of the information about a ticket. 16 | 17 | ## Examples of the call 18 | 19 | - Standard snippet call 20 | 21 | ```modx 22 | [[!TicketMeta]] 23 | ``` 24 | 25 | - In order to take a look at all the available standard placeholders 26 | 27 | ```modx 28 | [[!TicketMeta? &tpl=``]] 29 | ``` 30 | -------------------------------------------------------------------------------- /docs/en/guide/parts/one-space.md: -------------------------------------------------------------------------------- 1 | ::: warning WARNING 2 | Note that only one space is required after `!code`, here are two to prevent processing. 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/faq/categories.json: -------------------------------------------------------------------------------- 1 | { 2 | "ace": "Ace", 3 | "scripts": "Полезные скрипты", 4 | "manager-customize": "Кастомизация панели управления", 5 | "moxi": "Moxi", 6 | "tinymce-rte": "TinyMCE Rich Text Editor", 7 | "zoomx": "ZoomX" 8 | } 9 | -------------------------------------------------------------------------------- /docs/faq/scripts/version.md: -------------------------------------------------------------------------------- 1 | --- 2 | author: alexsoin 3 | --- 4 | 5 | # Вывод версии подключаемого файла 6 | 7 | Данный модификатор для феном полезен при подключении стилей и скриптов на сайт, чтобы не получать закэшированный файл. 8 | 9 | Создаем сниппет с именем `version` 10 | 11 | ```php 12 | 23 | 24 | ``` 25 | 26 | *P.S.* По следам [комментария](https://modx.pro/solutions/17860#comment-108776). 27 | -------------------------------------------------------------------------------- /docs/guide/parts/one-space.md: -------------------------------------------------------------------------------- 1 | ::: warning 2 | После `!code` должен быть **один** пробел. В примерах для корректного вывода добавлен лишний. 3 | ::: 4 | -------------------------------------------------------------------------------- /docs/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modx-pro/Docs/5976024868880b768c587d7082780731c7e2d67c/docs/public/apple-touch-icon.png -------------------------------------------------------------------------------- /docs/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modx-pro/Docs/5976024868880b768c587d7082780731c7e2d67c/docs/public/favicon.ico -------------------------------------------------------------------------------- /docs/public/icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modx-pro/Docs/5976024868880b768c587d7082780731c7e2d67c/docs/public/icon-192.png -------------------------------------------------------------------------------- /docs/public/icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modx-pro/Docs/5976024868880b768c587d7082780731c7e2d67c/docs/public/icon-512.png -------------------------------------------------------------------------------- /docs/public/og-default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modx-pro/Docs/5976024868880b768c587d7082780731c7e2d67c/docs/public/og-default.png -------------------------------------------------------------------------------- /docs/public/placeholder-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/modx-pro/Docs/5976024868880b768c587d7082780731c7e2d67c/docs/public/placeholder-logo.png -------------------------------------------------------------------------------- /docs/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Sitemap: https://docs.modx.pro/sitemap.xml 3 | -------------------------------------------------------------------------------- /docs/public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs.modx.pro", 3 | "icons": [ 4 | { "src": "/icon-192.png", "type": "image/png", "sizes": "192x192" }, 5 | { "src": "/icon-512.png", "type": "image/png", "sizes": "512x512" } 6 | ], 7 | "theme_color": "#ffffff", 8 | "background_color": "#ffffff", 9 | "display": "standalone" 10 | } 11 | -------------------------------------------------------------------------------- /docs/system/basics/input-filters.md: -------------------------------------------------------------------------------- 1 | # Фильтры ввода 2 | 3 | В настоящее время фильтры ввода используются при подготовке к обработке фильтров вывода. Обычно они используются только внутри движка MODX. 4 | -------------------------------------------------------------------------------- /docs/system/basics/modifiers/index.md: -------------------------------------------------------------------------------- 1 | # Модификаторы вывода 2 | 3 | В данном разделе представлены некоторые модификаторы и примеры их использования. В примерах модификаторы применяются к плейсхолдерам, но вы должны помнить, что они могут применяться к любым тегам MODX. Убедитесь, что используемый тег выводит хоть что-то, что модификатор будет обрабатывать. 4 | 5 | ## Цепочки фильтров (Множественные модификаторы) {#chaining} 6 | 7 | Хорошим примером цепочки фильтров будет форматирование даты, например, так: 8 | 9 | ```modx 10 | [[*publishedon:strtotime:date=`%d.%m.%Y`]] 11 | 12 | ``` 13 | 14 | ## Использование модификаторов вывода совместно с параметрами {#with-params} 15 | 16 | Если у тега есть параметры, то их необходимо прописывать сразу после модификатора: 17 | 18 | ```modx 19 | [[!getResources:default=`К сожалению, ничего не найдено`? 20 | &tplFirst=`blogTpl` 21 | &parents=`2,3,4,8` 22 | &tvFilters=`blog_tags==%[[!tag:htmlent]]%` 23 | &includeTVs=`1` 24 | ]] 25 | ``` 26 | -------------------------------------------------------------------------------- /docs/system/basics/output-filters.md: -------------------------------------------------------------------------------- 1 | # Фильтры вывода 2 | 3 | В Revolution фильтры вывода ведут себя так же, как и PHx в Evolution, только фильтры теперь встроены прямо в движок MODX. Синтаксис выглядит так: 4 | 5 | ```modx 6 | [[element:modifier=`value`]] 7 | ``` 8 | 9 | Фильтры могут применяться последовательно. Для этого напишите их подряд (слева направо): 10 | 11 | ```modx 12 | [[element:modifier:anothermodifier=`value`:andanothermodifier:yetanother=`value2`]] 13 | ``` 14 | 15 | Также фильтры могут применяться для модификации вывода сниппетов. Фильтр нужно прописывать перед всеми параметрами (перед знаком вопроса): 16 | 17 | ```modx 18 | [[mySnippet:modifier=`value`? &mySnippetParam=`something`]] 19 | ``` 20 | -------------------------------------------------------------------------------- /docs/system/xpdo/object-model.md: -------------------------------------------------------------------------------- 1 | # Объекты xPDO 2 | 3 | Здесь будет про xPDOObject и его стандартных наследников 4 | -------------------------------------------------------------------------------- /globals.d.ts: -------------------------------------------------------------------------------- 1 | import type { Ref } from 'vue' 2 | import type { DefaultTheme, SiteData } from 'vitepress' 3 | import type { DocsTheme } from './.vitepress/theme/types' 4 | import type { ComponentData } from './.vitepress/theme/plugins/component' 5 | 6 | declare module 'vitepress' { 7 | interface PageData { 8 | site: Ref 9 | component?: ComponentData 10 | breadcrumbs?: DefaultTheme.SidebarItem[] 11 | page?: Ref 12 | theme?: Ref 13 | } 14 | } 15 | 16 | export {} 17 | -------------------------------------------------------------------------------- /plop-templates/multi/interface/categories.md: -------------------------------------------------------------------------------- 1 | # {{ categories }} 2 | 3 | Интерфейс "категорий" в компоненте MODX Revolution позволяет пользователям создавать и организовывать различные категории для своих контентных элементов. 4 | 5 | При создании новой категории пользователи могут задать ее название и описание, а также выбрать родительскую категорию, если это необходимо. Категории могут быть использованы для организации различных типов контента, таких как новости, блоги, статьи или галереи изображений. Это позволяет пользователям быстро находить нужный контент и упрощает процесс управления сайтом. Кроме того, интерфейс "категорий" в компоненте MODX Revolution обеспечивает простой и интуитивно понятный способ создания и добавления собственных компонентов, делая MODX Revolution гибкой и мощной CMS. 6 | -------------------------------------------------------------------------------- /plop-templates/multi/interface/items.md: -------------------------------------------------------------------------------- 1 | # {{ items }} 2 | 3 | Интерфейс элементов компонента MODX Revolution интуитивно понятен и легок в использовании. Он позволяет пользователям изменять и настраивать свои сайты, используя различные компоненты в соответствии с их потребностями. 4 | 5 | Интерфейс позволяет пользователям легко управлять виджетами, расширениями, модулями и плагинами, а также устанавливать их через репозиторий MODX Revolution или вручную. Пользователи могут также создавать свои собственные компоненты и добавлять их в свои проекты. Это делает MODX Revolution одним из наиболее гибких и мощных CMS на рынке. 6 | -------------------------------------------------------------------------------- /plop-templates/multi/quick-start.md: -------------------------------------------------------------------------------- 1 | # {{ quickStart }} 2 | 3 | Для создания абстрактного компонента в MODX Revolution, следуйте простым шагам: 4 | 5 | 1. Определите функциональность и ключевые особенности компонента, которые могут быть использованы в разных проектах. 6 | 2. Создайте плагин или сниппет с необходимыми параметрами и настройками. 7 | 3. Добавьте его в пакет, который можно легко установить и использовать в других проектах MODX Revolution. 8 | 4. Документируйте код и дайте краткую инструкцию по использованию. 9 | 10 | Главное преимущество абстрактных компонентов заключается в их универсальности и переносимости, что позволяет разработчикам экономить время и силы на повторной разработке. 11 | -------------------------------------------------------------------------------- /plop-templates/multi/snippets/index.md: -------------------------------------------------------------------------------- 1 | # {{ snippets }} 2 | 3 | Абстрактные компоненты MODX Revolution - это наборы кода, которые можно использовать для создания различных компонентов, таких как сниппеты, плагины и т.д. Вот несколько примеров сниппетов абстрактного компонента MODX Revolution: 4 | 5 | - [getItems]({{ pathPrefix }}/components/{{ name }}/getitems) 6 | - [getCategories]({{ pathPrefix }}/components/{{ name }}/getcategories) 7 | 8 | Эти сниппеты являются универсальными и могут быть использованы в различных проектах без необходимости переписывать код. Они также могут быть легко настраиваемыми и расширяемыми, что делает их очень гибкими. 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true, 7 | "resolveJsonModule": true, 8 | "types": [ 9 | "vite/client" 10 | ], 11 | "typeRoots": [ 12 | "./node_modules/@types/", 13 | "./types", 14 | "./node_modules" 15 | ], 16 | }, 17 | "include": [ 18 | ".vitepress/theme/**/*", 19 | "globals.d.ts", 20 | "node_modules/vitepress/dist/client/theme-default/components/**/*.vue" 21 | ] 22 | } 23 | --------------------------------------------------------------------------------