Статьи об IT

Web-программирование - Шпаргалки и простые примеры: php, vue, html, css, modx, javascript

И вначале реклама, небольшой блок. Прошу не сердиться и не вносить ее в фильтры блокировщиков.

подробнее о рекламодателе можно узнать внутри блока
Спасибо. А теперь сам материал.

Решил собрать в одном материале кучу базовых примеров, блоков кода, простых шпаргалок по программированию сайтов. Надеюсь, хоть кому-то будет полезно

 Здесь будут совсем базовые азы, совсем простой код и все намешано - html,css,javascript,vue,modx,php. И в конце полезные книги, источники сайты, часть из которых я уже делился с вами в статье про cms, но некоторые продублирую еще раз. Это не учебник и не руководства, часть шпаргалок пишу\копирую\вставляю для себя. Т.к. иногда это полезно иметь под рукой готовые фрагменты кода, чтобы упростить и ускорить свою работу. Однако же рекомендую перепечатывать, а не копипастить  для понимания (а то вдруг у меня неправильные примеры).  Также, имея готовые фрагменты кода, можно экспериментировать и быстро прототипировать новые идеи. Ну или когда я сталкиваюсь с задачей, которую уже решал ранее, я могу просто обратиться к своей коллекции и найти соответствующий фрагмент кода :-D Хотя кого я обманываю, иногда приходиться "изобретать велосипед" заново и  тратить время на изучение документации и написание кода с нуля (кстати это даже на простых задачах немного помогает повторить, казалось бы, базовый материал, но не упустить важные детали). Ну и еще одно преимущество готовых фрагментов кода заключается в возможности обмена опытом, уверен, что кто-то скажет, что здесь что-то не так и предложит лучше вариант. Это хорошо. Желаю всем продуктивной работы и лучших результатов и начну.  

Изначально я хотел составить все на одной странице, но все-таки решил разбить на несколько в рамках одного материала, вверху содержание.

Итак


Простой и пустой HTML шаблон

<!DOCTYPE html>
<html>
<head>
 <title>Заголовок страницы</title>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <link rel="stylesheet" href="/style.css">
</head>
<body>
 <header>
 <nav>
 <ul>
 <li><a href="#">Главная</a></li>
 <li><a href="#">О нас</a></li>
 <li><a href="#">Контакты</a></li>
 </ul>
 </nav>
 </header>
 <main>
 <section>
 <h1>Заголовок раздела</h1>
 <p>Текст раздела</p>
 </section>
 </main>
 <footer>
 <p>Copyright &copy; Год</p>
 </footer>
</body>
</html>

Универсальные HTML Open Graph метатеги, для различных соцсетей. Однако же, стоит заметить, что для некоторых платформ может быть специфическое начало в property:

 <meta property="og:title" content="Заголовок страницы">
<meta property="og:description" content="Описание страницы">
<meta property="og:image" content="URL_изображения">
<meta property="og:url" content="URL_страницы">

К слову сказать в HTML множество различных мета-тегов, вот еще пример иногда или часто встречающихся:


<meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="description" content="Описание вашего веб-сайта"> <meta name="keywords" content="ключевые слова, разделенные запятыми"> <meta name="author" content="Имя автора"> <meta name="robots" content="index, follow"> <meta name="googlebot" content="index, follow"> <meta name="revisit-after" content="7 days"> <meta name="language" content="язык"> <meta name="theme-color" content="#ffffff"> <meta name="format-detection" content="telephone=no"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 Я буду приводить сухие примеры, вы можете самостоятельно найти теорию по ним. Теперь про CSS. Все мы уже привыкли к фреймворкам, например bootstrap, bulma или tailwind и стали забывать старый добрый чистый css, который сильно продвинулся. (это помимо SCSS). Например Flexbox.

Все мы знаем, что есть такой формат ссылки mailto: но многие не знают, что сюда можно добавить сразу и тему письма и строки для начала письма. например

<a href="mailto:Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript.?subject=Вопрос с сайта&body=Здравствуйте">нам на почту</a>

Это же работает и для большинства ссылок на мессанджеры, только нужно указывать ?text=

Простейший пример горизонтального меню с использованием CSS flexbox 

<div class="container"> 
<nav class="menu">
<a href="#">Главная</a> <a href="#">О нас</a>
<a href="#">Услуги</a> <a href="#">Контакты</a>
</nav> </div>

Стиль

.container {
display: flex;
flex-direction: column;
height: 100vh;
} .menu {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #f2f2f2;
padding: 10px;
} .menu a {
text-decoration: none;
color: #333;
margin-right: 10px;
}

 Flexbox сильно упрощает верстку блочных элементов Подробнее о всех свойствах можно прочесть по этой ссылке.

 Пример анимации на CSS. Мигание элемента

 <div class="pulse"></div>

.pulse {

width: 100px;
height: 100px;
background-color: #ff5e3a;
border-radius: 50%;
animation: pulseAnimation 1.5s ease-in-out infinite;
} @keyframes pulseAnimation {
0% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.2);
opacity: 0.7;
}
100% {
transform: scale(1);
opacity: 1;
}
}

CSS постоянно развивается и дополняется, это и новые единицы измерения например cqw, cqmin, это и новые селекторы, например has или where, и попытки добавить математические операторы. Вообщем, кто занимается фронтэндом, те должны следить и постоянно быть в курсе обновлений и поддержке браузерами. Вот, например, один из обзоров, что добавили в 2023 году. А вот крутейший сайт,  гд можно проверить, какой браузер, что поддерживает. Опять же ссылки еще я продублирую в самом конце 

 А пока перечислю самые популярные и часто используемые свойства css 

  • text-decoration: Устанавливает вид текста (например подчеркнутый).

  • box-shadow: Устанавливает тень блока. Для текста text-shadow

  • transition: Устанавливает переходные эффекты для свойств элемента при изменении состояния. Можно указывать время (transition-duration) и тип (transition-timing-function) перехода. Иными словами делает плавной анимацию

  • text-align: Устанавливает выравнивание текста внутри элемента. 

  • width и height: Устанавливают ширину и высоту соответственно. Можно и нужно использовать также min-width  или max-width для установки минимальной или максимальной ширины (или высоты)

  • border: Устанавливает границу элемента. Также можно прописать: border-width (толщина границы), border-color (цвет границы), border-style (стиль границы). Border-radius позволит вам скруглить углы.

  • font-family: Устанавливает шрифт (семейство шрифта) для текста.

  • font-size: Устанавливает размер шрифта.

  • color: Устанавливает цвет текста.

  • background: Устанавливает фоновые свойства элемента. Некоторые возможные значения: background-color (цвет фона), background-image (изображение фона), background-position (положение фона), background-repeat (повторение фона).

  • padding: Устанавливает внутренние отступы элемента. Можно задавать отступы для всех сторон сразу (padding: 10px) или для конкретной стороны (padding-left: 10px).

  • margin: Устанавливает внешние отступы элемента. Можно задавать отступы для всех сторон (margin: 10px) или для конкретной стороны (margin-top: 10px).

  • position: Определяет позиционирование элемента. Некоторые распространенные значения: static (позиционирование по умолчанию), relative (относительное позиционирование), absolute (абсолютное позиционирование), fixed (фиксированное позиционирование). 

  • display: Устанавливает тип отображения элемента. Некоторые распространенные значения: block (элемент отображается как блок), inline (элемент отображается как строчный элемент), none (элемент не отображается). 

  • gradient-background: Позволяет создавать градиентные фоны с плавным переходом цветов.

  • transform: Позволяет изменять размер, поворот и масштаб элементов.

  • opacity: Позволяет устанавливать прозрачность элементов.

  • box-sizing: Позволяет управлять моделью размеров блока, определяя, каким образом размеры и отступы влияют на полное занимаемое пространство.

  • media queries: Позволяют создавать адаптивный дизайн, изменяя стили в зависимости от различных параметров экрана (например, ширина экрана, разрешение и ориентация).

  • flexbox: Позволяет гибко распределять элементы внутри контейнера по горизонтали и вертикали.

  • grid: Позволяет создавать сетки для размещения элементов на веб-странице.

  • animation: Позволяет создавать сложные анимации и переходы с использованием ключевых кадров и временных функций.

