Initial commit

This commit is contained in:
2026-07-06 13:05:56 +03:00
commit 831c72dc60
28 changed files with 2527 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
{}
+1
View File
@@ -0,0 +1 @@
{}
+3
View File
@@ -0,0 +1,3 @@
[
"obsidian-git"
]
+33
View File
@@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"footnotes": false,
"properties": true,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"bases": true,
"webviewer": false
}
+22
View File
@@ -0,0 +1,22 @@
{
"collapse-filter": true,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": true,
"colorGroups": [],
"collapse-display": true,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1,
"close": true
}
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
{
"author": "Vinzent",
"authorUrl": "https://github.com/Vinzent03",
"id": "obsidian-git",
"name": "Git",
"description": "Integrate Git version control with automatic backup and other advanced features.",
"isDesktopOnly": false,
"fundingUrl": "https://ko-fi.com/vinzent",
"version": "2.38.6"
}
+705
View File
@@ -0,0 +1,705 @@
@keyframes loading {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.workspace-leaf-content[data-type="git-view"] .button-border {
border: 2px solid var(--interactive-accent);
border-radius: var(--radius-s);
}
.workspace-leaf-content[data-type="git-view"] .view-content {
padding-left: 0;
padding-top: 0;
padding-right: 0;
}
.workspace-leaf-content[data-type="git-history-view"] .view-content {
padding-left: 0;
padding-top: 0;
padding-right: 0;
}
.loading {
overflow: hidden;
}
.loading > svg {
animation: 2s linear infinite loading;
transform-origin: 50% 50%;
display: inline-block;
}
.obsidian-git-center {
margin: auto;
text-align: center;
width: 50%;
}
.obsidian-git-textarea {
display: block;
margin-left: auto;
margin-right: auto;
}
.obsidian-git-disabled {
opacity: 0.5;
}
.obsidian-git-center-button {
display: block;
margin: 20px auto;
}
.tooltip.mod-left {
overflow-wrap: break-word;
}
.tooltip.mod-right {
overflow-wrap: break-word;
}
/* Limits the scrollbar to the view body */
.git-view {
display: flex;
flex-direction: column;
position: relative;
height: 100%;
}
/* Re-enable wrapping of nav buttns to prevent overflow on smaller screens #*/
.workspace-drawer .git-view .nav-buttons-container {
flex-wrap: wrap;
}
.git-tools {
display: flex;
margin-left: auto;
}
.git-tools .type {
padding-left: var(--size-2-1);
display: flex;
align-items: center;
justify-content: center;
width: 11px;
}
.git-tools .type[data-type="M"] {
color: orange;
}
.git-tools .type[data-type="D"] {
color: red;
}
.git-tools .buttons {
display: flex;
}
.git-tools .buttons > * {
padding: 0;
height: auto;
}
.workspace-leaf-content[data-type="git-view"] .tree-item-self,
.workspace-leaf-content[data-type="git-history-view"] .tree-item-self {
align-items: center;
}
.workspace-leaf-content[data-type="git-view"]
.tree-item-self:hover
.clickable-icon,
.workspace-leaf-content[data-type="git-history-view"]
.tree-item-self:hover
.clickable-icon {
color: var(--icon-color-hover);
}
/* Highlight an item as active if it's diff is currently opened */
.is-active .git-tools .buttons > * {
color: var(--nav-item-color-active);
}
.git-author {
color: var(--text-accent);
}
.git-date {
color: var(--text-accent);
}
.git-ref {
color: var(--text-accent);
}
/* ====== diff2html ======
The following styles are adapted from the obsidian-version-history plugin by
@kometenstaub https://github.com/kometenstaub/obsidian-version-history-diff/blob/main/src/styles.scss
which itself is adapted from the diff2html library with the following original license:
https://github.com/rtfpessoa/diff2html/blob/master/LICENSE.md
Copyright 2014-2016 Rodrigo Fernandes https://rtfpessoa.github.io/
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
.theme-dark,
.theme-light {
--git-delete-bg: #ff475040;
--git-delete-hl: #96050a75;
--git-insert-bg: #68d36840;
--git-insert-hl: #23c02350;
--git-change-bg: #ffd55840;
--git-selected: #3572b0;
--git-delete: #cc3333;
--git-insert: #399839;
--git-change: #d0b44c;
--git-move: #3572b0;
}
.git-diff {
.d2h-d-none {
display: none;
}
.d2h-wrapper {
text-align: left;
border-radius: 0.25em;
overflow: auto;
}
.d2h-file-header.d2h-file-header {
background-color: var(--background-secondary);
border-bottom: 1px solid var(--background-modifier-border);
font-family:
Source Sans Pro,
Helvetica Neue,
Helvetica,
Arial,
sans-serif;
height: 35px;
padding: 5px 10px;
}
.d2h-file-header,
.d2h-file-stats {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
.d2h-file-header {
display: none;
}
.d2h-file-stats {
font-size: 14px;
margin-left: auto;
}
.d2h-lines-added {
border: 1px solid var(--color-green);
border-radius: 5px 0 0 5px;
color: var(--color-green);
padding: 2px;
text-align: right;
vertical-align: middle;
}
.d2h-lines-deleted {
border: 1px solid var(--color-red);
border-radius: 0 5px 5px 0;
color: var(--color-red);
margin-left: 1px;
padding: 2px;
text-align: left;
vertical-align: middle;
}
.d2h-file-name-wrapper {
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 15px;
width: 100%;
}
.d2h-file-name {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: var(--text-normal);
font-size: var(--h5-size);
}
.d2h-file-wrapper {
border: 1px solid var(--background-secondary-alt);
border-radius: 3px;
margin-bottom: 1em;
max-height: 100%;
}
.d2h-file-collapse {
-webkit-box-pack: end;
-ms-flex-pack: end;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
border: 1px solid var(--background-secondary-alt);
border-radius: 3px;
cursor: pointer;
display: none;
font-size: 12px;
justify-content: flex-end;
padding: 4px 8px;
}
.d2h-file-collapse.d2h-selected {
background-color: var(--git-selected);
}
.d2h-file-collapse-input {
margin: 0 4px 0 0;
}
.d2h-diff-table {
border-collapse: collapse;
font-family: var(--font-monospace);
font-size: var(--code-size);
width: 100%;
}
.d2h-files-diff {
width: 100%;
}
.d2h-file-diff {
/*
overflow-y: scroll;
*/
border-radius: 5px;
font-size: var(--font-text-size);
line-height: var(--line-height-normal);
}
.d2h-file-side-diff {
display: inline-block;
margin-bottom: -8px;
margin-right: -4px;
overflow-x: scroll;
overflow-y: hidden;
width: 50%;
}
.d2h-code-line {
padding-left: 6em;
padding-right: 1.5em;
}
.d2h-code-line,
.d2h-code-side-line {
display: inline-block;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
white-space: nowrap;
width: 100%;
}
.d2h-code-side-line {
/* needed to be changed */
padding-left: 0.5em;
padding-right: 0.5em;
}
.d2h-code-line-ctn {
word-wrap: normal;
background: none;
display: inline-block;
padding: 0;
-webkit-user-select: text;
-moz-user-select: text;
-ms-user-select: text;
user-select: text;
vertical-align: middle;
width: 100%;
/* only works for line-by-line */
white-space: pre-wrap;
}
.d2h-code-line del,
.d2h-code-side-line del {
background-color: var(--git-delete-hl);
color: var(--text-normal);
}
.d2h-code-line del,
.d2h-code-line ins,
.d2h-code-side-line del,
.d2h-code-side-line ins {
border-radius: 0.2em;
display: inline-block;
margin-top: -1px;
text-decoration: none;
vertical-align: middle;
}
.d2h-code-line ins,
.d2h-code-side-line ins {
background-color: var(--git-insert-hl);
text-align: left;
}
.d2h-code-line-prefix {
word-wrap: normal;
background: none;
display: inline;
padding: 0;
white-space: pre;
}
.line-num1 {
float: left;
}
.line-num1,
.line-num2 {
-webkit-box-sizing: border-box;
box-sizing: border-box;
overflow: hidden;
/*
padding: 0 0.5em;
*/
text-overflow: ellipsis;
width: 2.5em;
padding-left: 0;
}
.line-num2 {
float: right;
}
.d2h-code-linenumber {
background-color: var(--background-primary);
border: solid var(--background-modifier-border);
border-width: 0 1px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: var(--text-faint);
cursor: pointer;
display: inline-block;
position: absolute;
text-align: right;
width: 5.5em;
}
.d2h-code-linenumber:after {
content: "\200b";
}
.d2h-code-side-linenumber {
background-color: var(--background-primary);
border: solid var(--background-modifier-border);
border-width: 0 1px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
color: var(--text-faint);
cursor: pointer;
overflow: hidden;
padding: 0 0.5em;
text-align: right;
text-overflow: ellipsis;
width: 4em;
/* needed to be changed */
display: table-cell;
position: relative;
}
.d2h-code-side-linenumber:after {
content: "\200b";
}
.d2h-code-side-emptyplaceholder,
.d2h-emptyplaceholder {
background-color: var(--background-primary);
border-color: var(--background-modifier-border);
}
.d2h-code-line-prefix,
.d2h-code-linenumber,
.d2h-code-side-linenumber,
.d2h-emptyplaceholder {
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
.d2h-code-linenumber,
.d2h-code-side-linenumber {
direction: rtl;
}
.d2h-del {
background-color: var(--git-delete-bg);
border-color: var(--git-delete-hl);
}
.d2h-ins {
background-color: var(--git-insert-bg);
border-color: var(--git-insert-hl);
}
.d2h-info {
background-color: var(--background-primary);
border-color: var(--background-modifier-border);
color: var(--text-faint);
}
.d2h-del,
.d2h-ins,
.d2h-file-diff .d2h-change {
color: var(--text-normal);
}
.d2h-file-diff .d2h-del.d2h-change {
background-color: var(--git-change-bg);
}
.d2h-file-diff .d2h-ins.d2h-change {
background-color: var(--git-insert-bg);
}
.d2h-file-list-wrapper {
a {
text-decoration: none;
cursor: default;
-webkit-user-drag: none;
}
svg {
display: none;
}
}
.d2h-file-list-header {
text-align: left;
}
.d2h-file-list-title {
display: none;
}
.d2h-file-list-line {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
text-align: left;
}
.d2h-file-list {
}
.d2h-file-list > li {
border-bottom: 1px solid var(--background-modifier-border);
margin: 0;
padding: 5px 10px;
}
.d2h-file-list > li:last-child {
border-bottom: none;
}
.d2h-file-switch {
cursor: pointer;
display: none;
font-size: 10px;
}
.d2h-icon {
fill: currentColor;
margin-right: 10px;
vertical-align: middle;
}
.d2h-deleted {
color: var(--git-delete);
}
.d2h-added {
color: var(--git-insert);
}
.d2h-changed {
color: var(--git-change);
}
.d2h-moved {
color: var(--git-move);
}
.d2h-tag {
background-color: var(--background-secondary);
display: -webkit-box;
display: -ms-flexbox;
display: flex;
font-size: 10px;
margin-left: 5px;
padding: 0 2px;
}
.d2h-deleted-tag {
border: 1px solid var(--git-delete);
}
.d2h-added-tag {
border: 1px solid var(--git-insert);
}
.d2h-changed-tag {
border: 1px solid var(--git-change);
}
.d2h-moved-tag {
border: 1px solid var(--git-move);
}
/* needed for line-by-line*/
.d2h-diff-tbody {
position: relative;
}
/* My additions */
.cm-merge-revert {
width: 4em;
}
/* Ensure that merge revert markers are positioned correctly */
.cm-merge-revert > * {
position: absolute;
background-color: var(--background-secondary);
display: flex;
}
}
/* ====================== Line Authoring Information ====================== */
.cm-gutterElement.obs-git-blame-gutter {
/* Add background color to spacing inbetween and around the gutter for better aesthetics */
border-width: 0px 2px 0.2px;
border-style: solid;
border-color: var(--background-secondary);
background-color: var(--background-secondary);
}
.cm-gutterElement.obs-git-blame-gutter > div,
.line-author-settings-preview {
/* delegate text color to settings */
color: var(--obs-git-gutter-text);
font-family: monospace;
height: 100%; /* ensure, that age-based background color occupies entire parent */
text-align: right;
padding: 0px 6px;
white-space: pre; /* Keep spaces and do not collapse them. */
}
@media (max-width: 800px) {
/* hide git blame gutter not to superpose text */
.cm-gutterElement.obs-git-blame-gutter {
display: none;
}
}
.git-unified-diff-view,
.git-split-diff-view .cm-deletedLine .cm-changedText {
background-color: #ee443330;
}
.git-unified-diff-view,
.git-split-diff-view .cm-insertedLine .cm-changedText {
background-color: #22bb2230;
}
.git-obscure-prompt[git-is-obscured="true"] #git-show-password:after {
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye"><path d="M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0"></path><circle cx="12" cy="12" r="3"></circle></svg>');
}
.git-obscure-prompt[git-is-obscured="false"] #git-show-password:after {
-webkit-mask-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="svg-icon lucide-eye-off"><path d="M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49"></path><path d="M14.084 14.158a3 3 0 0 1-4.242-4.242"></path><path d="M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143"></path><path d="m2 2 20 20"></path></svg>');
}
/* Override styling of Codemirror merge view "collapsed lines" indicator */
.git-split-diff-view .ͼ2 .cm-collapsedLines {
background: var(--interactive-normal);
border-radius: var(--radius-m);
color: var(--text-accent);
font-size: var(--font-small);
padding: var(--size-4-1) var(--size-4-1);
}
.git-split-diff-view .ͼ2 .cm-collapsedLines:hover {
background: var(--interactive-hover);
color: var(--text-accent-hover);
}
.git-signs-gutter {
.cm-gutterElement {
display: grid;
/* Needed to align the sign properly for different line heigts. Such as
* when having a heading or list item.
*/
padding-top: 0 !important;
}
}
.git-gutter-marker:hover {
border-radius: 2px;
}
.git-gutter-marker.git-add {
background-color: var(--color-green);
justify-self: center;
height: inherit;
width: 0.2rem;
}
.git-gutter-marker.git-change {
background-color: var(--color-yellow);
justify-self: center;
height: inherit;
width: 0.2rem;
}
.git-gutter-marker.git-changedelete {
color: var(--color-yellow);
font-weight: var(--font-bold);
font-size: 1rem;
justify-self: center;
height: inherit;
}
.git-gutter-marker.git-delete {
background-color: var(--color-red);
height: 0.2rem;
width: 0.8rem;
align-self: end;
}
.git-gutter-marker.git-topdelete {
background-color: var(--color-red);
height: 0.2rem;
width: 0.8rem;
align-self: start;
}
div:hover > .git-gutter-marker.git-change {
width: 0.6rem;
}
div:hover > .git-gutter-marker.git-add {
width: 0.6rem;
}
div:hover > .git-gutter-marker.git-delete {
height: 0.6rem;
}
div:hover > .git-gutter-marker.git-topdelete {
height: 0.6rem;
}
div:hover > .git-gutter-marker.git-changedelete {
font-weight: var(--font-bold);
}
.git-gutter-marker.staged {
opacity: 0.5;
}
/* Prevent shifting of the editor when git signs gutter is the only gutter present */
.cm-gutters.cm-gutters-before:has(> .git-signs-gutter:only-child) {
margin-inline-end: 0;
.git-signs-gutter {
margin-inline-start: -1rem;
}
}
.git-changes-status-bar-colored {
.git-add {
color: var(--color-green);
}
.git-change {
color: var(--color-yellow);
}
.git-delete {
color: var(--color-red);
}
}
.git-changes-status-bar .git-add {
margin-right: 0.3em;
}
.git-changes-status-bar .git-change {
margin-right: 0.3em;
}
+216
View File
@@ -0,0 +1,216 @@
{
"main": {
"id": "71ce2d6ed3a4714f",
"type": "split",
"children": [
{
"id": "caaf5ccfe05afea5",
"type": "tabs",
"children": [
{
"id": "4a9bc3402fa74dd4",
"type": "leaf",
"state": {
"type": "empty",
"state": {},
"icon": "lucide-file",
"title": "Новая вкладка"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "d756269a4832ee79",
"type": "split",
"children": [
{
"id": "0b05d4ebddfcb5e5",
"type": "tabs",
"children": [
{
"id": "99cac85e2d3eaf40",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Файловый менеджер"
}
},
{
"id": "f4097239ece54137",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Поиск"
}
},
{
"id": "dc51c20e29cc4e4f",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Закладки"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "e587fc21a5cf3972",
"type": "split",
"children": [
{
"id": "d1c992278a67a5b5",
"type": "tabs",
"children": [
{
"id": "7f132a737dc37544",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Обратные ссылки"
}
},
{
"id": "dafbcdeb76bb02c6",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Исходящие ссылки"
}
},
{
"id": "b4682f0196dca359",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Теги"
}
},
{
"id": "b1c83e37575d6b97",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "Все свойства"
}
},
{
"id": "030e03ef178f4b50",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Структура"
}
},
{
"id": "8f09c7c9c5bcb98e",
"type": "leaf",
"state": {
"type": "git-view",
"state": {},
"icon": "git-pull-request",
"title": "Source Control"
}
}
],
"currentTab": 5
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"switcher:Меню быстрого перехода": false,
"graph:Граф": false,
"canvas:Создать новый холст": false,
"daily-notes:Сегодняшняя заметка": false,
"templates:Вставить шаблон": false,
"command-palette:Открыть палитру команд": false,
"bases:Создать новую базу": false,
"obsidian-git:Open Git source control": false
}
},
"active": "99cac85e2d3eaf40",
"lastOpenFiles": [
"Без названия.base",
"Без названия.canvas",
"Магазин обуви (apelsincom)/Архитектура и структура каталогов (apelsincom).md",
"Магазин обуви (apelsincom)/Быстрый старт для нового разработчика (apelsincom).md",
"Магазин обуви (apelsincom)/Сценарии. Товары и разделы.md",
"Магазин обуви (apelsincom)/Шаблон custom.md",
"Магазин обуви (apelsincom)/Магазин обуви (apelsincom) — Обзор.md",
"Магазин обуви (apelsincom)/Справочник — что где лежит (apelsincom).md",
"Магазин обуви (apelsincom)/Серверная логика и php_interface (apelsincom).md",
"Магазин обуви (apelsincom)/Источники и метод проверки (apelsincom).md",
"Магазин обуви (apelsincom)/Маршрутизация и ЧПУ (apelsincom).md",
"Магазин обуви (apelsincom)/Кэширование и обслуживание (apelsincom).md",
"Магазин обуви (apelsincom)/Компоненты и шаблоны компонентов.md",
"Магазин обуви (apelsincom)/Информационная безопасность (apelsincom).md",
"Магазин обуви (apelsincom)/Инфоблоки и каталог (apelsincom).md",
"Магазин обуви (apelsincom)/Интеграции (apelsincom).md",
"Магазин обуви (apelsincom)/Известные проблемы и рекомендации (apelsincom).md",
"Магазин обуви (apelsincom)/Доступы и окружение (apelsincom).md",
"Магазин обуви (apelsincom)/Глоссарий (apelsincom).md",
"Магазин обуви (apelsincom)/REST API — методы и примеры (richcode.api).md",
"Магазин обуви (apelsincom)/REST API (richcode.api).md",
"Магазин обуви (apelsincom)",
"Добро пожаловать.md"
]
}
@@ -0,0 +1,86 @@
# REST API (richcode.api)
Главная техническая особенность проекта. Сторонний модуль **`richcode.api` версии 3.1.5** (2024-08-02) отдаёт наружу REST-интерфейс к сущностям сайта: товарам, заказам, складам, пользователям, сделкам. Через него данными можно управлять **без админки** — вероятно, ради этого он и стоит.
Проверено по коду модуля: `bitrix/modules/richcode.api/` (`include.php`, `options.php`, `lib/core/Route.php`).
## Точка входа и формат URL
Запрос перехватывается обработчиком модуля на старте страницы (не через `urlrewrite.php`). Базовый путь задаётся в настройках модуля, по умолчанию `/api/`.
Структура адреса (из `lib/core/Route.php`):
```
/{apiPath}/{module}/{token}/{controller}/{action}
```
- `apiPath` — базовый путь (например `api`).
- `module` — область: `iblock`, `sale`, `main`, `crm`.
- `token` — токен авторизации (если включена авторизация по токену).
- `controller` / `action` — что вызываем. Действие — это оставшиеся сегменты пути после контроллера, склеенные точкой (`…/order/status/set``status.set`).
- Параметры: для GET — query-строка; для POST/PUT/DELETE — тело JSON (`Content-Type: application/json`).
Ответы — JSON (`lib/core/Response.php`).
## Что доступно (контроллеры)
Из карты автозагрузки в `include.php`:
| Модуль | Контроллер | Назначение |
|---|---|---|
| `iblock` | `Element` | CRUD элементов инфоблока: свойства (в т.ч. UF), разделы, файлы, единицы измерения |
| `sale` | `Order` | заказы: корзина, свойства заказа, оплаты, отгрузки |
| `sale` | `Product` | товары каталога и остатки на складах |
| `sale` | `Store` | склады и их остатки |
| `sale` | `Measure` | единицы измерения |
| `sale` | `Discount` | скидки |
| `main` | `User` | создание/обновление пользователей |
| `crm` | `Deal` | сделки (CRM) |
Важно: **каталог (инфоблок 2) обслуживает `sale/product`**, а `iblock/element` — только не-каталожные инфоблоки. Действия у них одинаковые.
> [!info] Полный список действий и примеры
> Все действия каждого контроллера, их параметры и готовые примеры запросов `curl` вынесены в отдельный справочник — [[REST API — методы и примеры (richcode.api)]]. Он составлен по исходникам контроллеров, а не по догадкам.
## Авторизация
- Включается опцией **«Авторизация по токену»** (`USE_AUTH_TOKEN`).
- Токен хранится в поле пользователя **`UF_API_TOKEN`** (по коду `lib/core/Tokens.php`; в подсказке настроек оно ошибочно названо `UF_RESTFUL_API_TOKEN`). Токены генерируются в настройках модуля («Сгенерировать» / «Пересоздать»).
- Токен передаётся **сегментом URL** (`…/{module}/{token}/{controller}/…`), а не заголовком — рабочий код читает его из пути. Пользователь-владелец токена должен состоять в заданной группе.
- Каждый вызов идёт **от имени пользователя-владельца токена** — права API = права этого пользователя. Это важно для безопасности: см. [[Информационная безопасность (apelsincom)]].
- Полная схема адресов, все действия и примеры `curl` — в [[REST API — методы и примеры (richcode.api)]].
## Настройки модуля (что где крутится)
Опции (админка → Настройки → Список модулей → richcode.api, или в БД):
| Опция | Смысл |
|---|---|
| `USE_API` | включить/выключить API |
| `API_PATH` | базовый путь (пример `/api/`) |
| `USE_AUTH_TOKEN` | авторизация по токену |
| `ONLY_HTTPS_EXCHANGE` | принимать только https |
| `USE_BLACK_LIST_ADDRESS_FILTER` / `BLACK_LIST_ADDRESS` | чёрный список IP |
| `USE_WHITE_LIST_ADDRESS_FILTER` / `WHITE_LIST_ADDRESS` | белый список IP |
| `USE_ACCESS_CONTROL_ALLOW_ORIGIN_FILTER` | CORS-фильтр по домену |
| `LOGGING` / `hl_logging` | лог запросов в highload-блок «Лог запросов» |
## Логирование
При включённом `LOGGING` каждый запрос пишется в highload-блок (его ID — в опции `hl_logging`) с полями `UF_API_LOG_TIME`, `UF_API_LOG_URL`, `UF_API_LOG_METHOD`, `UF_API_LOG_DATA`. Удобно для отладки интеграций; помните, что в лог попадает тело запроса — не логируйте лишнего (ПДн).
## Поток запроса
```mermaid
sequenceDiagram
participant C as Клиент
participant R as richcode.api (Route)
participant B as Bitrix (iblock/sale/main/crm)
C->>R: HTTP /api/{module}/{token}/{controller}/{action} (+JSON)
R->>R: проверка HTTPS / IP / CORS / токена
R->>B: вызов контроллера от имени пользователя токена
B-->>R: результат
R-->>C: JSON-ответ (+ запись в лог, если включён)
```
> [!warning] Что проверить и обезопасить
> - Точный `API_PATH` и какие пользователи-токены заведены — по файлам не видно, смотрите настройки модуля.
> - Включены ли `ONLY_HTTPS_EXCHANGE`, белый список IP и CORS — это ключевые меры защиты API.
> - Токены = ключи от данных. Их хранение, ротация и права пользователей-владельцев — в [[Информационная безопасность (apelsincom)]].
## См. также
- [[Информационная безопасность (apelsincom)]]
- [[Интеграции (apelsincom)]]
- [[Инфоблоки и каталог (apelsincom)]]
@@ -0,0 +1,298 @@
# REST API — методы и примеры (richcode.api)
Полный справочник действий модуля `richcode.api` и примеры запросов. Составлено по исходникам контроллеров (`bitrix/modules/richcode.api/lib/*/controllers/*.php`) и ядра модуля (`lib/core/`). Обзор и настройки — в [[REST API (richcode.api)]].
## Содержание
- URL-схема
- Авторизация и фильтры
- Формат ответа
- Справочник действий (по контроллерам)
- Примеры запросов
- Точные схемы (проверено по моделям)
## URL-схема
```
/{apiPath}/{module}/{token}/{controller}/{action}
```
- `apiPath` — базовый путь, по умолчанию `api` (модуль срабатывает, если первый сегмент URL равен ему — из `Init::checkPathApi`).
- `module` / `controller` — из карты в `lib/core/Init.php`: `iblock/element`, `sale/product|order|store|discount|measure`, `main/user`, `crm/deal`.
- `token` — сегмент URL с токеном (если включена авторизация).
- `action`**оставшиеся сегменты пути после контроллера, склеенные точкой**. Поэтому `.../element/section/add` → действие `section.add`, `.../order/status/set``status.set`.
- Параметры: для GET — query-строка; для POST/PUT/DELETE — тело JSON (`Content-Type: application/json`) или form-data.
## Авторизация и фильтры
Проверки идут по порядку (`Init::checkFilters`): **токен → только HTTPS → IP-список → группа пользователя**. Любая непройденная — ответ `403`.
- Токен берётся из **сегмента URL** и ищется в поле пользователя **`UF_API_TOKEN`** (`Tokens::checkToken`). Запрос выполняется **от имени этого пользователя** — его правами и ограничен.
- Пользователь-владелец токена должен состоять в группе, заданной в настройках модуля (`Config::getGroupId()`).
- Формат токена: `xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx` (например `b2b23c2b-8df82f85-256913d3-ff261962`), генерируется в настройках модуля.
> [!warning] Расхождения, которые собьют с толку
> - В подсказке настроек модуля поле названо `UF_RESTFUL_API_TOKEN`, но в коде используется **`UF_API_TOKEN`**. Верно то, что в коде.
> - Та же подсказка предлагает передавать токен заголовком `Authorization-Token`, но рабочий код (`Route`+`Init`) читает токен **из сегмента URL**, а не из заголовка. Заголовок лишь разрешён в CORS. Используйте токен в URL.
> - Токен в URL попадёт в логи веб-сервера и в собственный лог модуля (HL-блок). Это чувствительно — см. [[Информационная безопасность (apelsincom)]].
## Формат ответа
Всегда JSON `{"status", "result"}` (из `lib/core/Response.php`):
- Успех — HTTP 200: `{"status":200,"result": <данные>}`.
- Бизнес-ошибка — HTTP 400: `{"status":400,"result":{"type":"error","message":"..."}}`.
- Отказ фильтра (нет токена / не HTTPS / чужой IP / не та группа) — HTTP 403: `{"status":403,"result":{"type":"error","message":"Forgbiden"}}` (опечатка в исходнике сохранена как есть).
## Справочник действий
### iblock / element (и sale / product — те же действия, но по товарам каталога)
| Действие (URL) | Параметры | Что делает |
|---|---|---|
| `add` | поля элемента | создать элемент, вернуть ID |
| `update` | `ID` + поля | обновить элемент |
| `delete` | `ID` | удалить |
| `get` | `ID` | элемент по ID |
| `list` | фильтр/выборка | список элементов |
| `fields` | — | доступные поля элемента |
| `property.list` | (`IBLOCK_ID`) | список свойств инфоблока |
| `property.get` | `ID` | свойство по ID |
| `property.enumeration.fields` | параметры свойства | значения списочного свойства |
| `property.add` / `property.update` | поля свойства | создать/изменить свойство |
| `property.enumeration.add` / `.update` | поля | значения списочного свойства |
| `property.add.group` / `property.update.group` / `property.enumeration.add.group` / `property.enumeration.update.group` | `fields[]` | групповые операции |
| `section.add` / `section.update` | поля раздела | создать/изменить раздел |
| `section.update.group` | `fields[]` | групповое изменение разделов |
| `section.list` | фильтр | список разделов |
| `section.get` | `ID` | раздел по ID |
| `section.property.list` | `IBLOCK_ID` | свойства раздела |
| `section.property.enumeration.fields` | — | значения свойств раздела |
| `update.group` | `fields[]` | групповое обновление элементов |
| `file.add` | файл | добавить файл |
| `measure.ratio.update` | параметры | коэффициент единицы измерения |
| `store.amount.get` / `store.amount.set` | параметры остатков | остатки товара по складам |
### sale / order
| Действие | Параметры | Что делает |
|---|---|---|
| `create` | поля заказа | создать заказ, вернуть ID |
| `get` | `ORDER_ID` | заказ по ID |
| `list` | фильтр | список заказов |
| `fields` | — | поля заказа |
| `basket` | `ORDER_ID` | состав корзины заказа |
| `status.list` | — | список статусов заказа |
| `status.set` | `ORDER_ID`, `STATUS_ID` | сменить статус |
| `cancel` / `uncancel` | `ORDER_ID` | отмена / снятие отмены |
| `payed` / `unpayed` | `ORDER_ID` | отметить оплаченным / нет |
| `delivery.status.list` | — | статусы доставки |
| `delivery.status.set` | `ORDER_ID`, `STATUS_ID` | статус доставки |
| `delivery.accept` / `delivery.decline` | `ORDER_ID` | принять / отклонить доставку |
| `shipment.accept` / `shipment.decline` | `ORDER_ID` | отгрузка |
| `payer.list` | — | типы плательщиков |
| `property.list` / `property.enum` | — | свойства заказа |
| `payment.list` / `delivery.list` | — | доступные оплаты / доставки |
### sale / store
| Действие | Параметры | Что делает |
|---|---|---|
| `add` | `fields` | создать склад |
| `update` | `fields` | изменить склад |
| `set.amount` | `PRODUCT_ID`, `STORE_ID`, кол-во | задать остаток |
| `set.amount.group` | `fields[]` | групповые остатки |
| `list` | — | список складов |
### sale / measure, sale / discount, main / user, crm / deal
| Контроллер | Действия |
|---|---|
| `sale/measure` | `add`, `update` (`fields.ID`), `delete` (`ID`), `list` |
| `sale/discount` | `add`, `update`, `delete` (`ID`), `list` |
| `main/user` | `list`, `add`, `update`, `delete` (`ID`), `fields` |
| `crm/deal` | `productrows.set` (задать товарные позиции сделки) |
## Примеры запросов
Ниже `https://<домен>` = адрес сайта, `<TOKEN>` = токен из `UF_API_TOKEN`, `apiPath` = `api`. Reads — через GET, writes — через POST (роутер разбирает параметры и там, и там; метод влияет только на способ передачи данных).
> [!warning] Каталог vs обычный инфоблок — разные контроллеры
> Проверено по моделям: **`iblock/element` работает только с НЕ-каталожными инфоблоками**, а для товаров и разделов **каталога (инфоблок 2) нужен `sale/product`** (те же действия). Перепутаете — получите ошибку «Инфоблок с указанным ID не найден». Поэтому примеры для каталога ниже — на `sale/product`. И у `add`/`update`/`section.*` тело обёрнуто в ключ **`fields`** (у `order/create` — нет). Полные схемы — в разделе «Точные схемы».
**Доступные поля элемента:**
```bash
curl "https://<домен>/api/iblock/<TOKEN>/element/fields"
```
**Получить товар каталога по ID:**
```bash
curl "https://<домен>/api/sale/<TOKEN>/product/get?ID=123"
# → {"status":200,"result":{ ...поля товара... }}
```
**Список товаров каталога:**
```bash
curl "https://<домен>/api/sale/<TOKEN>/product/list?filter[IBLOCK_ID]=2"
```
**Создать товар каталога (инфоблок 2):**
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/add" \
-H "Content-Type: application/json" \
-d '{"fields":{
"IBLOCK_ID": 2,
"NAME": "Кроссовки Модель X",
"CODE": "krossovki-model-x",
"ACTIVE": "Y",
"PRICE": 4990,
"CURRENCY": "RUB",
"QUANTITY": 10,
"PROPERTY_ARTNUMBER": "ART-001"
}}'
# → {"status":200,"result": <новый ID>}
```
**Создать элемент обычного (не каталог) инфоблока:**
```bash
curl -X POST "https://<домен>/api/iblock/<TOKEN>/element/add" \
-H "Content-Type: application/json" \
-d '{"fields":{"IBLOCK_ID":5,"NAME":"Новость","CODE":"novost","ACTIVE":"Y","PROPERTY_AUTHOR":"Редакция"}}'
```
**Обновить товар:**
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/update" \
-H "Content-Type: application/json" \
-d '{"fields":{"ID": 123, "NAME": "Новое название", "PRICE": 5490}}'
```
**Удалить товар:**
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/delete" \
-H "Content-Type: application/json" -d '{"ID": 123}'
```
**Разделы каталога:**
```bash
# список разделов
curl "https://<домен>/api/sale/<TOKEN>/product/section/list?filter[IBLOCK_ID]=2"
# создать раздел
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/section/add" \
-H "Content-Type: application/json" \
-d '{"fields":{"IBLOCK_ID":2,"NAME":"Мужская обувь","CODE":"muzhskaya-obuv","ACTIVE":"Y"}}'
```
**Остатки на складе:**
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/store/set/amount" \
-H "Content-Type: application/json" \
-d '{"PRODUCT_ID":123,"STORE_ID":1,"AMOUNT":10}'
```
**Заказы:**
```bash
# получить заказ
curl "https://<домен>/api/sale/<TOKEN>/order/get?ORDER_ID=1001"
# список заказов
curl "https://<домен>/api/sale/<TOKEN>/order/list"
# создать заказ (полная схема — в разделе «Точные схемы»)
curl -X POST "https://<домен>/api/sale/<TOKEN>/order/create" \
-H "Content-Type: application/json" \
-d '{"PERSON_TYPE_ID":1,"DELIVERY_ID":1,"PAYSYSTEM_ID":1,
"ITEMS":[{"PRODUCT_ID":412,"QUANTITY":1}],
"PROPERTIES":[{"ID":1,"VALUE":"Иван"}]}'
# сменить статус
curl -X POST "https://<домен>/api/sale/<TOKEN>/order/status/set" \
-H "Content-Type: application/json" -d '{"ORDER_ID":1001,"STATUS_ID":"F"}'
# отметить оплаченным
curl -X POST "https://<домен>/api/sale/<TOKEN>/order/payed" \
-H "Content-Type: application/json" -d '{"ORDER_ID":1001}'
```
**Пользователь:**
```bash
curl -X POST "https://<домен>/api/main/<TOKEN>/user/add" \
-H "Content-Type: application/json" -d '{ ...поля пользователя... }'
```
## Точные схемы (проверено по моделям)
Схемы ниже сверены по коду моделей (`lib/…/models/…`), а не по догадкам.
### Правило: каталог vs обычный инфоблок
- `iblock/element/*` — только **не-каталожные** инфоблоки (`add`, `list`, `get`, `section.*` внутренне исключают каталоги).
- `sale/product/*` — только **каталог** (инфоблок 2); те же действия, но модель работает с ценой, остатком и товарными полями.
- У `add` / `update` / `section.add` / `section.update` тело обёрнуто в ключ **`fields`** (плоская карта). Свойства элемента — с префиксом `PROPERTY_<КОД>`, поля раздела — `UF_<КОД>`.
### element/add — элемент обычного инфоблока
`POST /api/iblock/<TOKEN>/element/add`
```json
{ "fields": {
"IBLOCK_ID": 5,
"NAME": "Заголовок",
"CODE": "zagolovok",
"ACTIVE": "Y",
"SORT": 100,
"PREVIEW_TEXT": "…",
"DETAIL_TEXT": "…",
"IBLOCK_SECTION_ID": 12,
"PROPERTY_AUTHOR": "Редакция"
} }
```
Стандартные поля (`getAvailableElementFields`): `ID, IBLOCK_ID, IBLOCK_SECTION_ID, ACTIVE, XML_ID, DATE_ACTIVE_FROM, DATE_ACTIVE_TO, SORT, NAME, PREVIEW_PICTURE, PREVIEW_TEXT, DETAIL_PICTURE, DETAIL_TEXT, CODE`. Если `CODE` пуст, а в инфоблоке включён транслит — сгенерируется из `NAME`. Возвращает ID нового элемента. Каталог (ИБ 2) метод отклонит.
### sale/product/add — товар каталога (инфоблок 2)
`POST /api/sale/<TOKEN>/product/add`
```json
{ "fields": {
"IBLOCK_ID": 2,
"NAME": "Кроссовки Модель X",
"CODE": "krossovki-model-x",
"ACTIVE": "Y",
"IBLOCK_SECTION_ID": 15,
"PRICE": 4990,
"CURRENCY": "RUB",
"QUANTITY": 10,
"VAT_ID": 1,
"VAT_INCLUDED": "Y",
"MEASURE": 5,
"WEIGHT": 800,
"PROPERTY_ARTNUMBER": "ART-001",
"PROPERTY_MANUFACTURER": "Производитель"
} }
```
Помимо полей элемента поддерживаются товарные (`Product::getAvailableElementFields`): `PRICE, CURRENCY, QUANTITY, QUANTITY_RESERVED, VAT_ID, VAT_INCLUDED, MEASURE, EXTERNAL_ID, PURCHASING_PRICE, PURCHASING_CURRENCY, WIDTH, HEIGHT, LENGTH, WEIGHT`. Метод сам заводит товар в торговом каталоге и ставит базовую цену. Требует именно каталог.
### section.add — раздел
`POST /api/sale/<TOKEN>/product/section/add` (каталог) или `/api/iblock/<TOKEN>/element/section/add` (обычный ИБ)
```json
{ "fields": {
"IBLOCK_ID": 2,
"NAME": "Мужская обувь",
"CODE": "muzhskaya-obuv",
"SORT": 100,
"ACTIVE": "Y",
"IBLOCK_SECTION_ID": 0,
"UF_SHOW_IN_MENU": 1
} }
```
Поля раздела: `ID, IBLOCK_SECTION_ID, IBLOCK_ID, NAME, CODE, SORT, ACTIVE` + пользовательские `UF_*` (например `UF_SHOW_IN_MENU`, см. [[Инфоблоки и каталог (apelsincom)]]).
### order/create — заказ
`POST /api/sale/<TOKEN>/order/create` (**без** обёртки `fields`). Заказ создаётся на пользователя токена.
```json
{
"PERSON_TYPE_ID": 1,
"DELIVERY_ID": 1,
"PAYSYSTEM_ID": 1,
"ITEMS": [
{ "PRODUCT_ID": 412, "QUANTITY": 1 },
{ "PRODUCT_ID": 413, "QUANTITY": 4 }
],
"PROPERTIES": [
{ "ID": 1, "VALUE": "Иван" },
{ "ID": 5, "VALUE": ["Опция А", "Опция Б"] }
]
}
```
- `ITEMS[].PRODUCT_ID` — ID товара/предложения каталога, `QUANTITY` — количество. Корзина строится через провайдер `catalog`, валюта — базовая.
- `PROPERTIES[].ID` — ID свойства заказа (значения списков — из `order/property.list`), `VALUE` может быть массивом для множественных.
- `DELIVERY_ID` / `PAYSYSTEM_ID` — из `order/delivery.list` и `order/payment.list`; `PERSON_TYPE_ID` — из `order/payer.list`.
- Возвращает ID созданного заказа; при ошибке — 400 с текстом от `sale`.
### Остальные схемы — сверять в моделях
Для `store/set.amount`, `user/add`, `measure/*`, `discount/*` и свойств (`property.*`) точный формат — в `lib/sale/models/Store.php`, `Product/DmlStore.php`, `lib/main/models/User.php`, `lib/iblock/models/Element/DmlProperty.php`. Быстро узнать поля вживую: `…/product/fields`, `…/order/fields`, `…/user/fields`, `…/product/property/list?filter[IBLOCK_ID]=2`.
## См. также
- [[REST API (richcode.api)]]
- [[Сценарии. Товары и разделы]]
- [[Информационная безопасность (apelsincom)]]
@@ -0,0 +1,60 @@
# Архитектура и структура каталогов (apelsincom)
Сайт сделан на 1С-Битрикс. Главное правило: все доработки лежат в `/local/`, а ядро `/bitrix/` не трогаем — так правки не слетают при обновлении платформы.
## Из чего сделан сайт
- **Движок:** 1С-Битрикс (PHP), решение eShop. Модули: главный, инфоблоки, торговый каталог, продажи (`sale`), валюты, склады (`storeassist`), поиск, веб-формы, плюс сторонний модуль `richcode.api` (внешний REST — см. [[REST API (richcode.api)]]).
- **Фронтенд:** jQuery 3.7.1, jQuery UI, Fancybox, Swiper, маска телефона, свой `script.js`. Сборки (webpack и т.п.) нет — библиотеки подключены готовыми. Подробнее — [[Шаблон custom]].
- **Данные:** товары в инфоблоке ID 2 с торговыми предложениями (размер/цвет), заказы в модуле `sale`. См. [[Инфоблоки и каталог (apelsincom)]].
## Как всё связано, по-простому
```mermaid
flowchart LR
U[Посетитель] --> H[.htaccess: HTTPS + ЧПУ]
H --> K[Ядро Битрикс]
K --> T[Шаблон custom]
T --> C[Компоненты и их шаблоны]
C --> IB[(Инфоблоки / sale)]
A[Внешняя система] -->|HTTP + токен| API[richcode.api /api/]
API --> IB
```
Витрину собирают штатные компоненты Битрикса с **переопределёнными шаблонами**. Параллельно наружу работает REST API (`richcode.api`), который ходит в те же данные, минуя витрину.
> [!tip] Ключевое отличие этого проекта
> Здесь **нет своих компонентов** (`/local/components/` пуст) и **нет своего `init.php`** (`/local/php_interface/` пуст). Вся кастомизация — в шаблонах компонентов внутри шаблона сайта. Если привыкли искать логику в `init.php` — тут её нет, смотрите в [[Компоненты и шаблоны компонентов]] и [[REST API (richcode.api)]].
## Папки на сайте
```
public_html/
├── index.php главная (баннер-слайдер, блоки категорий и товаров)
├── 404.php страница «не найдено» (крупный файл с вёрсткой)
├── .htaccess HTTPS-редирект и ЧПУ
├── urlrewrite.php правила ЧПУ Битрикса
├── catalog/ каталог (компонент bitrix:catalog, ИБ 2)
├── personal/ store/ news/ разделы: кабинет/корзина, магазины, новости
├── include/ подключаемые куски (логотип, баннер, контакты, кнопки Ozon/WB)
├── upload/ загрузки: картинки ИБ, файлы свойств, docs, фиды импорта/экспорта
├── odmavatar/ файлы внешнего виджета «ИИ-стилист» (отключён)
├── bitrix/ ядро движка (не трогаем)
│ ├── modules/richcode.api/ сторонний REST-модуль
│ ├── php_interface/ подключение БД + раннеры импорта/экспорта
│ └── services/ rest, ymarket, mobileapp, sale/b24integration
└── local/ ВСЕ ДОРАБОТКИ
└── templates/custom/ активный шаблон сайта (внутреннее имя reborn_template)
├── header.php footer.php шапка и подвал
├── js/script.js поведение фронта
├── styles.css fonts/ стили и шрифты
└── components/bitrix/ ПЕРЕОПРЕДЕЛЁННЫЕ шаблоны компонентов
```
Полный список «что где» — в [[Справочник — что где лежит (apelsincom)]].
## См. также
- [[Шаблон custom]]
- [[Компоненты и шаблоны компонентов]]
- [[REST API (richcode.api)]]
- [[Серверная логика и php_interface (apelsincom)]]
- [[Справочник — что где лежит (apelsincom)]]
@@ -0,0 +1,42 @@
# Быстрый старт для нового разработчика (apelsincom)
Эта страница для того, кто впервые открыл проект. Идите по шагам сверху вниз. Непонятные слова — в [[Глоссарий (apelsincom)]].
## 1. Получите доступы
Сервер, FTP и домен — на странице [[Доступы и окружение (apelsincom)]]. Админка в этом проекте может быть недоступна — работаем по FTP и через API.
Скачайте к себе по FTP папку `/local/` — это все доработки сайта. Ядро `/bitrix/` целиком тянуть не нужно.
## 2. Разберитесь, как всё устроено
- Прочитайте [[Архитектура и структура каталогов (apelsincom)]] — общая картина и правило «всё в /local/».
- Прочитайте [[Компоненты и шаблоны компонентов]] — здесь ключевая особенность: своих компонентов нет, вся вёрстка и логика вывода — в переопределённых шаблонах штатных компонентов.
- Загляните в [[REST API (richcode.api)]] — сайт отдаёт наружу REST-интерфейс; для этого проекта это важнее, чем витрина.
- Бегло — [[Маршрутизация и ЧПУ (apelsincom)]] и [[Инфоблоки и каталог (apelsincom)]].
## 3. Сразу узнайте про «грабли»
Это лучше прочитать до того, как что-то менять — [[Известные проблемы и рекомендации (apelsincom)]]:
- Номер инфоблока каталога (**2**) зашит в коде во многих местах.
- В webroot лежит публичный бэкап `shoes.zip` (~1.27 ГБ) — риск утечки.
- В шаблоне умного фильтра валяется файл-дубль `template copy 1.php`.
- Рядом с активными шаблонами лежат исходные `bootstrap_v4` — не перепутайте, какой правите.
## 4. Проверьте, что всё работает
- Откройте витрину: главная, каталог `/catalog/`, карточка товара.
- Проверьте, отвечает ли API по настроенному пути (по умолчанию `/api/`). Точный путь и токены — в настройках модуля `richcode.api` (нужен админ) либо у прежней команды. См. [[REST API (richcode.api)]].
- Посмотрите свежий `error_log` в корне аккаунта на предмет ошибок.
## 5. Сделайте первое простое изменение
Тренируйтесь на чём-то безопасном:
1. Поправьте текстовую область в `/include/` (например, контакты в подвале — сейчас там демо-данные). Как — в [[Компоненты и шаблоны компонентов#Include-области]].
2. Сбросьте кэш и проверьте страницу ([[Кэширование и обслуживание (apelsincom)]]).
Чего лучше не делать на старте:
- Не трогать ядро `/bitrix/` — работайте только в `/local/`.
- Не менять номер инфоблока и коды свойств без полной проверки — они зашиты в шаблонах и в API.
- Не выкладывать и не генерировать бэкапы в webroot.
- Не делать массовых правок без резервной копии.
## См. также
- [[Магазин обуви (apelsincom) — Обзор]]
- [[Архитектура и структура каталогов (apelsincom)]]
- [[Известные проблемы и рекомендации (apelsincom)]]
@@ -0,0 +1,30 @@
# Глоссарий (apelsincom)
Термины, которые встречаются в этой документации.
- **Инфоблок** — «таблица» контента в Битриксе (товары, новости, слайдер). Каталог здесь — инфоблок ID 2. См. [[Инфоблоки и каталог (apelsincom)]].
- **Элемент** — одна запись инфоблока (например, товар).
- **Раздел** — категория внутри инфоблока (дерево каталога).
- **Свойство** — доп. поле элемента/раздела (артикул, материал, `UF_SHOW_IN_MENU`). `UF_` — пользовательское поле.
- **Торговое предложение (SKU)** — вариант товара (размер, цвет) с собственной ценой и остатком.
- **Компонент** — готовый блок вывода (`bitrix:catalog`, `bitrix:menu`). См. [[Компоненты и шаблоны компонентов]].
- **Шаблон компонента** — вёрстка компонента. Здесь переопределены в `local/templates/custom/components/`.
- **result_modifier.php** — файл шаблона, где правят данные (`$arResult`) перед выводом. Местная замена серверной логики.
- **component_epilog.php** — код шаблона, выполняемый после кэша (некэшируемая часть).
- **Шаблон сайта** — общее оформление (шапка/подвал/стили). Здесь — `custom` (`reborn_template`).
- **Ядро (`/bitrix/`)** — движок Битрикса. Не редактируется.
- **`/local/`** — папка всех доработок проекта.
- **D7** — современное ядро/ORM Битрикса (пространства имён `\Bitrix\…`).
- **ЧПУ (SEF)** — человекопонятные адреса. Правила — `urlrewrite.php` + `.htaccess`. См. [[Маршрутизация и ЧПУ (apelsincom)]].
- **Символьный код** — латинская строка элемента/раздела, попадает в ЧПУ-адрес.
- **Агент** — фоновая задача Битрикса по расписанию (импорт/экспорт).
- **CommerceML** — XML-формат обмена товарами с 1С. См. [[Интеграции (apelsincom)]].
- **YML** — формат выгрузки для Яндекс.Маркета.
- **Highload-блок (HL-блок)** — таблица данных вне инфоблоков; сюда пишется лог API.
- **richcode.api** — сторонний модуль внешнего REST API. См. [[REST API (richcode.api)]].
- **Токен API** — ключ доступа к API, привязан к пользователю (`UF_RESTFUL_API_TOKEN`).
- **Проактивная защита** — модуль безопасности Битрикса (WAF, OTP, контроль целостности).
## См. также
- [[Магазин обуви (apelsincom) — Обзор]]
- [[Глоссарий]] — общий глоссарий соседнего проекта Shale Sante (термины Битрикса пересекаются)
@@ -0,0 +1,30 @@
# Доступы и окружение (apelsincom)
Всё про то, где живёт сайт и как к нему подключиться. Конкретные пароли и токены здесь **не хранятся** — их передают отдельно и по защищённому каналу (см. [[Информационная безопасность (apelsincom)]]).
## Окружение
| Параметр | Значение | Откуда известно |
|---|---|---|
| Платформа | 1С-Битрикс, главный модуль **25.100.500** (2025-06-07) | `bitrix/modules/main/classes/general/version.php` |
| Базовое решение | eShop (интернет-магазин) | модуль `bitrix.eshop`, шаблон `eshop_bootstrap_v4` |
| СУБД | MySQL 8 (коллация `utf8mb4_0900_ai_ci`) | `bitrix/php_interface/after_connect_d7.php` |
| Кодировка сайта | UTF-8 | файлы проекта |
| Веб-сервер | Apache + mod_rewrite | `.htaccess`, `error_log` |
| FTP | Pure-FTPd, поддержка TLS | приветствие FTP |
| Домен (стенд) | `shoes1.orangedm.agency` | `robots.txt` |
| Путь на сервере | `/home/a/apelsincom/public_html/` | `error_log` |
| Разработчик агентства | OrangeDM | папка `odmavatar`, домен |
## Как подключиться
- **FTP:** сервер `77.222.56.104`, порт 21. Логин/пароль — отдельно. Сервер умеет TLS — подключайтесь по **FTPS/SFTP**, а не по открытому FTP (см. [[Информационная безопасность (apelsincom)]]).
- **Webroot:** `public_html/`. Все доработки — в `public_html/local/`.
> [!warning] Про версию PHP
> Точную версию PHP по файлам определить нельзя — уточните её у хостинга или владельца сервера. От версии PHP зависит совместимость Битрикса и модулей.
## См. также
- [[Быстрый старт для нового разработчика (apelsincom)]]
- [[Архитектура и структура каталогов (apelsincom)]]
- [[Информационная безопасность (apelsincom)]]
@@ -0,0 +1,58 @@
# Известные проблемы и рекомендации (apelsincom)
Грабли и слабые места по результатам разбора кода (только чтение, без сканирования и эксплуатации). Часть — гипотезы, требующие проверки в админке; отмечено. Модель угроз — [[Информационная безопасность (apelsincom)]].
Приоритет: **критично** — сразу; **важно** — скоро; **средне** — планово.
## Критично
**1. Полный бэкап в webroot.** `public_html/shoes.zip` (~1.27 ГБ). Если открывается по `https://<домен>/shoes.zip` — это утечка исходников и, возможно, дампа БД со всеми секретами и токенами API.
→ Убрать из webroot, проверить, что ссылка отдаёт 403/404, впредь бэкапы в публичных папках не держать ([[Кэширование и обслуживание (apelsincom)]]).
**2. Открытый API без проверенной защиты.** Модуль `richcode.api` даёт доступ к товарам, заказам, пользователям. Если не включены HTTPS-only, белый список IP и токен-авторизация — это открытая дверь.
→ Проверить и включить меры в настройках модуля. См. [[REST API (richcode.api)]] и [[Информационная безопасность (apelsincom)]].
**3. FTP по открытому порту, доступы переданы текстом.** Порт 21, пароль передавался в переписке.
→ Сменить пароль FTP, перейти на FTPS/SFTP, секреты не слать в открытых каналах.
## Важно
**4. Хардкод номера инфоблока (IBLOCK_ID = 2).** Прописан в `catalog/index.php`, `header.php`, шаблонах компонентов, и используется в API. Пересоздание каталога под другим ID потребует правок во многих местах.
→ При любой миграции каталога искать `"IBLOCK_ID" => "2"` и `iblock_catalog`/`2` по всему `/local/` и в настройках `richcode.api`.
**5. Файлы импорта/фидов в публичном `upload/`.** `upload/xml/pric.xml`, `import_test_50.xml`, `upload/bitrix_import.csv` — могут раскрывать закупочные данные.
→ Проверить доступность по прямой ссылке; рабочие фиды держать вне webroot или закрыть; тестовые удалить.
**6. Демо-данные на витрине.** Контакты в подвале заглушечные (`info@catalog.ru`, `+7 (999) 123-45-67`).
→ Заменить перед продом ([[Шаблон custom]]).
## Средне
**7. Мусор в шаблонах.** В `catalog.smart.filter/custom` лежит `template copy 1.php` — нерабочий дубль, легко перепутать с `template.php`.
→ Удалить после проверки, что он нигде не подключается.
**8. Дубли шаблонов `bootstrap_v4` рядом с `custom`.** Исходные шаблоны eShop лежат рядом с рабочими. Риск править не тот файл.
→ Помнить, какой шаблон реально указан в вызове компонента ([[Компоненты и шаблоны компонентов]]).
**9. Логи и служебные файлы в доступе.** `error_log*`, `bitrix/site_checker_*.log`, `updater*.log`.
→ Ограничить доступ/чистить; снижает объём разведданных.
**10. Внешний виджет higgleby.tech.** Сейчас отключён (закомментирован). При включении — передача данных третьей стороне.
→ Включать осознанно, отразить в политике ПДн.
**11. Расхождения в документации API `richcode.api`.** Подсказки модуля вводят в заблуждение: поле токена названо `UF_RESTFUL_API_TOKEN`, хотя код использует **`UF_API_TOKEN`**; предлагается передавать токен заголовком `Authorization-Token`, хотя рабочий код читает его **из URL**. Разработчик на интеграции легко потеряет время.
→ Ориентироваться на код и на [[REST API — методы и примеры (richcode.api)]], а не на подсказки в админке.
**12. Неочевидные правила тела запросов API.** Легко потерять время на интеграции:
- каталог (инфоблок 2) обслуживает **`sale/product`**, а `iblock/element` каталог **отклоняет** («Инфоблок с указанным ID не найден»);
- у `add`/`update`/`section.add` тело обёрнуто в ключ **`fields`**, а у `order/create` — нет;
- свойства передаются с префиксом `PROPERTY_<КОД>`, поля раздела — `UF_<КОД>`.
→ Проверенные схемы — в [[REST API — методы и примеры (richcode.api)#Точные схемы (проверено по моделям)]].
## Что хорошо
- Свежая версия платформы (25.100.500, 2025) — меньше известных уязвимостей.
- Принудительный HTTPS и запрет листинга директорий в `.htaccess`.
- Кастомизация вынесена в `/local/`, ядро не правится.
- У модуля API есть встроенные меры (HTTPS-only, IP-фильтры, CORS, токены) — их нужно лишь правильно включить.
## См. также
- [[Информационная безопасность (apelsincom)]]
- [[REST API (richcode.api)]]
- [[Быстрый старт для нового разработчика (apelsincom)]]
@@ -0,0 +1,34 @@
# Интеграции (apelsincom)
Внешние связи сайта. Часть подтверждена по коду, часть настраивается в БД/админке — это отмечено. Отдельно про внешний REST — [[REST API (richcode.api)]].
## Обмен с 1С (CommerceML)
В `bitrix/php_interface/include/catalog_import/` есть штатные раннеры Битрикса **CommerceML** (`commerceml_run.php`, `commerceml_setup.php`) и импорт CSV, плюс `cron_frame.php`. Это стандартный механизм обмена каталогом с 1С (товары, цены, остатки).
- Рабочие файлы обмена/прайсы лежат в `upload/xml/` (`pric.xml`, `import_test_50.xml`) и `upload/bitrix_import.csv`.
- Точное расписание и профиль обмена — в настройках (Магазин → Импорт данных / Агенты). **Проверить.**
> [!warning] Импорт может перезаписывать данные
> Обмен из 1С обычно ведётся по `XML_ID`. Товары/цены, привязанные к 1С, при следующем обмене перезапишутся — не редактируйте их вручную, если не уверены. Тестовый файл `import_test_50.xml` — повод проверить, не настроен ли обмен на тестовую выгрузку.
## Яндекс.Маркет
- Экспорт (YML): в `bitrix/php_interface/include/catalog_export/` — раннеры `yandex_run.php`, `yandex_setup.php`, `yandex_simple_*` и `cron_frame.php`. Профили экспорта — `bitrix/catalog_export/`.
- Заказы: сервис `bitrix/services/ymarket/index.php` подключает штатный модуль `sale/services/ymarket` — то есть возможен приём заказов Яндекс.Маркета, а не только выгрузка.
- Конкретные включённые фиды — Магазин → Настройки → Экспорт данных. **Проверить.**
## Битрикс24
- Сервис `bitrix/services/sale/b24integration/push.php` — штатный роутер обмена «магазин ↔ Битрикс24» (`Bitrix\Sale\Exchange\Integration`). Установлен модуль `b24connector`.
- Скорее всего, заказы уходят в CRM Битрикс24. Подключение и портал — Настройки → Битрикс24. **Проверить.**
## Мобильное приложение
- Сервис `bitrix/services/mobileapp/jn.php` и маршрут `/mobileapp/jn/…` — фреймворк мобильных приложений Битрикса (JN). Возможно, сайт обслуживает мобильное приложение. **Проверить актуальность.**
## Маркетплейс-ссылки (Ozon, Wildberries)
Витринные ссылки «Купить на Ozon/Wildberries» в `include/ozon_btn.php`, `include/wb_btn.php` и в подвале. Это просто исходящие ссылки, не автоматический обмен.
## Виджет ИИ-стилист
В `footer.php` есть **закомментированный** внешний чат-виджет: `src="/odmavatar/avatarodm-chat-widget.min.js"`, API `hub.higgleby.tech`, бренд `gekkon`. Файлы — в `odmavatar/`. Сейчас **отключён**; при включении — передача данных третьей стороне (учесть в политике ПДн, см. [[Информационная безопасность (apelsincom)]]).
## См. также
- [[REST API (richcode.api)]]
- [[Серверная логика и php_interface (apelsincom)]]
- [[Кэширование и обслуживание (apelsincom)]]
@@ -0,0 +1,54 @@
# Инфоблоки и каталог (apelsincom)
Контент товаров хранится в инфоблоках Битрикса. Главный — **каталог, ID 2** (тип `catalog`). Номер и коды свойств взяты из параметров компонента `bitrix:catalog` в `catalog/index.php`.
> [!warning] IBLOCK_ID = 2 зашит в коде
> Номер инфоблока каталога прописан прямо в вызовах компонентов (в `catalog/index.php`, `header.php` и шаблонах). Если каталог придётся пересоздавать под другим ID — искать и править во многих местах, включая [[REST API (richcode.api)]]. См. [[Известные проблемы и рекомендации (apelsincom)]].
## Модель товара
- Товары — элементы инфоблока 2.
- Включены **торговые предложения (SKU)**: один товар (модель) имеет варианты по **размеру** и **цвету**. Дерево строится по свойствам `SIZES_SHOES`, `SIZES_CLOTHES`, `COLOR_REF`.
- Цена — тип **BASE**, НДС включён.
- Остатки — по складам модуля `storeassist` (в карточке блок «Наличие на складах»).
## Свойства товара (элемента)
| Код | Что это |
|---|---|
| `ARTNUMBER` | Артикул |
| `MANUFACTURER` | Производитель |
| `MATERIAL` | Материал |
| `BRAND_REF` | Бренд (привязка) |
| `MORE_PHOTO` | Доп. фотографии (галерея) |
| `NEWPRODUCT` | Флаг «Новинка» |
| `SALELEADER` | Флаг «Хит продаж» |
| `SPECIALOFFER` | Флаг «Спецпредложение» |
## Свойства предложения (SKU)
| Код | Что это |
|---|---|
| `SIZES_SHOES` | Размер обуви |
| `SIZES_CLOTHES` | Размер одежды |
| `COLOR_REF` | Цвет (привязка к справочнику) |
| `ARTNUMBER` | Артикул варианта |
| `MORE_PHOTO` | Фото варианта |
В корзину как свойства пишутся `SIZES_SHOES`, `SIZES_CLOTHES`, `COLOR_REF`.
## Свойство раздела
| Код | Что это |
|---|---|
| `UF_SHOW_IN_MENU` | Показывать раздел в боковом меню (читает `bitrix:catalog.section.list`) |
## ЧПУ каталога
Компонент `bitrix:catalog` работает в SEF-режиме, папка `/catalog/`. Адреса: раздел `#SECTION_CODE_PATH#/`, товар `#SECTION_CODE_PATH#/#ELEMENT_CODE#/`, фильтр `…/filter/#SMART_FILTER_PATH#/apply/`. Поэтому у разделов и товаров обязателен **символьный код**. Подробнее — [[Маршрутизация и ЧПУ (apelsincom)]].
> [!info] Что осталось проверить
> Типы свойств, привязки к справочникам (highload-блоки цвета/бренда) и полный список инфоблоков по файлам не видны — это смотрят в админке (Контент → Инфоблоки) или в структуре БД. Здесь зафиксированы только коды, реально используемые в коде.
## См. также
- [[Компоненты и шаблоны компонентов]]
- [[Сценарии. Товары и разделы]]
- [[REST API (richcode.api)]]
@@ -0,0 +1,49 @@
# Информационная безопасность (apelsincom)
> [!warning] Гриф: internal
> Эта заметка описывает устройство защиты и слабые места — она полезна и защищающему, и атакующему. Не публиковать, доступ по необходимости. Секреты (пароли, токены, ключи) здесь не приводятся — только указание, где они лежат. Оперативный список того, что чинить, — в [[Известные проблемы и рекомендации (apelsincom)]].
## Активы и границы
Что защищаем:
- **Данные покупателей** — заказы, кабинеты (ПДн, см. ниже про 152-ФЗ).
- **Коммерческие данные** — каталог, цены, остатки, выгрузки поставщиков.
- **Доступ к управлению** — FTP, БД MySQL, админка, а также **токены REST API** (`richcode.api`).
- **Целостность сайта и API** — защита от подмены кода и несанкционированных вызовов.
Точки входа: публичный веб (HTTPS), админка `/bitrix/admin/`, FTP (порт 21), **внешний API `/api/`**, штатный `/rest/`, интеграции (1С, Яндекс.Маркет, Битрикс24). Секреты — в `bitrix/.settings.php`, `bitrix/php_interface/dbconn.php`, `bitrix/license_key.php`.
## Модель нарушителя
- **Внешний аноним** — сканирует пути Битрикса, ищет открытые бэкапы/дампы, пробует API без токена.
- **Обладатель утёкшего токена API** — действует от имени пользователя-владельца токена (права = права этого пользователя).
- **Скомпрометированный FTP/админ-доступ** — полный контроль.
## Угрозы и меры (прослеживаемость «угроза → мера»)
| Угроза | Мера | Статус |
|---|---|---|
| Раскрытие данных: бэкап `shoes.zip` и фиды в webroot | убрать из публичного доступа | **нарушено**, см. [[Известные проблемы и рекомендации (apelsincom)]] |
| Несанкционированный вызов API | токен-авторизация + белый список IP + CORS + только HTTPS (опции `richcode.api`) | включённость проверить |
| Утечка/подбор токена API | хранить токен как секрет, ротация, минимальные права пользователя-владельца | зависит от эксплуатации |
| Перехват доступа | FTPS/SFTP вместо FTP, HTTPS для API (`ONLY_HTTPS_EXCHANGE`) | FTP по 21, требует действий |
| Утечка ПДн через лог API | не логировать лишнее; ограничить доступ к HL-блоку лога | при включённом `LOGGING` |
| Инъекции/XSS, устаревшие уязвимости | актуальная версия Битрикса, «Проактивная защита» (WAF) | версия свежая; фильтр проверить |
| Подмена файлов ядра/шаблонов | контроль целостности, отказ от правок ядра, работа в `/local/` | базово соблюдается |
| Захват админки | сложные пароли, OTP, ограничение по IP | OTP-модуль есть, статус проверить |
## Приоритет для этого сайта — API
Так как наружу торчит REST API, именно он — главная нестандартная поверхность атаки. Проверьте в настройках `richcode.api`:
- `ONLY_HTTPS_EXCHANGE` — включён;
- белый список IP (`USE_WHITE_LIST_ADDRESS_FILTER`) — если API вызывает известная система;
- CORS-домены — ограничены;
- токены выданы точечно, пользователи-владельцы (поле `UF_API_TOKEN`) имеют минимальные права и состоят только в нужной группе.
> [!warning] Токен передаётся в URL
> Рабочий код `richcode.api` берёт токен из **сегмента URL**, а не из заголовка. Значит, токен попадает в логи веб-сервера, в реферер и в собственный лог модуля (HL-блок при включённом `LOGGING`). Ограничьте доступ к логам, не включайте лишнее логирование, регулярно перевыпускайте токены. Детали — [[REST API — методы и примеры (richcode.api)#Авторизация и фильтры]].
## Персональные данные (152-ФЗ)
Сайт собирает ПДн (заказы, заявки, кабинет). В подвале есть PDF политики и согласия (`/upload/docs/`). Проверьте: собирается ли согласие в формах, актуальны ли реквизиты оператора, отражена ли передача данных третьим лицам (Битрикс24, Яндекс.Маркет, виджет higgleby.tech), определён ли уровень защищённости ИСПДн (для РФ — ПП №1119, меры приказа ФСТЭК №21).
## См. также
- [[Известные проблемы и рекомендации (apelsincom)]]
- [[REST API (richcode.api)]]
- [[Доступы и окружение (apelsincom)]]
@@ -0,0 +1,36 @@
# Источники и метод проверки (apelsincom)
Как собиралась эта документация и что стоит за каждым утверждением.
## Метод
- Доступ к серверу — **по FTP, только на чтение**. Выполнялись лишь листинг и скачивание файлов (`LIST`/`RETR`). **На сервере ничего не создавалось, не менялось и не удалялось.**
- Скачивались небольшие несекретные файлы: конфиги маршрутизации, шаблон и его JS, версия ядра, код модуля `richcode.api`, сервисы.
- Файлы с секретами (`bitrix/.settings.php`, `dbconn.php`, `.config.php`, `license_key.php`) **не выгружались и не приводятся** — задокументирована только их роль.
- Крупный архив `shoes.zip` и медиа не скачивались.
- Данные из БД (значения токенов, точные настройки модулей и обмена, включённость мер защиты) при разборе недоступны — такие места помечены «проверить».
## Ключевые первоисточники (файлы на сервере)
| Утверждение | Источник |
|---|---|
| Bitrix 25.100.500 | `bitrix/modules/main/classes/general/version.php` |
| БД MySQL 8 (utf8mb4) | `bitrix/php_interface/after_connect_d7.php` |
| Маршрутизация, HTTPS | `.htaccess`, `urlrewrite.php` |
| Каталог: ИБ 2, SKU, свойства, ЧПУ | `catalog/index.php` |
| Кастомизация только в шаблонах компонентов | дерево `local/templates/custom/components/`, пустые `local/php_interface` и `local/components` |
| Поведение фронта | `local/templates/custom/js/script.js` |
| Внешний REST API: версия, роутинг, авторизация, опции | `bitrix/modules/richcode.api/` (`install/version.php`, `include.php`, `options.php`, `lib/core/Route.php`, `Init.php`, `Tokens.php`, `Response.php`) |
| REST API: точные действия и параметры контроллеров | `lib/{iblock,sale,main,crm}/controllers/*.php` (карты `$aliases`) |
| Импорт 1С / экспорт Я.Маркет | `bitrix/php_interface/include/catalog_import|catalog_export/` |
| Обмен с Битрикс24 | `bitrix/services/sale/b24integration/push.php` |
| Сервис Я.Маркета | `bitrix/services/ymarket/index.php` |
## Что осталось непроверенным (нужен доступ в админку/БД)
- Версия PHP; включённость «Проактивной защиты» и OTP.
- Точный `API_PATH`, список токенов и прав пользователей `richcode.api`; включены ли HTTPS-only, IP-фильтры, CORS.
- Схемы полей тела запросов `add`/`update`/`create` (в моделях `lib/*/models/`) — действия проверены, детальный формат полсвойств — нет.
- Настроенные профили обмена 1С и фиды Яндекс.Маркета; активные агенты/cron.
- Типы и привязки свойств инфоблока 2 (highload-справочники).
## Обновление
При изменениях (новая версия платформы, новые интеграции, смена шаблона) обновляйте соответствующие заметки. Точка входа — [[Магазин обуви (apelsincom) — Обзор]].
@@ -0,0 +1,55 @@
# Компоненты и шаблоны компонентов
Компонент в Битриксе — готовый блок, который что-то выводит (каталог, меню, форму). На этом сайте **своих компонентов нет** (`/local/components/` пуст). Вместо этого используются штатные компоненты Битрикса, но с **переопределёнными шаблонами**, которые лежат в шаблоне сайта:
```
local/templates/custom/components/bitrix/<компонент>/<шаблон>/
```
Именно здесь ведётся почти вся фронтовая доработка. Логику вывода правят тут, а не в ядре.
## Из чего состоит шаблон компонента
Файлы внутри папки шаблона (стандарт Битрикса — полезно знать):
| Файл | За что отвечает |
|---|---|
| `template.php` | сама вёрстка (HTML + вывод `$arResult`) |
| `result_modifier.php` | правка данных `$arResult` перед выводом — «серверная логика» шаблона |
| `component_epilog.php` | код после кэша (то, что не должно кэшироваться) |
| `.parameters.php` | параметры шаблона для админки |
| `style.css` / `script.js` | стили и скрипт шаблона |
| `lang/` | языковые фразы |
> [!tip] Где искать логику
> Раз своего `init.php` нет, «где данные подхватываются и меняются» смотрите в `result_modifier.php` и `component_epilog.php` конкретного шаблона. Это местная замена серверных обработчиков.
## Переопределённые компоненты витрины
| Компонент | Активный шаблон | Где используется | Инфоблок |
|---|---|---|---|
| `bitrix:catalog` | `catalog_custom` | каталог `/catalog/` (комплексный: список, карточка, фильтр) | 2 |
| `bitrix:catalog.section` | `custom`, `custom_similar` | списки товаров, «похожие» | 2 |
| `bitrix:catalog.element` | `custom` | карточка товара (template.php ~35 КБ, script.js) | 2 |
| `bitrix:catalog.section.list` | `aside_menu`, `home_categories`, `popular_categories`, `custom_tags` | боковое меню и блоки категорий | 2 |
| `bitrix:catalog.smart.filter` | `custom`, `catalog-custom` | умный фильтр | 2 |
| `bitrix:news.list` | `custom_main_slider` | баннер-слайдер на главной | слайдер |
| `bitrix:form.result.new` | `feedback` | форма (заявка/обратная связь) | веб-форма |
| `bitrix:menu` | `custom`, `footer_custom` | верхнее и нижнее меню | — |
| `bitrix:search.page` | `custom_input`, `custom_page` | поиск в шапке и на странице поиска | 2 |
| `bitrix:breadcrumb` | `custom` | хлебные крошки | — |
| `bitrix:main.include` | — | подключение областей из `/include/` | — |
Какой компонент к какому адресу — в [[Маршрутизация и ЧПУ (apelsincom)]]; модель данных каталога — в [[Инфоблоки и каталог (apelsincom)]].
## Include-области
Мелкие переиспользуемые куски вёрстки — в `public_html/include/`, подключаются через `bitrix:main.include`. Там: логотип (`logo*.php`), баннер (`main_banner.php`), SEO-текст (`sect_bottom.php`), копирайт, соцсети, кнопки маркетплейсов (`ozon_btn.php`, `wb_btn.php`), тексты (`info.php`, `feedback.php`), «просмотренные товары». Правятся файлом или областью в админке.
> [!warning] Грабли шаблонов
> - Рядом с активными шаблонами (`custom`) лежат исходные `bootstrap_v4` из решения eShop. Правите не тот — изменений не видно. Всегда сверяйтесь, какой шаблон указан в вызове компонента.
> - В `catalog.smart.filter/custom` лежит мусорный файл-дубль `template copy 1.php` — не рабочий, легко перепутать с `template.php`.
## См. также
- [[Шаблон custom]]
- [[Инфоблоки и каталог (apelsincom)]]
- [[Маршрутизация и ЧПУ (apelsincom)]]
- [[Известные проблемы и рекомендации (apelsincom)]]
@@ -0,0 +1,39 @@
# Кэширование и обслуживание (apelsincom)
Рутинные операции сопровождения.
## Кэш
Компоненты кэшируются надолго — в вызовах `CACHE_TIME` стоят десятки миллионов секунд (`CACHE_TYPE = A`, автокэш). Поэтому правки контента и шаблонов могут не сразу отражаться на витрине.
Сбросить кэш:
- Админка → Настройки → Настройки продукта → **Автокеширование** (или «Сбросить весь кеш»).
- Файлово кэш лежит в `bitrix/cache/`, `bitrix/managed_cache/`, `bitrix/stack_cache/`. Чистить руками по FTP — крайняя мера.
> [!info] Композитного кэша не видно
> Папки `bitrix/html_pages/` (композитный сайт) в структуре нет — похоже, композит выключен или не сгенерирован. Если понадобится ускорение, это отдельная настройка (Настройки → Композитный сайт). **Проверить.**
## Картинки
Ресайзы Битрикса складываются в `upload/resize_cache/`. Отдельной генерации webp (как бывает на других проектах) в коде не замечено.
## Обновления платформы
- Ставятся через SiteUpdate: Настройки → Обновление платформы. Логи — `bitrix/modules/updater.log`, `updater_partner.log`.
- Текущая версия свежая (главный модуль 25.100.500, 2025-06-07) — это плюс к безопасности.
- Перед обновлением — резервная копия и проверка совместимости шаблона и модуля `richcode.api`.
## Cron и агенты
Импорт/экспорт каталога (1С, Яндекс.Маркет) запускаются по расписанию — через агенты Битрикса и/или системный cron (`cron_frame.php` в `php_interface/include/*`). Список активных агентов — Настройки → Настройки продукта → Агенты. **Проверить**, что нужные включены и отрабатывают.
## Логи
- Ошибки веб-сервера — `error_log` в корне аккаунта (+ архивы `error_log-*.gz`).
- Лог API-запросов — в highload-блоке, если включён (см. [[REST API (richcode.api)#Логирование]]).
- Логи обновлений и проверки системы — в `bitrix/`.
## Резервные копии
Штатный модуль резервного копирования или средства хостинга.
> [!warning] Бэкап не в webroot
> Готовые бэкапы нельзя оставлять в публичной папке — станут доступны по прямой ссылке. Сейчас это нарушено (`public_html/shoes.zip`, ~1.27 ГБ). См. [[Известные проблемы и рекомендации (apelsincom)]].
## См. также
- [[Интеграции (apelsincom)]]
- [[Известные проблемы и рекомендации (apelsincom)]]
@@ -0,0 +1,47 @@
# Документация сайта (магазин обуви apelsincom) — для разработчика
Это техническая документация интернет-магазина обуви на 1С-Битрикс (хостинг-аккаунт `apelsincom`, стенд `shoes1.orangedm.agency`, агентство OrangeDM). Она написана для веб-разработчика, который будет сопровождать и дорабатывать сайт **по FTP**, без опоры на админку. Задача — чтобы новый человек разобрался сам, не обращаясь к прежней команде.
Я разбирался по коду и файлам через FTP (только чтение, на сервере ничего не менял). Всё, что хранится в базе (точные настройки модулей, значения токенов, включённость мер защиты), по файлам не видно — такие места помечены как «проверить». Как и что проверялось — в [[Источники и метод проверки (apelsincom)]].
> [!info] Главная особенность этого сайта
> Кроме обычной витрины, сайт работает как **API-бэкенд**: сторонний модуль `richcode.api` отдаёт наружу REST-интерфейс к товарам, заказам, складам и пользователям. Скорее всего, именно поэтому «работа без админки» — данными управляют через API. Начните с [[REST API (richcode.api)]].
Впервые на проекте — идите в [[Быстрый старт для нового разработчика (apelsincom)]]. Совсем коротко — [[#Самое важное, если коротко]] ниже.
## С чего начать
- [[Быстрый старт для нового разработчика (apelsincom)]] — что делать в первый день
- [[Доступы и окружение (apelsincom)]] — сервер, FTP, домен, версии
## Как устроен сайт
- [[Архитектура и структура каталогов (apelsincom)]] — общая картина и правило «всё в /local/»
- [[Шаблон custom]] — шапка, подвал, подключение стилей, поведение на JS
- [[Компоненты и шаблоны компонентов]] — где вёрстка и данные каждого блока
- [[Инфоблоки и каталог (apelsincom)]] — модель товаров, размеры, цвета
- [[Маршрутизация и ЧПУ (apelsincom)]] — как адрес превращается в страницу
- [[Серверная логика и php_interface (apelsincom)]] — что выполняется на каждой странице
## Технические подсистемы
- [[REST API (richcode.api)]] — самое интересное: внешний API к сайту
- [[REST API — методы и примеры (richcode.api)]] — справочник действий и примеры `curl`
- [[Интеграции (apelsincom)]] — 1С, Яндекс.Маркет, Битрикс24, мобильное приложение
- [[Кэширование и обслуживание (apelsincom)]] — кэш, обновления, cron
## Работа с сайтом
- [[Сценарии. Товары и разделы]] — как добавить/изменить элемент и раздел (через API и код)
## Безопасность
- [[Информационная безопасность (apelsincom)]] — модель угроз и меры
- [[Известные проблемы и рекомендации (apelsincom)]] — грабли и что чинить в первую очередь
## Справочники
- [[Справочник — что где лежит (apelsincom)]]
- [[Глоссарий (apelsincom)]] — термины Битрикса
- [[Источники и метод проверки (apelsincom)]]
## Самое важное, если коротко
1. Сайт на Битриксе, главный модуль **25.100.500** (2025). Все доработки — в `/local/`, ядро `/bitrix/` не трогаем.
2. Каталог товаров — **инфоблок ID 2** (тип `catalog`), с торговыми предложениями (размер, цвет). Номер зашит в коде во многих местах — см. [[Известные проблемы и рекомендации (apelsincom)]].
3. Своих компонентов и `init.php` в `/local/` **нет**. Вся кастомизация — в переопределённых шаблонах штатных компонентов (`/local/templates/custom/components/`). См. [[Компоненты и шаблоны компонентов]].
4. Наружу торчит **REST API** (`richcode.api 3.1.5`) по пути вида `/api/…` с токенной авторизацией. Это чувствительная точка входа — [[REST API (richcode.api)]] и [[Информационная безопасность (apelsincom)]].
5. Внимание: в webroot лежит полный бэкап `shoes.zip` (~1.27 ГБ). Убрать в первую очередь — [[Известные проблемы и рекомендации (apelsincom)]].
@@ -0,0 +1,42 @@
# Маршрутизация и ЧПУ (apelsincom)
Как адрес в браузере превращается в страницу. Проверено по `.htaccess` и `urlrewrite.php`.
## Цепочка обработки (`.htaccess`)
1. **Принудительный HTTPS** — любой http-запрос получает 301 на https.
2. Существующий файл/папка отдаётся напрямую.
3. Иначе запрос уходит в `bitrix/urlrewrite.php` — механизм ЧПУ (SEF) Битрикса.
4. Если совпадения нет — на `/index.php`.
5. Ошибка 404 → `/404.php`. Листинг директорий запрещён (`Options -Indexes`). Статике заданы сроки кэша.
## Таблица SEF-маршрутов (`urlrewrite.php`)
| Условие URL | Компонент/обработчик | Файл |
|---|---|---|
| `/catalog/` | `bitrix:catalog` | `/catalog/index.php` |
| `/store/` | `bitrix:catalog.store` | `/store/index.php` |
| `/personal/order/` | `bitrix:sale.personal.order` | `/personal/order/index.php` |
| `/personal/` | `bitrix:sale.personal.section` | `/personal/index.php` |
| `/news/` | `bitrix:news` | `/news/index.php` |
| `/rest/` | сервис REST Битрикса | `/bitrix/services/rest/index.php` |
| `/bitrix/services/ymarket/` | выгрузка/заказы Яндекс.Маркета | `/bitrix/services/ymarket/index.php` |
| `/mobileapp/jn/…` | мобильное приложение | `/bitrix/services/mobileapp/jn.php` |
> [!info] API richcode.api — отдельно от urlrewrite
> Внешний REST-интерфейс (`richcode.api`, путь по умолчанию `/api/`) перехватывается **не** через `urlrewrite.php`, а обработчиком самого модуля на старте страницы. Подробнее — [[REST API (richcode.api)]].
## ЧПУ внутри каталога
`bitrix:catalog` в SEF-режиме строит адреса по символьным кодам (из `catalog/index.php`):
- раздел: `#SECTION_CODE_PATH#/`
- товар: `#SECTION_CODE_PATH#/#ELEMENT_CODE#/`
- фильтр: `#SECTION_CODE_PATH#/filter/#SMART_FILTER_PATH#/apply/`
Поэтому у каждого раздела и товара обязателен заполненный **символьный код** — иначе ЧПУ-адрес не построится.
> [!warning] Если новый раздел с ЧПУ не открывается
> `urlrewrite.php` Битрикс генерирует сам при настройке компонентов. После структурных изменений пересоберите правила: Настройки → Настройки продукта → Обработка адресов (или пересохраните страницу с компонентом). Правило вручную обычно не пишут.
## См. также
- [[Инфоблоки и каталог (apelsincom)]]
- [[REST API (richcode.api)]]
- [[Архитектура и структура каталогов (apelsincom)]]
@@ -0,0 +1,40 @@
# Серверная логика и php_interface (apelsincom)
Где на этом сайте выполняется серверный код помимо шаблонов. Короткий ответ: **своей серверной логики в `/local/` почти нет** — это отличает проект от типового Битрикс-сайта.
## Чего НЕТ (и это важно знать)
- `/local/php_interface/`**пусто**. Своего `init.php` с обработчиками событий и агентами нет.
- `/local/components/`**пусто**. Своих компонентов нет.
Поэтому не ищите бизнес-логику в `init.php` — её там нет. Она размазана по трём местам:
1. **Шаблоны компонентов** (`result_modifier.php`, `component_epilog.php`) — см. [[Компоненты и шаблоны компонентов]].
2. **Модуль `richcode.api`** — вся API-логика в `bitrix/modules/richcode.api/lib/` — см. [[REST API (richcode.api)]].
3. **Штатные механизмы Битрикса** — импорт/экспорт, обмен, агенты.
## Ядро: `bitrix/php_interface`
Это часть ядра, но пригодится:
| Файл | Назначение |
|---|---|
| `dbconn.php` | подключение к БД. **Чувствительно** (реквизиты) — не выносить в публичные бэкапы |
| `after_connect_d7.php` | SQL после коннекта: `SET NAMES 'utf8mb4' COLLATE 'utf8mb4_0900_ai_ci'` (отсюда вывод — MySQL 8) |
| `include/catalog_import/` | раннеры импорта: CommerceML (1С), CSV, `cron_frame.php` |
| `include/catalog_export/` | раннеры экспорта: Яндекс.Маркет (YML), Froogle, CSV, `cron_frame.php` |
Импорт/экспорт запускаются по расписанию (cron/агенты) — см. [[Интеграции (apelsincom)]] и [[Кэширование и обслуживание (apelsincom)]].
## Конфигурация
- `bitrix/.settings.php` (D7) и `bitrix/.config.php` — подключения, кэш, криптоключи. **Чувствительно**, значения в документации не приводятся.
- `bitrix/license_key.php` — лицензионный ключ.
> [!tip] Если нужно добавить свою логику
> Делайте это по-битриксовому, не трогая ядро:
> - обработчики событий — создать `local/php_interface/init.php` и регистрировать через `EventManager`/`AddEventHandler`;
> - свои компоненты — `local/components/`;
> - свои модули — `local/modules/`.
> Так правки переживут обновление платформы.
## См. также
- [[Компоненты и шаблоны компонентов]]
- [[REST API (richcode.api)]]
- [[Интеграции (apelsincom)]]
@@ -0,0 +1,36 @@
# Справочник — что где лежит (apelsincom)
Быстрый указатель. Пути от корня `public_html/`.
| Что нужно | Где это |
|---|---|
| Главная страница | `index.php` |
| Каталог | `catalog/index.php` (компонент `bitrix:catalog`, ИБ 2) |
| Редиректы и ЧПУ | `.htaccess`, `urlrewrite.php` |
| Страница 404 | `404.php` |
| Логотип, баннер, контакты, кнопки маркетплейсов | `include/` |
| Шаблон сайта | `local/templates/custom/` (имя `reborn_template`) |
| Шапка / подвал | `local/templates/custom/header.php` / `footer.php` |
| Поведение фронта (JS) | `local/templates/custom/js/script.js` |
| Переопределённые шаблоны компонентов | `local/templates/custom/components/bitrix/` |
| Свои компоненты | **нет** (`local/components/` пуст) |
| Свой init.php / события | **нет** (`local/php_interface/` пуст) |
| Внешний REST API | `bitrix/modules/richcode.api/` |
| Подключение БД | `bitrix/php_interface/dbconn.php` (чувствительно) |
| Кодировка соединения БД | `bitrix/php_interface/after_connect_d7.php` |
| Импорт из 1С (CommerceML), CSV | `bitrix/php_interface/include/catalog_import/` |
| Экспорт (Яндекс.Маркет YML) | `bitrix/php_interface/include/catalog_export/`, `bitrix/catalog_export/` |
| Обмен с Битрикс24 | `bitrix/services/sale/b24integration/` |
| Сервис Яндекс.Маркета | `bitrix/services/ymarket/` |
| Мобильное приложение | `bitrix/services/mobileapp/jn.php` |
| Файлы обмена/фиды | `upload/xml/`, `upload/bitrix_import.csv` |
| Картинки инфоблоков / ресайзы | `upload/iblock/`, `upload/resize_cache/` |
| Юридические PDF (ПДн) | `upload/docs/` |
| Конфиг ядра (чувствительно) | `bitrix/.settings.php`, `bitrix/.config.php`, `bitrix/license_key.php` |
| Кэш | `bitrix/cache/`, `bitrix/managed_cache/`, `bitrix/stack_cache/` |
| Логи ошибок | `error_log` (корень аккаунта) |
| Бэкап (убрать!) | `public_html/shoes.zip` — см. [[Известные проблемы и рекомендации (apelsincom)]] |
## См. также
- [[Архитектура и структура каталогов (apelsincom)]]
- [[Магазин обуви (apelsincom) — Обзор]]
@@ -0,0 +1,40 @@
# Сценарии. Товары и разделы
Как добавить или изменить товар и раздел каталога. Два пути в зависимости от доступа: через REST API и через код (D7). Модель данных — [[Инфоблоки и каталог (apelsincom)]].
> [!info] Про админ-панель
> Этот проект сопровождается **без админки** — только по FTP/коду и через REST API. Поэтому пошаговых сценариев «через админку» здесь нет. Всё, что делается кнопками в `/bitrix/admin/`, ниже описано на уровне API и кода. Что и где хранится в БД (и требует доступа в админку для проверки) — помечено в [[Источники и метод проверки (apelsincom)]].
> [!warning] Осторожно с символьным кодом
> Символьный код (латиницей) обязателен у товара и раздела — он идёт в ЧПУ-адрес. Смена кода у раздела/товара с уже проиндексированными адресами ломает ссылки (старые → 404). Меняете — настройте редиректы.
## Вариант A. Через REST API
Модуль `richcode.api` умеет создавать и править элементы каталога, разделы, остатки и заказы. Полный справочник действий и примеры — [[REST API — методы и примеры (richcode.api)]].
- **Каталог (инфоблок 2) — только через `sale/product`:** `add`, `update`, `delete`, `get`, `list`, а также `section.add`, `section.list`. Контроллер `iblock/element` каталог не обслуживает (вернёт ошибку).
- Остатки/склады: `sale/store``set.amount`.
- Обычные (не каталог) инфоблоки: `iblock/element` — те же действия.
- Нужны: включённый API, путь (`/api/`), токен пользователя (`UF_API_TOKEN`) с правами на инфоблок 2 и членством в заданной группе.
Пример — создать товар в каталоге (инфоблок 2), тело обёрнуто в `fields`:
```bash
curl -X POST "https://<домен>/api/sale/<TOKEN>/product/add" \
-H "Content-Type: application/json" \
-d '{"fields":{"IBLOCK_ID":2,"NAME":"Кроссовки Модель X","CODE":"krossovki-model-x","ACTIVE":"Y","PRICE":4990,"CURRENCY":"RUB","QUANTITY":10,"PROPERTY_ARTNUMBER":"ART-001"}}'
```
Полные схемы полей (`product/add`, `order/create`, `section.add`) — [[REST API — методы и примеры (richcode.api)#Точные схемы (проверено по моделям)]].
> [!warning] Права API = права пользователя-токена
> Через API вы действуете от имени пользователя, которому принадлежит токен. Дайте ему ровно те права, что нужны (доступ к инфоблоку 2, к заказам), не больше. См. [[Информационная безопасность (apelsincom)]].
## Вариант B. Через код (D7)
Разовые массовые операции можно делать скриптом на API ядра Битрикс (D7): `CIBlockElement` / `\Bitrix\Iblock\…`. Скрипт кладут вне ядра, номер инфоблока — **2**. Обязательно бэкап перед массовой правкой.
## После любых изменений
- Проверьте, что заполнен символьный код и товар активен.
- Сбросьте кэш каталога — он кэшируется надолго ([[Кэширование и обслуживание (apelsincom)]]).
- Откройте ЧПУ-адрес и карточку: фото, свойства, кнопка «Купить».
## См. также
- [[Инфоблоки и каталог (apelsincom)]]
- [[REST API (richcode.api)]]
- [[Маршрутизация и ЧПУ (apelsincom)]]
@@ -0,0 +1,45 @@
# Шаблон custom
Активное оформление сайта — шаблон `local/templates/custom` (внутреннее имя `reborn_template`, задано в `description.php`). Здесь шапка, подвал, подключение ресурсов, поведение фронта и переопределённые шаблоны компонентов.
## Подключение ресурсов (`header.php`)
Через `Bitrix\Main\Page\Asset` подключаются:
- **Шрифты:** Inter, ProximaNova (локальные, папка `fonts/`), плюс Google Fonts (Roboto, Manrope). В `fonts/` есть и `adihaus` (шрифт в стиле Adidas).
- **CSS:** Fancybox, Swiper, основной `styles.css` (~56 КБ).
- **JS:** jQuery 3.7.1, jQuery UI, Fancybox, Swiper, `jquery.maskedinput`, и свой `js/script.js`.
## Шапка (`header.php`)
- Верхнее меню-ссылки: «О компании», «Контакты», «FAQ».
- Логотип-текст **`GEKKON`** — захардкожен в `header.php`/`footer.php`. Судя по демо-контактам в подвале и реальному домену `shoes1.orangedm.agency`, это, скорее всего, **заглушка шаблона**, а не бренд магазина. Меняется правкой шаблона.
- Поиск — компонент `bitrix:search.page` (шаблон `custom_input`) по инфоблоку каталога (ID 2).
- Боковое меню разделов — `bitrix:catalog.section.list` (шаблон `aside_menu`); в меню попадают разделы со свойством `UF_SHOW_IN_MENU`.
- Хлебные крошки — `bitrix:breadcrumb` (шаблон `custom`), скрыты на главной.
## Подвал (`footer.php`)
- Колонки «Контакты», «FAQ», «Покупка» (ссылки на Ozon, Wildberries, «Заявка на покупку»).
- Нижнее меню — `bitrix:menu` (тип `bottom`, шаблон `footer_custom`).
- Юридические PDF из `/upload/docs/` (политика и согласие на обработку ПДн).
- Подключения областей: `include/copyright.php`, `include/socnet_footer.php`, `include/sect_bottom.php`.
- В самом низу — **закомментированный** внешний виджет «ИИ-стилист» (`odmavatar`). См. [[Интеграции (apelsincom)#Виджет ИИ-стилист]].
> [!warning] Демо-данные в подвале
> Контакты в подвале сейчас заглушечные (`info@catalog.ru`, `+7 (999) 123-45-67`, адрес в Москве). Перед продом заменить — правится в `footer.php` или выносится в `/include/`.
## Поведение фронта (`js/script.js`)
Свой скрипт (~12 КБ, чистый DOM + немного jQuery). Что делает:
- **Мобильное меню-бургер:** открытие/закрытие бокового меню, второй уровень, кнопка «назад», оверлей.
- **Аккордеон подвала** на мобильных (колонки сворачиваются).
- **Панель поиска:** открытие по иконке, фокус в поле, закрытие по Esc.
- **Слайдер баннера** (`.banner-swiper`) на Swiper; на узких экранах прокрутка вертикальная.
- **Галерея товара:** переключение главного фото по миниатюрам, drag-scroll миниатюр.
- **Выбор размера/цвета:** клик по цвету меняет главное фото и галерею (данные берутся из `data-picture` / `data-gallery`).
- **Кастомные мультиселекты** фильтра: клик по опции дёргает `smartFilter.click(checkbox)` — то есть завязан на умный фильтр каталога.
- **Маска телефона** `+7 (h99) 999-99-99` (первая цифра из набора `0,1,3,4,5,6,7,9`).
## Переопределённые шаблоны компонентов
Лежат в `local/templates/custom/components/bitrix/…`. Это основное место кастомизации — подробный разбор в [[Компоненты и шаблоны компонентов]].
## См. также
- [[Компоненты и шаблоны компонентов]]
- [[Архитектура и структура каталогов (apelsincom)]]
- [[Инфоблоки и каталог (apelsincom)]]