Initial commit
This commit is contained in:
Vendored
+1
@@ -0,0 +1 @@
|
||||
{}
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{}
|
||||
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
[
|
||||
"obsidian-git"
|
||||
]
|
||||
Vendored
+33
@@ -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
|
||||
}
|
||||
Vendored
+22
@@ -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
|
||||
}
|
||||
+415
File diff suppressed because one or more lines are too long
+10
@@ -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
@@ -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;
|
||||
}
|
||||
Vendored
+216
@@ -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)]]
|
||||
Reference in New Issue
Block a user