Теперь о CSCC/LESS/SASS. Все это так называемые препроцессоры css, которые сильно расширяют функциональность и помогают при программировании (или написании) css. Можно использовать переменные, константы, вложенности, mixin и т.д., SCSS и LESS отличаются синтаксисом и некоторыми особенностями, но основные концепции и возможности у них схожи. Но я обещал поменьше теории ) Мне лично scss помог в свое время избавиться от всяких !important и быстрой замены каких-либо цветов сразу для всех элементов. Вот простой пример 


// Определение переменных
$primary-color: #ff0000;
$font-size: 16px;

// Стили для элемента .my-element
.my-element {
background-color: $primary-color;
font-size: $font-size;

&:hover {
color: #fff;
}

.inner-element {
font-weight: bold;
}
}

 Чуть не забыл, пожалуй самое базовое и нужное в CSS это сброс всех отступов границ и т.д. для умолчаний. Вы можете добавить и свои элементы 

/* CSS Reset */
/* Обнуление отступов и полей */
body, h1, h2, h3, h4, h5, h6, p, ol, ul {
margin: 0;
padding: 0;
}
/* Сброс стандартных стилей списков */
ol, ul {
list-style: none;
}
/* Границы */
img, iframe {
border: 0;
}
/* Обнуление свойств шрифта */
body {
font-family: Arial, sans-serif;
font-size: 16px;
line-height: 1.5;
}
/* Сброс стандартных стилей ссылок */
a {
text-decoration: none;
color: inherit;
}
/* Сброс стандартных стилей заголовков */
h1, h2, h3, h4, h5, h6 {
font-weight: normal;
}

 Теперь по дебрям, кратко и сухо. 


 Javascript отправка данных Ajax : 

 // Создание объекта XMLHttpRequest
let xhr = new XMLHttpRequest();

// Настройка обработчика события загрузки
xhr.onload = function() {
if (xhr.status >= 200 && xhr.status < 400) {
// Обработка успешного ответа, выводим в консоль полученный текст
let response = JSON.parse(xhr.responseText);
console.log(response);
} else {
// Выводим ошибку в консоль
console.error('Ошибка :', xhr.status, xhr.statusText);
}
};

// Настройка обработчика события ошибки
xhr.onerror = function() {
console.error('Ошибка сети');
}; // Настройка и отправка запроса
xhr.open('POST', 'url страницы куда отправлять', true);
xhr.setRequestHeader('Content-Type', 'application/json'); let data = { name: 'Name ', age: 35
}; xhr.send(JSON.stringify(data));

 Кстати, везде в JS буду использовать объявление переменных let или const, а не как было ранее принято var

 К слову сказать, как это выглядит на jQuery

 $.ajax({
url: 'example.php', // URL
method: 'POST', // Метод запроса (GET, POST и т. д.)
data: {
name: 'Name',
age: 35
}, // Данные, которые нужно отправить

success: function(response) {
// Обработка успешного ответа от сервера
console.log(response);
},

error: function(xhr, status, error) {
// Обработка ошибок при выполнении запроса
console.log('Произошла ошибка: ' + error);
}
});

 Тернарный оператор на Javascript

 let a = (array.lenght >= 3) ? "длина массива больше 3 (условие true)" : "длина массива меньше трех (условия false (или иначе)";

 Перебор массива на Javascript

 let array = [1, 2, 3, 4, 5];
for (let i = 0; i < array.length; i++) {
let element = array[i];
// Обработка элемента массива
console.log(element);
}
let array = [1, 2, 3, 4, 5];
array.forEach(element => {
// Обработка элемента массива
console.log(element);
});

 Перебор массива на Jquery

let array = [1, 2, 3, 4, 5];
$.each(array, function(index, value) {
console.log('Индекс: ' + index + ', Значение: ' + value);
});

Запрос к удаленному серверу, предоставляющему API данные с авторизацией по API key на JavaScript с передачей параметров

const apiKey = 'your_api_key';
const params = { param: 'test' }; const url = new URL('https://api url nekiy/data'); Object.keys(params).forEach(key => url.searchParams.append(key, params[key])); fetch(,url {
headers: {
'Content-Type': 'application/json',
'API-Key': apiKey
}
})
.then(response => response.json())
.then(data => {
const dataArray = Array.isArray(data) ? data : [data]; console.log(dataArray); })
.catch(error => {
console.error('Ошибка при выполнении запроса:', error); });

Вот пример подключения jQuery с авторизацией по API-key

$.ajax({
url: 'https://api url nekiy', 
method: 'GET', 
data: { param: 'test'}, headers: {
'Authorization': 'APIKEY'
}, dataType: 'json', 
success: function(response) {
console.log(response);
let resp_data = JSON.parse(response.responseText);
},
error: function(xhr, status, error) {
console.log('Произошла ошибка: ' + error);
}
});

 jQuery получаем данные из полей на странице и передаем их php файлу (или куда там захотим)

 $(document).ready(function() {
$('#myForm').submit(function(event) {
event.preventDefault(); // Предотвращение отправки формы по умолчанию

// Получение данных из формы
let formData = {
pole1: $('#text').val(),
pole2: $('#text2').val(),
pole3: $('input[name="checkbox"]:checked').val()
};

// Преобразование данных в JSON-массив
let jsonData = JSON.stringify(formData);

// Отправка данных посредством AJAX-запроса
$.ajax({
url: '/page.php',
method: 'POST',
data: jsonData,
contentType: 'application/json', // Установка типа содержимого запроса
success: function(response) {
// Обработка успешного ответа от сервера
console.log(response);
},
error: function(xhr, status, error) {
// Обработка ошибок при выполнении запроса
console.log('Произошла ошибка: ' + error);
}
});
});
});

 Собственно php 

<?php
// Получение данных из POST-запроса
$jsonData = file_get_contents('php://input');
$formData = json_decode($jsonData, true);
// Получение данных из массива
$pole1 = $formData['pole1'];
$pole2 = $formData['pole2'];
$pole3 = $formData['pole3'];
// Обработка данных и генерация ответа
$response = 'Данные успешно получены: Данные1 - ' . $pole1 . ', Данные2 - ' . $pole2 . ', Данные3 - ' . $pole3;
// Возврат ответа в формате JSON
echo json_encode($response);
?>

 Простейший класс на JavaScript, который выведет введенное слово

 class MyClass {
constructor(value) {
this.value = value;
}

printValue() {
const { value } = this; // Деструктуризация значения из свойства this.value
console.log(value);
}
}

// Использование класса
const instance = new MyClass('Hello, World!');
instance.printValue(); // Выведет: Hello, World!

 Работа с датой в JavaScript

const currentDate = new Date();
console.log('Год:', currentDate.getFullYear());
console.log('Месяц:', currentDate.getMonth() + 1); // Месяцы нумеруются с 0, поэтому добавляем 1
console.log('День:', currentDate.getDate());
console.log('Часы:', currentDate.getHours());
console.log('Минуты:', currentDate.getMinutes());
console.log('Секунды:', currentDate.getSeconds());
const tomorrow = new Date(currentDate.getTime() + 24 * 60 * 60 * 1000); // Добавляем 1 день (24 часа * 60 минут * 60 секунд * 1000 миллисекунд)
console.log('Завтрашняя дата:', tomorrow);
const pastDate = new Date(currentDate.getTime() - 7 * 24 * 60 * 60 * 1000); // Вычитаем 7 дней
console.log('Дата неделю назад:', pastDate);
const formattedDate = currentDate.toLocaleDateString('ru-RU');
console.log('Форматированная дата:', formattedDate);

 Сортировка JSON данных по дате в JavaScript

 
const jsonData = [
{ "name": "Объект 1", "date": "2023-01-15" },
{ "name": "Объект 2", "date": "2023-02-10" },
{ "name": "Объект 3", "date": "2023-03-05" },
{ "name": "Объект 4", "date": "2023-01-30" }
];
// Сортировка по дате
jsonData.sort((a, b) => new Date(a.date) - new Date(b.date));
// Вывод отсортированных объектов
jsonData.forEach(obj => console.log(obj));

 В Node.JS есть специальный модуль FS который позволяет считать файл .json . здесь не рассматривается. 

 Для поиска в массиве JavaScript можно

  1. Метод indexOf()  array.indexOf(target); 
  2. Метод find()  array.find(item => item.id === targetId); 
  3. Метод filter()  для поиска всех элементов, удовлетворяющих условию   array.filter(item => item === target); 
  4. Метод includes() (возвращает true или false если  array.includes('значение') найдено 

 Простейшая проверка введенного текста в поле input и вывод сообщения в span, если его нет

 function checkField() {
const inputField = document.getElementById('IdTextInput');
const warningSpan = document.getElementById('IdSpan');
const checkbox = document.getElementById('myCheckbox');
if (inputField.value === '') {
warningSpan.textContent = 'Поле не заполнено';
} else {
warningSpan.textContent = '';
// если поле заполнено
}
} //проверим чекбоксы if (checkbox.checked) { warningSpan.textContent = 'Флажок установлен'; } else { warningSpan.textContent = 'Флажок не установлен'; }

 Как-то раз использовал Server-Sent Events. Простой пример SSE

const eventSource = new EventSource('/sse-endpoint', { headers: { 'Authorization': 'Bearer token' } });
eventSource.onmessage = (event) => {
// Обработка полученного события SSE
console.log('Получено событие SSE:', event.data);
};
eventSource.onerror = (error) => {
// Обработка ошибки SSE
console.error('Ошибка SSE:', error);
};

Немножко регулярки JS + jquery

Допустим у нас есть форма, в которой нужно ввести номер телефона и поставить галочку на "я согласен". Проверяем, что в поле номер телефона (11,12 цифр и символ +) и, собственно, принято согласение. Если все верно по ajax отправляем данные в php файл, иначе ругаемся

submitButton.addEventListener('click', function() {
let phoneNumber = phoneInput.value;
let agreementChecked = agreementCheckbox.checked;
let phoneFormat = /^[0-9+]+$/;
if (phoneNumber && agreementChecked && phoneNumber.match(phoneFormat)) {
let xhr = new XMLHttpRequest();
xhr.open('POST', '/send.php', true);
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onreadystatechange = function() {
if (xhr.readyState === 4 || xhr.status === 200) {
phoneNumber.disabled = true;
successMessage.textContent = xhr.responseText.replace(/(<([^>]+)>)/gi, '');
} else {

}
};
xhr.send('phone=' + encodeURIComponent(phoneNumber));
} else {
errorMessage.textContent = "Пожалуйста, заполните правильно все поля и примите условия обработки персональных данных.";
}
});

 

Находит в тексте слово и присваиваем ему класс, другой кнопкой его сбрасываем. Например нам из кучи абзацев нужно выделить и подчеркнуть определенное слово

$(document).ready(function() {
$('#searchButton').click(function() {
var keyword = 'тест'; // Слово для поиска
var divContent = $('#IdDiv').text(); // Получение содержимого слоя
// Создание регулярного выражения с флагом 'gi' (глобальный и независимый поиск)
var regex = new RegExp(keyword, 'gi');
// Замена найденных совпадений на выделенный текст
var highlightedContent = divContent.replace(regex, function(match) {
return '<span class="highlighted">' + match + '</span>';
});
// Вставка выделенного текста обратно в слой
$('#IdDiv').html(highlightedContent);
});
$('#resetButton').click(function() {
// Удаление элементов <span> из слоя
$('#IdDiv').find('span.highlighted').contents().unwrap();
});
});

 ExtJS обработка нажатия на кнопку, где делаем запрос к удаленному API, получаем данные и заполняем поля в панели

handler: function () {
Ext.Ajax.useDefaultXhrHeader = false;
Ext.Ajax.cors = true;
Ext.Ajax.disableCachingParam = true;
Ext.Ajax.request({
url: 'https://api.url.org/3/' + Ext.getCmp('txtName').getValue()',
withCredentials: true,
method: 'get',
headers: 'Access-Control-Allow-Origin',
cors: true,
async: true,
success: function (response, options) {
let objAjax = Ext.decode(response.responseText);
//если там все разложено, то
Ext.getCmp('homepage').setValue(objAjax.homepage);
Ext.getCmp('name').setValue(objAjax.title);
//или for (var j = 0; j < objAjax.results.length; j++) {
props_getid += 'Текст: ' + objAjax.results[j].id + ' - ' + objAjax.results[j].title + ' (' + objAjax.results[j].release_date.substring(0, 4) + 'г.)' + '\n';
}
//выводим все в одном поле
Ext.getCmp('result').setValue(props_getid);
//или перебираем массив в выдаче и также сплошняком заполняем
let a = ''
for (a = objAjax.genres.length; a--;) {
props += objAjax.genres[a].name + ', ';
}
Ext.getCmp('genres').setValue(props);
},
failure: function (response, options) {
alert("Ошибка: Проверьте данные в поле ввода. " + response.statusText);
}
})
}

ExtJS

 Как-то делая свою панель на ExtJS 3.0 для modx я долго искал как сделать выборку дат. Решил просто сделать текстовое поле с маской вводимых символов. Но оказывается достаточно просто сделать типа поля xtype: 'datefield' и тогда будет поле с календариком выбора дат, причем можно указать формат данных и формат отображения после выбора, например

 items: [{
width: 133,
cls: 'container',
fieldLabel: 'Конец диапазона',
xtype: 'datefield',
format: 'd.m.Y', // Отображаем только день
submitFormat: 'Y-m-d', // Сохраняем полный формат даты (гггг-мм-дд)
emptyText: 'Дата',
name: 'to_date',
id: 'to_date',
}]

 Добавляем динамично или нет элементы в панель. Допустим у меня есть панель 


id: 'panelActors',
xtype: "panel",
title: "Актерский состав",

 А при выполнении запроса, например к API я хочу добавить в эту панель N элементов в зависимости от размера массива. Или, напримр удалить все итемы с панели. Или обновить. Для всего этого есть следующие вещи


Ext.getCmp('panelActors').removeAll();
Ext.getCmp('panelActors').update();
Ext.getCmp('panelActors').doLayout();
Ext.getCmp('panelActors').add(
{
layout: "table",
title: 'Актер ' + i + ' ',
id: 'actor' + i + '',
style: 'padding-top:10px;',
layoutConfig: {
columns: 6
},
defaults: {
bodyStyle: "padding:5px;",
style: "margin:5px;"
},
items: [
{
columnWidth: .3,
colspan: 2,
title: 'Имя',
items: [{
xtype: 'textfield',
fieldLabel: 'В главных ролях',
id: 'casts' + i + '_name',
name: 'casts' + i + '_name',
emptyText: '',
style: 'width:98%'
}]
}}]});

 В одной из моих задач было такое: при нажатии на кнопку в handler, идет ajax запрос, а точнее Ext.Ajax.request , который выполняет обмен данными между сервером с сайтом и удаленным сервером, получая xml, разбирая его и занося в базу. Выполнение такого запроса занимало достаточно много времени, при этом в самой панели ничего не видно и непонятно, что что-то происходит и менеджер видит только или Успех (success) или Ошибка (failure). Покопавшись  в примерах ExtJS 3.4 и документации я нашел способ, показать окно анимации загрузки данных (можно даже анимацию прогресса) и даже в простом виде визуально выглядит лучше, чем простое ничего. Вот как это выглядит. При запуске handler мы делаем вначале показ Ext.MessageBox, потом делаем Ext.Ajax.request и в success и в failure просто делаем Ext.MessageBox.hide(). Таким образом мы создали некую анимацию и обращение к пользователю, что нужно ждать результата. Также можно указать еще и класс иконки, чтобы все было красиво. Вот простой код обращения. Еще обратите внимание, в request я добавил timeout, без него запрос может вернуть ошибку до того, как закончится выполнение скрипта и таймаутом мы задаем максимально время ожидания выполнения. Честно скажу, вначале меня это немного выбило из равновесия, что вроде бы скрипт на php выполняет все правильно, а request возвращает ошибку :-)

 Итак, вывод информации о загрузке при запросах request в ExtJS 3.4. Класс иконок - font awesome

 
{ 
style: 'margin: 13px 0px;',
xtype: 'button',
id: 'updall',
text: '<i class="fas fa-sync"></i> Обновить расписание',
cls: 'primary-button',
handler: function () {
Ext.MessageBox.show({
msg: 'Идет обмен данными между двумя серверами, пожалуйста подождите...',
progressText: 'Обмен данными...',
width:300,
wait:true,
waitConfig: {interval:200},
icon:'fas fa-plug',
animEl: 'updall'
});
Ext.Ajax.request({
url: '/////////////',
timeout: 300000,
params: {
//здесь ваши параметры action: 'mgr/update/all',
action: 'schedule',
},
success: function(response, options) {
//что-то делаем при успешном выполнении Ext.getCmp('testfield-success').setText('Успешно');
Ext.MessageBox.hide();
},
failure: function (data) {
Ext.getCmp('testfield-error').setText('Ошибка');
Ext.MessageBox.hide();
console.log(data);
}
});
}
},

 Единственное, что стоит отметить, можно решить по разному задачу, это один из видом решения. А вот тут все варианты обработок таких окошек (MsgBox) при нажатии на кнопку в официальных примерах ExtJS 3

 

 

 Перебор массива на VueJS 

<template>
<div>
<ul>
<li v-for="item in array" :key="item.id">{{ item.name }}</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
array: [
{ id: 1, name: 'Элемент 1' },
{ id: 2, name: 'Элемент 2' },
{ id: 3, name: 'Элемент 3' }
]
};
}
};
</script>

Запрашиваем данные у удаленного API и заполняем <li> данными при этом используем AXIOS

<template>
<div>
<button @click="fetchData">Загрузить данные</button>
<ul>
<li v-for="item in data" :key="item.id">{{ item.name }}</li>
</ul>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
data: []
};
},
methods: {
fetchData() {
const params = {
param1: 'value1',
param2: 'value2'
};
const headers = {
'apikey': 'your-api-key'
};
axios.get('https://api.example.com/data', { params, headers })
.then(response => {
this.data = response.data;
})
.catch(error => {
console.error(error);
});
}
}
};
</script>

Предположим, что я по cron получаю динамично некие данные в json файл. С помощью Vue мы будем перебирать файл json каждые 10 секунд и выведем информацию

<template>
<div>
<ul>
<li v-for="item in data" :key="item.id">{{ item.name }}</li>
</ul>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
data: []
};
},
mounted() {
this.fetchData(); // Запускаем запрос при монтировании компонента
setInterval(this.fetchData, 10000); // Запускаем запрос каждые 10 секунд
},
methods: {
fetchData() {
axios.get('path/to/data.json')
.then(response => {
this.data = response.data;
})
.catch(error => {
console.error(error);
});
}
}
};
</script>

 

 

 

 

 

 


PHP

Используя тернарный оператор проверим существует ли переменная или нет

$b = isset($a) ? "Условие сработало".$a." существует" : "не существует, условие не сработало";
//или же $a = (условие) ? если сработало, да, то выполняем действие : иначе выполняет это действие

С php7 можно использовать  нулевое слияние 

 $a = $b ?? "Не существует"; 
// Нулевое слияние позволяет установить значение переменной по умолчанию, если проверяемое значение равно null или не существует.

В условиях 
= - присвоение
== - равно, значение
=== - равно, с типизацией (очень строгая проверка, проверяет эквивалентность и значение)
&& - и
|| - или

Пример switch case (проверяем значение пока не совпадет или не выведется по умолчанию)

$cmd = "что-то содержит";
switch ($cmd) {
case "Variable1": //cmd содержит Variable1? условие верно?
echo "Действие 1";
break;
case "Variable2":
echo "Действие 2";
break;
case "Variable3":
echo "Действие 3";
break;
default:
echo "По умолчанию";
}

 

Популярная задача и вопрос. Вывод даты в родительном падеже при использовании strftime. Когда вы используете  strftime(%e %B %Y), то php вам покажет типа 1 сентябрь 2023 года. В интернете огромное количество решений этой проблемы - от перебора массива своих имет месяц, до.. уже и не помню. В основном все пишут свою функцию, которая заменит символ на месяц. На самом деле с версии php 7 какой-то и уж тем более в php 8  Функция объявлена УСТАРЕВШЕЙ, о чем прямо гласит информация здесь https://www.php.net/manual/ru/function.strftime.php . Вы можете использовать date(), но он выведет на английском или учиться писать с помощью IntlDateFormatter . Вот пример

//Дата на русском по стандартам php
$timestamp = time();//текущее время или
//$timestamp = new DateTime('2023-10-06'); например, если только дата в таком виде $dateFormatter = new IntlDateFormatter('ru_RU', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
$dateFormatter->setPattern('d, MMMM, Y');
$formattedDate = $dateFormatter->format($timestamp);
echo $formattedDate;

Дата будет выведена на русском языке и уже в родительном падеже. Подробнее о встроенном классе и работы с ним здесь - https://www.php.net/manual/ru/class.intldateformatter.php

Проверяем на безопасность получаемые данные или передаваемые далее

Основное - 

Функция htmlspecialchars(), а лучше htmlentities() можно вызывать с параметрами и преобразовывает в сущности html (кавычки, символы <> и т.д.)

$clear_inp = htmlspecialchars($text, ENT_QUOTES);

Функции фильтрации ввода  filter_var() или filter_input()  . Все возможные фильтры тут

$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);

В принципе filter_var позволит даже иногда заменить регулярные выражения по очистке строки и удалению, например текста.

$input = $_POST['text'];
$clear_input = filter_var($input, FILTER_SANITIZE_STRING);
$clear_input = filter_var($sanitizedInput, FILTER_SANITIZE_NUMBER_INT);
// $clear_input будет содержать только очищенные цифры из введенного значения

При передачи в БД ОБЯЗАТЕЛЬНО подготовленные выражения  Prepared Statements 

$sql = 'некая sql команда по вставке или обновлению записи';
$stmt = $pdo->prepare($sql);
$stmt->execute();

Если точно известно, что переменная будет число  is_numeric() 

Также для очистки строки от разных тегов  strip_tags()

$inp = $_POST['text'];
$clear_inp = strip_tags($inp );

 Это быстрые примеры, не пренебрегайте безопасностью

 Перебор массива без ключей. Обычный Foreach 

foreach ($array as $value) {
echo $value . "<br>";
}

 While. Итерация всегда в конце, чтобы начинался цикл с 0

$arrLength = count($array);
$i = 0;
while ($i < $arrLength) {
echo $array[$i] . "<br>";
$i++;
}

For

$arrLength = count($array);
for ($i = 0; $i < $arrLength; $i++) {
echo $array[$i] . "<br>";
}

Для массивов всегда использую Foreach. Примеры While и For можно использовать как просто пример этих циклов. Кстати, мне всегда был понятен for, который почему-то многие считают более сложным.

Пример цикла for с четными итерациями

for ($i = 0; $i <= 10; $i++) {
if ($i % 2 === 0) {
echo $i . "<br>";
}
}

Можно в for делать математические операции, например $i += 2 (прибавлять 2 к каждой итерации $i - ($i=0; $i<=10; $i +=2){};);
+=, -=, /=
В циклах можно использовать break и continue
(break - прерывает цикл, continue - пропускает одну итерацию)

for ($i = 47; $i>10; $i--){
if($i % 2 ==0)
continue;
if ($i<35)
break;
echo $i.'<br>';
}

Вернусь (вернемся) к массивам, перебор ассоциативного массива с ключами. Выводим и ключ и его значение. 

foreach ($array as $key => $value) {

echo $key . ": " . $value . "<br>";
}

 Простейший пример получения данных с БД в виде массива (используется PDO)

$query = "SELECT * FROM your_table";
$statement = $pdo->prepare($query);
$executeResult = $statement->execute();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);

 Проверим полученный массив на существования ключей

$requiredKeys = ["key1", "key2"];
if (array_diff($requiredKeys, array_keys($array))) {
// Если данные ключи в массиве отсутствуют, то выполним действие
}

С помощью  filter_var_array()  можно очищать массив вплоть до значений определенных ключей

$data = [
'name' => 'Имя',
'email' => 'его@почта',
'age' => '35',
];
// Определение фильтров для каждого значения
$filters = [
'name' => FILTER_SANITIZE_STRING,
'email' => FILTER_VALIDATE_EMAIL,
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => [
'min_range' => 1,
'max_range' => 100,
],
],
];
// Применение фильтров с помощью filter_var_array()
$filteredData = filter_var_array($data, $filters);
// Проверка результатов
if ($filteredData !== false && $filteredData !== null) {
// Фильтрация прошла успешно
} else {
echo 'Ошибка валидации или фильтрации данных.';
}

Поиск в массиве

  in_array() 

if (in_array('чтоищем', $array)) {
echo 'Элемент найден!';
} else { echo 'Элемент не найден.';}

array_search():

$key = array_search('значение', $array);
if ($key !== false) {
echo 'Элемент найден ' . $key;
} else { echo 'Элемент не найден.'; }

array_key_exists() проверяет, существует ли определенный ключ в массиве. true, если ключ существует, и false если нет

 Сортировка массива.  sort() сортирует массив в порядке возрастания значений ,  rsort() сортирует массив в порядке убывания значений  ,  asort() сортирует массив по значениям в порядке возрастания, сохраняя связь между ключами и значениями,  ksort() сортирует массив по ключам в порядке возрастания, сохраняя связь между ключами и значениями. 

 Перебор многомерного массива рекурсивной функцией. Внимание, на данное решение я наткнулся недавно и не проверял. В теории функция проверяет если внутри массива. Не рискуйте при запуске :-)

function recursiveArray($array) {

foreach ($array as $key => $value) {
if (is_array($value)) {
recursiveArray($value);
} else {
echo "Ключ: $key, Значение: $value\n";
}
}
}
recursiveArray($array);

Перебор двумерного массива вложенными foreach

foreach ($array as $key_a => $subarray) {
echo "Ключ 1: $key_a \n";
foreach ($subarray as $key_b => $value) {
echo "Ключ 2: $key_b, Значение: $value \n";
}
echo "\n";
}

Сортировка внутри многомерного массива, например по возрасту

usort($array, function ($a, $b) {
return $a['age'] - $b['age'];
});

 Предположим у нас есть удаленный сервер, который по порту 1234 отдает xml файл с чем-либо и нам необходимо его получить и составить запрос для бд (обращаю внимание, тут будет специфика MODX xpdo, но в целом думаю понятная). Например это список фильмов. Мы получим ответ, разберем его, подсчитаем количество актеров, заполним столько же полей (предположим, что мы не храним в json) и используем ON DUPLICATE KEY UPDATE, если такой фильм уже существует с таким ID и просто обновим данные на него. 


//формируем url с параметрами
$url = $remoteHost.':1234/?param1='.$param1.'&Encoding=UTF-8&';
$stream = fopen($url, 'r');
//проверили подключение
if (!$stream) {
$output = 'Не смог получить доступ к серверу по следующему запросу. Проверьте. '.$url;
return $output;
die();
}
$xml_data = stream_get_contents($stream);
//проверили получение файла
if ($xml_data === false) {
$output = 'Файл не получен по адресу: '.$url;
return $output;
die();
}
fclose($stream);
//получили xml
$xml = simplexml_load_string($xml_data);
$query = '';
//создали массив с фильмами
$movies = $xml->ArrayDataTo->ListMovies->Movie;
//начали его перебирать и заполнять в БД
$output .= "Результат добавления фильмов."."\n"."Фильмы:";
foreach ($movies as $movie) {
$query .= "INSERT INTO TableName SET `id` = ?,
`name` = ?,
`pole1` = ?,
`pole2` = ?,
`pole3` = ?,
";
//очищаем полученные данные, т.к. сервер удаленный и кто его знает, что они могут нам подсунуть от злости или просто пошутить $params = [
htmlentities(strip_tags($movie['ID'])),
htmlentities(strip_tags($movie->Name)),
htmlentities(strip_tags($movie->pole1['pole1'])),
htmlentities(strip_tags($movie['pole2'])),
htmlentities(strip_tags($movie->pole->pole['pole3']))
];
//определяем какое количество у нас актеров и предположим, что в бд 8 полей, но вообще такое лучше делать в json.
$namesArray = explode(", ", $movie->Actors);
$arraySize = (!empty($namesArray)) ? count($namesArray) : 7;
for ($i = 0; $i < $arraySize; $i++) {
$query .= ", `casts{$i}_name` = ?";
$params[] = htmlentities(strip_tags($namesArray[$i]));
}
//теперь делаем проверку на дубликат ключей, при INSERT. Мы не указываем поля, которые не трогаем и проверяем, например ID - не указываем ибо он и есть Primary
$query .= " ON DUPLICATE KEY UPDATE
`pole1` = COALESCE(VALUES(`pole1`), `pole1`),
`pole2` = COALESCE(VALUES(`pole2`), `pole2`)";
for ($i = 0; $i < $arraySize; $i++) {
$query .= ", `casts{$i}_name` = COALESCE(VALUES(`casts{$i}_name`), `casts{$i}_name`)";
}
$stmt = $mysqli->stmt_init(); $stmt->prepare($query);
if ($stmt) {
$stmt->execute($params);
}

$output .= "\n".$movie->Name;
$query = '';
}
$output .= "\n"."Успешно добавлены. Мои поздравления"."\n"."\n";

Подчеркну, что для уделанного соединения есть CURL и разные другие продвинутые библиотеки для работы с Rest и удаленным подключением. Простейший пример Curl запроса вы увидите ниже.

 

Простейший класс на php который подключается в __construct к БД , а мы создав объект, экземпляр класса, делаем выборку из таблицы по своему условию 

class DBMySelect {
private $pdo;
public function __construct() {
$dsn = "mysql:host=localhost;dbname=mydatabase";
$username = "username";
$password = "password";
$this->pdo = new PDO($dsn, $username, $password);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if (!$this->pdo) {
echo "Ошибка подключения к базе данных.";
}
}
public function MyCustomSelect($condition) {
$query = "SELECT * FROM table_name WHERE " . $condition;
$statement = $this->pdo->query($query);
if ($statement === false) {
echo "Ошибка выполнения запроса.";
} else {
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
}
}
$database = new DBMySelect();
$results = $database->MyCustomSelect("column_name = 'value'");
print_r($results);

Очень мечтал освоить или понять  Websocket и не вышло. 

Простейшее подключение по CURL к api серверу с авторизацией по API-KEY в заголовке, полученя данных в JSON, перебор его и очистка от html тегов

$url = "https://api.example.com/page_point";
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'api-key: ' . 'my-apikey'
]);
$response = curl_exec($curl);
if ($response === false) {
echo "Ошибка при выполнении запроса: " . curl_error($curl);
} else {
$clear_resp = strip_tags($response);
$data = json_decode($clear_resp, true);
foreach ($data as $key => $value) {
echo "Ключ: $key, Значение: $value<br>";
}
}
curl_close($curl);


Подключение с помощью file_get_contents

$url = "https://api.example.com/page_point";
$response = file_get_contents($url);
$data = json_decode($response, true);

Простейшая запись строки в текстовый файл

$logtext = 'Текст, который записываем';
file_put_contents('/files/log.txt', $logtext , FILE_APPEND);

 С помощью регулярки ищем слово в тексте

 preg_match("/\b$word\b/i", $text))
//где $word - слово, а $text, вы не поверите, текст

Разбиваем, с помощью регулярки, строку по цифра и тексту в массив. Например 100рублей делим на элемент 100 и рублей

 


if (preg_match('/(\d+(?:\.\d+)?)([^\d]+)/', htmlentities($place->Sum), $matches)) {
        $number = $matches[1];
        $currency = $matches[2];
        $formattedString = $number . ' ' . $currency;        
    } 
	

 

 

 


Стоит заметить, что я не супер профессионал разработчик modx и прошу прощения у сообщества, случайно сюда зашедшего и посмеявшегося над моими примерами кода. Да, у меня есть свои компоненты для modx, которые я для себя использую, однако я прекрасно понимаю, что они далеки от идеала и от грамтного написания и поэтому еще раз, прошу прощения! Просто мне нравится сам подход modx и возможность самореализации и кодинга.

 Столкнулся с такой задачей: у меня подгружаются картинки пользователем и неизвестно какой будет у них тип файла. Условно говоря mixed filetypes , а превьюхи создаются с помощью pthumb, который ругается, если неявно указан тип. Ошибка, что-то типа Unable to open image... и т.д. Одно из решений сделать конвертер, чтобы все файлы переводились в один тип, например в webp. Мною же был написан костыль, который, разумеется, чуть замедляет работу, но работает. Это сниппет, который получает адрес картинки, смотрит ее тип и задет фильтр. 

 

$imageInfo = getimagesize($modx->stripTags($input));
$imageType = $imageInfo['mime'];
$paramW = $modx->stripTags($w);
$options = 'w=' . $paramW; 

switch ($imageType) {
case 'image/jpeg':
$options .= '&f=jpeg';
break;
case 'image/webp':
$options .= '&f=webp';
break;
case 'image/png':
$options .= '&f=png';
break;
default:
break;
}

$params = array(
'input' => $input,
'options' => $options,
);
$img = $modx->runSnippet('pthumb', $params);
return $img;

Вызывается  примерно так:

<img src="/[[!ImageTypeforThumb? &input=`[[+tv.imgItem]]` &w=`170`]]" data-alt="[[+pagetitle]]" class="m-3" >

Что он делает, отправляет картинку, разбирает ее, собирает параметры и возвращает уже созданный thumbs. Понимаю, что решение возможно глупое, но было сделано на скорую руку. 

 

Далее, была у меня проблема в связке QuickEmail и доменной почтой с mail.ru - Письма не отправлялись никак. 

1. В mail.ru заходим под необходимым почтовым ящиком

2. Заходим в раздел Пароль и Безопасность -> Внешние сервисы и разрешаем доступ по smtp

3. Далее заходим Пароль и Безопасность -> Пароль для внешних приложений и создаем пароль для modx и smtp (потребуется привязка телефона. далее называем этот пароль и получаем)

4. В настройках modx, в разделе Авторизация и безопасность в ключе emailsender указываем эту почту

5. В настройках modx, в разделе Почта:
SMTP аутентификация - ДА
Авто TLS для SMTP - ДА
SMTP Helo сообщение - smtp.mail.ru
SMTP хосты - ssl://smtp.mail.ru
SMTP пароль - созданный пароль для внешних приложений
SMTP номер порта - 465
mail_smtp_prefix - ssl
SMTPS - ssl
SMTP посылать по одному - ДА
SMTP пользователь - email как в emailsender выше (ну или ваш почтовый ящик)
Использовать SMTP - ДА

Так же потом в mail.ru можно в разделе Пароль и Безопасность видеть все отправленные письма (а точнее историю активности). Промучался с этим долго

Пример отправки с QuickEmail в сниппете хорошо расписан у разработчика и повторять нет смысла. Но ладно, пример:

 

$props = array(
'debug' => '0',
'hideOutput' => '0',
'message' => 'Кто-то заполнил и отправил сюда. Новый клиент.',
'subject' => 'Новый клиент с сайта',
'to' => 'email куда',
'fromName' => 'От кого',
'emailSender' =>  'email ваш',
'replyTo' => 'email',
'html' => '1',
'failureMessage' => 'Mail Failed',
'successMessage' => 'Ваше сообщение успешно отправлено, мы свяжемся с вами в самое ближайшее время',
'errorHeader' => 'Mail error:',
'smtpErrorHeader' => 'SMTP server report:',
);

$output = $modx->runSnippet('QuickEmail',$props);

Создаем свой класс и проверяем, modx переменная уже определена или ее необходимо определить (например я свой класс использую как внутри modx, так и при работе Cron, Надеюсь правильно написал :-)

 

protected $modx;
public function __construct()
    {
        define('MODX_API_MODE', true);
        require_once(dirname(__DIR__, 4) . '/config.core.php');
        require_once MODX_CORE_PATH . 'model/modx/modx.class.php';
        if(isset($GLOBALS['modx'])){
        global $modx;
        $this->modx = $modx;
        } else {
          $this->modx = new modX();
        }
	}

Внимание, есть официальная страница как использовать modx вне системы modx. Следуйте больше ему Для версии 3

 

По разному используем PdoTools

 


//Получили в чанке дату и форматируем ее. Здесь и далее $_pls - плейсхолдер
{$_pls['date'] | date_format : '%B, %Y'}
//Форматируем дату с помощью Шикарного дополнения DateAgo
{$_pls['date'] | dateago:'{"dateNow":0,"dateDay":"","dateFormat":""j F, H:i"}'}
//Проверяем на пустоту плейсхолдер
{if $_pls['param'] is not empty}{/if}
//Подключаем свой лексикон в чанке
{$_modx->lexicon->load('NameSpasesMy:default')} // или любой другой словарь вместо default
//запускаем сниппет 
{$_pls['team_logo'] | pthumb : 'h=15'} 
//используем компонент mobiledetect
{if 'standard' | mobiledetect}{/if}
if 'mobile' | mobiledetect} {/if}

 

Очистить переменную можно с помощью $modx->stripTags. Я лично параноидально делаю

 

$statusId = $modx->stripTags(htmlentities($_POST['statusId']));

 

Допишу про все xpdo которые пользуюсь

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Литература

PHP + MySQL:

Отличнешая книга по PHP8, расписано практически все - Дмитрий Котеров, Игорь Симдянов, PHP 8 , Издательство БХВ. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra243qZj )

Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript, CSS и HTML5. 6-е изд., Робин Никсон, Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra249tEV )

MySQL по максимуму, Сильвия Ботрос, Джереми Тинли, Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23WGNd )

Laravel 9. Быстрая разработка веб-сайтов на PHP, Владимир Дронов, Издательство БХВ. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23WwLV )

Общее про SQL. SQL: быстрое погружение, Уолтер Шилдс. Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23ZdBw)

JavaScript:

JavaScript и Node.js для веб-разработчиков, Николай Прохоренок, Издательство BHV-CПб. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23SuZK)

Новые возможности JavaScript. Как написать чистый код по всем правилам современного языка, Ти Джей Краудер, Издательство БОМБОРА.  Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid:Kra23Uaxy )

JavaScript для FrontEnd-разработчиков. Написание. Тестирование. Развертывание, Александр Кириченко, Издательство Наука и техника. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23VbQm  )

JavaScript с нуля до профи, Роб Персиваль, Майке вае Путтен, Лоренс Свекис, Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23Vvth )

React:

React. Сборник рецептов, Дэвид Гриффитс, Издательство БХВ. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23XcJM )

React. Современные шаблоны для разработки приложений, Алекс Бэнкс, Ева Порселло, Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23YHGD )

Изучаем React, Кирупа Чиннатамби, Издательство БОМБОРА. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23Yck9 )

Разное:

Паттерны объектно-ориентированного проектирования, Эрих Гамма, Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23dKVB )

Проектирование веб-API, Лоре Арно, Издательство ДМК Пресс. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23dzT3 )

Git для профессионального программиста, С. Чакон, Б. Штрауб, Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23efQu)

Docker без секретов, Сайбал Гош, Издательство BHV-CПб. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23ihC5 )

Безопасность веб-приложений. Эндрю Хоффман, Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23iMi9 )

NGINX. Книга рецептов, Дерек Де Йонге, Издательство ДМК Пресс. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23jN9w )

UX/UI дизайн для создания идеального продукта, Ярослав Шуваев, Издательство БОМБОРА. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23jhds )

100 главных принципов дизайна, Сьюзан Уэйншенк, Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23kNbj )

И моя любимая, которая к программированию сайтов, конечно же не относится, но все же уж очень нравится она мне - Компьютерные сети. Принципы технологии протоколы. Юбилейное издание, Виктор Олифер, Издательство Питер. Купить в Читай-город (Реклама: ООО "Новый книжный центр" ИНН 7710422909, erid: Kra23mP3X )

 

Сайты

Codepen - пожалуй не стоит в представлении. Помимо интересных идей и наработак других программистов, можно тренироваться и писать свой код в песочнице практически на любых библиотеках.

RapidApi - огромная база API библиотек и сайтов расширяющих ваш сайт

Или же огромный список доступных публичных API - https://github.com/public-apis/public-apis

Рейтинг CMS по версии Wapallazer (популярное расширение для браузеров) - https://www.wappalyzer.com/technologies/cms/

Документация по Twig - https://dev-gang.ru/doc/twig/intro/

Документация по markdown - https://gist.github.com/Jekins/2bf2d0638163f1294637,

Документация по json  https://developer.mozilla.org/ru/docs/Learn/JavaScript/Objects/JSON,

Документация по yaml https://yaml.org/

Документация по php php.net

Docker Hub - https://hub.docker.com/ и документация https://docs.docker.com/

Документация по GitHub - https://docs.github.com/ и просто по GIT https://git-scm.com/doc

Документация по NodJS - https://nodejs.org/en/docs 

Документация по React - https://legacy.reactjs.org/docs/getting-started.html

Документация по NestJs - https://nestjs.ru/

Примеры различных панелек на ExtJS (не забудь поменять версию) - http://extjs.cachefly.net/ext-3.4.0/examples/

Шпаргалка по Emmet https://docs.emmet.io/cheat-sheet/

Документация по всему - https://webinmind.ru/

----

Блог разработчиков от  Google Chrome.

Caniuse - Проверяем доступность в браузерах свойства CSS 

Документация по моему любимому фреймворку CSS Bulma. - https://bulma.io/ , 

Документация по Популярному фреймворку CSS Tailwind  - https://tailwindcss.com/

Документация, конечно же, по Bootstrap (не забудьте менять версию вверху) - GetBootstrap

Документация, а еще есть такой CSS фреймворк, как Foundation, признаюсь честно - неосилил, мощная мащина - Get.foundation

Документация по Ukit Getuikit.com

Документация по Vue3 vuejs.org

Документация по Yii2 yiiframework.com

Документация по Laravel laravel.com

Пройдемся по CMS

October CMS https://octobercms.com/

GravCMS https://getgrav.org/

GhostCMS https://ghost.org/

Drupal CMS https://drupal.org/

Joomla CMS https://joomla.org/4

Wordress https://wordpress.com/

MODx https://modx.com/ - обожаю его

Сообщество Modx с магазином расширений, готовыми решениями, теплым коллективом и добрым советом https://modx.pro/

Документация по ExtJS https://docs.sencha.com/extjs

Полный справочник - документация по Fenom - https://github.com/fenom-template/fenom/tree/master/docs/ru

https://fontawesome.com/docs - ну Awesome, ну шрифт :-) 

Документация по Composer https://getcomposer.org/

https://figma.com/ - Figma, маст-хэв всех дизайнеров

Очень хорошо и просто про PDO в php https://prowebmastering.ru/php-pdo-start.html

Создаем макеты лендингов https://mobius1.github.io/Pageable/#page-1

Да, кстати, Конструкторы сайтов

Tilda. https://tilda.cc/ - все знают Тильду. Многие программисты с нее эмоционально вспыхивают и устраивают постоянные дискуссии в тематических и не очень каналах и форумах. Я ничего плохого в ней не вижу.

https://wfolio.ru/ - Идеален для фотографов! продумано все, до мелочей. Кстати, вот отличный фотограф, рекомендую https://poddubny.info/ 

https://nethouse.ru/

https://fo.ru/

https://lpmotor.ru/

https://lpgenerator.ru/

да и еще сотни

Шикарная таблица юникод кодов для эмодзи смайлов. Особенно круто для разработки телеграм ботов https://apps.timwhitlock.info/emoji/tables/unicode

Документация по API Telegram Bot https://core.telegram.org/bots/api к слову их совсем не сложно писать на php, а помогают здорово. Вот еще документация переведенная https://tlgrm.ru/docs/bots/api

----------------

https://codentools.com/jquery-to-javascript - Конвертер из Jquery в JavaScript (дожились)

Очень крутые инструменты от Adobe для получения кода цвета в hex и иных видах, может даже по фото цвета подобрать - https://color.adobe.com/ru/create/color-wheel

И еще один генератор пастельных цветов и спокойной цветовой гаммы - https://colorhunt.co/palettes/pastel

И еще одная цветовая схема -- https://colorscheme.ru/

Генератор Favicon под все устройства - https://realfavicongenerator.net/

Преоладеры - https://icons8.com/preloaders/

Яндекс для разработчиков - тут и API карт, и js библиотеки, и метрика и облачные решения - https://yandex.ru/dev/

Проверка правильности заполнения мета-тегов OG - https://metatags.io/

Cli команды для синхронизации по протоколу AWS - https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

Speechkit от яндекса Документация https://cloud.yandex.ru/docs/speechkit/quickstart - прикольная технология - вы отправляете текст, а получаете ogg озвучку

К слову у Яндекса очень много крутых облачных решений, рекомендую. Хотя бы даже один онлайн перевод https://cloud.yandex.ru/services#featured

Кабинеты для вебмастеров

Google - https://search.google.com/search-console

Яндекс - https://webmaster.yandex.ru/

Чуть позже распишу все полезные сервисы от Яндекса и Гугла.

PageSpeed от Google https://pagespeed.web.dev/

 

Хорошая статья по уведомлениям в режиме реального времени - https://intellect.icu/prilozheniya-realnogo-vremeni-i-polling-long-polling-websockets-server-sent-events-sse-webrtc-7016

собственно официально про SSE - https://learn.javascript.ru/server-sent-events

Конвертер HTML сущностей в обе стороны (в свое время очень сильно выручил) - https://www.online-toolz.com/langs/ru/tool-ru-text-html-entities-convertor.html

Один из сотни готовых генераторов, генератор полно экранных страниц сайтов - https://mobius1.github.io/Pageable/#page-1, отлично подойдет для лендингов

ОЧЕНЬ КРУТАЯ ШТУКА - набор для apache, nginx и т.д. правил для блокировки различных ботов на сервере или сайте. Пользоваться очень осторожно!! - https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker  сто раз перечитайте и подумайте или отредактируйте для себя. Будьте предельно аккуратными, вся ответственность на вас и только на вас. Я лично использую решения от Cloudflare. 

Собственно Cloudflare https://www.cloudflare.com/ - очень полезный и важный сервис, который поможет от быстрой светы ns записей домена и кеширования до cdn, защиты сайта, ограничений доступа и прочим прочим

Поиск различных SVG и PNG - https://undraw.co/

Поиск различных мокапов для оформления - https://www.mockupworld.co/all-mockups/

Статусы страниц с котиками - https://http.cat/

Регистрация доменов с моей реф-ссылкой  - https://www.webnames.ru/tld/catalog/?ref_id=139640

Шикарный генератор различных паттернов, есть даже плагины под Figma - https://www.magicpattern.design/

Конвертер стандратного шаблонизатора под шаблонизатор Fenom в modx - https://m2f.zencod.ru/

 ... и это еще не все, будут ссылки на софт и прочее.

 

Разное 

Отличный YouTube канал Анны Блок про Css и верстку. Всегда рассказывает про новинки в css и js. Иногда проводит шикарные стримы, где отвечает на любые вопросы по frontend программированию. Ведет телеграм-канал Типичный Верстальщик. YouTube | Telegram | ее крутейший сайт с полезностями и шпаргалками

Тоже канал про фронтэнд от RED Group. Достаточно интересные вещи кодит в прямых эфирах, доступны хорошие видео по react. YouTube

 Телеграм канал про веб разработчиков - Веб-Страница.

Телеграм канал программистов на October CMS, Перейти

А это программистов на Grav CMS. Перейти

Чат-бот на основе ChatGPT по Modx. Быстрее, чем в справке искать. Открыть.

ТГ канал с API. Обновляют информацию редко, но все равно интересно. Открыть

Официальный канал Яндекс Метрики и Яндекс Облака

YouTube канал разработка Академии Яндекса

 

Очень полезная кастомная клавиатура, где вы можете запрограммировать любую клавишу (у продавца есть еще много разных вариантов, например с регуляторами). (Реклама: Aliexpress).

Софт

 

 Материал еще не окончен и будет дополняться. Впереди php - curl, api, фильтрация данных, проверки, массивы, modx, полезные книги, youtube и т.д..

Очень важно - это не документация, не курсы, не учеба, не гарантия правильности, не каталог ссылок. Эт просто материал и я ответственности не несу, ни за работу блоков кода, ни за содержание сайтов, ссылки на которые я привел. Я не являюсь автором этих ресурсов и не мониторю постоянно, что у них там размещено. 

 
 
 

Похожее

draw I
draw I
draw I
draw I

 quote a81ca

Если вдруг вам было здесь полезно, уютно и приятно, что захотелось меня отблагодарить - вы можете пожертвовать мне на кофе.

 

i

Будет осуществлен переход на сайт Yoomoney

 

draw I

 


Внимание: На сайте могут присутствовать ссылки ePN

Мини-портфолио

очередной бесполезный блог