<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:yandex="http://news.yandex.ru"
     xmlns:media="http://search.yahoo.com/mrss/"
     xmlns:turbo="http://turbo.yandex.ru"
     version="2.0">
    <channel>
        <title>Lectoria</title>
        <link>https://lectoria.pro/</link>
        <description></description>
        <language>ru</language>
        <turbo:analytics type="Yandex" id="57540448"></turbo:analytics>
        
        <item turbo="true">
    <link>https://lectoria.pro/read/istoriya-moego-znakomstva-s-modx-revolution.html</link>
    <turbo:source>https://lectoria.pro/read/istoriya-moego-znakomstva-s-modx-revolution.html</turbo:source>
    <turbo:topic>История моего знакомства с MODx Revolution</turbo:topic>
    <pubDate>Thu, 23 Jan 2020 18:16:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="2387480e6cdc315b17b632edc6427901ee">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/istoriya-moego-znakomstva-s-modx-revolution.html" text="История моего знакомства с MODx Revolution"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">История моего знакомства с MODx Revolution</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>В 2011-м году я познакомился с системой управления и фреймворком, или CMS/CMF, MODx Revolution. С тех пор я изучил данный продукт вдоль и поперек и мы сделали больше сотни сайтов, в том числе и для крупных клиентов, например Сколково Форум или киностудии Арт-Пикчерс. Я прекрасно знаю, что обзоров на эту CMS сделано великое множество. Но, тем не менее, не поленюсь и напишу еще один, но свой.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Кто я и почему я знаю, о чем пишу</h2>

<p>Меня зовут Артем Зернов. Я не могу сказать, что я успешен как предприниматель или я супер веб-разработчик хоть с каким-то индексом цитирования. Но если вкратце, то у меня есть небольшая веб-студия по разработке сайтов, которой не так давно исполнилось 10 лет. Стремления к огромному количеству заказов у меня нет, так как я не бизнесмен, а скорее главный мастер небольшой веб-студии OpenColour. У меня нет стремления охватить все-все технологии. Я их изучаю по мере необходимости, именно в тот момент, когда возникает потребность их применить в конкретном проекте.</p>

<div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            <h2 class="news_info_block_title">А еще у меня есть свой канал по MODx Revolution</h2>
            <div class="news_info_block_descr">
                <p>Когда-то давно я решил выкладывать там короткие видео-уроки. И, как выяснилось позже, это оказались действительно полезные уроки для тех, кто только постигает все тонкости этой CMS.</p>
            </div>
            <a class="news_tag_link active_tag" href="https://youtube.com/c/OpenModx">Перейти на канал</a>
        </div>
    </div>
    
</div>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">2011 год</div>

<div class="news_block_text border_mod"><p>Именно тогда я впервые познакомился с MODx</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>MODx — любовь с первого взгляда</h2>

<p>До MODx я писал полу-кривые сайты на Joomla, в которой все было разбросано по разным подмодулям и нужно было порой поломать голову, чтобы понять принцип организации админки. А для того, чтобы реализовать что-то более-менее нестандартное, то мозг просто разрывался на части.</p>
<p>В один прекрасный день знакомый по универу скинул мне ссылку на MODx со словами: "Посмотри, уверен, тебе понравится". Я долго сопротивлялся, так как чаще всего придерживался позиции, что вместо того, чтобы изучать все подряд, лучше изучить что-то одно, но очень хорошо. <span class="mark">Но, тем не менее, зайдя впервые в админку MODx, был весьма удивлен, насколько приятно по сравнению с Joomla в MODx организована админка, даже несмотря на то, что некоторые элементы для меня были непонятны: какие-то </span><strong class="mark">чанки, сниппеты и телевизоры (TV)</strong><span class="mark">.</span></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_23/ntb_screen.png" alt="Внешний вид админки">
    <figcaption>Внешний вид админки</figcaption>
</figure>

<p>Админка организована таким образом, что вся структура сайта всегда перед глазами, в левом дереве ресурсов (они же страницы сайта), а всякие прочие общие настройки сайта и настройки отдельных модулей находятся в верхнем меню.</p>

<h3>Любовь со второго взгляда. Разработка прямо в админке.</h3>

<p>Второе, что привлекло, пожалуй, еще больше, чем первое — это возможность разработки сайта прямо из админки. На первый взгляд мне казалось, что это какой-то урезанный функционал и полноценной разработки сайта только из админки быть не может.<span class="mark"> Я ошибался.</span> Как выяснилось, для разработки сайтов без сложной внутренней бизнес-логики, этого более, чем достаточно. Конечно, в будущем, я перешел на разработку из IDE. Как ни крути, но IDE вроде PhpStorm врядли сможет переплюнуть даже самая продвинутая админка. Но эта статья совсем не об этом.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Из каких кирпичиков состоит MODx</h2>

<figure><img src="https://lectoria.pro/assets/files/images/res_23/2020_01_23_22_53_06.jpg" alt="Весь набор базовых сущностей MODx">
    <figcaption>Весь набор базовых сущностей MODx</figcaption>
</figure>

<p>Как и любой фреймворк, MODx также состоит из неких базовых сущностей, на основе которых разрабатывается веб-сайт или веб-приложение. В MODx основными (но не всеми) таковыми сущностями являются:</p>
<ul>
<li>Шаблоны</li>
<li>Чанки</li>
<li>Сниппеты</li>
<li>Плагины</li>
<li>Ресурсы</li>
<li>Системные настройки</li>
</ul>
<p>Я перечислил только их, так как понимания этих сущностей будет вполне достаточно, чтобы разрабатывать полноценные веб-сайты и веб-приложения на MODx.</p>
<p>Поговорим о них более подробнее в одной из следующих статей. А я продолжу о своей преданности к MODx.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">Если кратко</div>

<div class="news_block_text "><p>То это шаблоны, чанки, сниппеты, плагины, ресурсы и системные настройки</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Вы, вероятно, заметили, что я MODx называю фреймворком (или по-модному CMF), хотя, казалось бы, это же система управления сайтом (CMS). Вы будете одновременно правы и неправы, так как MODx включает в себя как непосредственно саму систему управления (в рамках MODx он называется manager) — по сути это просто интерфейс, через который вы редактируете записи в базе данных и загружаете картинки. А вот сам этот интерфейс написан на основе фреймворка MODx. Это означает, что вы можете использовать modx как фреймворк для построения своего веб-приложения.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Так почему же все-таки MODx является моей любимой системой?</h2>

<p>Если мне еще не удалось донести, почему же я питаю к MODx такие преданные чувства, то сейчас я постараюсь это сделать. Работая с той же Joomla, мне приходилось ломать голову, как реализовать тот или иной функционал в рамках конкретной верстки. И чаще всего мои решения выглядели как костыли. Я не уверен, было ли это связано с моим недостаточным опытом, или с неудобностью системы, на которой я строил сайты, но точно могу сказать, что при работе с MODx решения приходили как-то сами собой. И это, однозначно, говорит об удачности архитектуры. А когда разработка не заставляет каждый раз воевать с ограничениями системы, тогда она начинает приносить гораздо больше удовольствия от того, что все получается и практически с первого раза. Собственно, пожалуй, именно поэтому мы подружились с MODx и остаемся друзьями по сей день.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/zhiznennyy-tsikl-prilozheniya-na-modx.html</link>
    <turbo:source>https://lectoria.pro/read/zhiznennyy-tsikl-prilozheniya-na-modx.html</turbo:source>
    <turbo:topic>Жизненный цикл приложения на MODx</turbo:topic>
    <pubDate>Tue, 11 Feb 2020 07:12:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="68675999ccfe68c1f4e39b5690c110135d">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/zhiznennyy-tsikl-prilozheniya-na-modx.html" text="Жизненный цикл приложения на MODx"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Как работет MODx: через какие этапы проходит обработка запроса до выдачи контента клиенту.</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>В MODx Revolution, как и в любом другом фреймворке, приложение принимает на себя запрос от веб-сервера и проходит через определенные этапы, прежде чем отдать какой-либо контент клиенту. Эта статья поможет вам вникнуть в механизм работы приложения modx.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как ведет себя обычное приложение на MODx Revolution</h2>

<p>Любой сайт на MODx по-умолчанию имеет несколько различных точек входа. Под точкой входа подразумевается конечный php-скрипт, к которому обращается браузер через веб-сервер (nginx или apache).</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">CMS/CMF?</div>

<div class="news_block_text "><p>MODx не является только лишь системой управления контентом сайта (CMS). MODx представляет из себя также и довольно мощный и гибкий фреймворк для построения веб-приложений.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Прежде, чем приступить к дальнейшему изучению этого материала, для исключения путаницы в терминах, давайте условимся, что фронтэндом (<strong>frontend</strong>) мы будем называть страницы сайта, не относящиеся к админке, а бэкендом (<strong>backend</strong>) – страницы админки сайта.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Для тех, кто предпочитает смотреть, у нас есть видео от автора данной статьи.</p>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_video_w">
    <iframe src="https://www.youtube.com/embed/el-rPKsliyI" frameborder="0" allowfullscreen=""></iframe>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Точка входа #1: основной файл index.php</h3>

<p>Данный файл лежит в корневой папке сайта.</p>
<p>Цель скрипта: принимать на себя запросы, образующиеся при попытке обращения к какой-либо странице сайта (исключая страницы админки, или, как его еще называют, менеджера), обрабатывает запрос, находить нужную страницу в списке ресурсов (<span class="mark">modResource и дочерние классы</span>), обрабатывать контент, запускать необходимые плагины, вызывать различные компоненты и в итоге отдать обработанный контент в браузер, параллельно генерируя необходимые HTTP-заголовки.</p>
<p>По-умолчанию путь к этому файлу:</p>
<pre><code>/путь/до/корневой папки/сайта/index.php</code></pre>

<h3>Точка входа #2: файл index.php админки</h3>

<p>Данный файл очень похож на предыдущий index.php, но отличается тем, что инициализирует другой контекст (mgr) и ряд других классов, предназначенных для работы с админкой. Например, вместо класса <span class="mark">modResponse</span> и <span class="mark">modRequest</span> инициализируются классы <span class="mark">modManagerResponse</span> и <span class="mark">modManagerRequest</span>.</p>
<p>Цель данного скрипта схожа с целью предыдущего index.php. Разница в том, что в отличие от Frontend, в админке нам не нужно находить определенную страницу в базе, чтобы выдать ее контент. В админке данный скрипт находит необходимый контроллер (<span class="mark">modManagerController</span>) и запускает его, а контроллер, в свою очередь уже выдает в браузер запрашиваемый контент, представляющий из себя набор подключенных javascript-файлов, генерирующих интерфейс на ExtJS.</p>
<p>Путь к даному файлу по-умолчанию:</p>
<pre><code>/путь/до/корневой папки/сайта/<strong>manager</strong>/index.php</code></pre>

<h3>Точка входа #3: файл index.php для коннекторов</h3>

<p>Есть еще одна точка входа по-умолчанию – это точка входа для коннекторов.</p>
<p>Коннекторы (connectors) в modx – это скрипты, запускаемые через вышеупомянутую точку входа и принимающие на себя ajax-запросы из различных элементов интерфейса админки. <span class="mark">Но при определенных условиях они также могут использоваться и для обработки ajax-запросов из frontend-части сайта.</span></p>
<p>Цель коннектора: принять запрос, проверить, является ли данный запрос авторизованным, запустить необходимый процессор (<span class="mark">modProcessor</span>) и отдать контент клиенту. Как правило, контент отдается в формате JSON.</p>
<p>Путь к даному файлу по-умолчанию:</p>
<pre><code>/путь/до/корневой папки/сайта/<strong>connectors</strong>/index.php</code></pre>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Под точкой входа понимается php-скрипт, который запускается первым. Он может запускаться как непосредственно из консоли, так и через веб-сервер.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Дальнейшее рассмотрение жизненного цикла приложения MODx мы проведем на примере основного index.php файла, который лежит в корневой папке сайта.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Механизм обработки запроса</h2>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Первичная инициализация</h3>

<p>Прежде, чем запустятся какие-либо процессы обработки запроса и подготовки контента, происходит первичная инициализация, которая заключается в подключении конфигурационного файла и основного класса modx.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Это происходит в файле index.php</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Инициализация контекста web</h3>

<p>Контекст web – это контекст по-умолчанию, в котором хранятся ресурсы (или другими словами, страницы) сайта. Прежде, чем работать с ним, его необходимо проинициализировать.</p>
<p>Инициализация контекста включает в себя:</p>
<ul>
<li>Подключение кэш-менеджера (modCacheManager)</li>
<li>Загрузку конфигурации контекста (набор различных системных переменных, переменных контекста и прочих общих настроек, доступных для различных компонентов)</li>
<li>Подключение глобальных компонентов (extension packages)</li>
<li>Инциализацию механизмов контроля сессий (sessions)</li>
<li>Инициализацию механизмов обработки ошибок (modErrorHandler)</li>
<li>Инициализацию языковых механизмов</li>
<li>Инициализацию механизмов <span class="tooltip_item" data-tooltip="регистры в modx это механизмы очередей сообщений">регистра</span> (modRegistry)</li>
<li>Установку общедоступных <span class="tooltip_item" data-tooltip="плейсхолдеры в modx – это общедоступные переменные, которые можно использовать в шаблонах, чанках, сниппетах и прочих компонентах">плейсхолдеров</span></li>
<li>Генерацию события <span class="tooltip_item" data-tooltip="Данное событие является признаком того, что в MODx завершены все необходимые базовые инициализации">OnMODXInit</span>.</li>
</ul>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Это происходит в файле core/model/modx/modx.class.php</p></div>

<div class="news_block_title">Что такое контекст?</div>

<div class="news_block_text "><p>В modx контекст – по-умолчанию это своего рода объединение ресурсов или страниц по смысловому назначению. Например, по принадлежности их к backend или frontend части сайта, по принадлежности их к авторизованным и неавторизованным пользователям и т.д.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Обработка запроса</h3>

<p>После инициализации запускается процесс обработки запроса.</p>
<p>Данный процесс можно разделить на 2 основные части:</p>
<ol>
<li>Анализ самого запроса</li>
<li>Генерация и выдача контента</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Это происходит в файле core/model/modx/modx.class.php</p></div>

<div class="news_block_title">API режим</div>

<div class="news_block_text "><p>Если вы используете modx как фреймворк и подключаете корневой файл index.php в другом скрипте, то вам необходимо определить константу MODX_API_MODE. Тогда modx не будет выполнять обработку запроса и поиск ресурса.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Анализ запроса и поиск ресурса</h3>

<p>Для того, чтобы понять, какой именно ресурс просит от modx клиент, обратившись к конкретному URL, modx запускает метод handleRequest соответствующего класса.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Как было упомянуто выше, в MODx есть по-умолчанию три точки входа. В зависимости от того, какая точка входа используется, для обработки запроса используются три разных класса: <strong>modRequest</strong>, <strong>modConnectorRequest</strong> и <strong>modManagerRequest</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Для frontend используется метод modRequest::handleRequest. Данный метод анализирует URL, выделяя из него необходимые части, по которым можно однозначно найти ресурс в базе данных, а также обращается к системным настройкам modx для определения <span class="tooltip_item" data-tooltip="в MODx есть два метода поиска ресурса: по ключу id и по адресу uri. При включенном режиме дружественных URL поиск происходит по адресу uri.">метода поиска ресурса</span>.</p>
<p>В случае, если ресурс не будет найден, будет выдана страница ошибки. Но если ресурс обнаружен, то запускается следующий процесс – процесс генерации и выдачи контента клиенту.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Это происходит в файле core/model/modx/modrequest.class.php</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Генерация контента</h3>

<p>Здесь начинаются процессы фильтрации и обработки содержимого страницы, подключения различных javascript-файлов, вызов сниппетов, используемых в коде шаблона или содержимом страницы и т.д.</p>
<p>Весь процесс обработки и генерации контента можно поделить на несколько этапов:</p>
<ol>
<li>Определение <span class="tooltip_item" data-tooltip="Имеется ввиду mime-type. Например text/html, text/plain и т.д.">типа содержимого страницы</span></li>
<li>Подготовка содержимого страницы</li>
<li>Подключение <span class="tooltip_item" data-tooltip="При подготовке содержимого страницы выполняются различные сниппеты и плагины. Некоторые из них могут добавлять в начало или конец страницы дополнительный код. Например, подключение javascript-файлов">внедряемого кода</span></li>
<li>Вставка <span class="tooltip_item" data-tooltip="специальные теги modx содержат информацию о количестве сделанных запросов к БД, времени на генерацию страницы и т.д.">специальных тегов modx</span></li>
<li>Генерация заголовков</li>
<li>Выдача контента клиенту</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Это происходит в файле core/model/modx/modresponse.class.php</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Как и с классом запроса, в зависимости от используемой точки входа, используются различные классы для ответа: <strong>modResponse</strong>, <strong>modConnectorResponse</strong> и <strong>modManagerResponse</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Подготовка содержимого страницы</h3>

<p>Остановимся более подробно на 2-м пункте: <strong>"Подготовка содержимого страницы"</strong>, так как данный процесс представляет наибольший интерес с точки зрения количества и сложности внутренних операций.</p>
<p>Содержимое страницы в MODx состоит из кода, который генерируется шестью различными сущностями:</p>
<ol>
<li>Шаблоном страницы</li>
<li>Полями ресурса (как основными вроде pagetitle, content, так и дополнительными TV-полями)</li>
<li>Плейсхолдерами (например при обращении к системной настройке или настройке контекста)</li>
<li>Вызываемыми сниппетами</li>
<li>Вставляемыми чанками</li>
<li>Плагинами</li>
</ol>
<p>Причем стоит понимать, что все эти сущности могут вызываться друг из друга. Например, чанк может быть вызван из сниппета, сниппет может быть вызван внутри полей ресурса и так далее.</p>
<p>Основная задача данного этапа – это собрать все содержимое страницы таким образом, чтобы все вызовы сниппетов, чанков и ссылок на различные поля были заменены на соответствующие занчения и в итоге у нас остался только html код, в котором нет больше никаких конструкций MODx.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Основная часть процесса подготовки содержимого происходит в файлах core/model/modx/modresponse.class.php и core/model/modx/modresource.class.php</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Как вы наверняка догадались, процедура обработки содержимого на объемных страницах может создавать существенную нагрузку на сервер, а также время на такую обработку может быть довольно высоким.</p>
<p>Для того, чтобы не делать этого каждый раз, в MODx предусмотрен довольно мощный механизм кэширования. Поэтому при повторном обращении к тому же ресурсу, часть содержимого будет выбираться из кэша, тем самым ускоряя процесс генерации содержимого и снижая нагрузку на сервер.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">Кэш</div>

<div class="news_block_text border_mod"><p>На некоторых сложных проектах время первой генерации страницы может достигать 3 секунд, в то время как повторная отдача той же страницы из кэша занимает всего 300 миллисекунд.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Финальные процессы</h2>

<p>После того, как содержимое страницы собрано и обработано, в него добавляется внедряемый код, обрабатываются дополнительные специальные теги MODx для анализа производительности страницы, затем генерируются заголовки и контент отдается клиенту. В случае, если клиентом является браузер, вы увидите готовое содержимое страницы.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/razrabotka-dizayna-sayta.-kak-potratit-dengi-zakazchika-i-ne-poteryat-svoi.html</link>
    <turbo:source>https://lectoria.pro/read/razrabotka-dizayna-sayta.-kak-potratit-dengi-zakazchika-i-ne-poteryat-svoi.html</turbo:source>
    <turbo:topic>Как выстроить комфортный процесс разработки веб-дизайна</turbo:topic>
    <pubDate>Wed, 12 Feb 2020 07:35:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="69fd71aab86b39c053edfe1fd1bf5a4b81">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/razrabotka-dizayna-sayta.-kak-potratit-dengi-zakazchika-i-ne-poteryat-svoi.html" text="Как выстроить комфортный процесс разработки веб-дизайна"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Разработка дизайна сайта. Как выстроить процесс так, чтобы качественно выполнить работу и не потерять свои деньги.</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Меня зовут Артем Зернов. На протяжении вот уже более 10-ти лет мы в команде OpenColour занимаемся созданием сайтов. Я, как руководитель процесса, беру на себя помимо каких-то технических работ, также и ведение общения с заказчиком. На заре своей деятельности я пренебрегал многими аспектами по причине неопытности. И иногда это приводило к весьма неприятным последствиям, вплоть до того, что заказчик просил вернуть деньги, которые я, как это водится, уже успел потратить. Данная статья будет полезна командам тем, кто создает веб-дизайн как в команде, так и в одиночку. Я постараюсь, не погружаясь в детали, рассказать, как выстроить процесс разработки дизайна сайта так, чтобы заказчик остался доволен или хотя бы удовлетворен.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как я пришел к оптимальному процессу?</h2>

<p>Прежде, чем начать, я скажу, что большинство своих знаний по этой теме я получил из своего личного профессионального опыта и общения с коллегами. Я имею высшее техническое образование и дополнительного бизнес-образования и каких-либо курсов по общению с заказчиками я никогда не проходил. Мне нравится идея гедонизма и скорее всего, постоянное внутреннее желание свести количество стресса при разработке сайта к минимуму подталкивало меня искать решения, как организовать процесс наиболее оптимально, чтобы нам не было стыдно за результат работы, а полученная сумма и удовольствие от работы соответствовали количеству потраченных на нее сил.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Заблуждения о дизайне</h3>

<blockquote>
    <h4 class="blockquote_title">Типичный заказчик</h4>
    <p>То, что вы нарисовали, не соответствует тому, что у меня в голове</p>
</blockquote>

<p>Так рассуждают многие заказчики, ожидая, что дизайнер нарисует им то, что они себе напредставляли в голове. Хорошо, если вы каким-то невероятным образом попали в ожидания заказчика. Но проблема в том, что чаще всего дела обстоят иначе. Почему?</p>
<p>Одна из главных проблем кроется в том, что многие заказчики зачастую не понимают, что такое дизайн сайта. Мы можем им это простить по понятным причинам. Но что удивительно, некоторые дизайнеры, порой даже с большим количеством весьма приятных на вид работ в портфолио, неверно полагают, что дизайн – это красивая картинка <span class="mark">"чтобы нравилось заказчику"</span>.</p>
<p>Давайте обратимся к википедии и уточним, что же такое дизайн в глобальном смысле:</p>

<blockquote>
    <h4 class="blockquote_title">Википедия</h4>
    <p>Считается, что в более широком смысле дизайн не только призван к художественному конструированию, но и должен участвовать в <span class="mark">решении более широких социально-технических проблем</span> функционирования производства, потребления, существования людей в предметной среде, путём рационального построения её визуальных и функциональных свойств.</p>
</blockquote>

<p>Ключевое значение имеют слова "решение проблем". И, как вы догадываетесь, проблема заказчика, который заказывает разработку дизайна сайта, состоит далеко не в том, чтобы дизайнер нарисовал картинку из головы, но в том, чтобы решить вопрос "Зачем заказчику сайт?"</p>
<p>Понимание этого позволит избежать недопониманий между дизайнером и заказчиком, а также позволит сделать процесс более прогнозируемым.</p>
<p><strong class="mark">Вывод</strong><span class="mark">: правильное понимание того, что такое дизайн и для чего он нужен, поможет избежать лишних проблем и недопониманий между заказчиком и исполнителем.</span></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Семь раз отмерь...</h3>

<p>Еще один важный момент, который упускают из внимания многие как заказчики, так и дизайнеры, состоит в том во главу угла ставятся сроки, а не результат работы. И, вместо того, чтобы выяснить как можно больше деталей о заказчике и его бизнесе, дизайнер хочет как можно быстрее получить деньги и побыстрее нарисовать, потому как уверен в своем божественном чувстве стиля. Здесь кроется второй дьявол.</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_69/anigif_enhanced_14863_1419142486_2.gif" alt="">
    <figcaption></figcaption>
</figure>

<p>Старинная поговорка гласит "<span class="mark">Семь раз отмерь, один раз отрежь</span>". Не стоит забывать о ней. Прежде, чем начать что-то рисовать, разузнайте максимум информации. И в первую очередь задавайте вопросы о назначении конечного продукта, а не о том, какой шрифт использовать и в какой цветовой гамме должен быть сайт. В противном случае, вы рискуете нарисовать красивую картинку, которая будет раскритикована и в лучшем случае вас попросят предоставить еще одну версию (а потом еще одну, а потом еще, а потом...), а в худшем – попросят вернуть деньги как неустойку за несоответствие ожиданий и реальности.</p>
<p><span class="mark"><strong>Вывод</strong>: прежде, чем приступать к работе, не стесняйтесь выяснить как можно больше информации о бизнесе заказчика.</span></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>в лучшем случае вас попросят предоставить еще одну версию (а потом еще одну, а потом еще, а потом...), а в худшем – попросят вернуть деньги как неустойку за несоответствие ожиданий и реальности.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Веб-дизайн – это оформление контента</h3>

<p>А вы как думали? Да, дизайн – это оформление контента. Нет контента, тогда и нечего оформлять. Если вы не согласны с этой мыслью, тогда перечитывайте этот абзац снова и снова, пока не поймете, что это так.</p>
<p>В первую очередь, это понимание нужно вам, а во вторую – заказчику. Ошибочно предполагать, что сначала вы нарисуете красивую картинку и наполните ее рыбой вроде Lorem Ipsum, и натыкаете изображений из интернета, а потом заказчик вставит туда свои тексты и фотографии. В большинстве случаев это будет напоминать мемы "Ожидание vs Реальность". Когда вместо качественной фотографии вставляются замыленные фотографии, сделанные на смартфон, а вместо 1-го абзаца текста вставляется первый том "Войны и Мир" Льва Толстого. Все ваши труды дружно пойдут коту под хвост.</p>
<p>Донесите эту мысль вашему заказчику и не ведитесь на слова клиента:</p>

<blockquote>
    
    <p>"Вы пока что-нибудь туда вставьте, а мы потом напишем тексты и подготовим фотографии"</p>
</blockquote>

<p>А если уж и согласились оформлять то, чего нет, то будьте готовы сгенерировать за заказчика что-то похожее на настоящий контент. В противном случае придется переделывать.</p>
<p><span class="mark"><strong>Вывод</strong>: не торопитесь побыстрее что-то нарисовать, пока нет хотя бы набросков реального содержимого.</span></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_69/21340a3ed837a10b67062f9c4ff79300_w200.gif" alt=""></div>

<div class="news_block_text border_mod"><p>Нельзя оформить то, чего нет</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Доверие и правильное распределение ролей</h3>

<p>Когда вы идете к стоматологу, то вряд ли вы ему говорите, как вас лечить. Скорее всего вы ему всецело доверяете. В противном случае, процесс лечения будет сопряжен не только со стрессом, связанным с зубной болью, но и со стрессом от недоверия и мыслей о том, что сейчас вам сделают что-то не так.</p>
<p>При работе с заказчиком необходимо правильно распределить роли. Кто пациент, а кто врач. Кто пришел с проблемой, а кто ее решает. В противном случае, результат работы будет неподконтролен исполнителю, в то время как отвечать за него придется именно ему.</p>
<p>Возможно, что у заказчика был неприятный опыт работы с прежним исполнителем и этот опыт теперь выражается в недоверии к вам. Заказчика можно понять. Но в то же время, стоит приложить все усилия, чтобы вызвать доверие к вам уже на старте работ. Иначе, я повторюсь, за то, что исполнителя попросил сделать заказчик в буквальном смысле, отвечать все равно придется исполнителю.</p>
<p><span class="mark"><strong>Вывод</strong>: отделяйте свою зону ответственности от зоны ответственности заказчика. Если заказчик вам не доверяет, нужен ли вам такой заказчик?</span></p>
<p>Когда-то давно я делал выпуск по схожей теме на одном из моих youtube-каналов:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Последние несколько лет, перед началом основных работ по заказу, я стараюсь максимально донести идеи этой статьи до клиента. Если клиент их не принимает, то я отказываюсь от такого заказа, возвращая предоплату. Ощущение личного комфорта и удовольствия от работы для меня первостепенно.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_video_w">
    <iframe src="https://www.youtube.com/embed/c8UY39JwFRs" frameborder="0" allowfullscreen=""></iframe>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Минимизация субъективной составляющей процесса</h3>

<p>Сайт – это инструмент, а не просто картинка, которая должна кому-то понравиться. Все или почти все в его дизайне должно иметь практический смысл. Другими словами, любой элемент дизайна должен быть логически обоснованным, служить какой-то практической цели. Например, привлекать внимание пользователя к чему-либо, информировать о чем-либо, вызывать чувство доверия и т.д.</p>
<p>Поэтому, учитывая вышесказанное, оценивать дизайн словами "нравится" или "не нравится" нельзя. Такая оценка слишком субъективна и неконструктивна. При работе над дизайном важно донести заказчику, что критика должна быть объективной настолько, насколько это возможно.</p>
<p>Вместо "не нравится", попросите дать заказчика более развернутый ответ. Заказчик должен отдавать себе отчет в том, что дизайн сайта не обязан нравиться ему из-за личных вкусовых предпочтений. Например, если заказчику безумно нравится красный цвет, то его необязательно нужно добавлять во все элементы сайта, так как это не несет никакого практического смысла, кроме удовлетворения личной потребности человека, не имеющей ничего общего с потребностями бизнеса заказчика.</p>
<p><span class="mark"><strong>Вывод</strong>: минимизируйте наличие субъективной составляющей при оценке результата работы.</span></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_69/lebedev_watching.png" alt=""></div>

<div class="news_block_text border_mod"><p>Не все дизайнеры в курсе, что дизайн делается для людей. Обычно дизайн делается для заказчика, для зарплаты, для конкурентов, для коллег по цеху.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Правки, правки, правки... Да сколько можно?</h3>

<p>Еще один краеугольный камень, про который спрашивают заказчики – это сколько вариантов дизайна будет предоставлено и сколько правок можно вносить.</p>
<p>Я всегда стараюсь объяснить, что количество вариантов дизайна всегда одно, а количество правок – не более 3-х циклов. На вопрос "Почему только один вариант, у других как минимум 2?" я предпочитаю отвечать так:</p>

<blockquote>
    
    <p>Мы разрабатываем веб-дизайн не для того, чтобы угодить вам, а для того, чтобы решить проблемы вашего бизнеса. Необходимо выяснить вашу проблему, получить всю доступную информацию и оттолкнуться от некоторой логичной гипотезы, которая ляжет в основу дизайна. Проверить, верна ли эта гипотеза или нет, вы сможете только тогда, когда через ваш сайт пройдет достаточное количество пользователей, иначе никак. После этого отпадает всякий смысл рисовать несколько разных вариантов дизайна на старте.</p>
</blockquote>

<p>Правда, стоит оговориться, что бывают отдельные случаи, когда заказчику требуется изначально несколько вариантов дизайна для проверки разных гипотез.</p>
<p>Имеет смысл количество правок. Они всегда будут по той причине, что какая-то информация может измениться в процессе разработки, или дизайнер может неверно истолковать некоторые ответы заказчика. Важно на старте объяснить, что будет считаться правкой и в каком количестве они могут вноситься в рамках вашего договора.</p>
<p><strong class="mark">Вывод</strong><span class="mark">: важно донести мысль о том, что нет смысла создавать несколько вариантов дизайна.</span></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">Цикл правок</div>

<div class="news_block_text "><p>Вместо скрупулезного подсчета количества замечаний от заказчика я пришел к идее цикла правок. Под одним циклом понимается список правок, присланных клиентом в течение суток.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Итог</h3>

<p>Мой опыт ведения процессов при разработке сайтов – это результат как минимум 10-ти лет работы с разными заказчиками. Но не стоит списывать мою субъективную составляющую. Для меня при работе с заказчиком в первую очередь важен комфорт и отсутствие стрессов, поэтому я стараюсь отказываться от тех заказчиков, которые потенциально могут потрепать нервы. Возможно, что для тебя, мой читатель, удовольствие от денег может покрыть достаточную долю стресса и потраченных нервов, поэтому некоторыми из моих советов можно и пренебречь.</p>
<p>Спасибо за внимание!</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/modx-formit.html</link>
    <turbo:source>https://lectoria.pro/read/modx-formit.html</turbo:source>
    <turbo:topic>MODx FormIt. Создание форм с произвольной логикой</turbo:topic>
    <pubDate>Sat, 15 Feb 2020 14:15:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="526248d329c247448fbe7d43abe342a48a">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/modx-formit.html" text="MODx FormIt. Создание форм с произвольной логикой"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">MODx FormIt. Создание форм с произвольной логикой</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>В этом руководстве для новичков я кратко расскажу о ключевых возможностях компонента FormIt и о механизме работы одноименного сниппета, который я использую на 99% процентах разрабатываемых мной сайтов на MODx Revolution. Надеюсь, что данная статья поможет лучше понять суть работы данного компонента, особенно, если вы только начали свой путь в изучении MODx Revolution.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Для чего нужен FormIt?</h2>

<p>Если вкратце, то <strong>FormIt</strong> — это компонент для MODx Revolution, представляющий из себя набор сниппетов и дополнительного интерфейса админки MODx для обработки значений форм и навешивания на них дополнительной логики при успешном/неуспешном заполнении.</p>

<div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            
            <div class="news_info_block_descr">
                <p>Официальная страница документации компонента FormIt</p>
            </div>
            <a class="news_tag_link active_tag" href="https://docs.modx.com/current/en/extras/formit/index">Смотреть</a>
        </div>
    </div>
    
</div>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Первая версия компонента вышла более 10 лет назад!</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как использовать</h2>

<p>Все довольно просто. В коде вашего шаблона/чанка, где находится ваша форма в виде html-кода, перед этой формой ставите вызов сниппета FormIt.</p>
<p>Например:</p>
<pre>&#91;&#91;!FormIt&#93;&#93;</pre>
<p>или, если вы используете Fenom-синтаксис:</p>
<pre>&#123;'!FormIt' | snippet&#125;</pre>
<p>После этого вызова размещаете свою форму, внутри которой подставляете соответствующие плейсхолдеры FormIt. Плейсхолдеры могут служить разным целям: содержать сообщение об ошибке, содержать сообщение об успешном выполнении или содержать значение поля.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Сниппет FormIt не отображает форму, а делает обработку данных POST-запроса и заполняет плейсхолдеры, которые можно использовать далее на странице.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-html">&lt;h2&gt;Контактная форма&lt;/h2&gt;

&#91;&#91;!+fi.validation_error_message:notempty=&lt;p&gt;&#91;&#91;!+fi.validation_error_message&#93;&#93;&lt;/p&gt;&#93;&#93;

&lt;form action=&quot;&#91;&#91;~&#91;&#91;*id&#93;&#93;&#93;&#93;&quot; method=&quot;post&quot; class=&quot;form&quot;&gt;
    &lt;label for=&quot;name&quot;&gt;
        Имя:
        &lt;span class=&quot;error&quot;&gt;&#91;&#91;!+fi.error.name&#93;&#93;&lt;/span&gt;
    &lt;/label&gt;
    &lt;input type=&quot;text&quot; name=&quot;name&quot; id=&quot;name&quot; value=&quot;&#91;&#91;!+fi.name&#93;&#93;&quot; /&gt;

    &lt;label for=&quot;email&quot;&gt;
        Email:
        &lt;span class=&quot;error&quot;&gt;&#91;&#91;!+fi.error.email&#93;&#93;&lt;/span&gt;
    &lt;/label&gt;
    &lt;input type=&quot;text&quot; name=&quot;email&quot; id=&quot;email&quot; value=&quot;&#91;&#91;!+fi.email&#93;&#93;&quot; /&gt;


    &lt;label for=&quot;text&quot;&gt;
        Сообщение:
        &lt;span class=&quot;error&quot;&gt;&#91;&#91;!+fi.error.text&#93;&#93;&lt;/span&gt;
    &lt;/label&gt;
    &lt;textarea name=&quot;text&quot; id=&quot;text&quot; cols=&quot;55&quot; rows=&quot;7&quot; value=&quot;&#91;&#91;!+fi.text&#93;&#93;&quot;&gt;&#91;&#91;!+fi.text&#93;&#93;&lt;/textarea&gt;

    &lt;br class=&quot;clear&quot; /&gt;

    &lt;div class=&quot;form-buttons&quot;&gt;
        &lt;input type=&quot;submit&quot; value=&quot;Отправить&quot; /&gt;
    &lt;/div&gt;
&lt;/form&gt;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Механика работы</h2>

<p>При отправке данных формы <span class="mark">POST запросом</span> на адрес этой же страницы, сниппет FormIt делает обработку значений в соответствии с параметрами вызова сниппета. Если в сниппет был передан параметр <strong><span class="mark">submitVar</span></strong>, то при отстутсвии значения в этом поле POST запроса, будет считаться, что отправки формы не было. Это позволяет игнорировать POST-запросы других форм.</p>
<p>В примере ниже сниппет FormIt не будет реагировать на данные при отправке второй формы:</p>

<pre class="line-numbers"><code class="language-html">&#91;&#91;!FormIt?
    &amp;submitVar=`myFormSubmit`
&#93;&#93;

&lt;form action=&quot;&quot; method=&quot;post&quot;&gt;
    &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;
    &lt;button type=&quot;submit&quot; name=&quot;myFormSubmit&quot; value=&quot;1&quot;&gt;Отправить&lt;/button&gt;
&lt;/form&gt;

&lt;form action=&quot;&quot; method=&quot;post&quot;&gt;
    &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;
    &lt;input type=&quot;submit&quot; value=&quot;Отправить&quot;&gt;
&lt;/form&gt;</code></pre>

<p>Сама по себе механика работы FormIt глобально состоит из  3-х основных этапов:</p>
<ul>
<li>Предварительная инициализация значений, запуск скриптов preHooks</li>
<li>Обработка POST-значений и запуск скриптов hooks</li>
<li>Постобработка значений, запуск скриптов renderHooks и запись плейсхолдеров</li>
</ul>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Базовые параметры FormIt и пример использования</h2>

<p>Несмотря на то, что последние несколько лет я использую сниппет FormIt через компонент AjaxForm, вам в первую очередь необходимо понять механику работы FormIt, так как AjaxForm – это всего лишь обертка, позволяющая запускать FormIt асинхронно, без перезагрузки страницы.</p>
<p>Сам по себе сниппет FormIt имеет не так много родных параметров. Большинство параметров – это параметры, которые необходимы для запуска вызываемых скриптов (хуков). Поэтому, чем больше хуков вы используете, тем больше параметров нужно передать в сниппет FormIt.</p>
<p>Типичный мой вызов FormIt на Fenom выглядит так:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">{'!FormIt' | snippet : &#91;
    'hooks'=&gt;'email',
    'submitVar'=&gt;'mySubmitVar',
    'emailTpl'=&gt;'email.questionForm',
    'emailTo'=&gt;$_modx-&gt;config.my_admin_email,
    'emailFrom'=&gt;$_modx-&gt;config.emailsender,
    'emailSubject'=&gt;'Задан вопрос на сайте '~$_modx-&gt;config.site_url,
    'validate'=&gt;'name:required,email:email:required,comment:required',
    'validationErrorMessage'=&gt;'Укажите корректную информацию. Заполните все необходимые поля.',
    'successMessage'=&gt;'Спасибо за ваш вопрос. Мы постараемся ответить на него в ближайшее время.',
    'errTpl'=&gt;'&#91;&#91;+error&#93;&#93;' 
&#93;}</code></pre>

<pre class="line-numbers"><code class="language-html">&lt;h2&gt;Контактная форма&lt;/h2&gt;

&#91;&#91;!+fi.validation_error_message:notempty=&lt;p&gt;&#91;&#91;!+fi.validation_error_message&#93;&#93;&lt;/p&gt;&#93;&#93;

&lt;form action=&quot;&#91;&#91;~&#91;&#91;*id&#93;&#93;&#93;&#93;&quot; method=&quot;post&quot; class=&quot;form&quot;&gt;
    &lt;label for=&quot;name&quot;&gt;
        Имя:
        &lt;span class=&quot;error&quot;&gt;&#91;&#91;!+fi.error.name&#93;&#93;&lt;/span&gt;
    &lt;/label&gt;
    &lt;input type=&quot;text&quot; name=&quot;name&quot; id=&quot;name&quot; value=&quot;&#91;&#91;!+fi.name:htmlent&#93;&#93;&quot; /&gt;

    &lt;label for=&quot;email&quot;&gt;
        Email:
        &lt;span class=&quot;error&quot;&gt;&#91;&#91;!+fi.error.email&#93;&#93;&lt;/span&gt;
    &lt;/label&gt;
    &lt;input type=&quot;text&quot; name=&quot;email&quot; id=&quot;email&quot; value=&quot;&#91;&#91;!+fi.email:htmlent&#93;&#93;&quot; /&gt;


    &lt;label for=&quot;text&quot;&gt;
        Сообщение:
        &lt;span class=&quot;error&quot;&gt;&#91;&#91;!+fi.error.comment&#93;&#93;&lt;/span&gt;
    &lt;/label&gt;
    &lt;textarea name=&quot;comment&quot; id=&quot;text&quot; cols=&quot;55&quot; rows=&quot;7&quot; value=&quot;&#91;&#91;!+fi.comment:htmlent&#93;&#93;&quot;&gt;&#91;&#91;!+fi.comment:htmlent&#93;&#93;&lt;/textarea&gt;

    &lt;br class=&quot;clear&quot; /&gt;

    &lt;div class=&quot;form-buttons&quot;&gt;
        &lt;input type=&quot;submit&quot; name=&quot;mySubmitVar&quot; value=&quot;Отправить&quot; /&gt;
    &lt;/div&gt;
&lt;/form&gt;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Этот вызов означает, что прежде, чем выполнить хук email, отправляющий письмо по заданному адресу, FormIt проверит, заполнены ли поля name, email и comment. Также поле email будет проверено на предмет соответствия шаблону email-адресов. Если все проверки будут пройдены, то только в этом случае произойдет отправка и будет выведено сообщение об успешности отправки формы. Или же будет выведена ошибка:</p>

<pre class="line-numbers"><code class="language-html">&#91;&#91;!+fi.validation_error_message:notempty=&lt;p&gt;&#91;&#91;!+fi.validation_error_message&#93;&#93;&lt;/p&gt;&#93;&#93;</code></pre>

<p>Если бы мы не указывали хук email, то параметры:</p>

<pre class="line-numbers"><code class="language-php">    'emailTpl'=&gt;'email.questionForm',
    'emailTo'=&gt;$_modx-&gt;config.my_admin_email,
    'emailFrom'=&gt;$_modx-&gt;config.emailsender,
    'emailSubject'=&gt;'Задан вопрос на сайте '~$_modx-&gt;config.site_url,</code></pre>

<p>Не имели бы смысла.</p>
<p>Поэтому, если вы используете какие-либо хуки, не важно, встроенные или свои, то добавляйте в вызов FormIt соответствующие ожидаемые параметры. Набор встроенных хуков FormIt и их параметров можно посмотреть <a href="https://docs.modx.com/current/en/extras/formit/formit.hooks#built-in-hooks" target="_blank">здесь</a>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Вместо заключения</h2>

<p>Для первого обзора FormIt, выраженного в виде небольшой статьи, получилось довольно сумбурно, но думаю, что суть вы уловили. В следующих статьях я постараюсь подрбонее рассказать о самописных хуках и сценариях их использования.</p>

<div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            <h2 class="news_info_block_title">Курс по теме</h2>
            <div class="news_info_block_descr">
                <p>Также я записывал отдельный курс по созданию Landing Page на MODx, в рамках которого я также показывал, как реализуется простая форма обратной связи и форма с более сложным набором полей.</p>
            </div>
            <a class="news_tag_link active_tag" href="catalog/modx-sozdanie-lendinga-bystroe-pogruzhenie.html">Подробнее</a>
        </div>
    </div>
    
    <div class="right_side_content_w single_img_mod">
        <div class="right_side_content">
            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_52/modx_marafon_landing_cover.jpg" alt=""></div>
        </div>
    </div>
</div>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Весь набор параметров FormIt</h2>

<table>
<thead>
<tr>
<td>Параметр</td>
<td>Значение по-умолчанию</td>
</tr>
</thead>
<tbody>
<tr>
<td><strong>preHooks</strong><br />Набор скриптов или сниппетов, запускаемых в любом случае. Если сниппет возвращает false, то дальнейший запуск хуков прекращается. Можно использовать для подстановки значений в форму по-умолчанию. При этом значения полей будут устанавливаться только в том случае, если не было отправки формы. Подробнее о хуках см. ниже</td>
<td> </td>
</tr>
<tr>
<td><strong>renderHooks</strong><br />Набор скриптов или сниппетов (хуков), запускаемых после всех других хуков (hooks и preHooks). Запускаются независимо от того, была ли отправка формы или нет. Могут использоваться для трансформации полей перед отображением в форме (например, чтобы преобразовать html-символы  в соответствующие коды)</td>
<td> </td>
</tr>
<tr>
<td><strong>hooks</strong><br />Набор скриптов или сниппетов, запускаемых при отправке формы. Используются для обработки значений пришедших из формы и реализации дополнительной логики. Например, для отправки письма на почту, для отправки данных в сервис рассылки или CRM или для авторизации пользователя.</td>
<td> </td>
</tr>
<tr>
<td><strong>submitVar</strong><br />Поле формы, используемое как индикатор отправки формы.</td>
<td> </td>
</tr>
<tr>
<td><strong>validate</strong><br />Разделенные запятой правила валидации полей формы. Каждое правило представляет из себя имя поля и затем через двоеточие указываются правила валидации. Например: <code>username:required,email:email:required. </code>Весь список встроенных валидаторов FormIt можно посмотреть <a href="https://docs.modx.com/current/en/extras/formit/formit.validators#built-in-validators" target="_blank">здесь</a>.</td>
<td> </td>
</tr>
<tr>
<td><strong>validationErrorMessage</strong><br />Сообщение об ошибке, которое будет помещено в плейсхолдер <code>&#91;&#91;!+fi.validation_error_message&#93;&#93;</code> в случае, если валидация одного или нескольких полей не пройдет.</td>
<td>A form validation error occurred. Please check the values you have entered.</td>
</tr>
<tr>
<td><strong>validationErrorBulkTpl</strong><br />HTML-чанк используемый для вывода сообщения об ошибке для каждого поля. В чанке может исползоваться плейсхолдер <code>&#91;&#91;+error&#93;&#93;</code></td>
<td><code>&#91;&#91;+error&#93;&#93;</code></td>
</tr>
<tr>
<td><strong>errTpl</strong><br />Html-обертка для вывода ошибки. Это не чанк, это именно html-код. Например <code>&lt;span&gt;&#91;&#91;+error&#93;&#93;&lt;/span&gt;</code></td>
<td><code>&#91;&#91;+error&#93;&#93;</code></td>
</tr>
<tr>
<td><strong>customValidators</strong><br />Список ползовательских валидаторов (сниппетов), которые могут использоваться в параметре <strong>validate</strong></td>
<td> </td>
</tr>
<tr>
<td><strong>clearFieldsOnSuccess</strong><br />Если установлено, то при успешной отправке формы, значения плейсхолдеров полей формы будут очищены.</td>
<td>true</td>
</tr>
<tr>
<td><strong>store</strong><br />Если установлено, то значения формы будут сохранены в кэше или в сессии для повторного вызова.</td>
<td>0</td>
</tr>
<tr>
<td><strong>storeTime</strong><br />Если store установлен, то в данном парамере указывается время в секундах для хранения данных в сессии или кэше</td>
<td>300</td>
</tr>
<tr>
<td><strong>storeLocation</strong><br />Может принимать значения cache или session. Место хранения данных формы.</td>
<td>cache</td>
</tr>
<tr>
<td><strong>placeholderPrefix</strong><br />Префикс, используемый для всех плейсхолдеров, устанавливаемых текущим вызовом сниппета FormIt. <span class="mark">Обращаем внимание на точку на конце!</span></td>
<td>fi.</td>
</tr>
<tr>
<td><strong>successMessage</strong><br />Если не используется хук redirect (который делает редирект в случае успешной отправки формы), то здесь указывается сообщение об успешной отправке формы.</td>
<td> </td>
</tr>
<tr>
<td><strong>successMessagePlaceholder</strong><br />Название плейсхолдера, в котором будет лежать сообщение об успешной отправке формы.</td>
<td>fi.successMessage</td>
</tr>
<tr>
<td><strong>redirectTo</strong><br />ID страницы, на которую будет произведен редирект в случае успешной отправки. <span class="mark">Актуально только, если в списке хуков параметра hooks используется хук redirect.</span></td>
<td> </td>
</tr>
<tr>
<td><strong>allowFiles</strong><br />Если вы разрешаете отправку файлов через форму, то необходимо установить это поле. По-умолчанию оно уже включено. </td>
<td>true</td>
</tr>
<tr>
<td><strong>attachFilesToEmail</strong><br />Актуально, если вы используете хук email в параметре hooks  и если вы хотите прицепить отправляемые через форму файлы к письму. <span class="mark">При этом не забывайте добавлять к вашей форме атрибут enctype="multipart/form-data"</span></td>
<td>true</td>
</tr>
</tbody>
</table>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p class="news_more_link"><a href="read/modx-formit-hook-authorize.html">Как сделать свой хук для авторизации через FormIt</a></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/migx-ekspress-rukovodstvo.html</link>
    <turbo:source>https://lectoria.pro/read/migx-ekspress-rukovodstvo.html</turbo:source>
    <turbo:topic>MIGX: экспресс-руководство</turbo:topic>
    <pubDate>Fri, 21 Feb 2020 11:07:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="7391baaafb4c1b09d4b51da6298e6c7dac">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/migx-ekspress-rukovodstvo.html" text="MIGX: экспресс-руководство"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">MIGX: экспресс-руководство</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Эта статья — пошаговое экспресс-руководство для того, чтобы использовать MIGX на сайте, созданном на MODx Revolution, прямо сейчас. Мы пробежимся по самым основным этапам создания MIGX-полей, чтобы у вас не сложилось впечатления, что MIGX — это сложно и долго.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Зачем нам MIGX на сайте?</h2>

<p>Если вам необходимо в каком-либо блоке на сайте вывести несколько элементов одного типа, не обязаетльно одинаковых по стилю, но очень схожих по своему назначению, то в большинстве случаев, для этих целей как нельзя лучше подходит бесплатный компонент MIGX, особенно, если вы заранее не знаете, сколько таких блоков-элементов будет на странице.</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_20_51.jpg" alt="Например, эти 4 блока. Вы не знаете заранее, будет ли их ровно 4. Возможно в будущем, вы захотите добавить еще 2.">
    <figcaption>Например, эти 4 блока. Вы не знаете заранее, будет ли их ровно 4. Возможно в будущем, вы захотите добавить еще 2.</figcaption>
</figure>

<p>Помимо прочего данный компонент также позволяет добавлять и редактировать значения, хранимые в кастомных таблицах БД, но это выходит за рамки экспресс-руководства.</p>
<p>Первое, что пришло бы в голову: организовать такие элементы как набор заранее подготовленных TV (например, вы можете сделать заранее 20 TV для заголовков и 20 TV для описаний, <span class="mark">но это крайне неоптимально и неудобно</span>). Как раз, чтобы не заниматься такими глупостями, но при этом не тратить большое количество времени на создание дополнительных таблиц в БД и настройке админки, чтобы эти поля редактировать, был придуман MIGX с возможностью добавлять такого рода дополнительные поля:</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_20_22.jpg" alt="Вы можете добавлять новые элементы в список, заранее не зная, сколько в итоге будет элементов">
    <figcaption>Вы можете добавлять новые элементы в список, заранее не зная, сколько в итоге будет элементов</figcaption>
</figure>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Подготавливаем конфигурацию</h2>

<p>После установки MIGX в админке появится новый одноименный пункт меню. Именно туда нам и нужно. На вкладке "MIGX" добавляем новую конфигурацию, нажав на "Добавить элемент".</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_41_01.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>Самое главное дальше, не испугаться такого количество вкладок и полей. Мы будем заполнять только необходимые и их не так много. Вкладки и поля, которые нам не пригодятся для примера выше, мы будем пропускать. Таким образом, у вас появится первый навык применения MIGX для простых списковых TV-полей. В дальнейшем вы сможете изучить MIGX более подробно для применения его в более сложных случаях.</p>
<p>Даем имя нашей конфигурации. Ее можно назвать произвольным образом. Главное, дайте ей осмысленное название, которое отражает ее назначение.</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_42_59.jpg" alt="Наша конфигурация нужна для хранения элементов информационной секции. Отсюда и такое название.">
    <figcaption>Наша конфигурация нужна для хранения элементов информационной секции. Отсюда и такое название.</figcaption>
</figure>

<h3>Добавляем поля всплывающего окна редактирования</h3>

<p>На вкладке "Formtabs" мы можем настроить содержимое формы, которая будет открываться при добавлении нового элемента или редактировании существующего. Сначала мы добавляем вкладки формы (tabs), а затем на каждую вкладку добавляем поля.</p>
<p>Сначала добавляем новую вкладку:</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_44_04.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>Затем внутри новой вкладки добавляем поля один за одним, нажимая "добавить элемент":</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_45_23.jpg" alt="Можно также указать поле Caption &mdash; это название вкладки. Можно его оставить пустым.">
    <figcaption>Можно также указать поле Caption — это название вкладки. Можно его оставить пустым.</figcaption>
</figure>

<p>В нашем случае нам требуется всего 2 поля:</p>
<ol>
<li>Для заголовка (поле типа text)</li>
<li>Для описания (поле типа <strong>textarea</strong>–текстовая область или <strong>richtext</strong>–текстовый редактор)</li>
</ol>
<p>Поле заголовка:</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_46_08.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>Если вы хотите добавить в окно редактирования значения поле, тип которого совпадает уже с каким-то ранее подготовленным дополнительным полем (TV), то вы можете использовать имя этого TV в поле <strong>Input TV</strong>. Например, у вас уже есть TV для ввода даты и времени под названием <strong>myDateTime</strong>, для этого вам достаточно будет в поле <strong>Input TV</strong> ввести "<strong>myDateTime</strong>" и нажать "Выполнено", оставив остальные поля пустыми.</p>
<p>В поле Input TV type вводится тип поля. Список типов можно посмотреть на <a href="https://docs.modx.com/current/ru/building-sites/elements/template-variables/input-types" target="_blank">странице документации modx</a>.</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_47_06.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>После того, как мы выполнили добавление поля <strong>title</strong>, повторяем такую же процедуру для поля description, указав его тип как <strong>textarea</strong> или <strong>richtext</strong></p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_52_06.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>После этого считаем, что добавление полей для всплывающего окна добавления и редактирования записей мы завершили.</p>
<p>Теперь нужно определить, какие поля будут отображаться в таблице списка.</p>

<h3>Добавляем колонки таблицы</h3>

<p>В разделе "columns" настраиваются колонки таблицы, которые будут отображаться на месте TV в админке. Сюда добавляются, как правило, колонки, соответствующие полям из вкладки "Formtabs" и дополнительные колонки для прочих целей (например для вывода кнопок редактирования записи или отображающие какие-то сводные данные).</p>
<p>Нам необходимо добавить колонку для вывода поля title.</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_15_16_15.jpg" alt="">
    <figcaption></figcaption>
</figure>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_15_16_41.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>Если мы хотим иметь возможность редактировать значение прямо из таблицы, кликнув дважды на само значение, можно на вкладке <strong>Cell Editor</strong> указать тип редактора значений:</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_15_17_44.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>Аналогичную процедуру повторяем для поля description, указав в поле <strong>Field</strong> значение <strong>description.</strong> Затем, мы можем добавить для удобства еще одну колонку, в которой выведем три кнопки: <strong>Редактировать, Дублировать, Удалить</strong>.</p>
<p>Для этого добавляем еще одну колонку, задав ей заголовок "Действия", поле Field оставляем пустым, так как она не содержит никаких данных. А во вкладке "Renderer" нам необходимо выбрать функцию this.renderRowActions.</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_15_18_33.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>А для того, чтобы выбрать, какие именно действия необходимо отобразить в этой колонке, на вкладке Columnbuttons указываем те действия, которые хотим отобразить:</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_15_27_41.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>На этом можем считать, что наша первая конфигурация MIGX готова. Мы опустили рассмотрение многих полей, так как в данном кейсе они не используются, иначе бы данный мануал нельзя было назвать экспресс-руководством.</p>
<p>Сохраняем нашу конфигурацию и приступаем теперь непосредственно к созданию TV-поля.</p>

<div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            <h2 class="news_info_block_title">Подробнее про MIGX</h2>
            <div class="news_info_block_descr">
                <p>Кстати, почти такой же пример с подробным разъяснением способов его реализации я разбираю в курсе по созданию лендинга на MODx Revolution.</p>
            </div>
            <a class="news_tag_link active_tag" href="catalog/modx-sozdanie-lendinga-bystroe-pogruzhenie.html">Подробнее</a>
        </div>
    </div>
    
    <div class="right_side_content_w single_img_mod">
        <div class="right_side_content">
            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_73/modx_marafon_landing_cover.jpg" alt=""></div>
        </div>
    </div>
</div>

<h2>Добавление TV-поля</h2>

<p>Здесь все максимально просто: вы создаете новое дополнительное поле точно так же, как делали это раньше, указав тип поля: migx, а в поле "Конфигурации" указав название нашей конфигурации, созданное на предыдущем этапе.</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_15_33_04.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>При этом стоит понимать, что название данного TV-поля и название конфигурации никак между собой технически не связаны. Поэтому они могут как одинаковыми, так и разными. Обычно, я создаю одну конфигурацию на одно TV-поле и названия даю им одинаковые, но вы вольны применять и другую концепцию.</p>
<p>Прицепив данное поле к соответствующему шаблону и сохранив его, вы увидите его теперь на вкладке дополнительных полей ресурса:</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_73/2020_02_21_14_20_22.jpg" alt="">
    <figcaption></figcaption>
</figure>

<h2>Отображение в шаблоне</h2>

<p>Я применяю в своем коде синтаксис Fenom, в связи с этим представленный ниже код будет написан именно на нем.</p>
<p>При выводе значений из MIGX TV-полей стоит помнить, что данные таких полей хранятся в виде JSON-строки. Нам необходимо преобразовать эту строку в массив и затем в цикле вывести на странице, используя необходимые обрамления в виде html-тегов.</p>
<p>В моем случае, где требуется, чтобы первый элемент был выведен в увеличенном виде, а все последующие в виде одинаковых колонок, такой код мог бы выглядеть так:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>MIGX представляет возможность вручную вставлять конфигурацию TV и каждого поля на форме редактирования в JSON-формате, но это всего лишь возможность, а не обязательное условие его использования</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-html">{var $elements = $_modx-&gt;resource.infoSectionElements | json_decode}
{if $elements}
    {foreach $elements as $index =&gt; $element}
        {if $index &gt; 0}
            {break}
        {/if}
        &lt;section class=&quot;text-center&quot; id=&quot;about&quot;&gt;
            &lt;div class=&quot;container&quot;&gt;
                &lt;div class=&quot;row&quot;&gt;
                    &lt;div class=&quot;col-md-10 col-lg-8&quot;&gt;
                        &lt;h2&gt;{$element.title}&lt;/h2&gt;
                        &lt;p class=&quot;lead&quot;&gt;
                            {$element.description}
                        &lt;/p&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/section&gt;
    {/foreach}
&lt;section&gt;
    &lt;div class=&quot;container&quot;&gt;
        &lt;div class=&quot;row&quot;&gt;
        {foreach $elements as $index =&gt; $element}
            {if $index == 0}
                {continue}
            {/if}
            {if $index % 3 == 1 &amp;&amp; $index &gt; 3}
                &lt;/div&gt;
                &lt;div class=&quot;row&quot;&gt;
            {/if}
            &lt;div class=&quot;col-md-4&quot;&gt;
                &lt;div class=&quot;feature&quot;&gt;
                    &lt;h4&gt;{$element.title}&lt;/h4&gt;
                    &lt;p&gt;
                        {$element.description}
                    &lt;/p&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        {/foreach}
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/section&gt;
{/if}</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Все не так сложно</h2>

<p>По итогу, для того, чтобы создать MIGX-поле, потребовалось совсем не много времени. Минимально необходимый набор действий заключается в:</p>
<ol>
<li>Настройке полей на форме, требуеющей на каждое поле несколько кликов и заполнение трех-четырех настроек</li>
<li>Настройке колонок таблицы, требующей на каждое поле также несколько кликов и заполнения двух настроек</li>
<li>Создании TV поля с указанием названия MIGX-конфигурации</li>
</ol>
<p>Да, MIGX представляет возможность вручную вставлять конфигурацию TV и каждого поля на форме редактирования, но это всего лишь возможность, а не обязательное условие его использования. Так что, даже не разбираясь во всех тонкостях и возможностях MIGx вы можете успешно применять его на своих проектах.</p>
<p>Спасибо за внимание!</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/modx-formit-hook-authorize.html</link>
    <turbo:source>https://lectoria.pro/read/modx-formit-hook-authorize.html</turbo:source>
    <turbo:topic>Хуки FormIt. Авторизация на Frontend</turbo:topic>
    <pubDate>Fri, 06 Mar 2020 13:23:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="75fe21049959bc6dd9703b4f2160f2075a">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/modx-formit-hook-authorize.html" text="Хуки FormIt. Авторизация на Frontend"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Хуки FormIt. Пишем хук для авторизации пользователя на Frontend</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>В данном руководстве я покажу, как можно при помощи хуков FormIt реализовать более сложную логику формы, обрабатываемой при помощи сниппета FormIt, чем просто стандартная отправка email. Конкретно в данном примере разберем, как можно сделать форму авторизации, построенную на FormIt и AjaxForm.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Для чего все это нужно и почему не компонент Login?</h2>

<p>Не знаю, почему, но за всю свою многолетнюю практику работы с MODX Revolution, я использовал компонент <a href="https://docs.modx.com/current/en/extras/login/index" target="_blank">Login</a> только один раз. Отличие Login от FormIt состоит в том, что Login решает ряд задач, посвященных конкретно авторизации/регистрации и редактированию профиля пользователя на Frontend, а <span class="mark"><strong>FormIt</strong> — это более универсальный компонент, с помощью которого можно построить практически любую логику обработки формы, но придется немного покодить</span>. Если перед вами не стоит задача построить сайт с регистрацией и авторизацией на Frontend за час, то я бы предпочел исползовать FormIt, написав для него несколько хуков, вместо того, чтобы разбираться в Login и кастомизировать его формы, доступные по-умолчанию.</p>
<p>Я буду использовать ниже синтаксис Fenom вместо стандартного синтаксиса MODX.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>В <a href="&#91;&#91;~52&#93;&#93;" target="_blank">предыдущей статье</a> я разбирал принцип работы FormIt. При работе с FormIt в чистом виде необходимо в самой форме добавлять дополнительные плейсхолдеры для вывода значений ошибок, значений полей и так далее. Для того, чтобы упростить себе жизнь, можно использовать данный компонент в связке с <a href="https://docs.modx.pro/komponentyi/ajaxform" target="_blank">AjaxForm</a>, что позволит сделать формы асинхронными и избавит вас от необходимости вставлять упомянутые выше плейсхолдеры.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Создаем html-код формы авторизации</h2>

<p>На данном шаге нам необходимо создать болванку (html-код) нашей формы, которую мы в дальнейшем будем наполнять логикой.</p>
<p>Возьмем для примера такой код (взят из вполне конкретного проекта):</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-html">&lt;form&gt;
    &lt;ul class=&quot;field_list&quot;&gt;
        &lt;li class=&quot;field_item&quot;&gt;
            &lt;dl class=&quot;form_cell form_cell_v1_mod&quot;&gt;
                &lt;dt class=&quot;form_cell_title form_v1_mod hline_hide_mod&quot;&gt;
                    &lt;label for=&quot;signin_email2&quot;&gt;Email&lt;/label&gt;
                &lt;/dt&gt;
                &lt;dd class=&quot;form_field_wrap form_v1_mod hline_hide_mod&quot;&gt;
                    &lt;input class=&quot;form_field v2_mod default_mod&quot; type=&quot;text&quot; id=&quot;signin_email2&quot; placeholder=&quot;Email*&quot; name=&quot;username&quot;/&gt;
                    &lt;span class=&quot;form_field_error&quot; data-error-for=&quot;username&quot;&gt;&lt;/span&gt;
                &lt;/dd&gt;
            &lt;/dl&gt;
        &lt;/li&gt;
        &lt;li class=&quot;field_item&quot;&gt;
            &lt;dl class=&quot;form_cell form_cell_v1_mod&quot;&gt;
                &lt;dt class=&quot;form_cell_title form_v1_mod hline_hide_mod&quot;&gt;
                    &lt;label for=&quot;signin_password2&quot;&gt;Пароль&lt;/label&gt;
                &lt;/dt&gt;
                &lt;dd class=&quot;form_field_wrap form_v1_mod hline_hide_mod&quot;&gt;
                    &lt;input class=&quot;form_field v2_mod default_mod&quot; type=&quot;password&quot; id=&quot;signin_password2&quot; placeholder=&quot;Пароль*&quot; name=&quot;password&quot;/&gt;
                    &lt;span class=&quot;form_field_error&quot; data-error-for=&quot;password&quot;&gt;&lt;/span&gt;
                &lt;/dd&gt;
            &lt;/dl&gt;
            &lt;span class=&quot;btn_field&quot;&gt;Показать&lt;/span&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
    &lt;div class=&quot;form_btn_w offset_mod&quot;&gt;
        &lt;button type=&quot;submit&quot; name=&quot;sendSignin&quot; value=&quot;1&quot; class=&quot;btn_form&quot;&gt;ВОЙТИ&lt;/button&gt;
    &lt;/div&gt;
&lt;/form&gt;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Создаем чанк с именем <span class="mark">b.signinForm</span> и помещаем в него код формы в том виде, в котором он показан выше. Далее мы будем вызывать данный чанк в параметрах сниппета AjaxForm.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Делаем вызов сниппета AjaxForm в связке с FormIt</h2>

<p>Для того, чтобы наша форма хотя бы просто отобразилась на странице, необходимо в том месте, где она должна размещаться, поставить вызов сниппета AjaxForm.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">{$_modx-&gt;runSnippet('!AjaxForm', &#91;
    'form' =&gt; 'b.signinForm',
    'hooks' =&gt; 'ЗДЕСЬ МЫ УКАЖЕМ ИМЯ НАШЕГО ХУКА',
    'validate' =&gt; 'username:required,password:required',
    'validationErrorMessage' =&gt; 'Во время авторизации возникли ошибки',
    'successMessage' =&gt; 'Авторизация успешно завершена',
    'submitVar' =&gt; 'sendSignin',
&#93;)}</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Не важно, запускаете вы сниппет AjaxForm или FormIt, его необходимо вызывать без кэширования (с восклицательным знаком спереди), так как при любой загрузке страницы нам нужен свежий вызов, а не "слепок" из кэша.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Валидация полей</h2>

<p>FormIt имеет встроенный механизм валидации полей. Правила валидации мы можем задать в параметре <span class="mark">validate</span>. Прежде, чем будет запущен какой-либо хук из параметра <span class="mark">hooks</span>, все поля будут прогнаны через указанные правила валидации. В нашем случае, это простое правило <span class="mark">required</span>, которое проверит, есть ли хотя бы один символ во введенных полях. Если поля успешно прошли валидацию, будет запущен первый хук из цепочки хуков, указанных в параметре <span class="mark">hooks</span> через запятую. В нашем случае мы создадим один хук под названием loginHook.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">Что такое хук?</div>

<div class="news_block_text "><p>Для простоты понимания, хук — это сниппет, который запускается изнутри механизмов FormIt. Данный сниппет создается точно так же, как и все остальные сниппеты, а на входе такой сниппет принимает параметр $hook.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_2_mod">
                    <p>Стоит отметить, что если ваша форма подразумевает более сложную логику валидации полей, то вы можете создать собственный валидатор, который также является сниппетом, внутри которого вы можете проверить поле на соответствие значению в базе данных или любым иным способом.</p>
<p>Более подробно об этом написано <a href="https://docs.modx.com/current/en/extras/formit/formit.validators#custom-validators" target="_blank">здесь</a>.</p>
<p>Но! И это еще не все! Вы можете проводить валидацию полей внутри хуков, что бывает также удобно.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Наполняем наш хук кодом</h2>

<p>Сперва добавьте в параметр hooks в вызове сниппета AjaxForm или FormIt значение loginHook:</p>

<pre class="line-numbers"><code class="language-html">...
'hooks' =&gt; 'loginHook',
...</code></pre>

<p>После чего необходимо создать сниппет loginHook, код которого нас сейчас будет интересовать больше всего.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">&lt;?php
/**
 * Авторизация пользователя в текущем контексте
 *
 * @var modX $modx
 * @var fiHooks $hook
 */

//Формируем набор свойств, который мы передадим 
//в процессор авторизации, который есть в modx по-умолчанию
$properties = array(
    'login_context' =&gt; $modx-&gt;context-&gt;key,
    'add_contexts' =&gt; '',
    //Для обращения к полям, введенным в форме, 
    //используется метод $hook-&gt;getValue('имя поля')
    'username' =&gt; $hook-&gt;getValue('username'),
    'password' =&gt; $hook-&gt;getValue('password'),
    'returnUrl' =&gt; '',
    'rememberme' =&gt; true,
);

// Запуск процессора авторизации
/** @var modProcessorResponse $response */
$response = $modx-&gt;runProcessor(
    'user/login',
    $properties,
    &#91;
        //Путь к папке процессора
        'processors_path' =&gt; MODX_CORE_PATH.'model/modx/processors/security/',
    &#93;
);

// Проверка результата на ошибки. Возвращение ошибок в форму, если нужно
/** @var modProcessorResponseError&#91;&#93; $errors */
if($errors = $response-&gt;getFieldErrors()) {
    foreach ($errors as $error) {
        //Таким образом мы можем добавить ошибку к определенному полю
        $hook-&gt;addError($error-&gt;getField(), $error-&gt;getMessage());
    }

    //Если хук возвращает false, выполнение
    //последующих хуков останавливается
    return false;
}

//Получить объект текущего авторизовавшегося пользователя можно так:
$user = $modx-&gt;getAuthenticatedUser($modx-&gt;context-&gt;key);

//Здесь можно выполнить дополнительную логику после 
//авторизации ползователя (инициализацию каких-либо полей и прочие операции)

//Хук должен вернуть true, тогда будут выполнены 
//все остальные операции и будет считаться, что он завершился успешно
return true;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В данном примере авторизация пользователя осуществляется через встроенный в modx процессор login. Если ваша логика авторизации отличается от встроенной логики авторизации modx, вы можете создать собственный процессор, наследующий класс процессора login, или написать код авторизации непосредственно в хуке.</p>
<p>Таким образом, вызов AjaxForm ниже в связке с хуом loginHook и формой b.signinForm позволит вам реализовать форму авторизации пользователя на сайте:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">{$_modx-&gt;runSnippet('!AjaxForm', &#91;
    'form' =&gt; 'b.signinForm',
    'hooks' =&gt; 'loginHook',
    'validate' =&gt; 'username:required,password:required',
    'validationErrorMessage' =&gt; 'Во время авторизации возникли ошибки',
    'successMessage' =&gt; 'Авторизация успешно завершена',
    'submitVar' =&gt; 'sendSignin',
&#93;)}</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            <h2 class="news_info_block_title">MODX FormIt. Создание форм с произвольной логикой</h2>
            <div class="news_info_block_descr">
                <p>Как быстро понять суть работы FormIt и использовать данный компонент для обработки любых форм.</p>
            </div>
            <a class="news_tag_link active_tag" href="read/modx-formit.html">Читать</a>
        </div>
    </div>
    
</div>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/sessii-v-php-i-modx-revolution.html</link>
    <turbo:source>https://lectoria.pro/read/sessii-v-php-i-modx-revolution.html</turbo:source>
    <turbo:topic>Сессии в PHP и MODX Revolution</turbo:topic>
    <pubDate>Tue, 14 Apr 2020 13:52:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="15869d5bbb0b712cc35142756d77a5e4b26">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/sessii-v-php-i-modx-revolution.html" text="Сессии в PHP и MODX Revolution"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Как устроены сессии в PHP, как реализован данный механизм в MODX Revolution и как его можно улучшить</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Работая над оптимизацией сайта проекта Лектория, я всегда ищу узкие места, которые в перспективе могут привести к существенным проблемам и стараюсь их в максимально короткие сроки закрывать. Одним из таких вопросов, с которыми я недавно столкнулся, оказался вопрос работы стандартного механизма обработки сессий в MODX.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как я начал ковыряться в этом вопросе</h2>

<p>Меня зовут Артем Зернов. Я веб-разработчик, занимаюсь развитием проекта Лектория, а также веду свой youtube-канал <a href="https://youtube.com/c/OpenModx" target="_blank">OpenModx</a>, а еще у меня есть веб-студия <a href="https://openco.ru" target="_blank">OpenColour</a>, в которой мы создаем сайты, в основном на MODX Revolution. В процессе своей деятельности в нашей команде мы создали не одну сотню сайтов, и в процессе их обслуживания я замечал, что некоторые, наиболее посещаемые сайты начинали тормозить. Причиной тому была таблица <strong class="tooltip_item" data-tooltip="В этой таблице в MODX по-умолчанию хранятся сессии посетителей сайта">modx_session</strong>, о которой мы поговорим позже. Столкнувшись с этой проблемой, я начал разбираться, как устроен механизм сессий в PHP и MODX в частности. И вот буквально сегодня я вновь вернулся к этому вопросу, анализируя поведение сайта Лектории. Спешу поделиться своими наблюдениями и идеями.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как устроены сессии в PHP по-умолчанию</h2>

<p>При посещении какой-либо веб-страницы сайта, созданного на PHP, создается сессия. При этом, если у вас в cookie нет параметра с идентификатором сессии (по-умолчанию это <strong class="tooltip_item" data-tooltip="Имя этого параметра можно изменить в php.ini">PHPSESSID</strong>), то сервер устанавливает вам куки и теперь сервер знает, какая сессия должна быть ассоциирована с вашим визитом.</p>
<p>В сессии хранятся данные, которые присущи только вашему визиту. Например, корзина товаров, информация о том, авторизовались ли вы для входа в личный кабинет и так далее.</p>
<p>Пока у вас есть в куки идентификатор сессии, сервер знает, кто вы и может показывать вам какие-либо ваши данные, хранимые в сессии.</p>
<p>По-умолчанию, в php есть встроенные функции <strong class="mark">session_start</strong>, <strong class="mark">session_write_close</strong> и прочие функции с префиксом <strong class="mark">session_</strong>. Полный набор функций можно посмотреть по ссылке:</p>
<p><a class="news_more_link" href="https://www.php.net/manual/ru/ref.session.php" target="_blank">https://www.php.net/manual/ru/ref.session.php</a></p>
<p>Также есть глобальный массив <strong class="mark">$_SESSION</strong>, в который вы можете записывать что угодно. MODX также записывает в него свои служебные данные.</p>
<p>Пока сессия открыта и пока не вызван метод <strong class="mark">session_write_close</strong>, все манипуляции с данными в <strong class="mark">$_SESSION</strong> будут сохраняться при переходах между страницами в рамках вашего посещения.</p>
<p>По-умолчанию, в php сессии хранятся в файлах, хранимых во временном каталоге (например /tmp). Также в дистрибутиве php содержится bash-скрипт <strong class="mark">sessionclean</strong>, который автоматически устанавливается в системные таймеры (можно сказать — это cron) и с периодичностью раз в 30 минут очищает устаревшие сессии, чтобы они не занимали лишнее пространство на диске.</p>

<blockquote>
    
    <p>Сессии устаревают по принципу "<span class="mark">Если с момента последнего обращения к сессии прошло больше времени, чем укзано в настройке php <strong>session.gc_maxlifetime</strong>, то считаем ее устаревшей</span>".</p>
</blockquote>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_158/source.gif" alt=""></div>

<div class="news_block_title">Для чего нужны сессии</div>

<div class="news_block_text border_mod"><p>Сессии — это временные хранилища, связанные с конкретным посетителем, а точнее с браузером. В сессии хранятся данные, потеря которых не несет существенных последствий.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как и где инициализируются обработчики сессии в MODX</h2>

<p>Прежде, чем сказать о том, как это происходит в MODX, важно сказать, что php предусматривает переопределение стандартных механизмов работы с сессиями. Это делается при помощи встроенной в php функции <strong class="mark">session_set_save_handler</strong>, с помощью которой мы можем переопределить способ чтения, записи и очистки от устаревших сессий (сборки мусора).</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>В MODX это происходит в методе modX::_initSession.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Стандартный механизм обработки сессий в MODX реализован в классе <strong class="mark">modSessionHandler</strong>. И, как вы наверняка догадались, сессии MODX хранятся в базе данных, а точнее в таблице <strong class="mark">modx_session</strong>. Там хранятся ID сессии (это как раз то, что хранится в куки в переменной PHPSESSID), время последнего доступа к ним и, собственно, сериализованный массив <strong class="mark">$_SESSION</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Сборщик мусора и настройки gc_probability и gc_divisor</h2>

<p>В php механизм очистки от устаревших сессий запускается в соответствии с настройками <strong>php.ini</strong> <strong class="mark">session.gc_probability</strong> и <strong class="mark">session.gc_divisor</strong>. Очистка происходит <strong>session.gc_probability</strong> раз из <strong>session.gc_divisor</strong>.</p>

<blockquote>
    
    <p>Например, если <strong>session.gc_probability = 1</strong>, а <strong>session.gc_divisor = 100</strong>, то очистка будет происходить в одном случае из ста обращений к сайту, для того, чтобы не перегружать сервер слишком частыми процедурами очистки сессий.</p>
</blockquote>

<p>Если ваш сайт посещают часто, то нужно увеличивать параметр <strong>session.gc_divisor</strong>. Например, ваш сайт посещают 1000 раз в сутки (речь идет именно об обращении к страницам, которые может делать хоть один и тот же пользователь), тогда при соотношении <strong>session.gc_probability/session.gc_divisor</strong> <strong>1/1000</strong> хотя бы один раз в сутки у вас будет запускаться механизм очистки от устаревших сессий.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_158/source_1.gif" alt=""></div>

<div class="news_block_title">Garbage collector</div>

<div class="news_block_text "><p>В переводе с английского означает "сборщик мусора". Сокращенно gc. Универсальное понятие, используемое в разных языках программирования, означающее механизм очистки от устаревших данных.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_2_mod">
                    <p>Как вы понимаете, механизм очистки от устаревших сессий можно запустить и самостоятельно (выше мы говорили о скрипте <strong>sessionclean</strong>). В Ubuntu этот механизм запускается каждые 30 минут. За другие ОС не скажу.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В MODX процедура очистки от устаревших сессий происходит в методе <strong>modSessionHandler::gc</strong>. И тут стоит отметить, что механизм очистки сессии в скрипте <strong>sessionclean</strong>, запускаемый каждые 30 минут, не будет очищать сессии MODX, так как он ничего не знает о том, что MODX переопределяет стандартные механизмы в классе <strong>modSessionHandler</strong>. Поэтому, если вы хотите очищать сессии modx вручную, необходимо написать самостоятельно скрипт. Но смысла в этом большого нет, кроме случая, описанного в конце этой статьи, так как очистка сессий будет происходить согласно вашим настройка <strong>session.gc_probability</strong> и <strong>session.gc_divisor.</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Время жизни куки и сессий</h2>

<p>В настройках php, в php.ini есть настройка <strong class="mark">session.gc_maxlifetime</strong>, которая определяет время с момента последнего обращения к сессии, после которого сессия считается устаревшей и будет удалена во время следующей очистки сессий (сборке мусора) и <strong class="mark">session.cookie_lifetime</strong>, которая определяет время жизни куки <strong class="mark">PHPSESSID</strong> в вашем браузере.</p>
<p>Стоит отметить, что MODX переопределяет эти настройки, согласно своим аналогичным системным настройкам <strong>session_cookie_lifetime</strong> и <strong>session_gc_maxlifetime</strong>, поэтому в первую очередь смотрите именно в системные настройки вашего сайта на MODX.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Логично, что выставлять cookie_lifetime больше, чем gc_maxlifetime смысла нет.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Почему моя таблица modx_session весит 2Гб?</h2>

<p>Впервые с вопросом, как работают сессии в MODX я столкнулся, когда начал замечать, что если я давно не занимался каким-либо сайтом, то на сервер, где он расположен, таблица <strong>modx_session</strong> становится непомерно огромной, что порой это приводит к замедлению работы сайта из-за долгой выборки сессии из этой таблицы.</p>
<p>Стоит понимать, что сессия создается независимо от того, является ли пользователь авторизованным или нет. Как только на ваш сайт попадает новый пользователь, у вас автоматически появляется новая запись в таблице <strong>modx_session</strong>. А если он это делает еще и с нескольких устройств, то количество записей будет равно количеству устройств. Правда, это можно исправить, выключив системную настройку <strong class="mark">anonymous_sessions</strong>. Но, если у вас интернет-магазин, то выключать ее нельзя, иначе у неавторизованных пользователей не будет работать, например, корзина.</p>
<p>Учитывая все вышеописанное, такое происходит только потому, что данная таблица не очищается от устаревших сессий.</p>

<h3>Как это можно решить?</h3>

<ol>
<li>Проверить параметр <strong>session.gc_probability</strong> на сервере, он должен быть больше 0. Если он равен 0, значит механизм очистки от старых сессий не запускается никогда.</li>
<li>Проверить, насколько часто запускается механизм очистки сессий. Если, к примеру, параметр <strong>session.gc_divisor</strong> очень большой, то возможно, при вашей посещаемости, очистка от устаревших сессий происходит 1 раз в год или еще реже.</li>
<li>Проверить время жизни сессий (настройка MODX <strong>session_gc_maxlifetime</strong>). Если она очень большая, например 1 год, то, очевидно, в течение года сессия будет оставаться живой. А если, при этом, параметр <strong>session_cookie_lifetime</strong> значительно меньше этого значения, то на одного пользователя потенциально будет создаваться больше, чем одна сессия, что является излишним.</li>
<li>Если возможности изменить настройку сессий <strong>session.gc_probability</strong> или <strong>session.gc_divisor</strong> у вас нет, то есть смысл написать cron-скрипт, о котором я писал выше.</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_158/source_2.gif" alt=""></div>

<div class="news_block_text "><p>Доходило до такого, что таблица modx_session ввиду отсутствия корректных настроек сессии и обслуживания сайта, разрасталась до нескольких гигабайт</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как можно улучшить стандартный механизм работы с сессиями в MODX</h2>

<p>Ко мне пришла в голову идея расширить стандартный класс <strong>modSessionHandler</strong>, заставив его работать с другой таблицей, которая представляет собой копию <strong>modx_session</strong>, но где мы можем добавить свои столбцы, например столбец <strong>anonymous</strong>, столбец <strong>user_id</strong> и прочие полезные столбцы, по которым мы могли бы делать выборку сессий.</p>
<p>После таких манипуляций, необходимо указать системную настройку <strong>session_handler_class</strong>, вставив туда название нашего кастомного класса для работы с сессиями (при этом, к сожалению, нет настройки для указания пути к классу, поэтому файл придется класть в системный каталог MODX, туда же, где лежит файл <strong>modsessionhandler.class.php</strong>).</p>

<h3>Какие это может дать преимущества</h3>

<ol>
<li>При очистке сессий мы можем делать разные условия для времени жизни сессии авторизованных пользователей и анонимных. Например, сессиий анонимных пользователей действительны в течение одних суток, а авторизованных — в течение 7 дней.</li>
<li>При авторизации одного и того же пользователя с разных устройств, мы могли бы удалять его другую сессию, предотвращая тем самым одновременный вход с разных устройств (если такое предусмотрено логикой вашего сайта).</li>
<li>При авторизации одного и того же пользователя с разных IP мы могли бы сообщать о подозрительной активности.</li>
<li>Можно расширить эту таблицу прочими полезными столбцами, которые мы могли бы использовать себе во благо и расширять сайт дополнительным функционалом.</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Заключение</h2>

<p>Спасибо за внимание! Надеюсь, статья была интересной и вдохновит кого-то из читателей на новые идеи.</p>
<p>Не забывайте подписываться на мой youtube-канал: <a href="https://youtube.com/c/OpenModx">OpenModx</a>!</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/kak-sdelat-sayt-chast-1.html</link>
    <turbo:source>https://lectoria.pro/read/kak-sdelat-sayt-chast-1.html</turbo:source>
    <turbo:topic>Как создать сайт для заказчика. Общие вопросы.</turbo:topic>
    <pubDate>Wed, 27 May 2020 11:30:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="1684330b492b006c962a72d286e22b987df">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/kak-sdelat-sayt-chast-1.html" text="Как создать сайт для заказчика. Общие вопросы."/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Как создать сайт для заказчика. Общие вопросы.</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Этим материалом я начинаю серию статей, в которой постараюсь разложить по полочкам все этапы создания интернет-магазина, что позволит начинающим веб-разработчикам лучше разбираться в вопросе (весь набор статей по технической части будет построен на основе возможностей CMS MODX Revolution).</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В этой статье я поделюсь процессом разработки интернет-магазинов, который мы практикуем в веб-студии <a href="https://openco.ru" target="_blank">OpenColour</a>. Разработкой сайтов я занялся в далеких 2000-х, а первый интернет-магазин я разработал году, эдак, в 2013-м. Я не маркетолог, а технический специалист, поэтому по большей части я буду говорить про технические аспекты интернет-магазина, но тем не менее в маркетинговых вопросах я тоже разбираюсь. Но когда я буду упоминать словосочетание <strong>интернет-магазин</strong>, я в большинстве случаев буду иметь ввиду именно веб-сайт, а не целиком всю организацию-продавца с ее логистическими связями, службами доставки, маркетинговым отделом и так далее.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Пока вы не начнете говорить на одном языке с заказчиком и ваша воображаемая картинка будущего продукта не станет выглядеть одинаково, к работе можно не приступать</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Отличительные критерии интернет-магазина</h2>

<p>Чтобы понимать, что перед нами сайт интернет-магазин, достаточно убедиться, что весь процесс оформления заказа на нем автоматизирован, а от менеджера в лучшем случае требуется лишь убедиться в реальности покупателя, подтвердив заказ по телефону и, возможно, передача заказа в отдел сборки и доставки. Если говорить о сайте <a href="https://lectoria.pro/">Lectoria</a>, то здесь весь процесс покупки автоматизирован полностью, при условии, что оплата происходит при помощи банковской карты. Такое возможно, если вы продаете цифровые товары, не требующие физической доставки.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Начало разработки. Процессы до интеграции с CMS</h2>

<h3>Постановка задачи и предварительные действия</h3>

<p>Как и любой другой сайт, интернет-магазин начинается с постановки вопросов:<span class="Apple-converted-space"> </span><strong>"Что продавать? Кому продавать? Как продавать?"</strong><span>.</span></p>
<p>После многолетнего опыта создания сайтов и работы с разными веб-дизайнерами, я выработал одно важное правило, которое может показаться очевидным.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Это правило звучит так: <strong>"Пока вы не начнете говорить на одном языке с заказчиком и ваша воображаемая картинка будущего продукта не станет выглядеть одинаково, к работе можно не приступать"</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Почему так? Потому что, когда я был молодым и зеленым, я торопился приступить к работе, потому что боялся затянуть сроки. Но по итогу, не выяснив у заказчика максимум информации о будущем сайте, продуктах, услугах, видении, и не донеся до него свое видение, вы с ним будете как будто в разных мирах. Когда он ждет от вас круглого и зеленого, вы уверены, что нужно красное и теплое. Это все, кстати, относится и не только к интернет-магазинам, а вообще к чему-угодно.</p>
<p>Далее мы определяемся с набором товаров и информации, которые планируем размещать на сайте и начинаем проектировать будущий сайт.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Когда он ждет от вас круглого и зеленого, вы уверены, что нужно красное и теплое.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Готовые решения для интернет-магазинов</h3>

<p>В большинстве случаев, когда речь идет о малом или даже микробизнесе, задача состоит еще и в том, чтобы уложиться в максимально маленький бюджет, а лучше вообще сделать это бесплатно.</p>
<p>Для оптимизации бюджета всегда можно прибегнуть к готовым шаблонам, которые впоследствии можно интегрировать в систему управления или же вообще использовать готовые инструменты для разворачивания интернет-магазина, такие как онлайн-платформы для продаж или же готовые CMS-движки с бесплатными шаблонами для онлайн-коммерции.</p>
<p>Я всегда был против таких решений, так как считаю, что сайт должен изначально разрабатываться под цели конкретного бизнеса, но, тем не менее, это всего лишь мой взгляд и я знаю немалое количество примеров, когда начинающий бизнес становился успешным, благодаря подобным решениям для быстрого развертывания интернет-магазина.</p>
<p>Но мы будем говорить о полноценном процессе разработки, начиная от постановки задачи и визуального проектирования страниц сайта и их содержимого, до технической интеграции и написания программного кода. В своей серии статей я подробно расскажу о технической стороне проекта, потому что напомню, я — технический специалист и мои главные познания и опыт лежат в области общего построения процесса разработки и конкретно в области написания программного кода и запуска конечного продукта.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">Почему не выбрать готовое решение?</div>

<div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_168/ezgif_3_b3eab0f61449.gif" alt=""></div>

<div class="news_block_text "><p>Сейчас на рынке существует несколько популярных готовых решений для быстрого развертывания интернет-магазина. И в сообществе разработчиков и заказчиков ведутся вечные споры на тему, что лучше. Я все же считаю, что лучше трезво оценивать возможности, стоимость и перспективы готового решения и самостоятельной разработки.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Планы и задачи</h2>

<p>Да, я понимаю, ты очень хотел бы получить исчерпывающее руководство прямо здесь и сейчас. Но не огорчайся, впереди еще целый набор статей и руководств, в которых мы подробно рассмотрим отдельные модули и задачи при построении архитектуры сайта интернет-магазина. Ты уже сейчас можешь почерпнуть много нового и полезного из моих бесплатных уроков на youtube-канале<span class="Apple-converted-space"> </span><a href="https://youtube.com/c/OpenModx/" target="_blank">OpenModx</a>.</p>
<p>Спасибо за внимание!</p>
<p><a class="news_more_link" href="read/kak-razrabatyvaetsya-dizayn-internet-magazina.-prototipirovanie.html">Следующая часть</a></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/kak-razrabatyvaetsya-dizayn-internet-magazina.-prototipirovanie.html</link>
    <turbo:source>https://lectoria.pro/read/kak-razrabatyvaetsya-dizayn-internet-magazina.-prototipirovanie.html</turbo:source>
    <turbo:topic>Как разрабатывается дизайн интернет-магазина. Прототипирование.</turbo:topic>
    <pubDate>Tue, 23 Jun 2020 08:41:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="1696514e5635ca56dd6e52ed541a5854e09">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/kak-razrabatyvaetsya-dizayn-internet-magazina.-prototipirovanie.html" text="Как разрабатывается дизайн интернет-магазина. Прототипирование."/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Как разрабатывается дизайн интернет-магазина. Прототипирование.</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Продолжая серию статей, посвященной всему процессу разработки веб-сайтов, в этой я расскажу, как происходит процесс создания прототипа веб-сайта в нашей веб-студии OpenColour.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Мой путь от зеленого юнца, называющего себя программистом, до эксперта в области разработки веб-сайтов был довольно долгим и тернистым, потому что у меня не было большого опыта работы в разных командах и многие детали веб-разработки я познавал на собственном опыте, довольно часто изобретая велосипед заново. Я нисколько об этом не жалею, так как программирование и разработка сайтов мне всегда приносили удовольствие. А то, что я сейчас транслирую в массы — результат моего опыта, поэтому нисколько не сомневаюсь в том, что пишу, рассказываю и показываю на своих онлайн-уроках.</p>
<p>Продолжая серию статей, посвященной всему процессу разработки веб-сайтов, в этой я расскажу, как происходит процесс создания прототипа веб-сайта в нашей веб-студии<span class="Apple-converted-space"> </span><a href="https://openco.ru/" target="_blank">OpenColour</a>. Учитывая вышесказанное о набивании шишек и построении своего опыта практически полностью на своих ошибках, стоит сказать, что я понял необходимость этапа разработки прототипа далеко не сразу. Потребовалась как минимум пара лет, чтобы я понял, что данный этап жизненно необходим в процессе производства веб-сайта. Раньше же я думал, что сайт можно сразу рисовать со слов заказчика в готовые дизайн-макеты (какая самоуверенность!).</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p><strong>Прототип страницы</strong> — это схематичное изображение страницы сайта, основная цель которого — показать, из каких блоков информации будет состоять страница. В зависимости от степени детализации, прототип может содержать уже готовые финализированные тексты, или же предварительные наброски текста.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Крайне не рекомендуется создавать прототип на основе "рыбных" текстов вроде Lorem Ipsum — такие тексты не имеют ничего общего с реальными данными, которые будут в дальнейшем размещаться на сайте. Если заказчик не представляет вам тексты на данном этапе, заставьте его это сделать. Даже, если заказчик говорит, что берет всю вину на себя, переделывать дизайн-макеты, а может и вообще готовый сайт потом придется все равно вам. А объяснить заказчику (особенно российскому), что он должен за это доплачивать, будет ой как непросто. Наш заказчик привык считать, что если вы озвучили сумму, то это полный <strong>лакшери-ол-инклюзив</strong> и ни за что больше доплачивать не нужно.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Наш заказчик привык считать, что если вы озвучили сумму, то это полный лакшери-ол-инклюзив и ни за что больше доплачивать не нужно.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Декомпозиция задачи. План действий.</h2>

<figure><img src="https://lectoria.pro/assets/files/images/res_169/source_1.gif" alt="">
    <figcaption></figcaption>
</figure>

<p>Наилучший способ решения практически любой задачи состоит в разбиении большой задачи на более мелкие. Сначала вы набрасываете общую структуру сайта, а затем начинаете постепенно детализировать каждый из разделов. Просто отвечайте вместе с заказчиком последовательно на каждый из вопросов ниже.</p>

<h3>1. Из каких разделов будет состоять сайт?</h3>

<p>Например: Главная, Каталог, Новости, Поддержка, Контакты.</p>

<h3>2. Какие типовые страницы будут составлять содержимое каждого из разделов сайта?</h3>

<p>Например: Главная, Страница каталога, Страница раздела каталога, Страница товара, Страница всех новостей, Страница отдельной новости, Страница поддержки, Страница контактов.</p>
<p>Не забывайте о том, что на сайте есть еще и технические страницы. Например, страница ошибки 404 (Страница не найдена).</p>

<p>Постарайтесь на этом этапе подумать, какие страницы будут еще. Уточняйте вместе с заказчиком, какую еще информацию он хотел бы разместить на сайте, какую информацию ВАЖНО разместить на сайте, чтобы сайт работал и выполнял свои функции.</p>

<h3>3. Какие типовые блоки должны быть на каждой странице?</h3>

<p>Например: на главной странице мы хотим показать анонс продукции, показать главный посыл о качестве продукции, показать самые продаваемые или популярные товары, и сделать анонс нескольких важных новостей.</p>
<p>Описывая таким образом каждую страницу с точки зрения логики и цели страницы, вы проектируете ее содержимое.</p>

<h3>4. Каким должно быть наполнение каждого из блоков?</h3>

<p>Параллельно консультируйтесь с заказчиком о том, готов ли он предоставить информацию для ваших целей, сможете ли вы сами такую информацию подобрать (например фотографии или видео на стоковых сайтах, написать текст о продукции, сфотографировать их продукцию и так далее).</p>
<p>На этом этапе определитесь с тем, кто и какую информацию должен предоставить, кто должен подобрать изображения, кто должен провести фотосъемку, кто должен смонтировать видеоролик, кто должен найти фотографа и так далее. Как вы понимаете, от этих вопросов напрямую зависит бюджет проекта и сроки его выполнения.</p>

<h3>5. О чем будет текст в конкретном блоке?</h3>

<p>На уровне блочного состава страниц можно сказать, что определились, но также важно и определиться с тем, что будет размещаться в каждом из блоков — какой там будет текст, о чем, сколько знаков? Хорошо, если вы можете уже на этом этапе написать черновой вариант такого текста.</p>

<h3>6. Что должно быть на изображении в конкретном блоке?</h3>

<p>С визуальной составляющей на данном этапе лучше работать максимально абстрактно, так как мы обычно всю визуалку обсуждаем на этапе разработки визуального концепта и дизайн-макетов.</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_169/abstract_image_1.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p>Здесь мы обычно абстрактно решаем, что должно располагаться в блоке. Например: "здесь будет фотография счастливой семьи", "здесь будет видео, доносящее ценность продукта при помощи прямых примеров его использования" и т.д. Для наглядности можно найти парочку ссылок на примеры таких видео или изображений, но ни в коем случае не стоит их вставлять в предстоящий прототип.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Сбор текстов и материалов</h2>

<p>Уже на этапе прототипа, как я писал выше, нужно подбирать тексты и возможные будущие изображения и видео для сайта, чтобы сразу определиться с тем, насколько реально воплотить вашу идею в жизнь. Стоит уже сейчас оценивать, насколько ваши идеи или идеи вашего ux/ui дизайнера дороги в реализации, от каких из них стоит сразу отказаться, потому что они не укладываются в бюджет или потому что их невозможно реализовать ввиду отсутствия определенных материалов.</p>
<p>Отсекая все лишнее и невозможное, вы удивитесь, как мало на свете заказчиков, у которых есть все материалы. На деле же оказывается, что у большинства заказчиков есть 10 фотографий, сделанных на телефон и 3 файла формата .docx или .pdf, в которых все свалено в одну кучу.</p>
<p><strong class="mark">"Возьмите всю необходимую информацию из файлов",</strong><span class="mark"> — говорит вам заказчик. </span><span>И все ваши радужные представления о будущем сайте скатываются в пропасть. Поэтому не стесняйтесь пинать вашего заказчика и заставляйте его вовлекаться в процесс создания сайта, так как без его участия, как бы вы ни старались, хорошая работа не получится.</span></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_169/source.gif" alt=""></div>

<div class="news_block_text border_mod"><p>На деле же оказывается, что у большинства заказчиков есть 10 фотографий, сделанных на телефон и 3 файла формата .docx или .pdf, в которых все свалено в одну хаотичную кучу.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Сборка прототипов</h2>

<p>После того, как все предыдущие подэтапы пройдены, можно собрать все воедино, в виде серо-белых блоков с серо-черными текстами в них. Не лишним будет на прототипах серым текстом писать "здесь будет анимация: блок выезжает при скроллинге". Так вы сможете не забыть и зафиксировать какие-то идеи уже на этапе прототипа.</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_169/protos.jpg" alt="Пример итогового набора прототипов">
    <figcaption>Пример итогового набора прототипов</figcaption>
</figure>

<p>Итогом всего этого процесса должны стать несколько серо-белых изображений будущих страниц и возможно краткий сопроводительный текст, описывающий содержание некоторых идей, которые вы хотите реализовать на последующих этапах, а также наброски мыслей на тему того, какое настроение должен создать дизайн-макет или отдельный его блок.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_2_mod">
                    <h2>Какие я сделал выводы за все время создания сайтов для различных заказчиков?</h2>

<ol>
<li>Уж лучше минималистичный сайт, на котором есть все необходимые тексты, чем большой сайт, на котором половина текстов "Раздел наполняется" или "Скоро здесь будут изображения".</li>
<li>Лучше донести заказчику мысль о том, что он тоже ответственен за результат, дождаться от него необходимых материалов, сорвать все сроки, но сделать аккуратный прототип, где для всех блоков уже есть наполнение (или будет подготовлено в ближайшее время), чем нарисовать "суперкрутоймегапрототип", где "все потом будет", а потом сесть в лужу на этапе запуска сайта.</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Заключение</h2>

<p>Надеюсь, коллега, статья была тебе интересна и полезна. Впереди нас ждет этап дизайн-макетирования. Будет интересно!</p>
<p>Добра и удачи в нашем нелегком, но безумно интересном деле!</p>

<div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            <h2 class="news_info_block_title">Как создать сайт для заказчика. Общие вопросы</h2>
            <div class="news_info_block_descr">
                <p>Общий обзор процесса разработки сайта для заказчика</p>
            </div>
            <a class="news_tag_link active_tag" href="read/kak-sdelat-sayt-chast-1.html">Читать</a>
        </div>
    </div>
    
    <div class="right_side_content_w single_img_mod">
        <div class="right_side_content">
            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_169/make_site_1.jpg" alt=""></div>
        </div>
    </div>
</div>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/svoya-stranichka-v-adminke-modx.html</link>
    <turbo:source>https://lectoria.pro/read/svoya-stranichka-v-adminke-modx.html</turbo:source>
    <turbo:topic>Создание своей страницы в админке MODX Revolution</turbo:topic>
    <pubDate>Tue, 22 Sep 2020 06:51:11 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="1789b134e9f88c2a27789abfaf221ece6e2">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/svoya-stranichka-v-adminke-modx.html" text="Создание своей страницы в админке MODX Revolution"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Создание своей страницы в админке MODX Revolution</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>В рассматриваемой статье мы разберемся с тем, как создаются произвольные страницы компонентов в админке MODX. Мы разберемся с тем, что такое контроллер и за что он отвечает, а также определимся с тем, можно ли создать страницу в админке без использования сложной и непонятной библиотеки ExtJS.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Урок посвящен:</h3>
<ol>
<li>Архитектуре построения админки</li>
<li>Созданию собственных страниц в ней</li>
</ol>
<p><strong>Контроллер</strong> — это специальный php-файл, лежащий в директории <em>core</em> компонента, и наследующий класс <span class="mark">modExtraManagerController</span>. Его назначение — подготовить нужные файлы для вывода страницы. Иными словами, нажатие на пункт меню какого-нибудь приложения, вызывает соответствующий контроллер, который запускает ряд указанных в нем действий.</p>
<p>Используемый контроллер можно найти в адресной строке, которая строится по следующему шаблону: <span class="mark">&#123;название сайта&#125;/manager/?a=&#123;контроллер&#125;&amp;namespace=&#123;пространство имен&#125;</span> <strong>&#123;контроллер&#125;</strong> - имя контроллера (php-файла, например <strong>index</strong> — index.class.php) <strong>&#123;пространство имен&#125;</strong> - пространство имен созданное для компонента.</p>
<h3>Структура контроллера</h3>
<ul>
<li>Объявление класса</li>
<li>Подключение стилей *.css</li>
<li>Подключение javaScript-файлов</li>
<li>Подключение дополнительного кода необходимого для реализации логики</li>
</ul>
<h3>Создание тестового компонента с названием "openmodx"</h3>
<h4>Шаг 1. Добавьте пространство имен openmodx</h4>
<p>Для этого создайте папку openmodx в директории<span class="Apple-converted-space"> </span><strong>/www/core/components</strong></p>
<h4>Шаг 2. Добавьте в него каталог controllers</h4>
<p>В этом каталоге хранятся все контроллеры используемые в компоненте</p>
<h4>Шаг 3. В корне каталога контроллеров создайте файл контроллера index.class.php</h4>
<p>Название файла контроллера стандартизировано и всегда имеет вид &#123;название контроллера&#125;.class.php По умолчанию (если не определено другого) MODX ищет index контроллер</p>
<h4>Шаг 4. Объявите класс omIndexController</h4>
<p>В начале файла добавьте следующий код</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Имя контроллера modx должно состоять из 3-х обязательных частей объединенных в одно слово (без пробелов) и каждая часть начинается с заглавной буквы.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">&lt;?php
class OpenmodxIndexManagerController extends modExtraManagerController {
}</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Имя контроллера должно состоять из 3 обязательных частей объединенных в одно слово (без пробелов) и каждая часть начинается с заглавной буквы. Части указываются в следующем порядке:</p>
<ol>
<li>Openmodx - название пространства имен</li>
<li>Index - название контроллера</li>
<li>ManagerController - обязательное обозначение контроллера</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Обратите внимание что класс <strong>OpenmodxIndexManagerController</strong> должен наследоваться от <strong>modExtraManagerController</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Шаг 5. Объявите пространство имен</h4>
<ol>
<li>Перейдите в пространство имен (Настройки -&gt; Пространство имен)</li>
<li>В открывшемся окне кликните по кнопке<span class="Apple-converted-space"> </span><span>"Создать новый"</span></li>
<li>В сплывающем окне введите следующие данные:</li>
<li>Имя -<span class="Apple-converted-space"> </span><strong>openmodx</strong></li>
<li>Путь к ядру -<span class="Apple-converted-space"> </span><strong>&#123;core_path&#125;/components/openmodx/</strong></li>
<li>Путь к активам -<span class="Apple-converted-space"> </span><strong>&#123;assets_path&#125;/components/openmodx/</strong></li>
<li>Сохраните изменения</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_176/f1.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Шаг 6. Проверьте правильность выполненных шагов</h4>
<p>Обратитесь к созданному контроллеру через адресную строку <code>&#123;имя_сайта&#125;/manager/?a=index&amp;namespace=openmodx </code>В случае правильного выполнения задания вы должны увидеть пустое окно без каких-либо ошибок</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_176/f2.jpg" alt="пустое окно без каких-либо ошибок">
    <figcaption>пустое окно без каких-либо ошибок</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Наполнение созданной страницы</h3>
<p>В предыдущем примере мы рассмотрели создание пустой страницы нашей компоненты<span class="Apple-converted-space"> </span><span>openmodx</span>. Далее мы будем работать с созданным выше контроллером, который по своей сути представляет собой класс.</p>
<h4>Описание структуры класса</h4>
<p>Класс представляет собой набор функций, как правило состоящий из следующих методов:</p>
<ol>
<li>procees() - метод выполняющий подготовительные действия до загрузки страницы;</li>
<li>getPageTitle() - выводит текст для тега title страницы;</li>
<li>loadCustomCssJs() - основной метод контроллера, именно он загружает все нужные скрипты и стили для работы страницы;</li>
<li>getTemplateFile() - метод отдаёт html шаблон страницы для дальнейшего отображения;</li>
<li>checkPremissions() - метод проверки ограничительных прав на доступ к странице.</li>
</ol>
<p>Использование всех методов является не обязательным и зависит всегда от способа решения конкретной задачи. Как видно из описания классов для описания внешного вида странички мы можем использовать два метода<span class="Apple-converted-space"> </span><strong>getTemplateFile</strong><span class="Apple-converted-space"> </span>и<span class="Apple-converted-space"> </span><strong>loadCustomCssJs</strong>. Рассмотрим их начиная с самого простого.</p>
<h4>Метод getTemplateFile()</h4>
<p>Этот метод должен<span class="Apple-converted-space"> </span><span>возвращать путь к файлу</span><span class="Apple-converted-space"> </span>для отображения, давайте это напишем. Добавьте внутри класса следующий код:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">Обязательно ExtJS?</div>

<div class="news_block_text "><p>Для наполнения страницы содержимым и логикой абсолютно не обязательно использовать ExtJS. Вы вправе использовать любые библиотеки, либо нативный html для построения содержимого и произвольный javascript для динамической клиентской логики.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">public function getTemplateFile() {
  return dirname(__DIR__).'/templates/index.tpl';
}</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В приведенном примере для отображения используется tpl шаблон, который расположен, в нашем примере, по адресу<span class="Apple-converted-space"> </span><strong>www/components/openmodx/templates/</strong>. В указанной папке создайте файл<span class="Apple-converted-space"> </span><strong>index.tpl</strong><span class="Apple-converted-space"> </span>и поместите в него код который выведет на страницу заголовок 2 уровня с текстом "Тестовая страница для админки":</p>

<pre class="line-numbers"><code class="language-html">&lt;div class=&quot;container&quot;&gt;&lt;h2&gt;Тестовая страница для админки&lt;/h2&gt;&lt;/div&gt;</code></pre>

<p>Сохраните изменения в файле и перезагрузите страницу браузера. Результат должен быть как на изображении.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_176/f3.jpg" alt="Отображение шаблона, указанного в методе getTemplateFile">
    <figcaption>Отображение шаблона, указанного в методе getTemplateFile</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Использование метода<span class="Apple-converted-space"> </span><strong>getTemplateFile</strong><span class="Apple-converted-space"> </span>позволяет быстро создавать страницы внутри нашей системы и не требует от разработчика специфических знаний, так как используется только нативный html код. Далее рассмотрим другой подход к отображению страниц, более сложный на первый взгляд.</p>
<h4>Метод loadCustomCssJs()</h4>
<p>Для корректного отображения страницы с использованием данного метода закомментируйте метод<span class="Apple-converted-space"> </span><strong>getTemplateFile</strong><span class="Apple-converted-space"> </span>или сделайте так, чтобы он возвращал пустую строку, например так:</p>

<pre class="line-numbers"><code class="language-php">public function getTemplateFile() {
  return '';
}</code></pre>

<p>Применение данного метода мы рассмотрим с использованием библиотеки для разработки пользовательских интерфейсов ExtJS, такой подход к написанию компоненты делает его более гибким и удобным для реализации логики его работы.<br />Посмотрим внешний вид нашего метода</p>

<pre class="line-numbers"><code class="language-php">...
public function loadCustomCssJs() {}
...</code></pre>

<p>Видим, что наш метод должен возвращать строку содержащую абсолютный путь до файла шаблона. Но начнем реализацию метода не с его описания, а с подготовки, принятой в системе MODx, структуры каталогов.</p>

<h4>Шаг 1. Создание каталогов</h4>
<p>По пути<span class="Apple-converted-space"> </span><strong>www/assets/components/</strong><span class="Apple-converted-space"> </span>создайте каталог<span class="Apple-converted-space"> </span><strong>openmodx</strong>, в нем папку<span class="Apple-converted-space"> </span><strong>js</strong>, подпапку<span class="Apple-converted-space"> </span><strong>mgr</strong><span class="Apple-converted-space"> </span>с файлом <strong>index.js</strong>. У Вас должна получиться структура папок представленных на изображении<span class="Apple-converted-space"><br /></span></p>

<pre class="line-numbers"><code class="language-html">www/  
 |-- assets/  
      |-- components/  
          |-- openmodx/  
                |-- js/  
                    |-- mgr/   
                        |-- index.js  </code></pre>

<p>Почему именно такая структура? Это связано с правилами MODx, такое распределение позволяет упорядочить файлы по их назначению, содержанию и в дальнейшем упростит работу по модификации web-приложения. В теории такой структуры придерживаться не обязательно, но ее использование косвенно подтверждает высокий уровень разработчика. Давайте рассмотрим назначение папок:</p>
<ol>
<li>assets — содержит папки файлы, которые должны быть доступны снаружи, из интернета;</li>
<li>components — каталог в котором хранятся файлы компонентов, которые должны быть доступны из браузера;</li>
<li>openmodx - каталог содержащий вспомогательный файлы нашей компоненты;</li>
<li>js — каталог содержащий js файлы;</li>
<li>mgr — каталог содержащий файлы связанные с панелью управления менеджера.</li>
</ol>
<h4>Шаг 2. Наполнение index.js</h4>
<p>Вставьте следующий код в файл который выведет заголовок страницы и текстовое поле с названием. Для облегчения понимания внутри кода приведены комментарии поясняющие назначение тех или иных команд (выражений, функций и т.д.)</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-javascript">var myPanel = function(config){ // Создаём компонент - главный объект
  config = config || {};
    Ext.apply(config,{
      cls: 'container', //применяем стиль container
      header: true, // разрешаем отображение заголовка
      title: 'Тест', // в заголовке выводим слово &quot;Тест&quot;
      items:&#91;{ // описываем объекты внутри панели
        layout: 'form', // создаем слой типа форма
        cls: 'main-wrapper', //применяем стиль main-wrapper
        labelAlign: 'top', //отображение подписи &quot;сверху&quot;
        items: &#91;{
          xtype: 'textfield', //создаем тестовое поле
          fieldLabel: 'Тесктовое поле' // подпись к текстовому полю
        }&#93;
      }&#93;
    });
    myPanel.superclass.constructor.call(this,config); //собираем компонент
};

Ext.extend(myPanel, MODx.FormPanel); // Наша панель расширяет объект MODX.FormPanel
Ext.reg('my-panel',myPanel);// Регистрируем новый xtype для панели

Ext.onReady(function(){ // Когда страница загрузилась
  MODx.add({ // Вставляем на страницу объект
    xtype: 'my-panel' // Тип объекта - Панель
  })
});</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Шаг 3. Определение метода loadCustomCssJs()</h4>
<p>В предыдущем шаге мы описали внешний вид нашей страницы. Теперь сделаем его доступным пользователю. Для этого вставим путь к файлу index.js в метод.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">public function loadCustomCssJs() {
  $baseUrl = '/assets/components/openmodx';
  $this-&gt;addLastJavascript($baseUrl.'js/mgr/index.js') //добавление файла js в конец генирируемой страницы
}</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Сохраните изменения в файле и перезагрузите страницу браузера. Результат должен быть как на изображении.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_176/f5.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Как Вы заметили мы не стали писать полный путь к файлу, часть его задали переменной, а часть - прописали "жестко". Соблюдение этого правила не обязательно и писать можно полные пути. Однако мы вынесли переменную для того, чтобы в дальнейшем сократить объем кода, когда подключаться будет не один файл, а много.</p>

<h2>Заключение</h2>
<p>В данном уроке был рассмотрен принцип создания простой странички в админке, что по своей сути является началом написания компонента для MODx. В ходе выполнения предложенных заданий, в существующие архитектуру папок и пространство имен, мы внедрили свою компоненту -<span class="Apple-converted-space"> </span><span>openmodx</span>, которая выводит требую нам информацию на своей странице. Также отмечу, что отображение страницы возможно выполнить двумя разными способами:</p>
<ol>
<li>использованием tpl шаблона с html разметкой, через метод<span class="Apple-converted-space"> </span><strong>getTemplateFile</strong>;</li>
<li>описанием содержимого страницы через библиотеку Ext JS и подключаемый методом<span class="Apple-converted-space"> </span><strong>loadCustomCssJs</strong>.</li>
</ol>
<p>Несмотря на то, что второй способ значительно сложнее для понимая и реализации, но он является более универсальным при разработке интерфейсов админки на MODX и позволяет использовать общий стиль и архитектуру интерфейса админки MODX.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/nastroyka-vds.html</link>
    <turbo:source>https://lectoria.pro/read/nastroyka-vds.html</turbo:source>
    <turbo:topic>Настройка VDS. Подробное руководство по развертыванию своего сервера.</turbo:topic>
    <pubDate>Mon, 28 Sep 2020 10:46:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="179c7cbc99b9b3f08a44452274d552f7ba8">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/nastroyka-vds.html" text="Настройка VDS. Подробное руководство по развертыванию своего сервера."/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Настройка VDS. Подробное руководство по развертыванию своего сервера.</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Данное руководство предназначено для развертывания и настройки VDS сервера на примере Ubuntu 20.04 с установкой веб-сервера nginx, php 7 и сервера базы данных MySQL.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Для чего?</h3>

<p>Вы уже получили навыки в создании web приложений и хотите разместить созданный сайт в интернете, но как это сделать? Все просто! Есть хостинг провайдеры, которые, как раз и предоставляют услуги, по размещению сайтов в сети. Заходя на страничку к провайдеру, вы видите, что можно взять в аренду <strong>виртуальный хостинг</strong> или <strong>VDS</strong>.</p>
<p>В чем разница? Давайте рассмотрим эти продукты и избавимся от боязни их использовать. Начнем по порядку от общего к частному.</p>
<p><strong>Хостинг</strong> - это услуга по предоставлению ресурсов для размещения информации на сервере, постоянно имеющем доступ к интернету. Следовательно виртуальный хостинг - вид хостинга, при котором множество веб-сайтов расположено на одном веб-сервере. Это самый экономичный вид хостинга, подходящий для небольших проектов. Исходя из определения разные тарифы на виртуальные хостинг могут отличаться по следующим основным параметрам:</p>
<ol>
<li>размер дискового пространства;</li>
<li>количество месячного трафика;</li>
<li>количество сайтов, которые можно разместить в рамках хостинга как одной услуги;</li>
<li>количество баз данных и количество места под базы данных;</li>
<li>количество почтовых ящиков и FTP-аккаунтов;</li>
<li>ресурсы CPU;</li>
<li>количество оперативной памяти.</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f1.jpg" alt="Примеры тарифов (хостинг timeweb)">
    <figcaption>Примеры тарифов (хостинг timeweb)</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Используя виртуальный хостинг, соответственно Вы попадаете в определенные ограничения по использованию ресурсов, при превышении которых выставляются предупреждения об ограничении работы и предлагается повысить тариф или начать работу по оптимизации сайта. Но как компенсация этого, в Вашем распоряжении есть административная панель, с помощью которой вы можете реализовать все функции по управлению сайтами.</p>

<p>Альтернативой виртуального хостинга является использование <strong>VDS\VPS (Virtual Dedicated\Private Server)</strong> — это, виртуальный выделенный или приватный сервер, который предоставляется хостинг провайдером в аренду заказчику.Чтобы не вводить в заблуждение, сразу отмечу, что разницы между аббревиатурами VPS и VDS нет никакой. Дело в том, что два этих понятия появились практически одновременно и параллельно развивались.</p>

<p>Что же такое <strong>VDS?</strong> Говоря простым языком, поставщик услуг на своем оборудовании, с помощью средств виртуализации разворачивает несколько виртуальных (программных) серверов. С точки зрения функциональности такой сервер ничем не отличается от физического, на него также устанавливаются операционная система и программное обеспечение, он также расположен в сети и управляется, как и остальные ПК, средствами удаленного администрирования. При этом данный сервер находится на удаленной площадке провайдера, которая защищена от сбоев и оптимизирована под работу 24/7/365. В свою очередь хостинг провайдер берет на себя все обязательства по обслуживанию и сопровождению оборудования и системы виртуализации. Но соответственно цену на эту услугу несколько выше чем на виртуальный хостинг.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f2.jpg" alt="Примеры тарифов VDS">
    <figcaption>Примеры тарифов VDS</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>К достоинствам этой услуги можно отнести, что Вы больше не будете ограничены количеством месячного трафика, размещаемых сайтов, базами данных и прочим. В Ваших силах теперь установить на свой VDS все необходимое программное обеспечение без каких-либо запретов и ограничений.</p>
<p>Но и минусы тоже есть. Настройка и администрирование теперь является Вашей заботой.</p>
<p>Что бы исправить возникшую несправедливость и обучить настройке и азам администрирования VDS и создано это руководство.</p>

<h4>Исходные данные</h4>

<p>Определим, что у нас есть некоторый сайт, работающий на php+MySQL под управлением некой CMS (в нашем случае это будет MODX Revolution, но на процесс настройки VDS это не влияет), а это значит, что помимо развертывания CMS необходимо установить и настроить основные модули php, nginx, mysql. Для этого определим следующую последовательность наших действий:</p>

<ol>
<li><a class="scrollLink" href="#o1">Регистрация на хостинге и конфигурация VDS;</a></li>
<li><a class="scrollLink" href="#o2">Создание VDS из панели управления;</a></li>
<li><a class="scrollLink" href="#o3">Подключение по SSH;</a></li>
<li><a class="scrollLink" href="#o4">Обновление и установка пакетов системы;</a></li>
<li><a class="scrollLink" href="#o5">Установка nginx + php;</a></li>
<li><a class="scrollLink" href="#o6">Установка mariadb (mysql);</a></li>
<li><a class="scrollLink" href="#o7">Создание нового пользователя системы;</a></li>
<li><a class="scrollLink" href="#o8">Конфигурирование php-fpm;</a></li>
<li><a class="scrollLink" href="#o9">Конфигурация nginx;</a></li>
<li><a class="scrollLink" href="#o10">Конфигурация mysql;</a></li>
<li><a class="scrollLink" href="#o11">Создание пароля для root пользователя mysql;</a></li>
<li><a class="scrollLink" href="#o12">Создание нового пользователя и базы данных для сайта;</a></li>
<li><a class="scrollLink" href="#o13">Создание недостающих каталогов и перезапуск сервисов;</a></li>
<li><a class="scrollLink" href="#o14">Установка MODX.</a></li>
</ol>

<h4><a id="o1">Регистрация на хостинге и конфигурация VDS</a></h4>

<p>В руководстве будем пользоваться услугами компании <a href="https://go.openco.ru/timewebvds">timeweb</a>. Переходим на вкладку <strong>VPS / VDS</strong>, из предлагаемых тарифов выбираем тот, который нам подходит по характеристикам и нажимаем кнопку заказать. После этого попадаем в окно регистрации и выбора параметров виртуального сервера.</p>

<p>В текстовые поля вводим свою фамилию, имя и отчество, и адрес электронной почты. В выпадающем списке меняем операционную систему на <strong>Ubuntu 20.04</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f3.jpg" alt="Форма регистрации">
    <figcaption>Форма регистрации</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Далее жмем кнопку "ЗАКАЗАТЬ" и переходим к оплате. После окончания регистрации на электрону почту придет письмо, содержащее данные для подключения к виртуальному серверу (ip адрес сервера, пароль root пользователя).</p>

<blockquote>
    
    <p>Root – это суперпользователь в системах *nix. С помощью этой учетной записи можно осуществлять административные операции над важными файлами ОС.</p>
</blockquote>

<h4><a id="o2">Создание VDS из панели управления</a></h4>

<p>Если вы уже зарегистрированы на этом хостинге, то заходим <a href="https://vds.timeweb.ru" target="_blank">панель управления</a>, нажимаем кнопку "СОЗДАТЬ СЕРВЕР" (1), вводим имя сервера (2), выбираем операционную систему "Ubuntu 20.04" (3), указываем конфигурацию сервера (выбираем тариф) (4). Чтобы создать виртуальный сервер в верхней части окна, нажимаем на кнопку "СОЗДАТЬ СЕРВЕР".</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f4.jpg" alt="Панель управления при создании нового сервера">
    <figcaption>Панель управления при создании нового сервера</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Создание сервера занимает некоторое время, обычно оно не превышает нескольких минут. После того как создание будет завершено на электронную почту поступит информационное письмо с данными для подключения и в панели управления отобразится статистика по виртуальному серверу.</p>

<h4><a id="o3">Подключение по SSH</a></h4>

<p>Для подключения к серверу мы будем использовать встроенный терминал macOS или, если вы работаете в операционной системе windows, то программой Putty.</p>

<blockquote>
    
    <p>SSH - (Secure Shell) - это протокол удаленного управления компьютером с операционной системой Linux. В основном ssh используется для удаленного управления серверами через терминал.</p>
</blockquote>

<p>Дальнейшая руководство будет построено на примере работы из под macOS, для windows все действия аналогичны и не различаются.</p>
<p>Откройте окно терминала и введите следующую команду</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">ssh root@193.168.3.225</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <blockquote>
    
    <p>где ssh - означает подключиться к удаленному компьютеру по протоколу ssh, в записи "root@193.168.3.225" - обозначает имя пользователя (root), @ - разделитель, 193.168.3.225 - ip адрес удаленного компьютера (смените на полученный в письме)</p>
</blockquote>

<p>Нажмите клавишу "Enter", введите пароль и нажмите еще раз "Enter". Приглашение терминала изменится и это является свидетельством подключения к серверу.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f5.jpg" alt="Вид терминала после успешного подключения по SSH">
    <figcaption>Вид терминала после успешного подключения по SSH</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Обратите внимание!</h4>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">root@343158-artprog157:~#</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Такая запись называется приглашением терминала (командной строки), состоит из:</p>
<ol>
<li>root - имя подключенного пользователя;</li>
<li>@ - разделитель;</li>
<li>343158-artprog157 - имя компьютера</li>
<li>знак "#" на конце строки означает, что пользователь имеет права суперпользователя, у обычного пользователя знак "$".</li>
</ol>

<h4><a id="o4">Обновление и установка пакетов системы</a></h4>

<p>Обновление пакетов системы является неотъемлемой частью перед установкой программного обеспечения и настройкой сервера. В Ubuntu используется пакетный менеджер APT (Advanced Package Tool, Улучшенный инструмент для работы с пакетами), который умеет работать с репозиториями, разрешать зависимости и взаимодействовать с dpkg, которая, собственно, и занимается установкой пакетов. APT всегда работает с локальным кешем списков, поэтому перед любыми действиями с пакетным менеджером следует обновить списки в кэше. Это можно сделать следующей командой</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">apt-get update</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Введенная команда проверяет версии списков в репозитории и при необходимости скачивает их новые версии, после чего анализирует список установленных пакетов и сообщает о доступных обновлениях. Далее обновления нужно установить с помощью команды</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">apt-get upgrade</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Это безопасный способ обновления, при котором обновляются только установленные пакеты и не происходит установки новых пакетов, если они затрагивают текущие версии, также не удаляются убранные из репозитория пакеты. На этом обновление системных пакетов закончено, переходим к следующему шагу.</p>

<h4><a id="o5">Установка nginx + php</a></h4>

<p>Приступим к установке программного обеспечения, необходимого для функционирования системы MODx, как и на предыдущем шаге мы будем использовать менеджер APT. Синтаксис команды для установки выглядит следующим образом</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">apt-get install &#123;имя пакета&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Так как, необходимо установить более одного пакета, то не нужно вводить команду каждый раз для конкретного пакета. Можно все имена пакетов вписать в одну команду, отделяя их друг от друга пробелами. Выполните установку необходимых нам пакетов следующей командой:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">apt-get install nginx php-common php-cli php-curl php-json php-gd php-mysql php-xml php-zip php-fpm php-mbstring php-bcmath php-pear</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>И так, мы выполнили установку nginx и php с библиотеками. Проверим, как установились пакеты. Для этого откройте браузер и в адресную строку впишите ip адрес виртуального сервера. У Вас должно отобразится приветственное окно nginx.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f6.jpg" alt="Страница приветствия nginx по-умолчанию">
    <figcaption>Страница приветствия nginx по-умолчанию</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4><a id="o6">Установка mariadb (mysql)</a></h4>

<p>В качестве системы управления базами данных используется <strong>mariadb</strong>, установим ее следующей командой:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">apt-get install mariadb-server-10.3</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>На этом установке завершена, настройка будет происходить в последующих шагах.</p>

<h4><a id="o7">Создание нового пользователя системы</a></h4>

<p>Теперь перейдем к созданию пользователя, от имени которого мы будем в дальнейшем работать с удаленным сервером. Так же использование root пользователя, в качестве основного создает предпосылки к нарушению системы безопасности. Определим следующую логику создания пользователей: один сайт - один пользователь с соответствующими настройками nginx, php, mariadb и правами на каталоги своего сайта. Таким образом, если один сайт взломают, то другие будут защищены благодаря нашей настройки.<br /> Создадим пользователя с именем test, который входит в группу www-data командой:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">useradd -d /home/test -g www-data -m -s /bin/bash test</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>-d - определяет домашний каталог (в нашем случае /home/test)<br /> -g - задает группу создаваемого пользователя (www-data)<br /> -m - создает домашний каталог если он не существует<br /> -s - устанавливает командную оболочку</p>
<p>Чтобы в дальнейшем мы могли выполнять какие-либо административные действия добавим созданного пользователя в группу sudo</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">usermod -a -G sudo test</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Осталось задать пароль пользователю, выполним команду</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">passwd test</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>После этого необходимо ввести пароль и повторить его (при вводе пароль не отображается)</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f7.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Проверим этот путем подключения к удаленному серверу под созданным пользователем, для этого повторим шаг "Подключение по SSH"</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">ssh test@193.168.3.225</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Обратите внимание, что приглашение теперь содержит имя пользователя test и заканчивается на знак $, что это значит можно узнать выше. Продолжим настройку сервера. Переподключитесь к нему под пользователем root.</p>

<h4><a id="o8">Конфигурирование php-fpm</a></h4>

<p>Начнем настройку php-fpm - это программный пакет, позволяющий выполнить обработку скриптов, написанных на языке PHP.<br /> Настройка в операционной системе Linux, в большинстве случаев, сводится к правке конфигурационных файлов. Соответсвенно, для настройки php-fpm, необходимо перейти в каталог с этими файлами. Введите команду которая сменит каталог</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">cd /etc/php/7.4/fpm/pool.d/</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Посмотрите какие файлы есть в этом каталоге</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">ls -al</code></pre>

<figure><img src="https://lectoria.pro/assets/files/images/res_179/f8.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Как видим в этой директории есть только один файл - www.conf. Он содержит конфигурацию сайтов, которые будут запускаться на этом сервере. Теперь удалим его и создадим новый, с описанием запуска нашего сайта.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">rm www.conf</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Новый файл будет состоять из следующих строк</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">&#91;test.site&#93;
listen = /run/php/php-test.sock //сокет
listen.mode = 0666 //права на запуск
user = test //пользователь от имени которого будет запущен php
group = www-data //принадлежность к группе

//задание директив php
php_admin_value&#91;upload_tmp_dir&#93; = /home/test/tmp  //каталог для загружаемых файлов
php_admin_value&#91;date.timezone&#93; = Europe/Moscow //временная зона
php_admin_value&#91;open_basedir&#93; = /home/test  //корневой каталог сайта
php_admin_value&#91;post_max_size&#93; = 512M  // максимальной размер POST
php_admin_value&#91;upload_max_filesize&#93; = 512M //максимальный размер загружаемого файла
php_admin_value&#91;cgi.fix_pathinfo&#93; = 0
php_admin_value&#91;short_open_tag&#93; = On //использовать короткую запись php
php_admin_value&#91;memory_limit&#93; = 512M //лимит оперативной памяти
php_admin_value&#91;session.gc_probability&#93; = 1 //настройки сессий
php_admin_value&#91;session.gc_divisor&#93; = 100 //настройки сессий
php_admin_value&#91;session.gc_maxlifetime&#93; = 28800; //максимальное время жизни сессии
php_admin_value&#91;error_log&#93; = /home/test/logs/php_errors.log; //файл записи лога ошибок

//задание динамических параметров
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Создадим файл конфигурации test.conf, с помощью встроенного редактора nano вставим строки кода приведеные выше, и сохраним файл.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">nano test.conf</code></pre>

<figure><img src="https://lectoria.pro/assets/files/images/res_179/f9.jpg" alt="">
    <figcaption></figcaption>
</figure>

<figure><img src="https://lectoria.pro/assets/files/images/res_179/f10.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>На этом настройка php-fpm закончена, переходим далее.</p>

<h4><a id="o9">Конфигурация nginx</a></h4>

<p>NGINX – это мощный веб-сервер, использующий не потоковую, управляемую событиями архитектуру, которая позволяет ему превосходить Apache. Приступим к его конфигурированию.<br /> Перейдите в каталог веб-сервера</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">cd /etc/nginx/</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В этой папке нас интересует два каталога, которые хранят настройки сайтов - sites-available, sites-enabled. Перейдем в первый каталог sites-available</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">cd sites-available/</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Здесь находится файл default, который содержит установки по умолчанию. Удалите его командой</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">rm default</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>С помощью редактора nano создадим файл конфигураций 00-default. (00 в начале имени файла необходим для того, файл был первым в каталоге т.к. в своей работе nginx обращается сначала к первому файлу)</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash"> nano 00-default.conf</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Внутрь файла поместите следующий код</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash"> server &#123;
    listen &#91;::&#93;:80;
    listen      80;
    server_name &quot;&quot;;
    return      444; # закрытие соединения без ответа
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Данный код запрещает обращаться к сайту через ip адрес и в этом случае выводит пользователю ошибку 444.<br /> Сохраните файл. Далее создайте второй файл конфигураций, который будет задавать правила работы с нашим сайтом</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">nano 01-test.sites.conf</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Внутрь файла поместите следующий код, потом сохраните его</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">upstream backend-test &#123;
  server unix:/run/php/php-test.sock;
&#125;

server &#123;
	listen &#91;::&#93;:80;
	listen 80;
	server_name test.site; # имя нашего сайта
	access_log /home/test/logs/nginx_access.log;
	error_log /home/test/logs/nginx_error.log;
	
	gzip on;
	# Минимальная длина ответа, при которой модуль будет жать, в байтах
	gzip_min_length 1000;
	# Разрешить сжатие для всех проксированных запросов
	gzip_proxied any;
	# MIME-типы которые необходимо жать
	gzip_types text/plain application/xml application/x-javascript text/javascript text/css text/json;
	# Запрещает сжатие ответа методом gzip для IE6 (старый вариант gzip_disable &quot;msie6&quot;;)
	gzip_disable &quot;MSIE &#91;1-6&#93;\.(?!.*SV1)&quot;;
	# Уровень gzip-компрессии
	gzip_comp_level 6;
	
	# корневой каталог сайта
	root /home/test/test.site/www;
	index index.php;
	
	# запрет для всех для при обращению к ядру MODx из браузера
	location ~ ^/core/.* &#123;
	  deny all;
	  return 403;
	&#125;
	# переадресация запросов на адрес index.php
	location / &#123;
	  try_files $uri $uri/ @rewrite;
	&#125;
	location @rewrite &#123;
	  rewrite ^/(.*)$ /index.php?q=$1;
	&#125;
	
	# При обращении к файлам php будет происходить запуск сокета php который мы настраивали на предыдущем шаге (Конфигурирование php-fpm)
	location ~ \.php$ &#123;
	  try_files  $uri =404;
	  include fastcgi_params;
	  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	  fastcgi_pass backend-test;
	&#125;
  
	# кэширование файлов с указанными расширениями
	location ~* \.(jpg|jpeg|gif|png|css|js|woff|woff2|ttf|eot|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ &#123;
	  try_files $uri @rewrite;
	  access_log off;
	  expires 10d;
	  break;
	&#125;

	location ~ /\.ht &#123;
	  deny all;
	&#125;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Продолжаем настройку nginx. Перейдите в каталог sites-enabled</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">cd ../sites-enabled/</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В этом каталоге удалите ссылку на уже не существующую конфигурацию</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">rm default</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Создайте две ссылки на конфигурационные файлы созданные выше</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">ln -s ../sites-available/00-default.conf
ln -s ../sites-available/01-test.sites.conf</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>На этом конфигурация сервера nginx завершена. Двигаемся дальше!</p>

<h4><a id="o10">Конфигурация mysql</a></h4>

<p>Переходим в каталог mysql.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">cd /etc/mysql/</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В этом каталоге находится файл my.cnf, в котором содержатся настройки нашей системы управления базами данных. Откройте этот файл в редакторе nano и отредактируйте</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">nano my.conf</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В конец файла вставьте следующий код, который обеспечит работу системы MODx с базой данных без ошибок</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">&#91;mysqld&#93;
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Теперь настроим парольный доступ root пользователя к базе данных. Для этого подключимся к СУБД</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysql -u root</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Подключение к базе сопровождается выводом ее приветствия (смотри изображение), после этого подключитесь к базе mysql. Обратите внимание, что при работе с базой данных каждая строка должна завершаться точкой с запятой, в случае ее отсутствия СУБД будет воспринимать следующую строку как продолжение предыдущей.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">USE mysql;</code></pre>

<figure><img src="https://lectoria.pro/assets/files/images/res_179/f11.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4><a id="o11">Создание пароля для root пользователя mysql</a></h4>

<p>Для того, чтобы, пользователь root мог подключаться с паролем, необходимо изменить значения столбца <strong>plugin</strong> с unix_socket на mysql_native_password</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">UPDATE user SET plugin='mysql_native_password' WHERE User='root';</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Такую строку можно прочитать следующим образом:"Обнови в таблице user столбец plugin на mysql_native_password для строк где в колонке User значение root". Таким образом, мы разрешили пользователю root авторизироваться в СУБД через пароль БД. Однако сам пароль мы не задали, исправим это</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">ALTER USER 'root'@'localhost' IDENTIFIED BY 'testtest';</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Таким образом, мы задали пароль <strong>testtest</strong> для локально подключенного пользователя root. После этого, необходимо перезагрузить привелегии пользователей командой</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">FLUSH PRIVILEGES;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>и отключиться от СУБД</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">\q</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Как проверить правильность выполненных действий? Нужно войти в операционную систему под пользователем test (его мы создали немного выше) и подключиться к СУБД как root. Делаем следующие шаги - подключаемся как test</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">su test</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>У вас должно измениться приглашение системы на пользователя test. Теперь настала очередь подключиться к СУБД</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysql -u root -p</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В приведенной команде -u - определяет что следующим идет имя пользователя, -р - использовать нативный пароль mysql (именно тот что мы и настраивали). После отправки команды СУБД попросит ввести пароль (нами был задан пароль testtest). Если у Вас все получилось, то шаги, проделанные выше, выполнены правильно. Далее выйдите из СУБД, подключитесь к операционной системе как root, и от имени этого же пользователя подключитесь к СУБД. Переходим дальше.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f12.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4><a id="o12">Создание нового пользователя и базы данных для сайта</a></h4>

<p>Создадим базу данных для сайта с именем test</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">CREATE DATABASE IF NOT EXIST test;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Создадим пользователя в базе данных с именем test и паролем testtest. В дальнейшем этот пользователь будет использоваться системой MODx для работы с базой данных.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">CREATE USER 'test'@'localhost' IDENTIFIED BY 'testtest';</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Определим для созданного пользователя права при подключении к СУБД</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">GRANT USAGE ON *.* TO 'test'@'localhost' IDENTIFIED BY 'testtest' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Выдадим пользователю test все привилегии, на созданную, базу данных с правом ее передачи</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">GRANT ALL PRIVILEGES ON test.* TO 'test'@'localhost' WITH GRANT OPTION;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>После этого необходимо перезагрузить привилегии пользователей командой</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-sql">FLUSH PRIVILEGES;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Проверьте правильность выполненных шагов следующим образом: подключитесь к СУБД под пользователем test.</p>

<h4><a id="o13">Создание недостающих каталогов и перезапуск сервисов</a></h4>

<p>На данном этапе мы выполним следующие шаги:</p>
<ol>
<li>Подготовка каталогов, которые мы использовали в настройках;</li>
<li>Перезапуск сервисов.</li>
</ol>
<p>Для правильной установки и функционирования MODx осталось создать недостающие каталоги. Выполните следующие команды</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">sudo -u test mkdir /home/test/tmp
sudo -u test mkdir /home/test/logs
sudo -u test mkdir /home/test/test.site
sudo -u test mkdir /home/test/test.site/www</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В приведенных командах, как Вы заметили, операции по созданию каталогов (mkdir) выполняются с правами супер пользователя (sudo), от имени пользователя test (-u test). Это сделано с целью, чтобы пользователь test был владельцем этих каталогов и имел, по отношению к ним, полные права. После выполнения команд проверьте структуру каталога, там должны были появиться созданные нами папки.</p>
<p>Практически все готово к установке MODx, осталось перезапустить службы php, nginx, mysql. Это связано с тем, что настройки всех сервисов содержаться в текстовых файлах и считываются только при запуске служб. Выполните команды</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">sudo service php7.4-fpm restart
sudo service nginx restart
sudo service mysql restart</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Так как, мы запретили подключение по ip адресу, то необходимо в локальном файле hosts указать переадресацию. Добавьте следующую строку в конец файла (Ваш ip адрес может отличаться от того, который приведен в примере)</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">193.168.3.225 test.site</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Проверьте правильность выполненных действий. Введите в адресную строку браузера ip адрес сервера, Вам должна выдаться ошибка 444.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f13.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если обратитесь по имени сайта, то ошибка должна следующей</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f14.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Это является свидетельством, что все настроено правильно на данном этапе инструкции.</p>

<h4><a id="o14">Установка MODX</a></h4>

<p>Перед установкой MODx необходимо его дистрибутив поместить на наш виртуальный сервер. Для этого будем использовать текстовый загрузчик <strong>wget</strong>. Давайте установим его</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">apt-get install wget</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>На официальном сайте <a href="https://modx.com/download">MODx</a> скопируйте ссылку на дистрибутив (в моем случае она имеет вид https://modx.com/download/direct?id=modx-2.7.3-pl.zip&amp;0=abs). Теперь с помощью программы wget сохраним его в каталоге /home/test/test.site/www/ командой</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">wget -P home/test/test.site/www/ https://modx.com/download/direct?id=modx-2.7.3-pl.zip&amp;amp;0=abs  </code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>После скачивания проверьте, что в каталоге www присутствуют следующие файлы и папки (для разных версий MODx состав может незначительно отличаться)</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f15.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Приступим к установке MODx. В адресную строку строку браузера введите</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">test.site/setup</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Откроется окно выбора языка, оставьте русский и нажимайте "ДАЛЕЕ"</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f16.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Выберите пункт "НОВАЯ УСТАНОВКА", нажмите "ДАЛЕЕ"</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f17.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В этом окне установите базу данных mysql, сервер - localhost, имя пользователя - test, укажите его пароль (testtest), имя базы данных - test, кодировка подключения - utf8, сопоставление - utf8_general_ci.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f18.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Теперь придумайте логин и пароль администратора сайта</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f19.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Удостоверьтесь, что в отчете об установке все компоненты установлены и работают</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f21.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Нажмите войти и введите регистрационные данные администратора сайта</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f22.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>На этом установка MODx закончена.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_179/f24.jpg" alt="">
    <figcaption></figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Заключение</h3>

<p>В руководстве мы рассмотрели большой объем материала. Затронули множество тем, которые затрагивают основы администрирования удаленного сервера, установки и настройки необходимого программного обеспечения. Данное руководство, на первый взгляд, только выглядит сложно, но по мере получения практических навыков, для Вас, эти процедуры будут казаться элементарными.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/modx-nastroyka-avtorizatsii-cherez-plagin.html</link>
    <turbo:source>https://lectoria.pro/read/modx-nastroyka-avtorizatsii-cherez-plagin.html</turbo:source>
    <turbo:topic>Проверка авторизации через плагин в MODX</turbo:topic>
    <pubDate>Wed, 30 Sep 2020 09:30:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="18070a8e5d9b22ffaaca003be35090ba179">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/modx-nastroyka-avtorizatsii-cherez-plagin.html" text="Проверка авторизации через плагин в MODX"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Проверка авторизации через плагин в MODX</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>В этом руководстве рассмотрим один из вариантов, как ограничить доступ неавторизованных посетителей сайта к страницам, например профиль зарегистрированного пользователя или личный кабинет. При обращении к такой странице посетитель должен увидеть сообщение об ошибке, уведомление о необходимости пройти авторизацию или получить форму авторизации.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Постановка задачи</h2>

<p>Есть некоторый сайт, содержащий как публичные, так и личные страницы пользователя. Дополнительно в нем уже реализована логика авторизации и регистрации. Задачей данного руководства является ограничение доступа к страницам на основе идентификатора их шаблона.</p>

<h3>Принцип работы</h3>

<p>В отличии от встроенного в MODx управления ролями и группами, которое требует отдельного рассмотрения, логика работы гораздо проще. В имеющийся код добавляется плагин на событие <strong>OnLoadWebDocument</strong> и две системные настройки, с их помощью проверяется необходимость авторизации для каждой страницы, если она требуется, то либо допускает пользователя, либо выдает форму авторизации или ошибку (в зависимости от настройки).</p>

<h3>Подготовка системных настроек</h3>

<p>Если пользователь не авторизован, то ему необходимо показать соответствующую страницу. В моем случае, с этой целью создан ресурс <strong>Вы не авторизованы</strong>, его индекс - <strong>29</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Данный способ привлекателен тем, что мы не меняем код и структуру шаблона, т.е. в коде шаблона нет никакого кода, проверяющего авторизацию пользователя.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_180/f3_1_2.jpg" alt="Состав ресурсов сайта">
    <figcaption>Состав ресурсов сайта</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Отредактируйте системную настройку с именем <strong>unauthorized_page</strong> и в поле значение вставьте индекс ресурса - <strong>29</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_180/f3_2_2.jpg" alt="Редактирование системной настройки">
    <figcaption>Редактирование системной настройки</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Создадим системную настройку, которая будет содержать идентификаторы шаблонов, к которым необходимо ограничить доступ неавторизованных посетителей сайта. В разделе <strong>Системные настройки &amp; События</strong> нажмите кнопку <strong>создать новый параметр</strong>. В открывшемся окне добавьте:</p>
<ol>
<li>ключ <strong>authorized_templates</strong>;</li>
<li>название <strong>setting_authorized_templates</strong>;</li>
<li>в поле значение укажите идентификаторы шаблонов, к которым необходимо ограничить доступ.</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_180/f3_3_2.jpg" alt="Редактирование системной настройки">
    <figcaption>Редактирование системной настройки</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>На этом подготовка системных настроек закончена, перейдем к логике работы проверки авторизации.</p>

<div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            <h2 class="news_info_block_title">Где изучить подробнее?</h2>
            <div class="news_info_block_descr">
                <p>В курсе по профессиональной разработке интернет-магазинов на MODX Revolution вы научитесь создавать, помимо всего прочего функционала, личные кабинеты, а также формы для регистрации, авторизации и восстановления пароля.</p>
            </div>
            <a class="news_tag_link active_tag" href="catalog/modx-bolshoy-kurs-po-razrabotke-internet-magazinov.html">Подробнее</a>
        </div>
    </div>
    
    <div class="right_side_content_w single_img_mod">
        <div class="right_side_content">
            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/course_77/project_screen.png" alt=""></div>
        </div>
    </div>
</div>

<h3>Написание плагина</h3>

<p>Создайте новый плагин во вкладке <strong>Элементы</strong>. Добавьте название <strong>checkAuthorizedTemplates</strong> и описание для него.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_180/f3_4_2.jpg" alt="Создание плагина">
    <figcaption>Создание плагина</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Перейдите на вкладку <strong>Системные события</strong> и поставьте галочку в поле <strong>Включен</strong> напротив события <strong>OnLoadWebDocument</strong>. Таким образом, мы привяжем созданный плагин к загрузке страниц.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_180/f3_5_2.jpg" alt="Привязка плагина к событию">
    <figcaption>Привязка плагина к событию</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Ниже рассмотрим код плагина, который необходимо будет вставить в соответствующее поле на вкладке <strong>Создать/редактировать плагин</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">&lt;?php
/**
 * Плагин для выдачи ошибки, при отсутствии авторизации на страницах, где требуется авторизация
 */
if ($modx-&gt;resource) &#123;
    $template = $modx-&gt;resource-&gt;get('template');
    $templatesArray = $modx-&gt;getOption('authorized_templates');

    //Если список шаблонов - это строка, то предполагаем, что это список ID шаблонов, разделенных запятой
    if(is_string($templatesArray)) $templatesArray = explode(',',$templatesArray);

    //Если шаблон требует авторизацию и пользователь не авторизован, то выдаем страницу ошибки
    if(in_array($template, $templatesArray) &amp;&amp; !$modx-&gt;user-&gt;hasSessionContext($modx-&gt;context-&gt;key))&#123;
        //Вместо in_array($template, $templatesArray) можно разместить любую другую логику, которая соответствует вашему проекту
       
        //В системной настройке unauthorized_page лежит ID ресурса, на который будет выполнена переадресация 
        $modx-&gt;sendForward($modx-&gt;getOption('your_unauthorized_page_id'), &#91;
            'merge' =&gt; 1, // Включает механизм склейки полей
            // список оригинальных полей, которые нужно исключить из результата
            'forward_merge_excludes' =&gt; 'id,template,class_key',
            'response_code' =&gt; $_SERVER&#91;'SERVER_PROTOCOL'&#93; . ' 401 Unauthorized',
        &#93;);
        exit;
    &#125;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Рассмотрим представленный код. В начале получаем индекс шаблона запрашиваемой страницы</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">$template = $modx-&gt;resource-&gt;get('template');</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Получим значение системной настройки <strong>‌authorized_templates</strong>, в которой перечислены индексы шаблонов, к которым есть доступ у авторизованных пользователей</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">$templatesArray = $modx-&gt;getOption('authorized_templates');</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если получений список представляет собой строку, то преобразовываем ее в массив</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">if(is_string($templatesArray)) $templatesArray = explode(',',$templatesArray);</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Далее ставим условие - если шаблон посещенной страницы есть в массиве и пользователь не авторизован, то подменяем запрашиваемую страницу ресурсом, указанным в системной настройке <strong>unauthorized_page</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">if(in_array($template, $templatesArray) &amp;&amp; !$modx-&gt;user-&gt;hasSessionContext($modx-&gt;context-&gt;key))&#123;
    //Вместо in_array($template, $templatesArray) можно разместить любую другую логику, которая соответствует вашему проекту
   
    //В системной настройке unauthorized_page лежит ID ресурса, на который будет выполнена переадресация 
    $modx-&gt;sendForward($modx-&gt;getOption('unauthorized_page'), &#91;
        'merge' =&gt; 1, // Включает механизм склейки полей
        // список оригинальных полей, которые нужно исключить из результата
        'forward_merge_excludes' =&gt; 'id,template,class_key',
        'response_code' =&gt; $_SERVER&#91;'SERVER_PROTOCOL'&#93; . ' 401 Unauthorized',
    &#93;);
    exit;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Сохраните написаный код и проверьте функционирование плагина в связке с системными настройками.</p>

<h3>Заключение</h3>

<p>Данный способ привлекателен тем, что при ограничении доступа к странице неавторизованных пользователей, мы не меняем код и структуру шаблона, т.е. в коде шаблона нет никакого кода, проверяющего авторизацию пользователя. Вся задача возложена на плагин, реализованный из нескольких строк кода. Гибкость его настройки заключается в том, что для добавления нового шаблона необходимо зайти в системные настройки и в массив добавить идентификатор шаблона. Хочу заметить, что плагин легко переписать и проверять не код шаблона, а допустим, дополнительное поле текущего ресурса, на соответствие какому-либо параметру.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/uchimsya-delat-bekapy-mysql.html</link>
    <turbo:source>https://lectoria.pro/read/uchimsya-delat-bekapy-mysql.html</turbo:source>
    <turbo:topic>Учимся делать бэкапы MySQL как профи</turbo:topic>
    <pubDate>Tue, 06 Oct 2020 13:46:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="1826da8c417f8fce32b20963f3de6d2be18">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/uchimsya-delat-bekapy-mysql.html" text="Учимся делать бэкапы MySQL как профи"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Учимся делать бэкапы MySQL как профи</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Данное руководство появилось в процессе поиска информации по утилите mysqldump, когда я искал в мануалах опцию, задающую критерии выборки. Получился в итоге этот мануал, который обязательно стоит добавить к себе в закладки.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>База данных в создаваемом приложении играет очень значимую роль. В ней хранятся настройки, статьи, комментарии и другая информация, поэтому потеря информации может иметь очень тяжелые последствия для проекта. Следовательно, очень важно периодически делать резервные копии данных. Также эти копии могут быть очень полезными при переносе проекта на другой сервер.</p>

<p>В этом руководстве рассмотрим, каким образом можно выполнить резервное копирование mysql или mariadb базы данных, а также как восстановить информацию в базе из копии. В рассматриваемых базах для резервного копирования используется дамп. Операции с ним и будем рассматривать. Что же такое дамп, для чего, зачем и как?</p>

<blockquote>
    
    <p>Дамп (англ. <strong>dump</strong>) — снимок информации о состоянии компьютерной системы, в нашем случае базы данных. Дамп базы данных может состоять из описания структуры базы и/или содержащихся в ней данных, обычно в виде команд SQL и, как правило, используется для резервного копирования.</p>
</blockquote>

<p>В сборке MySQL используется специальная утилита <strong>mysqldump</strong>, позволяющая получить дамп содержимого базы данных или совокупности баз для создания резервной копии.</p>

<h3>Создание дампа</h3>

<p>Разберем самый простой пример использования утилиты</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_182/burning_laptop.gif" alt=""></div>

<div class="news_block_text border_mod"><p>Всех людей можно поделить на две группы: которые делают бэкапы и тех, которые еще не начали это делать.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysqldump -u username -ppassword database_name  &gt; dump.sql</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>где:</p>

<ul>
<li><strong>-u</strong> - ключ задания имени пользователя</li>
<li><strong>username</strong> - имя пользователя</li>
<li><strong>-p</strong> ключ задания пароля</li>
<li><strong>password</strong> - пароль пользователя username, вводится после ключа -р без пробела</li>
<li><strong>databasename</strong> - имя базы данных для дампа</li>
<li><strong>&gt;</strong> - перенаправление потока вывода</li>
<li><strong>dump.sql</strong> - имя выходного файла содержащий дамп БД. Если вы не указывали путь, то файл <strong>dump.sql</strong>, будет сохранен в папке <strong>home</strong> пользователя</li>
</ul>

<p>При вводе этой команды утилита подключится к указанной базе данных под пользователем username и результат содержимого отправит в файл dump.sql</p>

<p>Как вы поняли, такая команда справедлива только при локальном подключении. А как быть если у нас есть VPS или БД на удаленном компьютере?</p>

<h3>Создание бэкапа с удаленного хоста</h3>

<p>Тогда соответственно перепишем прошлую команду с указанием хоста.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysqldump -u username -hhost.ru -p database_name  &gt; dump.sql</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Как видите, мы указали имя хоста <strong>host.ru</strong> с использованием ключа <strong>-h</strong>. И второе отличие, как вы уже заметили, ключ <strong>-р</strong> не сопровождает пароль, а это значит, что перед тем как утилита начнет выполнение, она спросит пароль для подключения.</p>

<h3>Бэкап таблиц</h3>

<p>Допустим снятие дампа всей базы данных ни к чему, необходимо сделать снимок только одной таблицы, тогда после имени БД необходимо указать название таблицы (<strong>table_name</strong>).</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysqldump -u username -p database_name table_name  &gt; dump.sql</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>А если надо две или больше? Соотвественно перечислим их через пробел</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysqldump -u username -p database_name table_name1 table_name2  &gt; dump.sql</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Вариации дампа</h3>

<p>Допустим, нам нужна "песочница" для эксперимента, а для этих целей вся таблица ни к чему, нужна только ее часть — структура. Не проблема! Укажите атрибут <strong>--no-data</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysqldump -u username -p --no-data database_name table_name  &gt; dump.sql</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Теперь в файле <strong>dump.sql</strong> вы увидите SQL команды создания структуры этой таблицы. Такой же прием справедлив и ко всей базе данных. Думаю, пример приводить не надо, не пишите имя таблицы после указания БД.</p>

<p>Предположим, вы опытный программист и ваша база уже не просто набор таблиц связей, но и содержит триггеры, процедуры и события. Как вы правильно поняли, надо указать ключи, соответствующие этим объектам</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysqldump -u username -p --no-data --triggers --events --routines database_name   &gt; dump.sql</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>где:</p>

<ul>
<li><strong>--triggers</strong> - ссылка на тригеры</li>
<li><strong>--events</strong> - ссылка на события</li>
<li><strong>--routines</strong> - ссылка на процедуры</li>
</ul>

<h3>Дамп отдельных строк</h3>

<p>В этот раз мы немного вспомним структуру запросов SQL, а именно предложение <strong>WHERE</strong>. Допустим, в таблице содержится описание товаров и присутствует поле <strong>count</strong>, обозначающее количество этого товара. Необходимо сделать дамп товаров с количеством меньше 10.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysqldump -u username -p database_name table_name --where=&quot;count &lt; 10&quot;  &gt; dump.sql</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Соотвественно, если необходимо сделать выборку по двум параметрам, то в предложении появляется связка <strong>AND</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysqldump -u username -p database_name table_name --where=&quot;count &lt; 10 AND date_public='2020-10-24'&quot;  &gt; dump.sql</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Как видно из примеров, в использовании утилиты <strong>mysqldump</strong> нет ничего сложного. Однако, до этого были приведены примеры только снятия дампа, а как быть если его необходимо восстановить?</p>

<h3>Развертывание дампа</h3>

<p>Команда mysqldump предназначена только для снятия дампа. Если нам необходимо, наоборот, восстановить базу или отдельную таблицу из файла, необходимо воспользоваться командой <strong>mysql</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">mysql -u username -p database_name  &lt; dump.sql</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Дополнительные параметры</h4>

<p>На использовании параметров, приведённых выше, функциональность не заканчивается. Дополнительные параметры можно посмотреть в <a href="https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html">документации на утилиту</a>.</p>

<h3>Заключение</h3>

<p>Умение применять на практике утилиты, создающие дамп или бэкап, на подобие mysqldump не только может обезопасить от потери данных в критические моменты, но и является хорошим тоном для каждого программиста.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/avtorizatsiya-cherez-protsessor-v-modx.html</link>
    <turbo:source>https://lectoria.pro/read/avtorizatsiya-cherez-protsessor-v-modx.html</turbo:source>
    <turbo:topic>Авторизация через процессор в MODX</turbo:topic>
    <pubDate>Mon, 12 Oct 2020 10:00:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="1847eec43313dc87aafcc8b775380a398e2">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/avtorizatsiya-cherez-protsessor-v-modx.html" text="Авторизация через процессор в MODX"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Авторизация через процессор в MODX</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>В этом руководстве мы рассмотрим вариант frontend авторизации пользователя с использованием встроенного процессора MODX security/login. Этот метод по сравнению с другими является наиболее простым, надежным и универсальным в реализации.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В руководстве также используются сниппеты <strong>AjaxForm</strong> и <strong>FormIt</strong> (поэтому проверьте в менеджере пакетов, что они установлены).</p>

<h3>Авторизация</h3>

<p>Добавьте код, выводящий форму и запускающий выполнение авторизации, в поле <strong>Содержимое</strong> соответствующего ресурса.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">&#91;&#91;!AjaxForm? 
  &amp;snipet=&#96;FormIt&#96;
  &amp;frontend_js=&#96;assets/js/myform.js&#96;
  &amp;form=&#96;loginPopupFormTpl&#96;
  &amp;hooks=&#96;loginHook&#96;
  &amp;errtpl=&#96;&#91;&#91;+error&#93;&#93;&#96;
  &amp;validate=&#96;username:required,password:required&#96;
  &amp;validationErrorMesage=&#96;Во время авторизации произошли ошибки&#96; 
  &amp;successMesage=&#96;Авторизация успешно завершена&#96;
  &amp;submitVar=&#96;sendLogin&#96;
&#93;&#93;</code></pre>

<figure><img src="https://lectoria.pro/assets/files/images/res_184/f1.jpg" alt="Поле &quot;содержимое&quot; ресурса авторизации">
    <figcaption>Поле "содержимое" ресурса авторизации</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <blockquote>
    
    <p>Конечно, при полноценной разработке, я избегаю размещения кода вызова сниппета в содержимом ресурса и убираю это все в код шаблона или чанка, который используется в шаблоне, а поле "Содержимое" оставляю только для обычного содержимого вроде текстов и изображений, которые должны размещаться на странице. Но для демонстрации работы, такой способ вполне подойдет.</p>
</blockquote>

<p>Вызов сниппета <strong>AjaxForm</strong> производится с обработчиком форм <strong>FormIt</strong> и необходимыми параметрами, которые по порядку рассмотрим ниже.</p>

<h3>Форма авторизации</h3>

<p>Создайте чанк <strong>loginPopupFormTpl</strong> содержащий описание формы авторизации, со следующим кодом.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-html">&lt;form data-redirect=&quot;&#91;&#91;~3&#93;&#93;&quot;&gt;
	&lt;div class=&quot;row&quot;&gt;
		&lt;div class=&quot;col-sm-12&quot;&gt;
			&lt;input type=&quot;text&quot; placeholder=&quot;Имя пользователя&quot; name=&quot;username&quot;/&gt;
			&lt;span data-error-from=&quot;username&quot;&gt;&lt;/span&gt;
		&lt;/div&gt;
		&lt;div class=&quot;col-sm-12&quot;&gt;
			&lt;input type=&quot;password&quot; placeholder=&quot;Пароль&quot; name=&quot;password&quot;/&gt;
			&lt;span data-error-from=&quot;password&quot;&gt;&lt;/span&gt;
		&lt;/div&gt;
		&lt;div class=&quot;col-sm-12&quot;&gt;
			&lt;button class=&quot;btn btn-primary&quot; type=&quot;submit&quot; name=&quot;sendLogin&quot; value=&quot;1&quot;&gt;
			Вход
			&lt;/button&gt;
		&lt;/div&gt;
	&lt;/div&gt;
&lt;/form&gt;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Здесь <strong>&#91;&#91;~3&#93;&#93;</strong> — это ID ресурса, куда необходимо перенаправить пользователя после успешной авторизации. Поля <strong>span</strong> предназначены для вывода ошибок в процессе авторизации. Остальной код не нуждается в комментариях.</p>

<h3>Перенаправление при успешной авторизации</h3>

<p>Так как, после успешной авторизации необходимо выполнить перенаправление пользователя, допустим в личный кабинет, то возложим эту задачу на JavaScript. Для этого в вызове сниппета <strong>AjaxForm</strong> укажем свой скрипт-обработчик <strong>myform.js</strong>, расположенный по адресу <code>/assets/js/</code>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">...
&amp;frontend_js=&#96;assets/js/myform.js&#96;
...</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Cоздадим его из оригинального скрипта AjaxForm. Для этого скопируйте из папки <code>/assets/components/ajaxform/js/</code> файл <strong>default.js</strong> по адресу указанному в вызове сниппета и переименуйте его в <strong>myform.js</strong>. Откройте файл в редакторе и найдите код, который выполняется в случае отсутствия ошибок при успешной отправке формы.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-javascript">else &#123;
    AjaxForm.Message.success(response.message);
    form.find('.error').removeClass('error');
    form.find('&#91;data-error-for&#93;').html('');
    form&#91;0&#93;.reset();
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Перед закрывающей скобкой добавьте перенаправление на адрес, указанный в атрибуте <strong>data-redirect</strong> формы авторизации.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-javascript">if(form.attr('data-redirect'))&#123;
	window.location.href = form.attr('data-redirect');
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Таким образом, если указаны правильно логин и пароль пользователя, то произойдет перенаправление на указанную страницу. Сохраните изменения сделаные в скрипте.</p>

<blockquote>
    
    <p>Подробнее о кастомизации AjaxForm для использования своих файлов можно узнать <a href="https://www.youtube.com/watch?v=rAnazvaFAnI">в этом видео</a>.</p>
</blockquote>

<h3>Хук loginHook</h3>

<p>Теперь приступим непосредственно к процессу выполнения авторизации. Создайте в сниппетах хук с именем <strong>loginHook</strong> и вставьте следующий код</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">&lt;?php
	$properties = array(
		'login_context'=&gt;'web',
		'username'=&gt;$hook-&gt;getValue('username'),
		'password'=&gt;$hook-&gt;getValue('password'),
		'rememberme'=&gt;true,
	)
	
	$response=$modx-&gt;runProcessor(
		'security/login',
		$properties
	);
	
	if(!$response)&#123;
		$hook-&gt;addError('username','Системная ошибка');
		return false;
	&#125;
	
	if($errors = $response-&gt; getFieldErrors())&#123;
		foreach($errors as $error)&#123;
			$hook-&gt;addError($error-&gt;getField(),$error-&gt;getMessage());
		&#125;
		return false;
	&#125;
	
	if($response-&gt;isError())&#123;
		$hook-&gt;addError('username',$response-&gt;getMessage());
		return false;
	&#125;
	return true;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Рассмотрим подробнее его логику работы.</p>
<p>Вначале запишем в переменную <strong>‌$properties</strong> необходимые параметры вызова процессора. Как Вы уже поняли, функция <strong>getValue()‌</strong> получает значение поля из формы. Обратите внимание, что имена полей формы должны совпадать с параметрами вызова этой функции.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">	$properties = array(
		'login_context'=&gt;'web',
		'username'=&gt;$hook-&gt;getValue('username'),
		'password'=&gt;$hook-&gt;getValue('password'),
		'rememberme'=&gt;true,
	)</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Далее находится код, запускающий процессор <strong>login</strong> с параметрами определёнными выше. В результате переменной <strong>$response</strong> будет присвоен полученный объект.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">$response=$modx-&gt;runProcessor(
    'security/login',
    $properties
);</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Процессоры системы MODx находятся по адресу <code>core/model/modx/processors/</code>. Соответственно в нашем вызове мы работаем с файлом <strong>login.class.php</strong> лежащем в <code>core/model/modx/processors/security/</code>.</p>

<p>Далее следует код, выполняющий анализ полученного ответа процессора. Если процессор не отработал по какой-либо причине (переменная $response пустая), то в поле <strong>username</strong> выведем сообщение <strong>Системная ошибка</strong> и прекратим работу нашего хука.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">if(!$response)&#123;
    $hook-&gt;addError('username','Системная ошибка');
    return false;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если в результате работы процессора возникли ошибки, то запишем их в соотвествующие поля и завершим работу хука.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">if($errors = $response-&gt; getFieldErrors())&#123;
    foreach($errors as $error)&#123;
        $hook-&gt;addError($error-&gt;getField(),$error-&gt;getMessage());
    &#125;
    return false;
&#125;
if($response-&gt;isError())&#123;
    $hook-&gt;addError('username',$response-&gt;getMessage());
    return false;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В случае отсутствия каких-либо ошибок в работе процессора, т.е. введенные логин и пароль верны, завершим выполнение хука со значением <strong>true</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">return true;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Параметры AjaxForm</h3>

<p>Разберем оставшиеся параметры вызова сниппета <strong>AjaxForm</strong>. Параметр <code>&amp;validate</code> задается разделенным запятыми списком полей для проверки. Запуск с ключом <strong>username:required,password:required</strong> определяет, что поля <strong>username</strong> и <strong>password</strong> не должны быть пустыми. Задание <code>&amp;validationErrorMesage</code> и <code>&amp;successMesage</code> определяет выводимые сообщения в случае ошибки и успешной отправки формы соответственно. Свойство <code>&amp;submitVar</code> задает имя POST-переменной для обработки формы (значение должно совпадать с именем поля submit формы авторизации).</p>
<p>После того, как весь код написан проверьте работу авторизации.</p>

<div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            <h2 class="news_info_block_title">Где изучить подробнее?</h2>
            <div class="news_info_block_descr">
                <p>Не так давно я создал большой курс по разработке интернет-магазинов на MODX Revolution, в котором помимо основных функций интернет-магазина я обучаю, как создавать личные кабинеты на MODX, где, как раз, мы гораздо глубже погружаемся в тему авторизации, регистрации и восстановления пароля.</p>
            </div>
            <a class="news_tag_link active_tag" href="catalog/modx-bolshoy-kurs-po-razrabotke-internet-magazinov.html">Подробнее</a>
        </div>
    </div>
    
    <div class="right_side_content_w single_img_mod">
        <div class="right_side_content">
            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/course_77/code_2.jpg" alt=""></div>
        </div>
    </div>
</div>

<h3>Заключение</h3>

<p>В этом руководстве рассмотрен способ организации процесса авторизации штатными средствами MODX, путем использования процессора <strong>login</strong>. Как видно, построение логики работы без сторонних плагинов, не представляет собой ничего сложного. Необходимо только разобраться в работе нужного процессора и запустить его, как правило, с набором необходимых параметров. На примере этого руководства не составит никакого труда написать обработчик формы на процессоре <strong>logout</strong>, который будет выполнять деавторизацию (выход или разлогинивание) пользователя.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/ustanovka-i-ispolzovanie-composer.html</link>
    <turbo:source>https://lectoria.pro/read/ustanovka-i-ispolzovanie-composer.html</turbo:source>
    <turbo:topic>Установка и использование composer</turbo:topic>
    <pubDate>Thu, 15 Oct 2020 14:34:55 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="185adf4c3159d06bb09ea94f54eccf67b78">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/ustanovka-i-ispolzovanie-composer.html" text="Установка и использование composer"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Установка и использование composer</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>В этом руководстве рассмотрим выполнение установки пакетного менеджера composer и разберем на практике несколько базовых примеров его использования. Для начала разберёмся, что это и для чего он нужен.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <blockquote>
<p><strong>Composer</strong> - это пакетный менеджер уровня приложений для языка программирования PHP, который предоставляет средства по управлению зависимостями в PHP-приложении. Использование composer позволяет автоматизировать управление пакетами, которые присутствуют в Вашем проекте, а именно производить их установку, обновление и удаление.</p>
</blockquote>
<p>Экосистема менеджера состоит из двух важных частей:</p>
<ol>
<li>Непосредственно сам composer, представляет собой утилиту командной строки для работы с пакетами;</li>
<li>Репозиторий пакетов - <a href="https://packagist.org/">Packagist</a>.</li>
</ol>
<p>Приступим к установке пакетного менеджера.</p>
<p>Если вы предпочитаете видео-формат:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_video_w">
    <iframe src="https://www.youtube.com/embed/ISjQfl5uHsA" frameborder="0" allowfullscreen=""></iframe>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Установка composer</h3>

<h4>Проверка версии</h4>

<p>В этом руководстве установка будет показана на примере систем Unix/Linux/MacOs. Для начала стоит сказать, что для корректной работы менеджера пакетов, требуется наличие установленного PHP версии не ниже 5.3.2. Если не знаете какая версия установлена у Вас, то в командной строке выполните следующую команду</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">php -v</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В ответе увидим версию php, в моем случае установлена 7.3.11. Если Ваша версия ниже требуемой или php не установлен, то соответствующее руководство вы можете найти <a href="read/nastroyka-vds.html">здесь. </a></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f1.jpg" alt="Версия php">
    <figcaption>Версия php</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Скачивание менеджера</h4>

<p>Создайте директорию, в которую будет производится установка composer.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">mkdir composer</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Перейдите в этот каталог.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">cd ./composer/</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Скопируйте файл менеджера на свой компьютер из официального репозитория</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">php -r &quot;copy('https://getcomposer.org/installer', 'composer-setup.php');&quot;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Проверка установочного файла</h4>

<p>Проверим совпадение контрольной суммы с эталонной, это позволит нам использовать не поврежденный оригинальный файл, не содержащий каких-либо изменений.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">
php -r &quot;if (hash_file('sha384', 'composer-setup.php') === '795f976fe0ebd8b75f26a6dd68f78fd3453ce79f32ecb33e7fd087d39bfeb978342fb73ac986cd4f54edd0dc902601dc') &#123; echo 'Installer verified'; &#125; else &#123; echo 'Installer corrupt'; unlink('composer-setup.php'); &#125; echo PHP_EOL;&quot;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если значение хеша, устанавливаемого файла, совпадает с эталонным, то будет выведено сообщение <code>Installer verified</code></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f2.jpg" alt="Хеш совпадает">
    <figcaption>Хеш совпадает</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Значение хеша актуального файла <strong>‌composer-setup.php</strong> Вы можете узнать <a href="https://composer.github.io/pubkeys.html">здесь.</a></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f3.jpg" alt="Хеш значение актуального файла">
    <figcaption>Хеш значение актуального файла</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Запуск установщика</h4>

<p>Запустим загруженный файл <strong>‌composer-setup.php</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">php composer-setup.php</code></pre>

<figure><img src="https://lectoria.pro/assets/files/images/res_185/f4.jpg" alt="Успешная установка composer">
    <figcaption>Успешная установка composer</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В случае успешной установки увидим сообщение, что все настройки для использования composer правильные, и в ходе инсталляции создан исполняемый файл <strong>composer.phar</strong>.</p>

<h4>Перемещение в глобальный каталог</h4>

<p>Для того, чтобы composer был доступен для всех пользователей, переместим его в глобальный каталог <code>/usr/local/bin/</code> к остальным исполняемым файлам системы и уберем расширение <strong>.phar</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">mv composer.phar /usr/local/bin/composer</code></pre>

<figure><img src="https://lectoria.pro/assets/files/images/res_185/f5.jpg" alt="Перемещение в глобальный каталог">
    <figcaption>Перемещение в глобальный каталог</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если в консоли набрать команду <code>composer</code>, то будет выведена справка по его использованию. На этом установка composer закончена и можно переходить к практическим примерам его использования.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f6.jpg" alt="Команда composer">
    <figcaption>Команда composer</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>composer.json</h3>

<p>В своей работе менеджер пакетов использует специальный файл, содержащий описание устанавливаемых пакетов. По правилам он должен находится в корне проекта и иметь название <strong>composer.json</strong>. В нем описаны зависимости проекта, и могут содержаться различные метаданные. В руководстве будем использовать файл со следующим содержанием</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">&#123;
    &quot;require&quot;: &#123;
        &quot;monolog/monolog&quot;: &quot;1.0.*&quot;
    &#125;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Как видно, ключ require содержит названия пакетов и ограничение версии. Т.е. в проекте используется пакет monolog с любой версией из ветки 1.0. Соответсвенно, допустимо использование следующих обозначений в ограничении версий:</p>

<table>
<thead>
<tr>
<td align="left">Знак</td>
<td align="left">Значение</td>
</tr>
</thead>
<tbody>
<tr>
<td align="left">&lt;1.1</td>
<td align="left">Версия ниже 1.1</td>
</tr>
<tr>
<td align="left">&lt;=1.1</td>
<td align="left">Версия не выше 1.1 включительно</td>
</tr>
<tr>
<td align="left">&gt;1.1</td>
<td align="left">Версия выше 1.1</td>
</tr>
<tr>
<td align="left">&gt;=1.1</td>
<td align="left">Версия не ниже 1.1 включительно</td>
</tr>
<tr>
<td align="left">1.*</td>
<td align="left">Любая версия ветки 1</td>
</tr>
<tr>
<td align="left">1.1</td>
<td align="left">Только версия 1.1</td>
</tr>
</tbody>
</table>
<p> </p>
<p> </p>

<h3>Примеры использования</h3>

<h4>Задача 1</h4>

<p>Вы внедряетесь в какой-либо проект. Необходимо локально развернуть этот проект и продолжить его разработку. В репозитории предложенного Вам проекта находится файл <strong>composer.json</strong> с описанием зависимостей.</p>

<h4>Решение</h4>

<p>Перейдите в каталог с проектом (для примера test)</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">cd /test/</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Напоминаю, что в корне этого каталога должен находиться файл <strong>composer.json</strong> с описанными зависимостями. В командной строке запустите composer с параметром install</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">composer install</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В ходе выполнения команды в консоль будет выведена информация о выполняемых действиях.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f7.jpg" alt="Выполнение команды composer">
    <figcaption>Выполнение команды composer</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>И в результате успешного выполнения в каталоге <strong>test</strong> создана папка <strong>vendor</strong>, в которые загружены пакеты описание в файле <strong>composer.json</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f8.jpg" alt="Результат работы">
    <figcaption>Результат работы</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Помимо загруженного пакета, так же был создан файл <strong>composer.lock</strong>. В него были записаны точные версии пакетов, которые были установлены и его в дальнейшем можно использовать для установки пакетов. Таким образом, если при установке присутствует файл <strong>.lock</strong> и <strong>.json</strong>, то версии и состав пакетов будут взяты из lock-файла. Такой подход позволяет создавать проект с абсолютно одинаковыми версиями пакетов.</p>

<p>На этом решение первой задачи завершено, переходим далее.</p>

<h4>Задача 2</h4>

<p>Проект над которым Вы работаете претерпел некоторые изменения, а именно перешли на новые версии пакетов. У Вас есть файл <strong>composer.json</strong>, где версия пакета mononlog задана <strong>&gt;=2.0</strong>. Необходимо обновить пакеты до последних версий.</p>

<h4>Решение</h4>

<p>Проверьте нахождение нового файла <strong>composer.json</strong> в корне Вашего проекта и отсюда запустите composer с параметром <strong>update</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">composer update</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>При выполнении команды "update" менеджер пакетов считал json-файл, установил необходимость повышения версии пакета <strong>monolog</strong> до 2.1.1 и дополнительно установить зависимый пакет <strong>psr/log</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f9.jpg" alt="Обновление пакетов">
    <figcaption>Обновление пакетов</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Как видите, один пакет был установлен и один обновлен. Решение второй задачи завершено.</p>

<h4>Задача 3</h4>

<p>Вы начинаете работу над проектом. Знаете что в нем будет использован пакет <strong>monolog</strong> не ниже версии 2.0. Необходимо создать файл, описывающий зависимости, для передачи другому участнику проекта, и установить эти пакеты.</p>

<h4>Решение</h4>

<p>Перейдите в папку с новым проектом (например test). Запустите команду <strong>composer</strong> с параметром <strong>init</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">composer init </code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Запустится генератор файла composer.json. В командной строке будут выводится сообщения менеджера пакетов composer, на которые необходимо ответить. Если не давать ответ, то в соответствующее поле запишется значение указанное в квадратных скобках. Первым предложением требуется указать имя пакета по маске "разработчик/проект". Если не указывать, то имя будет выглядеть "root/test". Укажите имя вашего пакета.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f10.jpg" alt="Генератор файла composer.json">
    <figcaption>Генератор файла composer.json</figcaption>
</figure>

<pre class="line-numbers"><code class="language-bash">Description &#91;&#93;: - описание пакета
Author &#91;, n to skip&#93;: - автор проекта</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если не хотите указывать автора, то нажмите "n".</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">Minimum Stability &#91;&#93;: - минимальная степень стабильности пакета</code></pre>

<pre class="line-numbers"><code class="language-bash">Package Type (e.g. library, project, metapackage, composer-plugin) &#91;&#93;: - тип пакета (библиотека, проект, метапакет и т.д.)</code></pre>

<pre class="line-numbers"><code class="language-bash">License &#91;&#93;:  - лицензия</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>После лицензии будет предложено указать зависимости проекта. Здесь необходимо будет указать пакет <strong>monolog</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">Define your dependencies.

Would you like to define your dependencies (require) interactively &#91;yes&#93;? </code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Укажите пакет <strong>monolog</strong> для поиска</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">Search for a package: monolog</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>С таким названием менеджер пакетов нашел 15 вариантов. Вам необходимо ввести номер нужного пакета, в нашем случае - 0.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f11.jpg" alt="Результат поиска">
    <figcaption>Результат поиска</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Далее укажите версию пакета. По условиям задачи прописываем "&gt;=2.0"</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">Enter the version constraint to require (or leave blank to use the latest version):  &gt;=2.0</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Описание пакета monolog закончено. Если необходимо добавить еще пакет, то в предложении <code>Search for a package:</code> укажите имя и проделайте предыдущие шаги. В противном случае нажмите enter. После этого, composer, предложит определить зависимости необходимые для разработки. Ответьте "no".</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">Would you like to define your dev dependencies (require-dev) interactively &#91;yes&#93;? no</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Следующим шагом будет показано предварительное содержимое файла <strong>‌composer.json</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f12.jpg" alt="Результат поиска">
    <figcaption>Результат поиска</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если вы с ним согласны, то нажмите enter, если нет, то введите "no".</p>
<p>В заключении работы генератора, Вам будет предложено установить указанные зависимости. Ответьте "yes". Далее начнётся установка monolog с зависящими пакетами и сгенерируются автоматически файлы <strong>composer.json</strong> и <strong>composer.lock</strong>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <figure><img src="https://lectoria.pro/assets/files/images/res_185/f13.jpg" alt="Результат выполнения задания">
    <figcaption>Результат выполнения задания</figcaption>
</figure>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Задание выполнено.</p>

<h4>Задача 4</h4>

<p>При разработке проекта возникла необходимость установить в пакете <strong>monolog</strong>. Установите его используя composer.</p>

<h4>Решение</h4>

<p>Перейдите в каталог проекта. Если не важна версия, то наберите команду установки пакета monolog.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">composer require monolog/monolog</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Соответсвенно команда с указанием версии выглядит следующим образом</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">composer require &quot;monolog/monolog&gt;=2.0&quot;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>После выполнения команды установится указанный пакет и создастся или обновится файл <strong>composer.json</strong>. Задача выполнена.</p>

<h3>Заключение</h3>

<p>Использование на практике менеджера пакетов <strong>composer</strong> позволяет автоматизировать не только процесс установки и обновления пакетов, но и дает возможность использовать одни и те же версии пакетов среди всех разработчиков, что является несомненным плюсом. В руководстве были рассмотрены только базовые варианты использования менеджера, однако с его помощью можно удалять пакеты, использовать сторонние репозитории пакетов и многое другое.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/kak-zarabotat-frilanseru.html</link>
    <turbo:source>https://lectoria.pro/read/kak-zarabotat-frilanseru.html</turbo:source>
    <turbo:topic>Как заработать фрилансеру</turbo:topic>
    <pubDate>Mon, 03 May 2021 10:00:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="194fb9b8d4921d2c91f0ec20715a54fcd20">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/kak-zarabotat-frilanseru.html" text="Как заработать фрилансеру"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Как заработать фрилансеру</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Я работаю в том числе и на фрилансе уже много лет, и, как никто другой, знаю, как тяжело начать этот самостоятельный путь и какие подводные камни могут сбить тебя с него.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>И да, фриланс это вовсе не та розовопония, о которой нам кричат из каждого утюга. Картинки на берегу моря с ноутбуком имеют место быть, но не все так беззаботно, как кажется. На фрилансе можно заработать больше, чем в штате, если ты действительно работаешь на результат. Вся ответственность по организации работы, поиску клиентов, документальном оформлении и налогах полностью лежит на тебе.</p>
<p>Я занимался исключительно фрилансом перед тем, как открыть свою веб-студию, не считая моего первого опыта официальной работы на должности C# разработчика. Совмещал его с учёбой и в начале относился к этому, как к подработке, а позже полностью перешел на фриланс. Начинал с небольших проектов и мелких задач, а затем это стало карьерой со стабильно высоким доходом. Важно сделать первый шаг, а дальше будет только легче.</p>

<h2>Карьера на фрилансе. С чего начать?</h2>

<p>Отличие опытных разработчиков на фрилансе от новичков в том, что им почти не приходится искать заказы, потому что уже наработана клиентская база — в то время, как в начале пути обычно не знаешь, с чего начать и как строить работу.</p>
<p>Пока ты в начале карьеры на фрилансе, важно не бросать основную работу или учёбу, потому что работать будешь с небольшими проектами и задачами. Не забывай о портфолио, наполняй его проектами с хорошими показателями и зарабатывай имя в своей сфере. Выполняй небольшие задания, но не берись за всё подряд.</p>

<blockquote>
    
    <p><strong>Совет</strong></p>
<p>Как только ты решишь полностью перейти на фриланс, тебе придётся побороться за первые заказы, поэтому запасись денежными накоплениями, которых тебе хватило бы на 2-3 месяца. Это позволит не браться за всё подряд и сосредоточиться на качестве. Первое время — самое сложное, будут и взлеты, и падения, но это поможет набраться опыта. Как начать зарабатывать больше на фрилансе?</p>
</blockquote>

<p>Сначала ты работаешь на фриланс, потом он работает на тебя. Эту заповедь я усвоил спустя год-два после того, как начал работать на себя. И, я думаю, многие коллеги согласятся с этим. Основной доход приносят постоянные заказчики, а не просто работа на бирже фриланса. Со временем нарабатывается клиентская база, но здесь нужно выбирать проекты, в которых есть перспектива для развития и наработки полезных контактов.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В течение пары лет основной объем заказов ты будешь получать не через биржу, а от твоих же заказчиков, которые оценили твою работу и рекомендуют своим друзьям или партнёрам. На этом этапе уже формируется твой личный бренд, даже если осознанно никаких усилий не было приложено. Очевидно, что клиент не дал бы серьезный проект и достойную оплату человеку со стороны, без рекомендаций и не внушающему доверия. Что нужно новичку для успешного продвижения?</p>

<p>У тебя не получится заработать достойные деньги, только лишь зарегистрировавшись на каком-нибудь сайте или бирже. Я прошел путь от программиста-самоучки до профессионального разработчика и собственной веб-студии. В своей карьере я набил достаточно шишек и у меня получилась абстрактная формула успешного продвижения новичка, и вот ее составляющие:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Владельцу бизнеса, особенно небольшого, работать с фрилансерами выгодно — платить взносы и налоги не нужно, нет бюрократических вопросов по оформлению документов и выплат.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p><strong>Понять, как должно выглядеть решение.</strong> Когда я вижу, что у клиента нет более-менее чёткого понимания задачи, я часто не берусь за такие заказы.</p>
<p><strong>Готовься к тому, что первый вариант не всегда устроит заказчика</strong>, поэтому планируй рабочий процесс, имея в виду возможность частых правок: сделал скелет, показал, отредактировал, повторил.</p>
<p><strong>Нарабатывать опыт, совершенствоваться и регулярно пополнять портфолио.</strong></p>
<p><strong>Не зацикливаться на одном задании, брать несколько заказов по возможности, но не в ущерб качеству.</strong></p>
<p><strong>Научиться распределять рабочее время и разделять объемную задачу на несколько этапов</strong>: начиная от простых к сложным.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Какие возможности открывает программирование на фрилансе?</h2>

<p>Сегодня люди стали понимать, какая сфера наиболее перспективная и с каждым днём будет набирать обороты. <strong>Желающих «войти в айти» много, а действительно путных специалистов не хватает.</strong> Поэтому компании важно найти такого сотрудника — фрилансер это будет или штатный работник, удаленная работа или в офисе, этот аспект уже не имеет большого значения. Работодателям не всегда получается найти в штат нужного сотрудника либо проект не требует полной занятости. Опытные программисты сегодня зарабатывают от 2-2,5 тысяч долларов.</p>
<p>Наиболее востребованными остаются разработчики сайтов, дизайнеры и специалисты по работе с текстами.</p>
<p>Владельцу бизнеса, особенно небольшого, работать с фрилансерами выгодно — платить взносы и налоги не нужно, нет бюрократических вопросов по оформлению документов и выплат. Такой вариант сотрудничества с подрядчиком будет в приоритете, меньше взаимных обязательств. Также есть безопасные площадки для поиска удаленной работы. Клиенты и фрилансеры находят там друг друга, не нужно оформлять никаких бумаг, проводить оплату можно там же.</p>

<h2>О тонкостях выбора языка программирования в 2021</h2>

<p>В интернете можно встретить информацию о том, какой язык программирования лучший, так вот хочу тебя огорчить (или обрадовать), <strong>лучшего не существует</strong>. Каждый язык лучше подходит под конкретную задачу и твои предпочтения, поэтому для начала нужно понять, какую цель ты перед собой ставишь. Стать разработчиком игр или приложений? Просто попробовать или любыми способами устроиться работать в IT?</p>

<h4>C и C++</h4>

<p>C++ изначально был усовершенствованной версией языка C, поэтому я решил их объединить в этом пункте. Они требовательны к разработчику, но могут выжать из железа всё. C++ идеален для создания игр и софта не для типичных компьютеров, а часто для устройств с процессорами малой мощности — банкоматов и автомобилей.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Python</h4>

<p>Он считается самым простым языком, здесь для многих базовых задач есть готовые способы решения. Но в производительности Python уступает и C++, и более молодым языкам. В требованиях к вакансии Python часто упоминается не как основное требование, а как «дополнение» — чего будет недостаточно для отклика на неё. При выполнении рабочих задач он в каком-то смысле всегда является вторым лучшим: удобный, но всегда чем-то уступающий. Подходит в качестве языка для обучения, что касается трудоустройства — тут смотрите по ситуации.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>JavaScript</h4>

<p>Хороший вариант для тех, кто выбрал для себя область фронтенда (но сегодня это уже не совсем так). JavaScript здесь вне конкуренции по сравнению с ситуацией в бэкенде. Поэтому востребованность языка очень высокая, выбор вакансий огромный — так что проблем с устройством на работу тут не будет. Особой популярностью пользуются фреймфорки JS-а, такие как React, Vue, Angular.</p>
<p>Но не стоит также забывать и про NodeJS, среду выполнения JavaScript, которая позволяет исполнять JS-код не только в браузере, но и на сервере, что делает JavaScript универсальным инструментом для разработки целых веб-приложений. А наличие фреймворков вроде Nuxt.js и Next.js позволит быстрее начать создавать такие приложения.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">Что создано на JavaScript</div>

<div class="news_block_text "><p>Frontend-логика почти любого современного сайта<br>
Frameworks: ReactJS, VueJS, Angular, Nuxt.js, Next.js</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Java</h4>

<p>Java занял очень хорошие позиции в бэкенде, хотя и не идеален. Среди IT специалистов часто говорят о том, что она скоро умрет и довольно устарела. Не согласен! Эти предположения звучат уже лет дцать, а «старушка» не сдаёт позиции и никуда не делась. Кто-то считает Java занудной и многословной и что используется она в скучных организациях вроде банков, а другие языки могут решать те же задачи эффектнее и без лишней «воды», и их предпочитают стартапы. Здесь всё субъективно: кому-то работа с Java приносит удовольствие, и в банковской разработке находят немало любопытных задач, для других она скучная, что тоже имеет место быть.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>C#</h4>

<p>Язык C# часто упоминается в вакансиях с требованиями «построения бэкенда для веб-приложений». Но он не ограничивается этим вариантом. C# также используется в разработке игр на самом популярном движке в мире Unity — так что область применения у него шире, чем у той же Java.</p>

<blockquote>
    <h4 class="blockquote_title">Артем Зернов</h4>
    <p>Кстати, мне довелось поработать на C# в течение целого года в организации, которая использовала .NET-фреймворк и, в частности, C# для разработки специализированного банковского софта. Это была моя первая официальная работа.</p>
</blockquote>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">Что создано на C#</div>

<div class="news_block_text "><p>Framework Unity<br>
Используется в рамках .NET фреймворка от Microsoft</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>PHP</h4>

<p>Применяется преимущественно для разработки веб-приложений и со временем стал языком общего назначения. На PHP написаны популярные CMSки, такие как WordPress, Joomla!, Drupal, и, конечно же, мой любимый MODX Revolution. Фреймворки Laravel, Yii2, Symfony-разработаны именно на нем. И даже такие масштабные сервисы, как Facebook и «ВКонтакте», тоже созданы на PHP. PHP отличает то, что он имеет низкий порог вхождения в IT-разработку. Это касается как особенностей самого языка, так и доступности информации о нем.</p>
<p>Что касается вопроса трудоустройства, то востребованность PHP в ближайшей перспективе останется высокой — взять хотя бы CMS, сейчас они на пике развития и работающие на них сайты не будут закрываться. PHP идеально подойдет для тех, кто планирует работать в регионе. Его массово используют региональные веб-студии, которые делают сайты на заказ.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_title">Что создано на PHP?</div>

<div class="news_block_text "><p>CMS: MODX Revolution, WordPress, Joomla, Drupal<br>
Frameworks: Laravel, Yii2, Symfony<br>
Сайты: VK, Facebook</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>О молодых языках: Go, Dart, Rust и так далее</h4>

<p>Думаю, многие слышали высказывания о безупречности молодых языков (те, которым около десяти лет). О том, что они соответствуют новым тенденциям и не совершают ошибок своих «отцов и дедов», работать с ними приятнее.</p>
<p>Возможно. Только проблема в том, что такие языки встречаются в разработке намного реже своих «предшественников». Поэтому в вопросе трудоустройства востребованность таких вакансий очень низкая, даже в Москве, не говоря уже о небольших городах.</p>
<p>Нельзя точно сказать, какие языки станут нишевыми, а какие в скором времени завянут. Разумнее будет начать с укоренившегося и проверенного языка, а с приобретением опыта и лучшего понимания индустрии можно переходить к чему-то новому.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Заключение</h3>

<p>Для начала не обязательно сразу полноценно переходить на фриланс, а попробовать брать первые разовые заказы, совмещая с основной работой. Если ты уверен, что готов поменять род деятельности и начать самостоятельный путь, подумай о финансовой поддержке на первое время.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/kakie-navyki-nuzhny,-chtoby-stat-vostrebovannym-razrabotchikom-na-frilanse.html</link>
    <turbo:source>https://lectoria.pro/read/kakie-navyki-nuzhny,-chtoby-stat-vostrebovannym-razrabotchikom-na-frilanse.html</turbo:source>
    <turbo:topic>Какие навыки нужны, чтобы стать востребованным разработчиком на фрилансе</turbo:topic>
    <pubDate>Mon, 10 May 2021 10:30:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="1967c57e93da94ad16b872c2b88db55c880">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/kakie-navyki-nuzhny,-chtoby-stat-vostrebovannym-razrabotchikom-na-frilanse.html" text="Какие навыки нужны, чтобы стать востребованным разработчиком на фрилансе"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Какие навыки нужны, чтобы стать востребованным разработчиком на фрилансе</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Сегодня непрерывное обучение стало не просто трендом, это реальность и необходимость. Хотите сохранять актуальность своих компетенций и знаний? На помощь придет LLL (lifelong learning) или непрерывное образование, то есть постоянное повышение квалификации.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Значение lifelong learning точно описывает цитата американского футуролога Элвина Тоффлера:</p>

<blockquote>
    <h4 class="blockquote_title">Элвин Тоффлер</h4>
    <p>Безграмотными в 21 веке будут не те, кто не умеет читать и писать, а те, кто не умеет учиться, разучиваться и переучиваться</p>
</blockquote>

<p>Еще недавно профессия человека развивалась по известному стандартному сценарию: жизненный путь определяло одно образование-одна профессия-одна работа. Человек учился, шёл по выбранной стезе, рос по карьерной лестнице, и завершалось всё пенсией.</p>
<p>Сейчас можно наблюдать перестройку этого установившегося сценария — быстротечное развитие общества во всех смыслах кидает вызов человеку и необходимо вовремя перестроиться под эти реалии.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Быстротечное развитие общества во всех смыслах кидает вызов человеку и необходимо вовремя перестроиться под новые реалии</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Какими навыками должен обладать востребованный разработчик на фрилансе?</h2>

<p>Эти навыки пригодятся не только фрилансеру, но и для постоянной работы программистом удалённо и в офисе.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Технический кругозор</h4>

<p>Технический кругозор. Опыт работы с разными технологиями, понимание, что, как и когда применять. Хороший специалист находится в постоянном поиске и изучении новых технологий.</p>
<p>Например, платформа MODX позволяет реализовать различные нестандартные задачи и создать уникальный веб-сайт с современным функционалом (начиная от визитки до интернет-магазина). Ее особенностью является гибкость и мощь, которая не сравнится ни с одной CMS.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Умение работать с highload-проектами</h4>

<p>Это те системы, которые нужно постоянно масштабировать. Чаще всего к ним относят сайты с количеством запросов от сотни в секунду и выше. Например, популярные соцсети.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Детальное понимание технологий</h4>

<p>Некоторые задачи требуют более глубоких знаний и практического опыта, ошибки могут стать фатальными. Например, какие сниппеты нужно вызывать с кэшем или как зафиксировать все идентификаторы важнейших страниц в одном файле.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Способность рассмотреть задачу с точки зрения бизнеса</h4>

<p>Программисты обычно нацелены на техническое решение задач проекта, но здесь важно также слышать заказчика и понимать задачи бизнеса, чтобы не услышать на выходе “То, что вы нарисовали, не соответствует тому, что у меня в голове”.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Soft skills, или гибкие навыки</h4>

<p>К ним можно отнести умение планировать работу, справляться с большими объемами информации, отзывчивость, способность работать в состоянии неопределенности и принимать самостоятельные решения.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Умение анализировать и читать чужой код</h4>

<p>Программист в большинстве своем — профессия командная. И умение разбираться в чужом коде, а главное, понимать, как он работает, и какую логику в него хотел заложить автор, даже если в коде нет ни единого комментария, несомненно, важнейший навык успешного разработчика.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Навык отладки</h4>

<p>Понимание принципов отладки приложений, умение локализовать ошибку, понять причину и устранить ее в любом, даже не вашем программном коде, безусловно, открывает для вас границы гораздо большего числа проектов, в которых вы можете стать полноценным участником</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Эти навыки можно получить самостоятельно, как это сделал я. А чтобы освоить профессию быстрее, проходите онлайн-курсы.</p>

<div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            <h2 class="news_info_block_title">Подробный курс по профессиональной разработке интернет-магазинов на MODX Revolution</h2>
            
            <a class="news_tag_link active_tag" href="catalog/modx-bolshoy-kurs-po-razrabotke-internet-magazinov.html">Подробнее</a>
        </div>
    </div>
    
    <div class="right_side_content_w single_img_mod">
        <div class="right_side_content">
            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/course_77/project_screen.png" alt=""></div>
        </div>
    </div>
</div>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Заключение</h2>

<p>Сегодня человеку представлен огромный горизонт возможностей прокачать свои скиллы независимо от сферы деятельности. Набор необходимых компетенций каждый определяет сам для себя.</p>
<p>Главное — стать таким специалистом, которому можно доверить комплекс задач по созданию сайта “с нуля” и который будет выделяться среди конкурентов в глазах покупателей.</p>
<p>Именно такие навыки ты можешь получить в нашей онлайн-школе Lectoria.</p>
<p>На наших курсах программирования мы не только изучаем техническую сторону создания сайтов, но и разбираемся с тем, как правильно построить карьеру фрилансеру. Для этого мы создали дополнительный бонус — блок «Основы продаж», в котором ты научишься грамотно “продавать” себя как специалиста, стать узнаваемым в своей нише и повысить чек на услуги.</p>

<div class="news_anons_block">
    <div class="news_info_block">
        <div class="news_info_block_col text_mod">
            <h2 class="news_info_block_title">Этим мы занимаемся на курсе "Профессиональная разработка интернет-магазинов на MODX"</h2>
            
            <a class="news_tag_link active_tag" href="catalog/modx-bolshoy-kurs-po-razrabotke-internet-magazinov.html">Подрбонее</a>
        </div>
    </div>
    
    <div class="right_side_content_w single_img_mod">
        <div class="right_side_content">
            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/course_77/structure.jpg" alt=""></div>
        </div>
    </div>
</div>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <h4>Почему этот курс?</h4>

<ol>
<li>Автор курса — разработчик с 15-летним стажем </li>
<li>Объемная теория с реальными примерами в видео-формате</li>
<li>Практические задания с обратной связью и разбором ошибок</li>
<li>База знаний с ответами на все частые вопросы</li>
<li>Бонус блок «Основы продаж»</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если ты хочешь разобраться с тем, как обходить свои “затыки” в работе, как объяснять клиентам важность решений и получать советы и помощь единомышленников, регистрируйся на наш курс.</p>
<p>Этот и другие наши курсы основаны на платформе MODx, которая соответствует современным реалиям IT сферы и позволяет быть в курсе нестандартных решений и новинок.</p>
<p>Инвестируй в свое саморазвитие и будь на волне, сейчас и есть то самое подходящее время.</p>
<p><strong>Удачи в любых начинаниях!</strong></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/aktualnye-frontend-tehnologii,-kotorye-dolzhen-znat-kazhdyy-razrabotchik-na-frilanse.html</link>
    <turbo:source>https://lectoria.pro/read/aktualnye-frontend-tehnologii,-kotorye-dolzhen-znat-kazhdyy-razrabotchik-na-frilanse.html</turbo:source>
    <turbo:topic>Актуальные frontend-технологии, которые должен знать каждый разработчик на фрилансе</turbo:topic>
    <pubDate>Sat, 22 May 2021 14:00:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="197f9884cd49fce99296ebd5f0333c8d89d">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/aktualnye-frontend-tehnologii,-kotorye-dolzhen-znat-kazhdyy-razrabotchik-na-frilanse.html" text="Актуальные frontend-технологии, которые должен знать каждый разработчик на фрилансе"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Актуальные frontend-технологии, которые должен знать каждый разработчик на фрилансе</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>И вот ты на пике своей карьеры, у тебя постоянный поток клиентов, как вдруг выходит обновленная версия привычного стека и тебе нужно успеть запрыгнуть в вагон, иначе останешься на своей “устаревшей” станции. Мы-то знаем, что никто и ничто не остановится в развитии — такова наша айтишная реальность. И выпасть из нее — не самый лучший сценарий. </p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p dir="ltr">Да, IT — молодая и перспективная сфера. Тем не менее и здесь есть  как те профессии и технологии, которые теряют актуальность, так и те, которые возникают с неумолимой скоростью. Стоит ли в это новое вникать? Идти ли на курсы повышения квалификации для программистов? И что изучать сегодня?</p>
<p dir="ltr">Мы изучили известные аналитические ресурсы и готовы рассказать вам, какие направления и технологии наиболее актуальны на сегодняшний день.</p>

<h2>О чем говорят аналитические обзоры: основные актуальные технологии</h2>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Мы проанализировали результаты ежегодного опроса от Stack Overflow и выяснили, какие веб-технологии были наиболее популярны в 2020 году. Будем руководствоваться данными из Stack Overflow Developer Survey 2020.</p>
<p>Рассмотрим список популярных веб-технологий согласно Developer Survey за 2020-й год:</p>

<figure><img src="https://lectoria.pro/assets/files/images/res_197/2021_05_22_08_51_10.jpg" alt="">
    <figcaption></figcaption>
</figure>

<p dir="ltr">Согласно графику, представленному на рисунке (число опрошенных — 90 000 разработчиков), лидирующие позиции занимают FrontEnd-библиотеки и фреймворки — jQuery, React.js, Angular, Vue.js, а также технологии .NET платформы — ASP.NET и ASP.NET Core. Наряду с ними библиотека Express, которая используется в бекенде на Node.js (JavaScript). Только после них идут фреймворки Spring (Java) и Django (Python).</p>
<p dir="ltr">О некоторых из них мы расскажем ниже.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text "><p>Если ты ещё не знаком со Stack Overflow. Это специальный информационный портал для IT-специалистов всевозможных направлений, где участники могут общаться и обсуждать профессиональные темы. Другими словами, это интернациональная система вопросов-ответов для айтишников.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>jQuery</h3>

<p dir="ltr">Библиотека JQuery — это одна из библиотек языка javascript. Основная цель применения которой — манипуляций с DOM-деревом. Вставить текст, блок, анимировать блок или элемент — то, ради чего чаще всего используют jQuery, в особенности начинающие frontend-разработчики.</p>
<p dir="ltr">Для тех, кто уже сталкивался с манипулированием объектами DOM (Document Object Model — объектная модель документа) с помощью других библиотек JavaScript или встроенных функций API, jQuery намного упростит процесс работы с этими модулями.</p>
<p dir="ltr">Важной особенностью данной библиотеки является то, что она способна упрощать сам язык javascript, предоставляя более простые и понятные конструкции.</p>

<h3>React.js</h3>

<p dir="ltr">Наверное нет такого программиста, который бы не слышал про React. Весь код данной библиотеки находится в открытом доступе.</p>
<p dir="ltr">Суть работы с React в том, чтобы описать элементы, которые необходимо вывести на страницу. Не нужно создавать инструкции, направленные на объяснение браузеру того, как это необходимо делать. Это дает возможность обеспечить более компактный код и снизить количество шаблонных частей, необходимых для построения сайта.</p>
<p dir="ltr">Если говорить о разработке веб-приложения, React будет недостаточно. В MVC-фреймворке (схема разделения модели, отображения и логики приложения, Model-View-Controller или по-русски Модель-Представление-Контроллер) React играет роль «V». Он делает возможным отображение данных модели пользователю и реагирует на ее изменения. Model и Controller, при этом необходимо обеспечивать дополнительными средствами.</p>
<p dir="ltr">Возможности React.js позволяют строить как большие проекты со сложной структурой, так и что-то скромное. Часто на нем пишут стартап проекты, так как с этим инструментом легче выйти на окупаемость, чем, к примеру, с Angular.</p>

<h3>Angular</h3>

<p dir="ltr">Angular — фреймворк от компании Google для создания клиентских приложений. Сферой его разработки считаются SPA-решения (Single Page Application), то есть одностраничные приложения. Его предшественником является фреймворк AngularJS. Но Angular это не новая версия AngularJS, а принципиально новый фреймворк.</p>
<p dir="ltr">Angular позволяет строить двустороннюю связку, которая способна динамически изменять данные в одном месте интерфейса при изменении данных модели в другом, шаблоны, маршрутизацию и так далее.</p>
<p dir="ltr">Характерной чертой Angular является то, что на нем строятся приложение с использованием языка TypeScript. Но также при желании использовать такие языки как Dart или JavaScript. </p>
<p>Если бы HTML был предназначен для приложений его можно было бы приравнять к Angular. HTML — декларативный язык для статических документов. В нем недостаточно функционала для создания приложений, и, как результат, построение в нем веб-приложений сводится к тому чтобы обмануть браузер, заставив его делать то, что я хочу.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Vue.js</h3>

<p dir="ltr">Это еще одна библиотека JavaScript, которая используется для разработки веб-интерфейсов с помощью шаблона архитектуры <a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel">MVVM</a> (Model-View-ViewModel).</p>
<p dir="ltr">Теоретически его можно соотнести с jQuery. Но на деле Vue.JS претендует на лидерские позиции React.JS в области View. В силу того, что Vue работает только на «уровне представления» и не используется для промежуточного программного обеспечения и бэкэнда, он может легко интегрироваться с другими проектами и библиотеками. </p>
<p dir="ltr">При создании Vue.JS были позаимствованы готовые решения из вышеперечисленных технологий. К примеру, в React.JS — это идея виртуального DOM, который исключает прямое взаимодействие с узлами интерфейса. То есть на первых этапах разработки сайта используется его легковесная копия (virtual DOM).</p>
<p dir="ltr">Vue.js применяется в небольших проектах, где нужно добавить реактивности, представить форму с помощью AJAX, отобразить значения при вводе данных пользователем, авторизацию и т.д. Он считается передовым фреймворком, так как легко масштабируется и может использоваться для создания мощных одностраничных веб-приложений, с использованием таких расширений VueJS как Router и Vuex. </p>
<p dir="ltr">Vue.js также отличный вариант для разработки frontend блога на популярных CMS и для создания динамических интерфейсов.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text "><p>MVVM — программно-архитектурный шаблон проектирования, который облегчает разделение разработки графического пользовательского интерфейса (представления), будь то с помощью языка разметки или кода графического интерфейса, от разработки бизнес-логики или back-end логики (модели), чтобы представление не зависело от какой-либо конкретной платформы модели.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Заключение</h2>

<p dir="ltr">Так что если вы ищете, в каком направлении начинать свой путь или совершенствовать уже набранные навыки в IT, выбирайте одну из этих веб-технологий — не ошибетесь. Ваш поезд доставит вас на нужную станцию. </p>
<p dir="ltr">Программирование открывает большие возможности для тех, кто не стоит на месте, а хочет заработать не только на хлеб с маслом, но и на икорку. </p>
<p dir="ltr">А если говорить о программировании на фрилансе… в этом есть особая романтика. Поверьте мне, тому, кто прошел 15-летний опыт от штатного сотрудника до владельца собственной веб-студии и онлайн-школы.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/vysshee-obrazovanie-vs-onlayn-obuchenie.html</link>
    <turbo:source>https://lectoria.pro/read/vysshee-obrazovanie-vs-onlayn-obuchenie.html</turbo:source>
    <turbo:topic>Высшее образование VS онлайн-обучение</turbo:topic>
    <pubDate>Wed, 30 Jun 2021 14:12:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="1982d5de106827da83d0c97473ebef3ca9a">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/vysshee-obrazovanie-vs-onlayn-obuchenie.html" text="Высшее образование VS онлайн-обучение"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Высшее образование VS онлайн-обучение</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Если бы мне лет 10 назад сказали: “Сиди дома, изучай то, что тебе нужно для конкретной вакансии, и будет у тебя и работа любимая, и зарплата хорошая”, я бы восприняла это как шутку. Хочешь ты этого или нет, но онлайн-обучение стало настолько популярным, что может стать (если уже не стало) альтернативой классическому образованию. Онлайн-курсы уже стали базой для дальнейшей карьеры и хорошим дополнением к высшему образованию.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Я знаю много примеров образовательных порталов, где обучающую программу предоставляют высшие учебные заведения. То есть это просто другой канал получения знаний, в другое время, в удобном для тебя месте.</p>
<p>"Онлайн и студент" — раньше эти слова были несочетаемыми, и даже абсурдом. Но посмотри, как поменялась жизнь. Цифровые технологии и концепция непрерывного обучения (lifelong learning) становятся нормой жизни.</p>
<p>Чаще всего онлайн-курсы это комбинации тем, и огромная часть посвящена технологиям. Самые популярные темы:</p>
<ul>
<li>компьютерные науки</li>
<li>бизнес</li>
<li>социальные науки</li>
<li>науки о данных</li>
<li>личностный рост</li>
</ul>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Программирование: особенности сферы, как быстро меняется, почему важно постоянное обучение и мало одного диплома бакалавра</h2>

<p>Да-да, фраза о том, что IT-отрасль - лидер по развитию среди остальных сфер экономики, уже мозолит глаза. К счастью или нет, но это факт. Поэтому если ты вошел в IT, будь уверен — зарплата твоя будет выше средней по стране. Заработная плата на одной и той же вакансии в традиционных и IT-компаниях отличается в 1-2 раза. А в случае со специалистом с опытом работы от 3 лет разница может быть в 5-10 раз больше, чем в других отраслях.</p>
<p>Рынок труда изменился и теперь ты не можешь просто закончить ВУЗ с дипломом в 20 с чем-то лет и больше ничего не делать. И речь идет не только о программировании. Предсказать то, какие профессии будут через несколько лет, невозможно. Привычные профессии уже исчезают, новые — появляются. Работать за станком, водить машину, подавать еду в кафе, и даже защищать вас в суде скоро будут роботы.</p>
<p>IT-сфера обладает огромным преимуществом — это ее всеобъемлющее распространение, благодаря чему в этой сфере требуется очень много специалистов самых разных направлений. Хороший «айтишник» всегда будет трудоустроен, к его услугам весь мир, ведь работать можно и дистанционно. А высокая востребованность — это высокая зарплата.</p>
<p>Но помни, невозможно сделать карьеру в сфере информационных технологий, если ты не любишь учиться и не стремишься постоянно развиваться.<br />Ты, наверное, скажешь: "ну это и так понятно, для любой сферы важно развитие". Нет, здесь оно просто необходимо.</p>
<p>А что насчёт ВУЗов? По себе знаю, что в наших вузах довольно слабый уровень подготовки IT-специалистов, и не только. Об этом откровенно говорят и сами «Айтишники». А вот тут многие, узнав себя, спросят: "И что теперь делать?". Придется добывать эти знания самостоятельно, изучая тонны специализированных источников и набивая собственные шишки.</p>
<p>А нужен ли тогда диплом? И в России, и за границей по-прежнему важны дипломы. Причина в бренде или в самом образовании? — сказать сложно. Безусловно, в топовых иностранных вузах нет проблем с квалифицированными учеными. Чего не скажешь о российских преподавателях. У них низкие зарплаты — отсюда и нехватка ведущих специалистов. Поэтому частные компании берут на себя роль так называемого образовательного портала. К примеру, Яндекс и Сбербанк в тандеме с университетами создают программы по специальностям, которые сегодня востребованы.</p>
<p>Западные университеты впереди планеты всей? Хах, не тут-то было, они также не успевают подстраиваться под потребности работодателей. Ведь вузы — консервативные организации. Если мы говорим о направлениях типа блокчейна или селф-драйвинг технологий, думаю, в мире можно по пальцам одной руки посчитать такие университетские программы.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Рынок труда изменился и теперь ты не можешь просто закончить ВУЗ с дипломом в 20 с чем-то лет и больше ничего не делать. И речь идет не только о программировании.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Распространенные мифы об изучении программирования</h2>

<p>Каково это быть программистом, я не знаю, но я прошарила много источников и опросила специалистов. Собрала самые популярные мифы, которые мешают или наоборот вселяют излишнюю уверенность людям на пути к тому, чтобы стать программистом.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Миф 1. Чтобы освоить программирование, нужно быть очень умным.</h3>

<p>При упоминании слов "программист, айтишник", многим (да и мне когда-то тоже) на ум приходит фильм "Матрица", где сверхразумные люди живут как бы в параллельном мире, состоящем из зеленых кодов. На самом деле они обыкновенные люди.</p>
<p>Программисты создают компьютерные программы, веб-сайты, игры, мобильные приложения. Точно так же как летчики поднимают в воздух железных гигантов, а повара создают свои вкусные и красивые блюда.</p>
<p>В каждой профессии есть свои сложности, и везде нужны мозги. Поэтому работай над собой и не позволяй каким-то убеждениям встать на пути к мечте.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_198/source.gif" alt=""></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Миф 2. Программирование — это скучно</h3>

<p>Сидеть весь день перед монитором и щелкать по клавиатуре. И что тут интересного? Это на первый взгляд все так грустно. На самом деле, программист в этот момент может разрабатывать компьютерную игру, создавать мобильное приложение или даже писать ПО для космического корабля.</p>
<p>Мы уже выяснили, что айтишнику нет времени скучать — для них всегда найдется работа. И к тому же, это все индивидуально. Интересы каждого человека зависят от характера и образа жизни.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_198/source_1.gif" alt=""></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Миф 3. Программисты всё пишут с нуля</h3>

<p>Представь себе программиста, который каждый раз бы начинал сложную программу, состоящую из сотен тысяч строк кода, с нуля. Это нереально, и заняло бы уйму времени, особенно, если говорить про игры.</p>
<p>Кому захочется изобретать велосипед, если есть готовое решение? Разработчики используют сторонние библиотеки, а также код, написанный самостоятельно либо другими кодерами.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_198/code.gif" alt=""></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Миф 4. Чтобы устроиться работать программистом, нужно очень долго учиться</h3>

<p>Ну во-первых, как бы ни банально звучало, все зависит от нас самих, от желания и стремления. Кому-то удается освоить языки программирования и нужные технологии за месяц. У кого-то это растянется на пол года, а кому-то и года будет мало.</p>
<p>Во-вторых, от времени, которое ты готов выделить на обучение. Установив четкую цель, тебе будет легче идти. Рассчитай необходимое время и поговори с близкими, чтобы тебя не отвлекали в эти часы.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_img_w"><img class="news_block_img" src="https://lectoria.pro/assets/files/images/res_198/source_2.gif" alt=""></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Какие возможности есть у бесплатного обучения и в чем нюансы платных курсов</h2>

<p>Из чего состоит бесплатное обучение? Мы сейчас говорим о самостоятельном пути.</p>
<ul>
<li>Поиск информации</li>
<li>Тестирование информации</li>
<li>Набивание шишек на практике</li>
<li>Применение опыта в жизни/работе</li>
</ul>
<p>Если грамотно сложить все кирпичики и пройти все вышеописанные этапы, ты уже будешь профессионально подкован и сможешь начать свою карьеру.</p>
<p>Университет дает удочку, а рыбу ты будешь ловить сами. Поэтому всё остальное тебе придется доучивать, посещать соответствующие онлайн-курсы программирования, проходить интернатуру в IT-компании, повышать квалификацию и добирать недостающие кирпичики.<br />Огромный минус бесплатного обучения это трата времени на поиск и анализ информации. Есть еще несколько негативных моментов:</p>
<ul>
<li>нет ментора, который бы мог давать верное направление, советы и отвечать на вопросы;</li>
<li>нет четкого понимания о навыках и знаниях, которые будут необходимы для соответствующей позиции компании;</li>
<li>нет структурированной информации и четкой программы обучения;</li>
<li>отсутствие поддержки и достаточной мотивации, которые есть в коллективной среде (наставник, сокурсники, домашние задания)</li>
</ul>
<p>И да, здесь не нужен особый талант, а нужна крепкая сила воли и мощная мотивация.</p>
<p>Конечно, платные курсы перекрывают все эти нюансы. В жизни и мире IT все настолько быстро меняется, что можно не заметить, как ты уже остался за бортом. Поэтому не экономь на образовании — иногда лучше заплатить денег за обучающие курсы и поймать ту самую золотую рыбку уже в первые месяцы работы.<br />И еще, перед тем, как отдавать кому-то деньги, изучи нишу и сразу отсортируй курсы инфоцыган, которыми сейчас кишит интернет.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Я и сама имею 2 диплома о высшем экономическом образовании, прочувствовала все прелести универа на своей шкуре — начиная от танцев на студвесне до зубриловки предмета, который далек от экономики. Сейчас работаю совсем в другом направлении. Ради этой профессии прошла обучение на онлайн-курсах и очень многое пришлось добирать самостоятельно.</p>

<p>Как говорится, время-деньги, поэтому выбор только за тобой. Не ведись на стереотипы и прислушивайся к себе.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Поэтому мой тебе совет: чтобы обучиться за максимально короткое время, выбирай хорошие куры, разбавляя их большим количеством самостоятельной практики.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/kak-sdelat-gibkiy-konverter-valyut-v-laravel.html</link>
    <turbo:source>https://lectoria.pro/read/kak-sdelat-gibkiy-konverter-valyut-v-laravel.html</turbo:source>
    <turbo:topic>Как сделать гибкий конвертер валют в Laravel</turbo:topic>
    <pubDate>Mon, 02 Aug 2021 13:48:13 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="199d03324a3b29dadecfc82513cba562453">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/kak-sdelat-gibkiy-konverter-valyut-v-laravel.html" text="Как сделать гибкий конвертер валют в Laravel"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Как сделать гибкий конвертер валют в Laravel</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Это мини-руководство покажет принцип создания самостоятельного сервиса Currency в рамках фреймворка Laravel. Основная цель сервиса — конвертация сумм из внутренней валюты сайта в валюту пользователя и обратно.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Подготовка конфигурационного файла</h2>

<p>В папке config создаем файл currency.php со следующим содержимым:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php
//валюты и курсы
return &#91;
        'code' =&gt; 'usd', //Внутренняя валюта
        'precision' =&gt; 0, //Точность при конвертации сумм
        'default' =&gt; 'rub', //Валюта пользователя по-умолчанию, если не удалось определить иную
        'rates' =&gt; &#91;
            'usd' =&gt; &#91;
                'rub' =&gt; 75, //Покупка usd за рубли
            &#93;,
            'rub' =&gt; &#91;
                'usd' =&gt; 0.01333 //Покупка рублей за usd (продажа usd)
            &#93;,
        &#93;
    &#93;
&#93;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Готовим словарь с валютами</h2>

<p>Для того, чтобы иметь гибкую возможность для разных языковых версий по-разному выдавать знак валюты или слово (например руб. или rub), создаем словарь, в котором определяем перевод для соответствующего кода валюты.</p>
<p>Создаем файл resources/lang/en/currency.php (можно создать также и для любого другого языка resources/lang/&#91;код языка&#93;/currency.php) со следующим содержимым:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php

return &#91;
    'rub' =&gt; '₽',
    'usd' =&gt; '$'
&#93;;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Готовим главный класс сервиса Currency</h2>

<p>В папке app/Services/Currency создаем класс CurrencyService.php со следующим содержимым:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php


namespace App\Services\Currency;

use App\Dictionary\BalanceTransactionOperationCode;
use App\Models\User;

/**
 * Класс для работы с конвертацией внутренней валюты
 * Class CurrencyService
 * @package App\Services\Currency
 */
class CurrencyService
&#123;
    protected array $rates;
    protected string $defaultCurrencyCode;
    protected int $precision;
    protected string $defaultUserCurrencyCode;

    public function __construct(string $defaultCurrencyCode, array $rates, $defaultUserCurrencyCode, $precision = 2)
    &#123;
        $this-&gt;rates = $rates;
        $this-&gt;defaultCurrencyCode = $defaultCurrencyCode;
        $this-&gt;precision = $precision;
        $this-&gt;defaultUserCurrencyCode = $defaultUserCurrencyCode;
    &#125;

    /**
     * Получить валюту пользователя
     * @return string
     */
    public function getDefaultUserCurrency()&#123;
        //TODO здесь вы можете определить произвольную логику, по которой мы определяем валюту по-умолчанию для текущего пользователя (не важно, авторизованного или нет)
        /** @var User $user */
        $user = \Auth::user();
        if($user) return $user-&gt;currency_code;
        return $this-&gt;defaultUserCurrencyCode;
    &#125;

    /**
     * Конвертация из внутренней валюты во внешнюю
     * @param $amount
     * @param null $toCurrencyCode
     * @return float
     */
    public function convertFromDefault($amount, $toCurrencyCode = null)&#123;
        if(!$toCurrencyCode)&#123;
            $toCurrencyCode = $this-&gt;getDefaultUserCurrency();
        &#125;
        $rate = $this-&gt;rates&#91;$toCurrencyCode&#93;&#91;$this-&gt;defaultCurrencyCode&#93;;
        return round($amount / $rate, $this-&gt;precision);
    &#125;

    /**
     * Конвертация из внешней валюты во внутреннюю
     * @param $amount
     * @param null $fromCurrencyCode
     * @return float
     */
    public function convertToDefault($amount, $fromCurrencyCode = null)&#123;
        if(!$fromCurrencyCode)&#123;
            $fromCurrencyCode = $this-&gt;getDefaultUserCurrency();
        &#125;
        $rate = $this-&gt;rates&#91;$this-&gt;defaultCurrencyCode&#93;&#91;$fromCurrencyCode&#93;;
        return round($amount * $rate, $this-&gt;precision);
    &#125;

    /**
     * Конвертирует и возвращает отформатированную строку со знаком валюты
     * @param $amount
     * @return string
     */
    public function convertAndFormatFromDefault($amount, $toCurrency = null)&#123;
        if(!$toCurrency) &#123;
            $toCurrency = $this-&gt;getDefaultUserCurrency();
        &#125;
        return number_format($this-&gt;convertFromDefault($amount, $toCurrency), 0, ',', ' ').__('currency.'.$toCurrency);
    &#125;

    /**
     * Конвертирует и возвращает отформатированную строку со знаком валюты
     * @param $amount
     * @return string
     */
    public function convertAndFormatToDefault($amount, $fromCurrency = null)&#123;
        if(!$fromCurrency) &#123;
            $fromCurrency = $this-&gt;getDefaultUserCurrency();
        &#125;
        return number_format($this-&gt;convertFromDefault($amount, $fromCurrency), 0, ',', ' ').__('currency.'.$fromCurrency);
    &#125;
&#125;</code></pre>

<p>По комментариям и названию в doc-блоке функции можно понять, что делает та или иная функция.</p>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Добавим сервис в контейнер</h2>

<p>В файле app/Providers/AppServiceProvider.php в методе register() добавляем следующие строки инициализации нашего сервиса CurrencyService:</p>

<pre class="line-numbers"><code class="language-php">use App\Services\Currency\CurrencyService;

...
//В методе register()
$this-&gt;app-&gt;singleton(CurrencyService::class, function()&#123;
            return new CurrencyService(
                config(&quot;currency.code&quot;),
                config(&quot;currency.rates&quot;),
                config(&quot;currency.default&quot;),
                config(&quot;currency.precision&quot;)
            );
        &#125;);
...</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Уже можно пользоваться, но это еще не все</h2>

<p>Теперь мы можем обращаться к нашему сервису. Например так:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php
...
$currencyService = \App::make(\App\Services\Currency\CurrencyService::class);

//Выведет на экране что-то вроде 86 250₽
echo $currencyService-&gt;convertAndFormatToDefault(1150, 'usd');
...</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Создадим фасад и псевдоним для удобного обращения к сервису</h2>

<p>Для более удобного обращения, создадим фасад и короткий alias.</p>
<p>Сначала создадим фасад. Создаем файл app/Facades/Currency.php со следующим содержимым:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php
namespace App\Facades;

use App\Services\Currency\CurrencyService;
use Illuminate\Support\Facades\Facade;

class Currency extends Facade
&#123;
    protected static function getFacadeAccessor()
    &#123;
        return CurrencyService::class;
    &#125;
&#125;
</code></pre>

<p>Этот фасад позволит нам обращаться к сервису в статической форме. Например так:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php

echo App\Facades\Currency::convertAndFormatToDefault(1150);</code></pre>

<p>И теперь чтобы сделать обращение еще короче, добавим в файле config/app.php в настройке 'providers' следующую связь:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php
...
'providers' =&gt; &#91;
    
    ...
    
    'Currency' =&gt; App\Facades\Currency::class,
&#93;</code></pre>

<p>Теперь мы можем пользоваться в любом месте приложения такой записью:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php
...
echo Currency::convertAndFormatToDefault(1150);</code></pre>

<p>В Blade-шаблонах:</p>

<pre class="line-numbers"><code class="language-html">...
&#123;&#123; Currency::convertAndFormatToDefault(1150) &#125;&#125;
...</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Создаем директиву Blade для отображения внутренней валюты в валюте пользователя</h2>

<p>В файле app/Providers/AppServiceProvider.php в методе boot добавляем следующие строки кода:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php
use Illuminate\Support\Facades\Blade


...
public function boot()
&#123;
...

//Директива позволяет выводить сумму во внутренней валюте, конвертированную в валюту пользователя
        Blade::directive('currency_money', function ($amount) &#123;
            return &quot;&lt;?php echo Currency::convertAndFormatFromDefault($amount) ?&gt;&quot;;
        &#125;);
...
&#125;</code></pre>

<p>Теперь мы можем в Blade-шаблонах использовать еще более лаконичную запись:</p>

<pre class="line-numbers"><code class="language-html">@currency_money(1150)

или с динамическим значением:

@currency_money($sum)</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Итог</h2>

<p>Мы создали сервис Currency, который полностью настраивается через конфигурационный файл, в котором мы можем задавать курс валют и отображать их в различных местах вашего веб-приложения или сайта. Гибкость данного подхода в том, что в AppServiceProvider вы можете задать другой источник курсов валют — например какой-то внешний сервис или база данных. Также в методе <strong>getDefaultUserCurrency</strong> класса CurrencyService вы можете определить свою логику получения валюты пользователя по-умолчанию.</p>
<p>Удачи в веб-разработке! Если хочешь получать больше полезных материалов по Laravel, подписывайся на мой канал в Youtube: <a href="https://www.youtube.com/channel/UCuzjhRFc0S85MWIsaeZym8Q" target="_blank">Lectoria. Обучение веб-разработке</a></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/preimuschestva-razrabotki-internet-magazinov-na-modx.html</link>
    <turbo:source>https://lectoria.pro/read/preimuschestva-razrabotki-internet-magazinov-na-modx.html</turbo:source>
    <turbo:topic>Преимущества разработки интернет-магазинов на MODX</turbo:topic>
    <pubDate>Thu, 05 Aug 2021 10:00:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="200e524d2e682c43f15e2ca93ac7ee5e2f8">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/preimuschestva-razrabotki-internet-magazinov-na-modx.html" text="Преимущества разработки интернет-магазинов на MODX"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Преимущества разработки интернет-магазинов на MODX</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Что для тебя означает качественная CMS-ка? Удобство в управлении, гибкость и адаптивность к любому типу сайтов. Разнообразие самых разных систем по управлению сайтом сегодня зашкаливает. Проблема в том, чтобы подобрать движок с той самой идеально подходящей начинкой. Сегодня речь пойдет о создании интернет-магазинов, для которых идеальной начинкой является MODX. </p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Первая причина, почему MODX это идеальный выбор для создания интернет-магазина — он БЕСПЛАТНЫЙ. Самый популярный компонент, на котором строятся магазины на MODX — miniShop2 стоит ровно 0 рублей.</p>
<p>В данном случае бесплатное не значит некачественное. Дополнительные компоненты для MODX и miniShop2 можно приобрести бесплатно или за сравнительно небольшую сумму. Благодаря этому, ты не будешь тратить время на разработку с нуля, бери готовые решения, адаптируй и применяй их на своём сайте.</p>
<p>Ты можешь также использовать MODX и как фреймворк для построения своего веб-приложения. Его использование не ограничивается только в качестве CMS (именно поэтому ты можешь встретить такую аббревиатуру: CMS/CMF, что означает Content Management System/Content Management Framework).</p>
<p>MODX распространяется с помощью специальной лицензии GPL. Это позволяет использовать ее для выполнения самых разных задач и любого типа сайтов, от простой визитки до крупного интернет-магазина или информационного каталога.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text "><p>MODX может применяться не только как CMS, но и как фреймворк (именно поэтому ты можешь встретить такую аббревиатуру: CMS/CMF, что означает Content Management System/Content Management Framework)</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Преимущества MODX для интернет-магазинов</h2>

<h3>Простая структура админки</h3>

<p>Админка организована таким образом, что вся структура сайта всегда перед глазами, в левом дереве ресурсов (они же страницы сайта), а всякие прочие общие настройки сайта и настройки отдельных модулей находятся в верхнем меню.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Простая структура шаблонов</h3>

<p>Это очень экономит время и позволяет создавать проекты с любым дизайном и функционалом. Иначе на создание даже самого примитивного проекта у тебя уйдёт вагон времени. <br />Здесь понадобится только стандартный html-код и немного тегов MODX. Поэтому, если есть навыки работы с HTML и CSS, проблем с настройкой дизайна не будет.<br />Это важно, в особенности для начинающего разработчика, у которого ещё нет большого багажа проектов. В MODX достаточно изучить инструкцию и любой junior разберется без труда.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Легкость продвижения и рекламы сайта</h3>

<p>MODX — одна из самых SEO-дружественных систем.<br />Здесь есть все необходимые инструменты для продвижения сайта: чистый код без громоздких конструкций, возможность создавать произвольные SEO-поля для каждой страницы, в которых можно указать метатеги keywords, description, title, canonical и так далее.</p>
<p>Вместо обычных и длинных URL страницы создаются с максимально понятными, а главное настраиваемыми ЧПУ-адресами. Они хорошо распознаются поисковой системой. Есть инструменты для быстрого создания карты сайта, содержащей ссылки на все страницы, она способствует максимально быстрой индексации.<br />Также MODX хорош тем, что позволяет закрепить один URL за конкретной страницей, что способствует отсутствию дублей страниц. В коде страницы нет лишних строчек, которые не имеют значения.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Простая установка на хостинг</h3>

<p>Если ты хочешь создавать сайт сразу на хостинге, то тебе не составит труда поставить MODX в своей начальной комплектации, а затем уже устанавливать необходимые плагины и расширения. Это особенно важно в случае, если на хостинге имеются какие-либо ограничения.</p>
<p>Это касается и требований к хостингу. Для работы MODX достаточно наличия базы данных MySQL, веб-сервера Apache или Nginx и поддержки PHP. Такая конфигурация найдется у подавляющего большинства доступных хостеров не только в России, но и во всем мире.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Разнообразие компонентов для расширения функциональных возможностей сайта</h3>

<p>MODX и встроенные модули позволяют создавать полноценный интернет-магазин практически любого масштаба.</p>
<p>Вот некоторые из них:</p>
<ul>
<li>создание личного кабинета покупателя;</li>
<li>торговые карточки с ценой, описанием, изображением и рекламной информацией товара;</li>
<li>формирование клиентской корзины с возможностью ее редактирования для покупателя и отправкой напоминаний для менеджера;</li>
<li>создание каталога, структурированного по различным параметрам (цена, бренд, назначение и т.д.);</li>
<li>добавление большого числа способов оплаты и доставки;</li>
<li>разграничение прав доступа между сотрудниками магазина;</li>
<li>система фильтров для поиска необходимого товара;</li>
<li>форма обратной связи для общения посетителей с администрацией торговой площадки;</li>
<li>различные языковые версии сайта;</li>
</ul>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Возможности miniShop2</h3>

<p>Кроме всего этого, у нас в наличии ведь ещё имеется бесплатный модуль miniShop2. Что он даёт? Возможность создавать категории и товарные позиции с фильтрацией по названию и артикулу товара, справочники производителей, связи товаров по определенным характеристикам, возможность из админки добавлять к товарам неограниченное количество характеристик, мультикатегории или, другими словами, возможность нахождения одного товара одновременно в нескольких категориях, статусы заказов, регистрация пользователей.</p>
<p>Для каких-то конкретных задач многие разработчики создают и делятся готовыми сборками интернет-магазинов на miniShop2 и Modx.</p>
<p>Есть также огромное количество самых разных доступных модулей, которых лишены некоторые другие CMS. А значительная часть этих плагинов вообще доступна только в платных системах.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Курс по разработке интернет-магазинов на MODX и miniShop2</h2>

<p>Время очень дорогой ресурс, сегодня ты можешь быть на коне, а завтра выйдет новая версия фреймворка и вот ты уже не соответствуешь требованиям должности.</p>
<p>Если ты хочешь повысить свой чек и начать работать с более серьёзными проектами, на нашей платформе для онлайн-обучения Лектория есть курс по профессиональной разработке интернет-магазинов.</p>
<p>Формат обучения — записанные видео уроки, по которым можно обучаться в любое удобное время и опциональные домашние задания, которые проверяются лично автором курса. Таким образом, ты сможешь повысить свой уровень, не выходя из дома.</p>
<p>Также на курсе будет:</p>
<ul>
<li>Постоянная поддержка и обратная связь по практическим заданиям.</li>
<li>Закрытый чат, база знаний и база часто задаваемых вопросов</li>
</ul>
<p>По окончании курса ты получаешь сертификат о его прохождении.</p>
<p>Совсем нулям будет сложновато работать с CMS MODX. Но если ты разработчик с хорошим опытом, и тебе необходимо предложить клиентам многогранное, сложное и максимально защищенное приложение, то это подходящий вариант.</p>
<p>Если у тебя уже есть этот фундаментальный опыт и ты обладаешь уровнем знаний junior или middle разработчика, то на курсах Лектория ты сможешь повысить навыки и стать более востребованным специалистом. Наш проект «Лектория» тоже работает на платформе MODX, которая, как мы уже выяснили, обладает большими возможностями.</p>
<p>Всем легкой разработки и прибыльных интернет-магазинов ;)</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/kak-vybrat-podhodyaschuyu-professiyu.html</link>
    <turbo:source>https://lectoria.pro/read/kak-vybrat-podhodyaschuyu-professiyu.html</turbo:source>
    <turbo:topic>Как выбрать подходящую профессию</turbo:topic>
    <pubDate>Tue, 17 Aug 2021 16:28:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="201f66e100cea3d36fe1cb4d4b2f7c6cc65">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/kak-vybrat-podhodyaschuyu-professiyu.html" text="Как выбрать подходящую профессию"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Как выбрать подходящую профессию</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Не бывает идеальной профессии, бывает востребованная здесь и сейчас. А самая востребованная профессия — это… та, которая даёт возможность быстро адаптироваться к изменяющимся реалиям. Внедрение новинок в управлении и маркетинге, научно-технических разработок, автоматизации и роботизации многих рабочих процессов — всё это порождает новые направления, в то время как остальные устаревают.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В этой статье мы рассмотрим, что сегодня в топе у работодателей, какие направления самые востребованные. Какими навыками нужно обладать для вхождения в конкретную сферу. И как выбрать подходящую профессию, учитывая личные качества.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Востребованные профессии 2021</h2>

<h3>IT специальности</h3>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p dir="ltr">Ну конечно же, куда без него, родного.  Мы говорим о всех вакансиях, которые относятся к IT и программированию. Самые востребованные здесь специальности: программист, системный архитектор, разработчик программного обеспечения, специалист кибербезопасности, web-инженер, системный-инженер, системный-администратор.</p>
<p dir="ltr">Начать работу можно уже в процессе обучения, если возьмешься за какой-либо проект. Многие компании сотрудничают с университетами и онлайн-курсами — готовы взять на работу молодых выпускников сразу после окончания обучения. Ну и чем лучше специалист будет разбираться в информационных системах, тем выше будет зарплата.</p>
<p dir="ltr">Среди работодателей самыми популярными позициями являются специалисты в области разработки и внедрения программного продукта. На них приходится более 50% от всех востребованных профессий. В лидерах — backend-специалисты. На каждом сайте есть вакансии веб-разработчика. </p>
<p dir="ltr">Ещё 2 категории — разработчики-универсалы (full-stack) и разработчики пользовательского интерфейса, знающие несколько языков, фреймворков и сред программирования. Их востребованность составляет больше 80% от количества вакансий в этой группе, разработчики мобильных приложений — только 1%.</p>

<h4>Кому подойдёт?</h4>

<p dir="ltr"><span>Профессии в сфере IT подойдут тем, кто обладает:</span></p>
<ul>
<li>Аналитическим и математическим складом ума</li>
<li>Техническим английским языком</li>
<li>Креативностью, современным подходом</li>
<li>Внимательностью — даже небольшая ошибка способна привести к некорректному функционированию приложения или сайта;</li>
<li>Трудолюбием, усидчивостью — на эту работу может уходить много времени, а если приближается дедлайн, придется работать практически 24 часа в сутки;</li>
<li>Обучаемостью и любознательностью — важно постоянно развиваться, повышать квалификацию;</li>
<li>Быть ответственным и уметь работать в команде.</li>
</ul>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text "><p>Информация о том, какие вакансии сейчас востребованы, получена с сайта hh.ru.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Дизайнер</h3>

<p dir="ltr">В сфере дизайна большой поток новых специальностей — дизайн интерьеров, дизайн вещей, игровой дизайн, дизайн машин. Эти являются самыми высокооплачиваемыми, но войти в эту сферу непросто.</p>
<p dir="ltr">Высшее образование или обучение дизайну онлайн, чувство прекрасного и основы художественного искусства — вот что необходимо. Также обязательно нужно знать современные графические программы и постоянно изучать новые разработки.</p>
<p dir="ltr">Профессии в сфере дизайна будут оставаться востребованными еще очень долго.</p>

<h4>Кому подойдет?</h4>

<p dir="ltr">Дизайнер — это не гуманитарное направление, как многие думают. Здесь нужно обладать творческими и техническими навыками. Дизайнер должен понимать основы композиции и эргономики, иметь развитое пространственное мышление, любить геометрию и черчение.</p>
<p dir="ltr">Также очень важна любовь к деталям. Эта работа подойдёт только внимательным людям, которые любят порядок во всём, начиная с папок на компьютере. Если не любить копаться в мелочах, то будет сложно.</p>
<p dir="ltr">Ещё одна иллюзия, что дизайнер должен уметь рисовать. Это совсем не обязательно. Но нужно овладеть какой-то программой для демонстрации своих идей.</p>
<p dir="ltr">Хороший дизайнер должен понимать и следить за современными трендами.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Маркетолог-аналитик</h3>

<p dir="ltr">В сфере рекламы и продвижения это самая нужная позиция. Специалист в этой сфере проводит анализ потребительского рынка и конкурентов, после чего разрабатывает эффективную кампанию по продвижению продукта или услуги.</p>
<p dir="ltr">Маркетолог остается востребованной профессией, потому что также является частью бизнеса, как и дизайн. Реклама «в лоб» выпячивает достоинства и преимущества товара или услуги. Маркетологи используют совершенно противоположный хитрый и умный подход. Нужно иметь высшее образования или пройти курсы маркетинга онлайн и постоянно заниматься самообразованием.</p>

<h4>Кому подойдет?</h4>

<p dir="ltr">Это творческие и идейные люди, при этом обладающие гибким аналитическим умом. Профессия требует дипломатичности, стрессоустойчивости и умения смотреть в будущее.</p>
<p dir="ltr">И ещё несколько личностных характеристик:</p>
<ul>
<li dir="ltr">лидерские качества — для эффективного управления большой группой людей человек должен быть несомненным лидером;</li>
<li dir="ltr">умение обрабатывать большой объём информации;</li>
<li dir="ltr">быть эрудированным и иметь «пытливый» ум;</li>
<li dir="ltr">обладать хорошей памятью;</li>
<li dir="ltr">иметь способность много работать;</li>
<li dir="ltr">быть коммуникабельным и уметь общаться с различного рода людьми.</li>
</ul>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Системный аналитик</h3>

<p dir="ltr">Системный аналитик помогает оптимизировать и автоматизировать работу компании и её подразделений. Такой специалист должен разбираться в менеджменте, экономике и информационных технологиях — организует процесс разработки ПО так, чтобы достичь максимальных показателей.</p>
<p dir="ltr">Его можно назвать посредником между заказчиком — руководством компании и исполнителем — разработчиком. Итог такого сотрудничества — программный продукт.</p>

<h4>Кому подойдет?</h4>

<p dir="ltr">Системным аналитиком может стать человек, обладающий: </p>
<ul>
<li dir="ltr">Широким кругозором. Чтобы вникнуть в проект и говорить с клиентом на одном языке, нужно знать как можно больше предметных областей и особенности разных видов деятельности. При этом сохранить в голове паттерны решения задач, которые можно применить в работе. </li>
</ul>
<ul>
<li dir="ltr">Хорошими коммуникативными навыками. Эта работа не для тебя, если тебе тяжело общаться с людьми и ясно доносить информацию.</li>
</ul>
<ul>
<li dir="ltr">Аналитическим складом ума. Здесь говорится о том, что аналитик умеет предсказывать разные варианты решения задачи.</li>
</ul>
<ul>
<li dir="ltr"> Развитой эмпатией. Работа с людьми так или иначе означает умение понимать чувства заказчика и конечного пользователя, встать на их место и рассмотреть проблему с разных сторон.</li>
</ul>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Проект-менеджер</h3>

<p dir="ltr">Другими словами это руководитель проекта. Он — связующее звено между исполнителем и заказчиком и отвечает за качество продукта. Если каждый член команды выполняет только свой участок работы, и отвечает за его результат, то менеджер проекта отвечает за всё и за всех. </p>
<p dir="ltr">Проект-менеджер объединяет команду специалистов, трудящихся над одним или несколькими проектами, координирует их работу и контролирует этапы её выполнения. Такой лидер, “многорукий бог” должен умеет общаться с заказчиком, брать на себя ответственность за конечный результат и качество получаемого продукта.</p>

<h4>Кому подойдет?</h4>

<p dir="ltr">Какими качествами должен обладать проект-менеджер?</p>
<ul>
<li dir="ltr">Умение руководить, знание специфики проекта. От его компетентности  зависит не только его собственные профессиональный престиж и зарплата, но и репутация и доход компании и каждого члена команды. </li>
<li dir="ltr">Быть отличным стратегом и тактиком, уметь видеть проект в будущем и определять нужные шаги для достижения результата.</li>
<li dir="ltr">Быть хорошим психологом, потому что нужно постоянно общаться с людьми. И к каждому звену проекта найти свой подход.</li>
<li dir="ltr">Обладать отличной памятью, уметь держать в уме общий план и замечать все мелочи. </li>
<li dir="ltr">Быть выносливым и готовым к ненормированному рабочему дню. </li>
<li dir="ltr">Обладать творческим и креативным мышлением.</li>
</ul>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Продакт-менеджер</h3>

<p>Продакт-менеджер организует продвижение и запуск продукта или части продукта. Специалист должен создать «сильный» Продукт, ставить понятные и правильные задачи для разработчика, устанавливать дедлайны и обозначать приоритеты. Никому не интересно иметь мало фич и множество неисправленных багов. Продакту нужно задолго до запуска продукта оценить эффективность продукта, заставить поверить в него менеджмент и запустить. Также вся ответственность за то, чтобы продукт «взлетел» и продолжал набирать высоту лежит на нем.</p>

<h4>Каким должен быть продакт-менеджер?</h4>

<p dir="ltr">Уметь выбирать и отказывать. Опытный продакт должен смотреть на идеи по изменению продукта сквозь свой выработанный годами фильтр, и оставлять только некоторые из них для последующей проверки.</p>
<p dir="ltr">Продакт-менеджер- это человек с широким кругозором. Ему не стоит сознательно сужать свой кругозор каким-то одним направлением: чем больше знаний о разных сферах бизнеса и специализациях, тем лучше.</p>
<p dir="ltr">Настоящий продакт должен смотреть на вещи широко, должен уметь совмещать самые разнообразные активности.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Между какими профессиями можно переключиться максимально быстро и какие профессии дополняют друг друга</h2>

<p dir="ltr">Все вышеперечисленные профессии так или иначе «варятся в одной каше», пересекаются с IT сферой.</p>
<p dir="ltr">Веб-программист может перейти во многие смежные области в IT-компании – дизайн, маркетинг, аналитику, менеджмент. При желании он может стать архитектором программного обеспечения, девопс-инженером, менеджером IT-проектов, если добрать немного навыков и компетенций.</p>
<p dir="ltr">Профессия «маркетолог» больше граничит с направлениями в бизнесе. Маркетолог может легко переключиться на позицию продакт-менеджера: у них много схожих обязанностей и профессиональных навыков. Работа маркетолога, как и продакт-менеджера, начинается задолго до того, как продукт поступит в продажу. Ещё до начала производства (в торговых фирмах – задолго до решения о закупке) они определяют, на кого товар будет рассчитан, какова потенциальная ёмкость рынка, анализируют деятельность конкурентов, занимаются мероприятиями по продвижению продукта. Иногда компании объединяют эти позиции в одну.</p>
<p dir="ltr">Если говорить о системном аналитике, эта профессия объединяет несколько диджитал-сфер, поэтому возможности для смены направления довольно широкие. К примеру, стать системным архитектором — здесь важное значение имеет знание предметных областей бизнеса и опыт проектирования систем, который был получен при работе системным аналитиком. Они часто становятся проджект-менеджерами — достаточно просто перейти на эту позицию, так как на практике данные направления нередко пересекаются.</p>
<p dir="ltr">Вообще для системного аналитика двери открыты во многие позиции: от тестирования до технического писательства.</p>
<p dir="ltr">Чтобы стать проект-менеджером, можно начать путь в разработке, вырасти до senior-developer и дальше определить, куда идти — в проекты, архитектуру или управление командой;</p>
<p dir="ltr">Если ты уже разработчик / тестировщик / кто-то из ИТ и хочешь попробовать что-то новое, то переход — это хорошая возможность. Эти специалисты уже знают, что такое ИТ, разработка проектов и продуктов, теперь будет стоять задача научиться управлять командой в целом и разбираться в бизнес-процессах.<span style="font-size: 1.8em;"> </span></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Заключение</h2>

<p dir="ltr">В общем-то, главное начать, а дальше начинается круговорот получения опыта работы с заказчиком, командой, написанием бизнес-требований, внедрением программного продукта и другими штуками, которые нужны в этих профессиях.</p>
<p dir="ltr">Если захотеть, можно стать кем угодно и в каком угодно возрасте. А какую профессию выбрать? Ориентируйтесь на свои интересы и личные качества.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/4-pravila-horoshego-koda.html</link>
    <turbo:source>https://lectoria.pro/read/4-pravila-horoshego-koda.html</turbo:source>
    <turbo:topic>4 правила хорошего кода</turbo:topic>
    <pubDate>Thu, 19 Aug 2021 10:00:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="202ac9dc2cf0e70ddf2e0c51237be5de0dc">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/4-pravila-horoshego-koda.html" text="4 правила хорошего кода"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">4 правила хорошего кода</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Если говорить непосредственно о программировании, то у меня в 95% случаев это одиночный кодинг. Поэтому мое развитие как веб-разработчика было более замедленным, чем у тех, кто работал в командах. Но, возможно, благодаря одиночному опыту, я пришел к тем правилам, которым следуют опытные разработчики, в том числе и я сам.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Итак, 4 базовых правила хорошего кодинга по версии Артема Зернова aka Lectoria.pro</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Давай осмысленные имена переменным, функциям и классам.</h2>

<p>Не стоит стесняться длинных названий переменных и функций. Я всегда предпочитаю что-то вроде такого:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php
...
$filterParamFromRequest = $request-&gt;input('productLength');

function getFilteredParamString($data) &#123;
	...
&#125;</code></pre>

<p>вместо</p>

<pre class="line-numbers"><code class="language-php">&lt;?php
...
$fpr = $request-&gt;input('param');

function fpString($data) &#123;
	...
&#125;</code></pre>

<p>Что же касается классов, то я предпочитаю закладывать в название класса как можно больше информации. Если мы работаем без пространств имен, то в моем коде это может быть что-то подобное:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php

class TournamentCalculatorService &#123;
	...
&#125;</code></pre>

<p>Если мы имеем дело с проектом, где поддерживаются пространства имен, то при помощи каталогов и неймспейсов мы можем сделать путь к классу максимально информативным. Например, таким:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php

use App\Services\Game\Tournament\CalculatorService;</code></pre>

<p>Сам же код класса может выглядеть так:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php

namespace App\Services\Game\Tournament;

class CalculatorService &#123;
	...
&#125;</code></pre>

<p>Согласитесь, что с информативным названием в большинстве случаев нет необходимости даже снабжать его комментарием. Но тем не менее, это не значит, что от комментариев в коде нужно отказаться.</p>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Снабжай код подробными комментариями</h2>

<p>Я уже не помню, когда точно я начал заставлять себя писать комментарий к коду, но сейчас это стало моей привычкой. Причем, я могу пересматривать свой код, который написал вчера и дополнить его сегодня новыми комментариями, чтобы в будущем быстро вникнуть в суть реализованной логики.</p>
<p>Пример сложного участка кода, который я снабжаю комментариями:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php
...
public function saveAndAddTeamToTournament(Tournament $tournament, User $createdByUser, Team $newTeam)&#123;
    //Команда уже существует. Метод предполагает что будет передана не сохраненная ранее команда
    if($newTeam-&gt;exists)&#123;
        throw new \Exception(__('messages.team_already_exists'));
    &#125;

    //Нет подключенного игрового аккаунта
    if(!$this-&gt;userHasGameLinkedAccount($createdByUser, $tournament-&gt;game))&#123;
        ...
    &#125;

    //Турнир не командный
    if(!$tournament-&gt;isTeam())&#123;
        ...
    &#125;

    //Смотрим, попадаем ли мы на период приема заявок этого турнира
    if(!$tournament-&gt;isRequestAvailable())&#123;
        ...
    &#125;

    //Пользователь уже участвует в этом турнире
    $member = UserTournamentMember::where('user_id', $createdByUser-&gt;id)
        -&gt;where('tournament_id', $tournament-&gt;id);
    if($member-&gt;exists())&#123;
        ...
    &#125;

    ...
    
    return $teamTournamentMember;
&#125;</code></pre>

<p>Когда ты пишешь код здесь и сейчас, ты, безусловно, понимаешь, что ты пишешь и зачем. Но не стоит думать, что твой мозг может помнить все, что он сгенерировал ранее. Детали, безусловно, забываются со временем. Так устроена наша память. Если ты не оставишь хороших комментариев в своем же коде, причем несмотря на то, что у тебя информативные названия функций и переменных, через неделю или месяц, тебе придется снова вникать в то, что ты написал. Хорошие же комментарии, как ты уже догадался, позволят тебе сделать это максимально быстро.</p>

<h3>Делай README</h3>

<p>Когда логика твоего кода становится слишком сложной, не ленись описывать ее в отдельном рядом стоящем файле <strong>Readme</strong>. Это сэкономит время тебе и твоим коллегам, если ты работаешь в команде. При разработке крупных продуктов в команде для этого выделяется отдельный документ или даже сайт, основная задача которого описать логику и внутренние алгоритмы продукта.</p>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Декомпозируй логику на составляющие</h2>

<p>Есть такой принцип единственной ответственности (<strong>Single Responsibility</strong>), который применяется в объектно-ориентированном проектировании (хотя, я уверен, что он применяется не только в ООП). Если вкратце, то он означает, что нельзя валить всю логику в одну функцию/класс. Другими словами, старайтесь делить большую и сложную логику на отдельные составляющие (пространства имен, классы и функции), отвечающие за свой узкий круг задач. Так вам будет гораздо проще следить за работоспособностью проекта, а при работе в командах вы сможете гибко распределять задачи по разным исполнителям.</p>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Выноси настройки в отдельные файлы конфигурации или файлы окружения</h2>

<p>Это правило я для себя выработал, глядя на то, как устроены большие системы, вроде CMS, где есть отдельный раздел "Настройки" и в нем можно найти огромное количество самых разных настроек, отвечающих за абсолютно не связанные между собой функции. Другими словами, если вы разрабатываете веб-приложение или сайт и вдруг сталкиваетесь с моментом, когда в коде вставляете конкретное число (например количество элементов на странице), конкретный идентификатор (например идентификатор пользователя-администратора) или строку (например, имя приложения), то в большинстве случаев это сигнал о том, что это значение нужно вынести в конфигурационный файл, а на его месте поставить обращение к конфигурации.</p>
<p>Таким образом, все варьируемые параметры будут собраны в единой конфигурации, которую вы можете оперативно изменять, в зависимости от различных факторов (например от того, локальный это сервер или боевой).</p>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Заключение</h2>

<p>Америку, конечно, заново я не открыл, так как эти правила я так или иначе подхватил, изучая чужой код и многочисленные статьи по теме программирования и веб-разработки. Тем не менее, я прочувствовал эти правила на собственном опыте и могу определенно сказать, что после того, как я постепенно начал их применять, я вижу недостатки чужого и своего кода, написанного мной несколько лет назад.</p>
<p>Бери на вооружение и применяй!</p>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/autentifikatsiya-vhodyaschih-api-zaprosov-laravel.html</link>
    <turbo:source>https://lectoria.pro/read/autentifikatsiya-vhodyaschih-api-zaprosov-laravel.html</turbo:source>
    <turbo:topic>Аутентификация входящих API запросов Laravel</turbo:topic>
    <pubDate>Mon, 06 Sep 2021 10:00:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="20311a7a4df82b558b2ba149f33428b9a56">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/autentifikatsiya-vhodyaschih-api-zaprosov-laravel.html" text="Аутентификация входящих API запросов Laravel"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Аутентификация входящих API запросов Laravel</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Обзор различных способов аутентификации входящих запросов при создании API на Laravel.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>При разработке приложения, когда речь идет о доступе к нему через веб-интерфейс, другими словами, при помощи веб-браузера, часто для аутентификации используется логин/пароль, а для хранения  аутентифицированного состояния пользователя используется механизм сессий, который заключается в хранении уникального ключа в Cookies браузера. По этому ключу на стороне сервера можно достать сессионные данные и таким образом восстановить состояние текущего пользователя при переходе между страницами.</p>
<p>Я думаю, про сессию и хранение аутентификации в сессии все, даже начинающие разработчики более-менее понимают. А вот когда мы создаем точку доступа API своего приложения, то здесь аутентификация происходит немного иначе.</p>
<p>Так как API разрабатываются без сохранения состояния, то о сессии и сессионном хранилище говорить не приходится. А это значит, что вместо всем известного идентификатора PHPSESSID или других аналогичных, при каждом запросе нам нужно передавать что-то другое.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Какие способы аутентификации запросов к API могут быть</h2>

<h3>Логин и пароль</h3>

<p>Можно, но так никто не делает. Зачем перекидывать каждый раз логин и пароль? Честно говоря, сам не думал глубоко над этим. Но, если посмотреть на то, как устроены API общеизвестных сервисов, то можно заметить, что чаще всего логин и пароль дает доступ ко всем функциям и данным личного кабинета, а нам зачастую нужен доступ только к нескольким отдельным функциям. Помимо прочего, вероятность компрометации логина и пароля, если мы их будем передавать при каждом запросе в открытом виде, очевидно, повышается.</p>
<p>Поэтому, повторюсь, логин и пароль в качестве способа аутентификации использовать можно, но это далеко не самый идеальный способ.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Одноразовый пароль</h3>

<p>Это то самое, что просит от вас гугл, яндекс, вконтакте и прочие небезызвестные сервисы, когда вы включаете двухфакторную авторизацию.</p>
<p>Мы могли бы использовать одноразовый пароль при каждом запросе, но это сильно усложняет реализацию как на клиентской стороне, так и на серверной, так как требует интеграции с сервисом генерации и проверки одноразовых паролей. Но стоит отметить, что уровень надежности будет существенно выше, так как с каждым новым запросом мы будем передавать новый пароль и его случайная компрометация не будет нести какую-либо существенную угрозу для нашего API. Однако, такой способ аутентификации запросов к API вы вряд ли где-то встретите.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Аутентификация по сертификату</h3>

<p>Если вкратце, то мы аутентифицируем пользователя по его сертификату, выданного удостоверяющим центром. При каждом запросе пользователь отправляет зашифрованную приватным ключом информацию о себе (свой сертификат) и публичный ключ, а на сервере мы расшифровываем информацию публичным ключом и убеждаемся, что доступ пытается получить доверенный пользователь. Другими словами, мы проверяем не столько какую-либо секретную фразу, а сравниваем необходимую информацию из  расшифрованного сертификата (например, номер паспорта) с некоторой внутренней базой пользователей, которым мы разрешаем доступ. Сложность реализации такого способа аутентификации заключается в проверке на стороне сервера подлинности сертификата. Тема зачастую довольно сложная даже для опытных разработчиков, что уж говорить о начинающих.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Токен или API-ключ</h3>

<p>Ну и наконец, самый доступный и распространенный способ аутентификации — по токену или api-ключу, который пользователь может получить одним из следующих способов:</p>
<ol>
<li>В личном кабинете пользователь сгенерировал его себе сам и теперь при каждом запросе передает этот токен, мы узнаем пользователя и даем ему нужные данные. Подходит для сервисов, предполагающих частую необходимость пользователей в обращении к API.</li>
<li>Мы создали токен вручную и выдали ему по другим каналам (например, отправили в личные сообщения в телеграм) и теперь при каждом запросе он делает то же самое, что и в пункте 1. Подойдет для частных сервисов, где доступ к API выдается сильно ограниченному кругу лиц и не требует частого создания новых API-ключей.</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Практическая часть</h2>

<p>Как выглядит проверка ключа на стороне сервера. На примере фреймворка Laravel.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Создаем Middleware для защиты маршрутов API</h3>

<p>Создаем файл <strong>app/Http/Middleware/AuthenticateApi.php</strong></p>
<p>Это можно сделать как вручную, так и при помощи команды:</p>

<pre class="line-numbers"><code class="language-bash">php artisan make:middeware AuthenticateApi</code></pre>

<p>Кладем в него следующее содержимое</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">&lt;?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class AuthenticateApi extends Middleware
&#123;
    protected function authenticate($request, array $guards)
    &#123;
        //Даем пользователю возможность передать токен (api-ключ) разными способами
        //1. в адресе запроса
        $token = $request-&gt;query('api_token');
        if(empty($token))&#123;
            //2. Через url-form-encoded поля POST запроса
            $token = $request-&gt;input('api_token');
        &#125;
        if(empty($token))&#123;
            //3. Через заголовок Authorization: Bearer ......
            $token = $request-&gt;bearerToken();
        &#125;

        //Сравниваем токен с тем, что хранится в наших настройках. Здесь можно заменить логику на свою. Например сделать поиск токена в базе
        if($token === config('apitokens')&#91;0&#93;) return;
        //В случае неуспеха, вызываем метод сообщающий о статусе &quot;Неавторизован&quot;
        $this-&gt;unauthenticated($request, $guards);
    &#125;
&#125;
</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Регистрируем middleware</h3>

<p>В файле <strong>app/Http/Kernel.php</strong> вносим следующие изменения</p>

<pre class="line-numbers"><code class="language-php">...
protected $routeMiddleware = &#91;
        'auth' =&gt; \App\Http\Middleware\Authenticate::class,
        'auth_api' =&gt; AuthenticateApi::class, //&lt;----регистрируем middleware
        'auth.basic' =&gt; \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
...</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Используем для защиты маршрута</h3>

<p>Пример использования middleware для защиты маршрута <strong>api/user/&#123;id&#125;</strong> от свободного доступа.</p>
<p>В файле <strong>routes/api.php</strong></p>

<pre class="line-numbers"><code class="language-php">...
Route::middleware('auth_api')-&gt;get('/user/&#123;id&#125;', function(Request $request, $id)&#123;
    $user = \App\Models\User::find($id);
    if(!$user) return response('', 404);
    return $user;
&#125;);
...</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p><span>Удачи в веб-разработке! Если хочешь получать больше полезных материалов по Laravel, подписывайся на мой канал в Youtube: </span><a href="https://www.youtube.com/channel/UCuzjhRFc0S85MWIsaeZym8Q" target="_blank">Lectoria. Обучение веб-разработке</a></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/ocheredi-v-laravel-ili-pochemu-vash-sayt-tormozit.html</link>
    <turbo:source>https://lectoria.pro/read/ocheredi-v-laravel-ili-pochemu-vash-sayt-tormozit.html</turbo:source>
    <turbo:topic>Очереди в Laravel или почему ваш сайт тормозит</turbo:topic>
    <pubDate>Wed, 15 Sep 2021 10:00:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="2055b36a17818afabb3062dfd1f17665a86">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/ocheredi-v-laravel-ili-pochemu-vash-sayt-tormozit.html" text="Очереди в Laravel или почему ваш сайт тормозит"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Очереди в Laravel или почему ваш сайт тормозит</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Замечали, как на некоторых сайтах долго "думает" форма обратной связи?  Вы спросите, какое это имеет отношение к очередям? Давайте обо всем по порядку.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Я выбрал в качестве примера формы обратной связи, потому что большинство веб-разработчиков с ними так или иначе сталкивались и поэтому как нельзя лучше поймут все преимущества отказа от синхронного выполнения обработки запроса от формы.</p>
<p>Для тех, кому удобнее видео-формат, смотрите видео ниже. Если же вы предпочитаете текстовый формат, крутите ниже.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_video_w">
    <iframe src="https://www.youtube.com/embed/XaIkHyORbzg" frameborder="0" allowfullscreen=""></iframe>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как работают формы обратной связи</h2>

<p>Как правило, форма обратной связи работает следующим образом:</p>

<ol>
<li>Вы вводите свои данные и нажимаете "Отправить"</li>
<li>Сервер принимает этот запрос и начинает его обработку. Сначала происходит валидация введенных вами данных — эта операция быстрая и не требует большого времени на выполнение.</li>
<li>Далее запускается логика отправки данных на почту, в CRM и так далее. И именно здесь у нас возникает самая длительная задержка, потому что нужно обратиться к почтовому серверу, отправить данные, дождать ответа, обратиться к API CRM, отправить запрос, дождаться ответа и так далее.</li>
</ol>

<p>А что, если отправка происходит не на 1 почтовый ящик, а на 3 (например, в техподдержку, менеджеру и гендиректору, потому что он тоже хочет все контролировать). В этом случае время ожидания увеличится в несколько раз.</p>

<h2>Как ускорить обработку?</h2>

<p>Для того, чтобы все работало, как ожидается и при этом сайт не подвисал на несколько секунд при отправке формы, необходимо выносить всю длительную логику в асинхронную задачу, чтобы она не блокировала выполнение остального кода.</p>

<p>Один из способов это сделать — очередь: вы отправляете задачу в очередь, а специальный процесс (он же демон или воркер) — обработчик очереди выполнит ее, когда будет в очередной раз опрашивать очередь.</p>

<h2>Как настроить очередь в Laravel</h2>

<p>Если мы заглянем в файл <strong>config/queue.php</strong>, то заметим, что в настройке <strong>connections</strong> находятся 5 различных видов соединений:</p>

<ol>
<li>Синхронная очередь. По сути — это имитация или некоторый "совсем базовый" вид очередей, так как одна из сильных сторон очередей — асинхронность выполнения задач и возможность выполнить задачу с отсрочкой по времени.</li>
<li>Очередь на основе таблицы в базе данных</li>
<li>Очередь на основе пакета <a href="https://beanstalkd.github.io/" target="_blank">beanstalkd</a>.</li>
<li>Очередь на основе <a href="https://aws.amazon.com/ru/sqs/" target="_blank">сервиса очередей от Amazon</a></li>
<li>Очередь на основе сервера <a href="https://redis.io/" target="_blank">redis</a></li>
</ol>

<p>Давайте разберем процедуру настройки очередей на основе таблицы в базе данных.</p>

<h3>1. Подготовим таблицу БД для очереди</h3>

<p>Запускаем в консоли встроенную команду, которая создаст в базе данных таблицу для хранения отложенных задач (очередь)</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">php artisan queue:table
php artisan migrate</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>2. Указываем вид соединения</h3>

<p>В файле .env находим настройку QUEUE_CONNECTION и указываем соединение для работы с очередями.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">QUEUE_CONNECTION=database</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если данной настройки не было в файле .env ранее, то скопируйте строку выше и добавьте в конец файла или между любыми другими настройками.</p>

<h3>3. Создаем асинхронную задачу (Job)</h3>

<p>В Laravel предусмотрен отдельный специальный термин для асинхронных задач — Job, а также отдельная встроенная команда для быстрого создания заготовки под класс такой задачи.</p>

<p>Создаем отдельный Job-класс для нашей долгой задачи, выполнив следующую команду:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">php artisan make:job MyVeryLongJob</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Как вы понимаете, имя <strong>MyVeryLongJob</strong> вы можете заменить на свое. Как правило, я в своих проектах, оставляю в названии класса его принадлежность к определенной сущности. Например, если это Job, то в конце имени класса будет <em>"Job"</em>. Если это контроллер, то это может быть, например, <em>"MainUserController"</em>.</p>

<h3>4. Внедряем необходимые зависимости и аргументы в Job</h3>

<p>Если ваша асинхронная задача нуждается в каких-либо данных или сервисах из приложения для успешного запуска, добавьте их через конструктор. Например так:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">class MyVeryLongJob implements ShouldQueue &#123;
...
    public $user;
    public $service;
    
    public function __construct(User $user, MyVeryImportantService $service)&#123;
        $this-&gt;user = $user;
        $this-&gt;service = $service;
    &#125;
...
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>5. Опишите логику вашего джоба</h3>

<p>В методе handle() класса App\Jobs\MyVeryLongJob опишите всю необходимую логику работы вашей задачи (джоба), используя внедренные зависимости через <code>$this-&gt;</code>.</p>

<h3>6. Запуск джоба</h3>

<p>В том месте вашего приложения (например, в контроллере или внутри какого-либо сервиса) вместо прямого запуска логики мы теперь сделаем отправку задачи в очередь следующим образом:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">...
MyVeryLongJob::dispatch(&#91;АРГУМЕНТЫ И ЗАВИСИМОСТИ&#93;);
...</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Обратите внимание, что при внедрении зависимости от какого-либо сервиса, добавленного через сервис-контейнер, нет необходимости указывать его в аргументах метода <code>dispatch()</code>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Например, для того джоба, в конструкторе которого мы в качестве примера указали зависимости в пункте 4, отправка задачи в очередь может выглядеть следующим образом:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">...
$user = User::find(1);
MyVeryLongJob::dispatch($user);
...</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Обратите внимание, что в аргументах метода <code>dispatch()</code> мы не передаем сервис <code>MyVeryImportantService $service</code></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>7. Запуск воркера</h3>

<p>Ну и наконец, чтобы наши отправляемые в очередь задачи были запущены и обработаны, необходимо запустить отдельный специальный процесс (воркер) при помощи следующей консольной команды:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">php artisan queue:work --queue=default</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В качестве параметра <code>--queue</code> мы указали очередь под именем <strong>"default"</strong> — это именно то имя очереди, в которую отправляются задачи по-умолчанию, если мы явно не задали имя очереди. Не путайте с соединением. Напротив, в каждом соединении в файле <strong>config/queue.php</strong> с помощью параметра <strong>queue</strong> задано имя очереди по-умолчанию (то самое "default", которое мы указали в параметре команды <code>php artisan queue:work</code>).</p>

<h2>Заключение</h2>

<p>Все, что я описал выше — это всего лишь основы работы с очередями. Так сказать, мануал для быстрого погружения, чтобы попробовать здесь и сейчас. Попробуйте сделать одну и ту же задачу с очередью и без нее. Добавьте в код логики что-нибудь вроде <code>sleep(5)</code>, чтобы заметить, насколько долго выполняется задача. И после этого сравните, как ведет себя страница вашего сайта при работе с очередями и без. Разница будет очевидной!</p>

<p>Удачи в веб-разработке. Задавай вопросы в комментариях, подписывайся на <a href="https://www.youtube.com/channel/UCuzjhRFc0S85MWIsaeZym8Q" target="_blank">Youtube-канал Lectoria</a> и обязательно подписывайся на наши соцсети: <a href="https://instagram.com/lectoria.pro" target="_blank">Instagram</a>, <a href="https://vk.com/lectoria" target="_blank">VK</a>, <a href="https://fb.com/lectoria.pro" target="_blank">Facebook</a>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/taym-mendzhment-dlya-frilansera.html</link>
    <turbo:source>https://lectoria.pro/read/taym-mendzhment-dlya-frilansera.html</turbo:source>
    <turbo:topic>Тайм-менджмент для фрилансера</turbo:topic>
    <pubDate>Mon, 20 Sep 2021 10:30:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="206f801716e7431653993fcc920f5a60c46">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/taym-mendzhment-dlya-frilansera.html" text="Тайм-менджмент для фрилансера"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Тайм-менджмент для фрилансера: лучшие инструменты</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Поговорим сегодня о таком звере как продуктивность на фрилансе, почему иногда ее так тяжело поддерживать, зачем нужен тайм-менеджмент и какие его инструменты можно выделить.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>В чем трудности работы на фрилансе?</h2>

<p>И вот ты сидишь на диване в любимых тапочках с ноутбуком, и никуда тебе не нужно ехать. В первое время это кажется действительно прекрасным занятием. Но временами появляется чувство, что чего-то не хватает, ведь расслабленная домашняя обстановка, как правило, не способствует продуктивности.</p>

<p>Во-первых, не всегда удобно быть одному. В офисе всегда есть, с кем можно обсудить задачи, посоветоваться, перенять какое-то решение. Работая на фрилансе, такой возможности нет, часто приходится все обдумывать в одиночку, и это ставит в ступор. Снижается продуктивность — и даже специалист с самой железной силой воли сдастся в борьбе с соблазном позаниматься чем-то кроме работы, ведь рядом нет начальников.</p>

<p>Во-вторых, может для кого-то будет открытием, но дома не всегда так тихо и спокойно, уровень комфорта тоже под вопросом. Это касается тех, у кого нет отдельного жилья от родственников. Это значит, что все домочадцы ведут обычную жизнь и быт, часто отвлекают. А желание пообщаться с тобой появляется на пике рабочего процесса, когда дедлайны повисли, словно лавина, готовая обвалиться в любой момент.</p>

<h2>Тайм-менеджмент для фрилансера или управление временем.</h2>

<p>Все сводится к тому, что приходится поддерживать дисциплину своими силами. Если ты никогда не пробовал применять тайм-менеджмент, это может стать большой проблемой.Лучше планировать дни заранее и выделять определенное время для рабочих проектов. Планирование — вот ключ к продуктивности и то, что поможет избежать переработок.</p>

<p>Основная проблема удаленной работы в том, что сотрудники вынуждены поддерживать дисциплину своими силами. Для людей без навыков тайм-менеджмента это может стать сложной задачей. А еще лучше завести блокнот или тетрадь для тайм-менеджмента, в котором можно составить эффективный рабочий день-неделю-месяц.</p>

<p>Советую разграничить рабочий день: время, когда он начинается и когда заканчивается. И поставить в известность своих клиентов, коллег. Мне удобно работать с 9:00 до 17:00. Со временем это поможет определить собственные пики продуктивности.</p>

<p>Мои принципы тайм-менеджмента в работе сводятся к тому, что я много и упорно работаю, и работа доставляет мне удовольствие. Но фриланс это как что-то неизмеримое и не поддающееся подсчету, и я бы ничего не успевала, если бы не самоменеджмент. У меня нет начальства, никто не заставляет работать.</p>

<p>Для меня главный мотив к управлению своим рабочим и нерабочим временем — внутри меня самой. И эта “свободная” жизнь фрилансера на самом деле и кроет в себе опасность — посвятить свое время только работе. Так вот нельзя допускать того, чтобы рабочие проекты занимали время личное.</p>

<h2>Список лучших инструментов для тайм-менеджмента</h2>

<p>Если честно, я не успеваю все. Да даже половину. Но это потому что иногда хочется успеть все и сразу🤯</p>

<p>Я не претендую на истину, но я за подход “делать мало, но качественно”. Чтобы решить проблему нехватки времени и рационального его распределения, я поделюсь подборкой сервисов, которыми пользуюсь сама и которыми пользуется коллега. Почти все приложения поддерживаются IOS и Android👇🏻</p>

<h3>1. TickTick</h3>

<p>🔗 <a href="https://ticktick.com/" target="_blank">https://ticktick.com/</a></p>
<p>Приложение можно полностью кастомизировать под себя с помощью настроек и опций. Здесь встроен календарь и срабатывает напоминание. К любой задаче можно добавить комментарии, чек-листы, файлы, теги и метки, назначить приоритетность. Есть возможность «привязать» задачу к конкретному адресу, например, если нужно купить продукты в конкретном магазине. Если нет времени печатать, можно надиктовать задачи голосом.</p>

<h3>2. Google Календарь.</h3>

<p>🔗 <a href="https://workspace.google.com/products/calendar/" target="_blank">https://workspace.google.com/products/calendar/</a></p>
<p>Я его использую как планировщик времени, задач и напоминаний о следующем проекте. Ключевая особенность в том, что на любую задачу я сразу закладываю время. Разработать новый модуль для клиента? Окей, на это уйдет ориентировочно 3 часа и полчаса вначале, чтобы уточнить детали. Записать новый видео-урок: подготовить материал 1 час, записать урок 1 час, смонтировать и выложить — еще примерно 2 часа. Благодаря этому я быстро понимаю, что день не резиновый и не пытаюсь запланировать на день 10500 дел.</p>

<h3>3. Sectograph</h3>

<p>🔗 <a href="https://sectograph.com/" target="_blank">https://sectograph.com/</a></p>
<p>Приложение для визуалов с наглядным расписанием на часовом циферблате. Приложение переносит ваши планы из Google Календаря на 12-часовой циферблат и вместо линейного списка ваше расписание превращается в наглядную круговую диаграмму.</p>

<h3>4. Trello.</h3>

<p>🔗 <a href="https://trello.com/" target="_blank">https://trello.com/</a></p>
<p>Подойдет тем, кто практикует подход "Канбан". Смотрели сериал "Кремниевая долина"? Именно после того, как там показали аналоговую версию Trello, коллега начал использовать его более эффективно. Даже несмотря на то, что он чаще всего работает один, организация задач в виде списков и досок помогает наглядно оценивать объем работ и видеть прогресс. Неоспоримым плюсом Trello также является возможность его всесторонней интеграции с различными внешними сервисами, в том числе и с Google календарем. Именно в такой связке он использует Trello (Trello + <a href="https://www.cronofy.com/" target="_blank">Cronofy</a>).</p>

<h3>5. Notion</h3>

<p>🔗 <a href="https://www.notion.so/" target="_blank">https://www.notion.so/</a></p>
<p>Еще один мощный инструмент, содержащий в себе множество способов организации заметок, сроков, задач и не только. Преимущество Notion перед Trello заключается в его более гибком устройстве. Вы можете адаптировать рабочее пространство под свои цели практически как угодно. При создании новых страниц Notion предлагает различные шаблоны под различные виды проектов — от простых Todo листов до больших проектов вроде съемки кино.</p>

<h3>6. Rescue Time.</h3>

<p>🔗 <a href="https://www.rescuetime.com/" target="_blank">https://www.rescuetime.com/</a></p>
<p>Для мониторинга экранного времени. Показывает, сколько часов я провожу в телефоне или за компьютером, с какой целью чаще всего ими пользуюсь и как эффективно. Особенно полезно увидеть, где засиживаешься больше всего🙄</p>

<h2>Желание все откладывать на потом.</h2>

<p>Или когда пришла пора спросить себя, куда уходят те 1440 минут, которые у тебя есть на каждый день?</p>

<p>Немного о прокрастинации. Быть дисциплинированным мне мешает ноут, соцсети, телефон. Думаю, что большинство из нас страдает этой вредной привычкой. Раньше я списывала это на банальную лень. Причем, при отсрочке начинаешь себя винить, казнить, тревожиться, беспокоиться по пустякам и накапливать в себе напряжение. А это еще и чревато появлением всяких болячек.</p>

<p>Если ты хоть раз откладывал важное дело на потом, это может перейти в привычку откладывать решение важных вопросов. Это когда ты оттягиваешь время, затрачивая его на абсолютно ненужные дела, и, когда ты знаешь, что все возможные сроки прошли, то ты либо отказываешься от выполнения задания, либо пытаешься выполнить его за нереально короткий срок. И первый и второй вариант — это фейл. А если речь идёт о долгосрочной цели и «срока сдачи» нет, есть риск не приступить к делу никогда.</p>

<p>Если ты чувствуешь, что мог бы прожить эти 1440 минут в день лучше, не сливай дорогой ресурс времени, а попробуй одно из вышеперечисленных инструментов для улучшения продуктивности.</p>

<p>Удачи тебе в продуктивности и планировании!</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/sozdanie-internet-magazinov-bystrye-resheniya.html</link>
    <turbo:source>https://lectoria.pro/read/sozdanie-internet-magazinov-bystrye-resheniya.html</turbo:source>
    <turbo:topic>Создание интернет-магазинов: быстрые решения</turbo:topic>
    <pubDate>Wed, 03 Nov 2021 11:00:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="207953d9cce31dd87cec67c2415da31c212">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/sozdanie-internet-magazinov-bystrye-resheniya.html" text="Создание интернет-магазинов: быстрые решения"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Создание интернет-магазинов: быстрые решения</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Чего ждет клиент при обращении за разработкой интернет-магазина? Обычно это увеличение продаж, раскрутка и продвижение в интернете. При этом важно помнить, что не существует единого решения для всех видов бизнеса — руководствоваться нужно условиями конкретной данной сферы.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Для эффективной работы магазина недостаточно онлайн-витрины — за ним должна стоять продуманная бизнес-идея, хорошая логистика, эффективная работа с продвижением и удержанием клиентов.</p>
<p>Что это означает для веб-разработчика.<br />Что такой сайт должен быть безопасным, оптимизированным под поисковые системы, быстрым, удобным в использовании и конечно же mobile-first. Также не нужно забывать о его наполнении — контент должен быть качественным и уникальным.</p>
<p>Данная статья будет полезна тем, кто уже создавал интернет-магазины, и тем, кто только начал вникать в эту область. Я расскажу о том, что нужно помнить перед созданием интернет-магазина, какими быстрыми решениями можно воспользоваться и в каких случаях.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text "><p>Текст статьи мы подготовили совместно с Артемом Зерновым — основателем проекта Lectoria</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Это нужно учитывать ДО начала разработки интернет-магазина</h2>

<p>Нужно понимать, что нет единого шаблона, с помощью которого можно было бы создать интернет-магазин для любого бизнеса. У каждого проекта всегда будут свои особенности, которые для других неактуальны. Вот самые важные из них:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Структура категорий</h4>

<p>Важно продумать структуру каталога товаров. Если ты будешь делать это самостоятельно, то, скорее всего, сделаешь неправильно. Потому что:</p>
<ol>
<li>Если говорить о владельце бизнеса, то он хорошо осведомлён об особенностях своего товара, но не разбирается в технической реализации каталога товаров.</li>
<li>Ты, как разработчик, хорошо компетентен в технических моментах, но не разбираешься в товарах, который предлагает бизнес.</li>
</ol>
<p>Выходит, что наиболее безошибочно составить структуру каталога можно только в результате совместной работы заказчика и программиста.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Структура товаров</h4>

<p>Товары по своей структуре могут быть поделены на: простые — артикул, цена, описание, простые дочерние — отличаются одним свойством, влияющим на цену, сложносоставные дочерние — их отличает несколько параметров, которые влияют на цену. Все зависит от сферы, в которой работает бизнес.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Конечно, если каталог будет состоять только из простых товаров, тем легче задача. Но если необходимо добавлять дочерние товары, это займёт больше времени, а сервер должен выдерживать повышенные нагрузки.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Настраиваемые поля. </h4>

<p>Не откладывай установку этого функционала на потом, после настраивать будет сложнее. Для бизнесов, работающих с автомобилями, часами, техникой, домами это особенно важно — характеристики такого товара многогранны.</p>
<p>Обязательно включай хотя бы базовый набор настраиваемых полей и фильтрацию товаров по ним. В будущем можно будет легко расширить список полей на примере уже созданных. Без настраиваемых полей невозможно будет отфильтровать товар по характеристикам — а эта функция является стандартом во всех успешных интернет-магазинах.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Контроль остатков</h4>

<p>Эта функция может повлиять на всю дальнейшую разработку. Можно будет выбрать между более сложными дочерними товарами и более простыми настраиваемыми полями, а также регулировать функции вроде ограничения количества заказываемого товара и отображения остатков.</p>
<p>Не забудь предупредить заказчика о том, что установка контроля остатков усложнит управления интернет-магазином.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Обмен данными (экспорт/импорт)</h4>

<p>Данная настройка зависит, опять же, от вида бизнеса. Место хранения основной базы товаров, каким образом и как часто обновляется, место выгрузки данных и т.д. — основные параметры, на которые здесь нужно ориентироваться.</p>
<p>Какими данными и с какими службами будет обмениваться интернет-магазин — нужно определить на данном этапе. И разобраться с тем, как будет проходит загрузка и обновление базы товаров, остатков и цен. Остальной функционал можно дополнить уже после старта проекта.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Быстрые решения для создания интернет-магазина. Какие CMS самые оптимальные для интернет-магазина?</h2>

<p>На первом этапе бизнес-идею лучше протестировать, оценить потенциал с минимальными затратами. Для небольших проектов подойдут конструкторы типа той же Tilda , потому что это дешево и быстро, а иногда и вовсе бесплатно.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Какие конструкторы использовать?</h3>

<h4>Tilda</h4>

<p>Здесь достаточно мало шаблонов для интернет-магазинов — всего 20. Несмотря на это, разнообразие тем позволяет создавать сайты для многих товаров. Одежда, украшения, мебель, цветы, постеры, растения и даже отдельные продукты.</p>
<p>Также есть конструктор с готовыми блоками, где при желании можно что-нибудь поменять.</p>
<p class="mark">Цена. 14 дней бесплатно. Потом — от 500 руб./мес.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Wix</h4>

<p>Удобный конструктор с большим выбором шаблонов дизайна, гибкой настройкой, возможностью базовой оптимизации. Главный минус — перенести интернет-магазин на свой домен и хостинг нельзя, экспорта товаров тоже нет. Панель управления довольно сложная.</p>
<p class="mark">Цена — от 123 р./месяц.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Bazium</h4>

<p>Обладает обширным функционалом не только для создания интернет-магазина, но и управления продажами. Есть шаблоны для разных сфер, широкие возможности для SEO, полноценная встроенная CRM. Из минусов: экспорт/импорт товаров разрешен только на самом дорогом тарифе, есть ограничения по количеству товаров (до 10000).</p>
<p><br /><span class="mark">Цена. 14 дней бесплатно. Потом — от 480 руб./мес при оплате за год</span> (магазин до 500 товаров, не доступен экспорт/импорт и промо-коды).</p>

<p>Для больших магазинов — лучше сразу использовать более продвинутые решения: системы управления контентом (CMS), которые закрывают базовые и сложные задачи интернет-магазинов.</p>
<p>Важный параметр здесь — масштаб сайта. Если трафик с рекламы составляет десятки тысяч посетителей в день, то нужно применять инструменты, которые будут выдерживать высокую нагрузку.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Какая CMS лучше?</h2>

<p>На рынке существует огромное разнообразие CMS. Среди них можно выбрать платные или бесплатные, с подключением платных модулей, с возможностью доработки или без неё. Но я хочу выделить одну, как минимум потому что я с ней работал. И вот почему.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>MODX Revolution</h3>

<p>Как по мне, так это идеальное решение. Я пользуюсь им уже на протяжении 10 лет. Одна из главных причин в том, что MODX БЕСПЛАТНЫЙ. Самый популярный компонент, на котором строятся магазины на MODX — miniShop2 — тоже бесплатный.</p>
<p>В данном случае бесплатное не значит некачественное. Дополнительные компоненты для MODX и miniShop2 можно приобрести бесплатно или за сравнительно небольшую сумму. Благодаря этому, ты не будешь тратить время на разработку с нуля, бери готовые решения, адаптируй и применяй их на своём сайте.</p>
<p>Ты можешь также использовать MODX и как фреймворк для построения своего веб-приложения. Поэтому можно встретить такую аббревиатуру: CMS/CMF</p>
<p>MODX распространяется с помощью специальной лицензии GPL. Это позволяет использовать ее для выполнения самых разных задач и любого типа сайтов, от простой визитки до крупного интернет-магазина или информационного каталога.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Что выбрать: готовое решение или разработку? </h2>

<p>Как я уже сказал, на начальном “пробном” этапе (когда возможно нужна экономия затрат) можно воспользоваться готовыми шаблонами. В будущем их можно объединить в систему управления или же вообще использовать готовые инструменты для разворачивания интернет-магазина — такие как онлайн-платформы для продаж или же готовые CMS-движки с бесплатными шаблонами для онлайн-коммерции.</p>
<p>Фактически выходит готовый интернет-магазин, который нужно только наполнить контентом. Иногда могут потребоваться быстрые доработки дизайна или структуры, добавление новых модулей. Затраты на такой сайт будут минимальны.<br />До тех пор пока у бизнеса не появятся новые требования к сайту, такой проект имеет место быть. Говоря о требованиях, я имею в виду нестандартный калькулятор или фильтр поиска, расширение базовых возможностей, фундаментальные изменения в структуре страниц или каталога. Выполнить их будет сложно, так как технические возможности у конструктора не рассчитаны на такие доработки. А если клиент планирует развивать бизнес и расти (если проект перспективный — то это в любом случае), то без продвинутых решений не обойтись.</p>
<p>Когда речь идет о полноценном интернет-магазине с широкими возможностями как управления, так и удобства для пользователей, то нужна профессиональная разработка, начиная от постановки задачи и визуального проектирования страниц сайта и их содержимого, до технической интеграции и написания программного кода. <br />Поэтому если уже на старте финансовые возможности бизнеса позволяют, то проще выполнить разработку и не покупать “кота в мешке”.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/karernyy-rost-programmista-ozhidaniya-i-realnost.html</link>
    <turbo:source>https://lectoria.pro/read/karernyy-rost-programmista-ozhidaniya-i-realnost.html</turbo:source>
    <turbo:topic>Карьерный рост программиста: ожидания и реальность</turbo:topic>
    <pubDate>Thu, 11 Nov 2021 11:15:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="208e2e5d314c1a9dfd3631fbbdd690dfde1">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/karernyy-rost-programmista-ozhidaniya-i-realnost.html" text="Карьерный рост программиста: ожидания и реальность"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Карьерный рост программиста: ожидания и реальность</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Плох ли тот программист, который никогда не стремился стать управляющим IT-компании? В этом нет ничего плохого, да и не каждый обладает качествами для командования проектом или группой специалистов. А вот большие амбиции можно приравнять к желанию стать профессионалом в своей области.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Довольно сложно выбрать стратегию роста до высшей ступени - от junior до senior и выше. Проблема в том, что в IT сфере нет универсальных критериев, по которым можно оценить позицию разработчика. Каждая компания самостоятельно их определяет и прописывает при приеме на работу.</p>
<p>В этой статье мы рассмотрим варианты карьерного пути программиста, расскажем о том, какие ожидания могут оказаться обманутыми и о наиболее перспективных для карьерного роста компаниях.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как может развиваться карьера программиста.</h2>

<p>Профессиональное развитие может идти по вертикальному или горизонтальному пути. Это зависит от того, на чем ты больше делаешь акцент: получить более высокую по статусу должность или новые знания и навыки.</p>

<h3>Вертикальный рост</h3>

<p>Это классический и наиболее распространенный путь от стажера до руководителя. Это и есть продвижение по карьерной лестнице. Повышение на службе-увеличение зарплаты-новые обязанности и расширение зоны ответственности.</p>
<p>Есть факторы, на которые специалист не может повлиять при переходе на каждую позицию, от junior к senior. И самым важным является компания, в которой он работает и ее установки. <br />И здесь может быть несколько сценариев. К примеру, разработчик 5 лет трудится в небольшой организации и вырастает до позиции senior. Он захотел перейти в другую более крупную компанию на ту же позицию, а на собеседовании выясняется, что этих навыков и знаний недостаточно для нового работодателя.</p>
<p>Другой вариант, когда программист надолго застревает в статусе middle: выполняет одни и те же задачи и самостоятельно не принимает важные решения на проекте. Это может быть связано не только с нежеланием повышать свои профессиональные навыки, но и ограниченными возможностями для роста конкретно в этой компании.</p>

<h3>Горизонтальный рост</h3>

<p>Такой вариант развития в профессии возможен, когда специалист остаётся на одной и той же должности, но при этом расширяются компетенции и он стремится к статусу эксперта в своей области. Это особенно актуально для тех, кто на позиции senior-разработчика и не хочет быть менеджером или архитектором ПО. Несмотря на то, что горизонтальный рост не равен повышению, зарплата здесь также увеличивается.</p>
<p>Какие здесь есть варианты:</p>
<ul>
<li>Можно стать <strong>экспертом в определенной области</strong>, что предполагает накопление редких знаний и опыта, которыми обладают далеко не все.</li>
<li><strong>IT-евангелист.</strong> Подойдёт в том случае, если ты находишься в статусе senior и тебе нравится обучать и мотивировать коллег. Задача в том, чтобы популяризировать технологии, делиться опытом и давать советы.</li>
<li><strong>IT-консультант.</strong> Позиция актуальна для сервисной IT-компании, где услуги не ограничиваются только разработкой ПО, а также есть комплекс дополнительных услуг. Здесь senior-разработчик сможет совмещать должность программиста и роль IT-консультанта.</li>
</ul>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Карьера программиста: ожидания и реальность</h2>

<p>А теперь о самых частых ожиданиях новичков, которые могут оказаться не правдивыми.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>1. Ожидание: у программистов большие зарплаты. </h3>

<p>Реальность: да, действительно так и есть.</p>
<p>Но тут есть подвох. Они большие, но не сразу. Первые 1-1,5 года, возможно, придется поработать за маленькую зарплату или даже бесплатно стажироваться, чтобы набрать опыт. Если повезет, то получится сразу устроиться на зп 30-50 тыс.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>2. Ожидание: устроиться программистом очень легко.</h3>

<p>Реальность: найти работу программисту не проще чем, менеджеру или переводчику.</p>
<p>Просто здесь слишком много факторов, которые влияют на трудоустройство и не относятся напрямую к твоим навыкам. Это место жительства, материальная основа, специализация, семейные обстоятельства, возраст, образование.</p>
<p>Некомпетентность некоторых HR-менеджеров тоже может стать преградой. Зачастую их необъективность и общая политика компании мешают при устройстве, даже если на должность у тебя нет конкурентов.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>3. Ожидание: Программистом работать интересно.</h3>

<p>Реальность: интерес иногда быстро угасает.</p>
<p>На первый взгляд многим кажется, что программирование это красочные приложение на смартфоне, анимированные веб-сайты, игры или ПО аж для космических разработок. На самом же деле за всем этим стоит работа десятков специалистов, бесконечные строки кода и т.д. Могу представить себе мысли такого новоиспечённого «зелёного» специалиста и уровень его разочарования.</p>
<p>Вторая причина в низком качестве образования и погоня компаний за количеством, а не качеством. Такая ситуация в нашей стране во многих областях, и у юристов, и у экономистов.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>4. Ожидание: IT специальности это безвредное производство. </h3>

<p>Реальность: страдает физическое и психологическое здоровье.</p>
<p>Во-первых, суставы — из-за недостаточной подвижности. Во-вторых, это также нервы, как в любой умственной работе (планерки, документация, дедлайны и переговоры с заказчиками). В-третьих, портится зрение из-за постоянного сидения перед экраном.<br />А еще ненормированный график работы, который приводит к хроническому недосыпу и регулярным перекусам вместо полноценного обеда/ужина.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>В каких компаниях больше возможностей для профессионального роста.</h2>

<p>Когда не видишь перспектив роста в своей нынешней компании, приходится менять место работы. Например, стать проджект-менеджером больше шансов в крупной развивающейся компании, где растёт штат и проекты не ограничиваются стандартными задачами. <br />Сервисная или продуктовая компания — вот на что еще нужно ориентироваться — это тип организации. Продуктовые компании лучше подойдут тем, кто точно знает, в каких технологиях хочет развиваться. Здесь можно будет сфокусироваться на одном направлении, но в чем-то новом придётся себе отказать, будет трудно переключиться. Сервисную компанию нужно выбирать в том случае, когда важнее разнообразие проектов, не ограниченных ни стеком технологий, ни одной сферой бизнеса.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Новичкам лучше выбирать крупные сервисные компании, где будет возможность поработать в разных проектах и командах. Программист всегда учится у более опытных коллег, и если в команде мало специалистов, то ограничен и трансфер знаний. А проработав 5-7 лет в IT-компании, где сотни сотрудников, программист получит профессиональный капитал, с которым будет проще реализоваться в любой компании, как сервисной, так и продуктовой, или развивать свой стартап.</p>

<p>Карьерная лестница должна вести не только к повышению зарплаты, но и квалификации и профессионального мастерства. Больше возможностей будет в той компании, где программист не ограничен статусом senior, а может попробовать себя и в других ролях.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Мой совет: При устройстве на работу, уточняй, каким образом в компании «растут» сотрудники и какие у них критерии, по которым определяют готовность специалиста для перехода на следующую ступень карьеры. Так будет проще планировать свой профессиональный путь.</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/otlichie-nastroek-prilozheniya-ot-nastroek-okruzheniya.html</link>
    <turbo:source>https://lectoria.pro/read/otlichie-nastroek-prilozheniya-ot-nastroek-okruzheniya.html</turbo:source>
    <turbo:topic>Отличие настроек приложения от настроек окружения</turbo:topic>
    <pubDate>Fri, 03 Dec 2021 10:15:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="21037cb5a36a29388b37f3b4fb743efddf2">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/otlichie-nastroek-prilozheniya-ot-nastroek-okruzheniya.html" text="Отличие настроек приложения от настроек окружения"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">В чем отличие настроек приложения от настроек окружения на примере Laravel</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>При разработке веб-приложения рано или поздно встает вопрос деплоя и поддержки. О том, как нам в этом помогут настройки приложения и окружения, поговорим на примере популярного php-фреймворка Laravel. Даже если вы ни разу им не пользовались, суть вы должны уловить.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Когда вы создаете новое приложение (даже если это обычный веб-сайт), рано или поздно встает вопрос деплоя, или простым языком переноса на боевой сервер, на котором, скорее всего отличается некоторый набор параметров. Например:</p>
<ul>
<li>Настройки подключения к базе данных</li>
<li>Доменное имя</li>
</ul>
<p>Очевидно, что в программном коде ваших подмодулей и составляющих, где вы обращаетесь к этим значениям, удобно использоваеть некоторую переменную, вместо того, чтобы явно указывать значение. То есть, вместо:</p>

<pre class="line-numbers"><code class="language-php">$connection = new DbConnection('vasya', 'superStrongPassword');</code></pre>

<p>Написать что-то вроде такого:</p>

<pre class="line-numbers"><code class="language-php">$connection = new DbConnection($config-&gt;user, $config-&gt;password);</code></pre>

<p>Детали и особенности обращения к переменной конфигурации могут отличаться, в зависимости от реализации, фреймворка и подхода разработчика, но суть остается той же: <span class="mark">заменить явное использование значения на конфигуриремую переменную.</span></p>
<p>А сама переменная <strong>$config</strong> где-то в момент запуска приложения будет наполняться значениями, которые хранятся в конфигурационном файле.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Как хранить настройки приложения</h2>

<p>Любой уважающий себя разработчик, хранит код в git-репозитории, в том числе и файл(-ы) конфигурации. Но хранит не совсем ту конфигурацию, которая используются на локальном или боевом сервере, а всего лишь пример конфигурации (так называемую sample-конфигурацию), наполненной либо значениям по-умолчанию, либо какими-то тестовыми значениями, которые необходимо заменить на свои.</p>
<p>Выглядеть этот файл конфигурации может так:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php

return &#91;
	'domain' =&gt; 'example.com',
	'username' =&gt; 'example',
	'password' =&gt; 'pleaseСhangeMe',
	'dbtype' =&gt; 'mysql',
	'dbserver' =&gt; 'localhost',
	//... и так далее
&#93;;</code></pre>

<p>Хранится такой файл наряду с другими конфигурационными файлами различных подмодулей в каталоге <strong>config</strong> (так, например, устроено в Laravel и некоторых других фреймворках).</p>
<p>Суммарное количество настроек во всех файлах конфигурации может достигать несколько сотен. Деплой такого проекта может значительно затянуться из-за просмотра большого числа настроек и их редактирования.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Чаще всего при деплое нужно поменять не все настройки, а только лишь некоторый ограниченный набор. Для этого на помощь приходят файлы окружения.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            <div class="news_block_text border_mod"><p>Файлы окружения — это такие же файлы настроек, но с некоторыми особенностями</p></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Настройки окружения (.env)</h2>

<p>По сути, файлы настроек окружения — это такие же файлы настроек, но:</p>
<ol>
<li>во-первых, файл окружения, как правило не хранят в git-репозитории (а хранят как пример example-файл)</li>
<li>во-вторых, в этот файл выносят ограниченный набор настроек, с которыми вы чаще всего будете работать</li>
<li>в-третьих, в этом файле чаще всего содержатся именно те настройки, которые нужно поменять при переносе на другой сервер — это могут быть флаги отключения отладочного режима, ключи доступа к API, настройки почты и так далее — все то, что на локальном сервере имеет другие значения</li>
</ol>
<p>При этом в самом файле конфигурации (не окружения) мы можем обратиться к настройке окружения и задать при этом значение по-умолчанию на тот случай, если запрашиваемой настройки нет в файле окружения:</p>

<pre class="line-numbers"><code class="language-php">&lt;?php

return &#91;
	'domain' =&gt; env('APP_DOMAIN', 'example.com'),
	'username' =&gt; env('DB_USERNAME'),
	'password' =&gt; env('DB_PASSWORD'),
	'dbtype' =&gt; env('DB_TYPE', 'mysql'),
	'dbserver' =&gt; env('DB_SERVER', 'localhost'),
&#93;;</code></pre>

<p>При этом файл настроек окружения (в Laravel) лежит в корневом каталоге проекта, называется <strong>.env</strong> и выглядит примерно так:</p>

<pre class="line-numbers"><code class="language-bash">APP_DOMAIN=mywebsite.com
DB_USERNAME=vasya
DB_PASSWORD=myStrongPassword
DB_SERVER=localhost</code></pre>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Резюме</h2>

<p>Файлы настроек окружения содержат относительно узкий набор часто меняемых настроек и настроек, которые зависят от рабочей станции (или, если правильнее — от окружения), а файлы настроек содержат весь набор варьируемых параметров, от которых зависит работа приложения или его подмодулей, среди которых есть те параметры:</p>
<ul>
<li>которые чаще всего работают "из коробки"</li>
<li>которые нужно изменить всего один раз и они будут иметь одинаковые значения вне зависимости от окружения (сервера)</li>
<li>которые транслируются из настроек окружения.</li>
</ul>
<p>Удачи в веб-разработке. Задавай вопросы в комментариях, подписывайся на <a href="https://www.youtube.com/channel/UCuzjhRFc0S85MWIsaeZym8Q" target="_blank">Youtube-канал Lectoria</a> и обязательно подписывайся на наши соцсети: <a href="https://instagram.com/lectoria.pro" target="_blank">Instagram</a>, <a href="https://vk.com/lectoria" target="_blank">VK</a>, <a href="https://fb.com/lectoria.pro" target="_blank">Facebook</a>.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/kak-effektivno-rabotat-na-udalenke-7-shagov.html</link>
    <turbo:source>https://lectoria.pro/read/kak-effektivno-rabotat-na-udalenke-7-shagov.html</turbo:source>
    <turbo:topic>Как эффективно работать на удаленке: 7 шагов</turbo:topic>
    <pubDate>Mon, 06 Dec 2021 10:15:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="209fd24709190553340809ef1c6dc3b9c4a">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/kak-effektivno-rabotat-na-udalenke-7-shagov.html" text="Как эффективно работать на удаленке: 7 шагов"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">7 шагов для эффективной работы на удаленке</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Если ты хоть раз мечтал проснуться на пару часов позже и работать, не вылезая из постели, то хочу огорчить тебя. Все не так гладко как кажется. Такой режим подойдет не каждому.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В этой статье я хочу затронуть тему “домашней работы”, почему в реальности выходит все не так, как пишут в “интернетах”. О том, как обойти эти недостатки удаленки и выстроить эффективный рабочий процесс.</p>
<p>Успех дистанционной работы зависит от двух сторон: руководителю нужно быть готовым создать условия и контролировать процесс, а сотруднику — организовать себя и свой график. И у многих с этим возникают проблемы.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>В чем сложность удаленки для программистов?</h2>

<p>Дома, на удаленке тебя будут отвлекать не меньше, чем на работе, возможно и больше. Это могут быть твои домочадцы, ребенок или же домашний питомец. Но даже если дома обычно никого нет, это не значит что получится нормально сконцентрироваться.<br />Часто создается иллюзия большей свободы действий — организовывать все так, как удобно тебе, главное делать все качественно и в срок. Так что же мешает? Здесь много соблазнов в виде холодильника под рукой или телевизора на фоне. Тем более нет контроля руководства. Кажется, что на работу времени уходит столько же, а на самом деле успеваешь сделать меньше. Так можно и весь рабочий настрой потерять.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_mod">
                    <p>Есть и другая сторона. Когда начинаешь работать только проснувшись — это может привести к профессиональному выгоранию.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Ты привыкаешь к тому, что дом и работа это одно и то же и перестаёшь разграничивать эти понятия. Голова забита рабочими задачами 24 часа в сутки и становится невозможно отвлечься и отдохнуть.</p>
<p>Когда ты как бы оторван от коллектива, кажется, что что-то упускаешь. Да, «дистанционка» даёт возможность оставаться на связи с офисом постоянно. Но зачастую создаётся впечатление, что ты во время таких конференций больше сторонний наблюдатель, а не активный участник. Плюс ко всему могут возникать технические неполадки, что добавляет ещё больше неуверенности в собственной нужности для компании.</p>
<p>Если говорить о начальнике, то чисто психологически коллега, которого он видит постоянно вживую, вызывает у него больше доверия. Он может наблюдать его мотивацию, трудолюбие и ответственное отношение.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>7 шагов к эффективной работе на удаленке</h2>

<p>А теперь о принципах, которые помогут облегчить удалённую работу:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Планируй все и распределяй по важности</h4>

<p>Записать в блокноте все задачи на неделю и затем распределить на каждый день — с этого нужно начинать рабочий день. И составлять этот список начиная от самых важных и срочных дел по убывающей. Выполняй блок самых приоритетных задач в самом начале, несмотря на гнев, отрицание или желание перейти к другой задаче.</p>
<p>Я расставляю приоритеты так:</p>
<ol>
<li>Задачи, за которые я ручаюсь головой</li>
<li>Задачи, у которых выходит дедлайн</li>
<li>Задачи, результаты которых могут повлиять на работу всех сотрудников</li>
</ol>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Создай рабочую атмосферу</h4>

<p>Личное мне не помогает этот фокус с переодеваниями в работника дома — пиджак, кофе в корпоративной кружке, туфли, то есть делать вид, что ты в офисе. В первое время это может помочь, но не надолго.</p>
<p>А вот смена локации может стать выходом: сделать небольшую перестановку или повернуть рабочий стол к окну/стене. В общем, нужно сделать так, чтобы дом в рабочее время не ассоциировался с досугом и местом отдыха. Когда совсем все плохо, сядь на пол или запрись где-нибудь в кладовке (я не шучу). Я как-то писала пост, сидя на полу на балконе, но тогда это добавило мне концентрации и скорость работы.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Отдыхай, когда устал</h4>

<p>Режим офисной работы в 9:00 до 18:00 с перерывом на обед с переходом в «Хоум-офис» становится непродуктивным, а иногда даёт обратный эффект, а то и отторжение. Потому что как раньше уже быть не может.</p>
<p>Как ни странно, но комфортная среда дома давит намного сильнее. Чувствуешь, что голова не соображает? Соберись и выйди погулять на полчаса, к тому же физическая активность и свежий воздух улучшают мозговую деятельность.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Установи дедлайны </h4>

<p>Работники уходят на удаленку для того, чтобы избавиться от прессинга и давления со стороны. А я недавно поняла, что мне лучше работается, когда на меня оказывается хотя бы небольшое давление. Поэтому дома тоже нужно определить для себя какие-то ограничения. Ставить дедлайн на каждую задачу, тогда работается лучше. Чем больше времени у меня есть, тем медленнее идёт работа, и тем меньше я делаю. Так что приходится самостоятельно устанавливать себе сроки.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Поработай где-то вне дома</h4>

<p>Периодически нужно выходить из дома и идти работать в другое место. Это странно, но когда я работаю в кафе или коворкинге, я успеваю сделать больше. Я чувствую себя более продуктивной вне дома, несмотря на шумную обстановку и людей вокруг.</p>
<p>Дома кажется, что есть ещё полно времени и ты откладываешь работу до последнего, а выходя из дома мы на подсознательном уровне устанавливаем себе ограничения в сроках.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Определи длительность рабочего дня</h4>

<p>Находясь дома, рабочее время становится понятием расплывчатым, если заранее не установить время окончания рабочего дня или определить событие, которое будет означать его завершение. Я использую второй вариант — с утра определяю список задач на день и заканчиваю работу, как только их выполню.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h4>Поощряй себя «плюшками»</h4>

<p>Можно подкупать себя за проделанную работу. Определи для себя небольшие поощрения, которые ты сможешь позволить себе, только исполнив какое-то поручение или задачу. Это может быть перерыв на кофе или просмотр ленты инстаграма.</p>
<p>Ожидание какой-то «плюшки» — это не только отличный стимул, но и помощь в ускорении работы.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Кому подходит удаленка</h2>

<p>Я думаю, что домашний формат подойдет тем, кто любит работать, ориентируясь на отдельные задачи. А ещё для творческих профессий — с тем условием, что работник сумеет себя «собрать» и организовать процесс. Но если ты хочешь набраться опыта и увидеть весь процесс изнутри, нужно хотя бы на первых порах устроиться в офис. Или, если чувствуешь, что дома не та обстановка. Офис помогает быть «в тонусе», позволяет общаться с коллегами и заводить новые знакомства. Но принципиально твой подход к делу это не изменит.</p>
<p>Выбирай те условия, которые будут лучше стимулировать. Потому что «выгореть» можно где угодно. В конце концов все будет зависеть от того, насколько тебе удастся сохранять мотивацию и интерес к делу. Качество работы, сделанной только из-за денег и той, что выполнена с горящими глазами, сильно отличается.</p>
<p>Есть такие люди, которые ради возможности работать удаленно готовы согласиться на небольшую зарплату, несмотря даже на их высокую квалификацию. Причем за ними не надо бегать с напоминаниями — они подходят к делу ответственно и с самоотдачей.</p>
<p>А если до офиса еще и нужно добираться часа 2, то тут выбор очевиден в сторону удаленки. Можно потратить это время на то, чтобы подольше поспать с утра или заняться спортом.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/sobytiya-i-slushateli-v-laravel.html</link>
    <turbo:source>https://lectoria.pro/read/sobytiya-i-slushateli-v-laravel.html</turbo:source>
    <turbo:topic>События и слушатели в Laravel</turbo:topic>
    <pubDate>Wed, 06 Apr 2022 15:18:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="211b1e784eb91b811eb3097a032dea9d97e">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/sobytiya-i-slushateli-v-laravel.html" text="События и слушатели в Laravel"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">События и слушатели в Laravel</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>События Laravel обеспечивают простую реализацию паттерна "Наблюдатель" (Observer), позволяя вам подписываться и отслеживать различные события, происходящие в вашем приложении. Классы событий обычно хранятся в каталоге app/Events, а их слушатели – в app/Listeners, но это не обязательно.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Преимущество такого паттерна состоит в разделении различной логики вашего приложения. При этом одно событие может иметь много независимых друг от друга слушателей. Например, вы хотите получать каждый раз уведомление о том, что у вас новый зарегистрированный пользователь на сайте. Для этого вам не нужно вносить изменения в класс регистрации пользователей или каким-то образом расширять его. Достаточно создать класс независимого слушателя события "Регистрация" (подписаться на событие), внутри которого и будет реализована логика уведомления.</p>

<h2>Регистрация событий и слушателей</h2>

<p>Связью событий и слушателей в Laravel занимается класс App\Providers\EventServiceProvider. Laravel предоставляет возможность осуществить эту связку несколькими различными способами, а вы вправе использовать как только один, так и несколько способов одновременно, в зависимости от логики вашего приложения и отдельных его компонентов.</p>

<h3>Явная связка</h3>

<p>Явный способ позволяет наглядно задать событие и набор классов-обработчиков, реагирующих на это событие при помощи поля $listen вышеупомянутого класса App\Providers\EventServiceProvider:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">class EventServiceProvider &#123;
	...
	protected $listen = &#91;
	    EventClass::class =&gt; &#91;
	        EventListener::class,
	        EventListener2::class,
	        ...
	    &#93;,
	    Event2Class::class =&gt; &#91;
	        Event2Listener::class,
	        Event2Listener2::class,
	        ...
	    &#93;,

	&#93;;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Динамическая связка</h3>

<p>В отличие от предыдущего способа, мы также имеем возможность связывать обработчик (слушатель) с событием в процессе выполнения при помощи фасада Event, например в методе boot класса EventServiceProvider:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">//Обработчиком события MyEvent будет метод handle класса MyEventHandler
Event::listen(
	MyEvent::class, &#91;MyEventHandler::class, 'handle'&#93;
);</code></pre>

<pre class="line-numbers"><code class="language-php">//Обработчиком события MyEvent будет анонимная функция, объявленная внутри аргумента метода Event::listen
Event::listen(function (MyEvent $event) &#123;
    //логика обработки
&#125;);</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Групповая связка</h3>

<p>Если мы хотим задать один обработчик сразу на несколько событий, имена которых попадают под указанный паттерн, то мы можем воспользоваться следующей конструкцией:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">Event::listen('user.*', function ($eventName, array $data) &#123;
    //
&#125;);</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Автообнаружение слушателей (неявная связка)</h3>

<p>В отличие от двух вышеуказанных методов данный способ доступен только в том случае, если внутри класса EventServiceProvider описан метод, дающий Laravel инструкцию для запуска механизма автоматического обнаружения обработчиков, лежащих в каталоге app/Listeners:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">public function shouldDiscoverEvents()
&#123;
    return true;
&#125;

/**
 * Получить каталоги слушателей, которые следует использовать для обнаружения событий.
 *
 * @return array
 */
protected function discoverEventsWithin()
&#123;
    return &#91;
        $this-&gt;app-&gt;path('Listeners'),
    &#93;;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Для того, чтобы понимать, как именно Laravel будет связывать события с обработчиками, необходимо понять структуру класса обработчика. В минимальном варианте класс обработчик (слушатель) должен содержать в себе метод handle:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">namespace App\Listeners;

class MyEventHandler &#123;
	...
	public function handle(MyEvent $event)&#123;
		//Логика обработки
	&#125;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Именно благодаря сигнатуре метода handle, указывающей явно на класс события MyEvent, Laravel "поймет", что данный обработчик слушает событие MyEvent.</p>

<p>Для того, чтобы Laravel произвел процедуру связки через автообнаружение и закешировал связь событий и слушателей, можно запустить команду:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">php artisan event:cache</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если кеша ранее не было и команда кеширования не запускалась ранее, то кеш будет создан при первом запуске приложения (например при заходе пользователя на веб-страницу).</p>

<p>Для очистки кеша, которая может потребоваться, когда вы создали новые события и новые обработчики, необходимо запустить:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">php artisan event:clear</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Генерация классов событий и слушателей</h2>

<h3>Автоматическая генерация классов слушателей и событий</h3>

<p>Вы можете сгенерировать заготовки под них при помощи команды</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">php artisan event:generate</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Данная команда создаст классы для тех событий и слушателей, которые перечислены в поле $listen класса EventServiceProvider и классы которых еще не созданы</p>

<h3>Самостоятельная генерация классов слушателей и событий</h3>

<p>Если вы хотите создать классы событий и слушателей самостоятельно (например для автообнаружения), то используйте следующие команды:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-bash">php artisan make:event MyEvent</code></pre>

<pre class="line-numbers"><code class="language-bash">php artisan make:listener SendPodcastNotification --event=PodcastProcessed</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Параметр <code>--event</code> в команде создания слушателя позволяет автоматически в методе handle указать явно класс события, которое должен слушать данный обработчик (слушатель).</p>

<h2>Добавление слушателей в очередь</h2>

<p>В определенных ситуациях нам может потребоваться запустить обработчик события через очередь, для того, чтобы не блокировать основной поток приложения и тем самым не замедлять его работу. Механизмы работы с событиями и слушателями в Laravel позволяют это сделать без особых танцев с бубном.</p>

<h3>Размещение анонимного обработчика в очередь</h3>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">Event::listen(queueable(function (MyEvent $event) &#123;
        //Логика обработчика
    &#125;));</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Добавление параметров очереди</h3>

<p>Также вы можете задать параметры обработки через очередь:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">Event::listen(queueable(function (MyEvent $event) &#123;
    //
&#125;)-&gt;onConnection('redis')-&gt;onQueue('myevents')-&gt;delay(now()-&gt;addSeconds(10)));</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Обработка неудачных событий</h3>

<p>При возникновении проблем при обработке события, вы также можете перехватывать такие ситуации:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">Event::listen(queueable(function (MyEvent $event) &#123;
    //
&#125;)-&gt;catch(function (MyEvent $event, Throwable $e) &#123;
    // Событие в очереди завершилось неудачно ...
&#125;));</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Запуск класса-обработчика автоматически в очереди</h3>

<p>В отличие от анонимных обработчиков, классы-слушатели могут быть обработаны через очередь путем указания имплементации интерфейса <code>Illuminate\Contracts\Queue\ShouldQueue</code>:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">use Illuminate\Contracts\Queue\ShouldQueue;

class MyEventListener implements ShouldQueue &#123;
...
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>При этом параметры очереди можно задать при помощи полей внутри класса:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">class MyEventListener implements ShouldQueue &#123;
	public $connection = 'redis';
	public $queue = 'myevents';
	public $delay = 120;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Если вы хотите определить очередь и соединение динамически во время выполнения, используйте методы:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">public function viaQueue()
&#123;
    return 'myevents';
&#125;

public function viaConnection()
&#123;
    return 'redis';
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Помимо прочего, вы можете динамически определять, стоит ли данный обработчик отправлять в очередь или исполнить его в текущем потоке немедленно:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">use Illuminate\Contracts\Queue\ShouldQueue;

class MyEventListener implements ShouldQueue &#123;
...
    public function shouldQueue(MyEvent $event)
    &#123;
        return $event-&gt;isTooBig;
    &#125;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Дополнительные детали обработки неудачных выполнение обработчика можно задать при помощи методов, реализуемых трейтом InteractsWithQueue</p>

<h2>Отправка событий (генерация события)</h2>

<p>Достаточно вызвать метод dispatch класса события. При этом в качестве параметров передаются те же параметры, которые требуются в конструкторе класса события:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">MyEvent::dispatch($param);</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Класс-подписчик</h2>

<p>Еще один способ сгруппировать логику событий и обработчиков — создать класс-подписчик, который реализует внутри себя логику подписки на одно или несколько событий. Для того, чтобы Laravel мог понять, какие подписчики необходимо запустить, перечислите их в поле $subscribe класса EventServiceProvider:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">/**
 * Классы подписчиков для регистрации.
 *
 * @var array
 */
protected $subscribe = &#91;
	App\Listeners\MyEventSubscriber::class,
&#93;;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Далее определяем класс подписчик:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">&lt;?php

namespace App\Listeners;

class MyEventSubscriber
&#123;
    public function myEventHandler1($event)&#123;
	    //Некая функция-обработчик события
    &#125;
    
    public function myEventHandler2($event)&#123;
	    //Некая вторая функция-обработчик события
    &#125;

    public function subscribe($events)
    &#123;
		    //Связываем обработчик 1 и событие MyEvent
        $events-&gt;listen(
            MyEvent::class,
            &#91;MyEventSubscriber::class, 'myEventHandler1'&#93;
        );

				//Связываем обработчик 2 и событие MyEvent
        $events-&gt;listen(
            MyEvent::class,
            &#91;MyEventSubscriber::class, 'myEventHandler2'&#93;
        );
    &#125;
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Заключение</h2>

<p>Как мы выяснили выше, Laravel предоставляет гибкие способы задания событий и слушателей, которые подойдут как для небольших веб-приложений, так и для огромных сервисов. А четкая структуризация при помощи каталогов и пространств имен позволит вам не запутаться в событиях и обработчиках по мере роста вашего приложения.</p>

<p>Успехов в веб-разработке!</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>
<item turbo="true">
    <link>https://lectoria.pro/read/laravel-guards.-autentifikatsiya-polzovateley.html</link>
    <turbo:source>https://lectoria.pro/read/laravel-guards.-autentifikatsiya-polzovateley.html</turbo:source>
    <turbo:topic>Laravel Guards. Аутентификация пользователей</turbo:topic>
    <pubDate>Thu, 26 May 2022 11:00:00 +0300</pubDate>
    <author></author>
    <metrics>
        <yandex schema_identifier="21210c65e426b9072cc2202e1e134d09d0b">
            <breadcrumblist><breadcrumb url="https://lectoria.pro/" text="Главная"/>
<breadcrumb url="https://lectoria.pro/read/" text="Интересные статьи"/>
<breadcrumb url="https://lectoria.pro/read/laravel-guards.-autentifikatsiya-polzovateley.html" text="Laravel Guards. Аутентификация пользователей"/></breadcrumblist>        </yandex>
    </metrics>
    <yandex:related></yandex:related>
    <turbo:content>
        <![CDATA[
        <header class="news_block_w">
            <h1 class="section_title offset_v5_mod">Laravel Guards. Аутентификация пользователей</h1>
            <div class="news_block">
                <div class="news_block_in left_side_mod">
                    <div class="news_block_body">
                        <div class="news_block_body_in">
                                                            <p>Когда я столкнулся впервые с аутентификацией в Laravel, я все делал по примеру из документации, но логику, если честно, до конца не понимал, так как раньше я обходился всего лишь одним понятием "Пользователь" — он либо аутентифицирован, либо нет. В Laravel же логика аутентификации тесно связана с такими понятиями, как Auth Manager, Guard, User Provider, Guard Driver, Provider Driver, и, похоже, это не все.</p>
                                                    </div>
                    </div>
                </div>
            </div>
        </header>
        <div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>В этой статье я не буду показывать, как сделать форму аутентификации, но попытаюсь объяснить, как связаны все эти термины между собой. Разобравшись в этом, ты сможешь лучше понимать механизм аутентификации Laravel, а также сможешь создавать свои нестандартные решения.</p>

<h2>Терминология</h2>

<p>Итак, давай определим для начала, что означает Guard и Provider.</p>

<p><strong>Guard Driver</strong> — это способ аутентификации пользователя при каждом запросе. Одним из стандартных драйверов guard-ов является <code>session</code> — способ, при котором с помощью механизма php-сессий и cookies состояние пользователя восстанавливается при каждом запросе и система "опознает" таким образом пользователя, который совершает запрос.</p>

<p><strong>User Provider</strong> — это способ, с помощью которого пользователи вытаскиваются из некоторого постоянного хранилища. В Laravel по-умолчанию предусмотрен способ с помощью моделей Eloquent и с помощью Database Query Builder (строителя запросов к базе данных). User Provider определяет драйвер модели (Eloquent или Database Query Builder) и дополнительные параметры, которые нужны для этого провайдера (например класс модели, или имя таблицы с пользователями). Каждый User Provider имеет свое уникальное имя (ключ), которое указывается в настройках Guard.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p><strong>Guard</strong> — в рамках настроек Laravel это связка определенного guard-драйвера и user-провайдера, обозначенная уникальным именем (ключом), например web, admin, manager и так далее, и являет собой механизм аутентификации пользователя и хранения (или не хранения) состояния.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_2_mod">
                    <p>Классический пример: пользователей мы будем аутентифицировать и хранить в сессии, а самих пользователей будем доставать при помощи модели Eloquent.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Как мы выяснили выше, Guard-ов может быть несколько. Это нужно для того, чтобы создавать на сайте несколько областей, где требуется своя отдельная аутентификация.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in accent_mod bg_2_mod">
                    <p>Например, у нас есть личный кабинет пользователя и админка сайта. Пользователи личного кабинета и администраторы сайта хранятся в разных таблицах и мы не хотим, чтобы пользователи личного кабинета могли входить в админку при помощи своего логина и пароля. Для этого, как раз могут пригодиться два разных Guard-а, которым мы можем дать имена "web" и "admin" или "frontend" и "backend"</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>Пример (настройки, хранимые в файле конфигурации: config/auth.php):</p>

<pre class="line-numbers"><code class="language-php">...
//Guards
'guards' =&gt; &#91;
    //👇 ключ guard-а
    'admin' =&gt; &#91;
        'driver' =&gt; 'session', //👈 Guard Driver
        'provider' =&gt; 'admin_users', //👈 Ключ User Provider-а
    &#93;,
    
    //👇 ключ guard-а    
    'web' =&gt; &#91;
        'driver' =&gt; 'session', //👈 Guard Driver
        'provider' =&gt; 'users', //👈 Ключ User Provider-а
    &#93;,
&#93;,
...

//User providers
'providers' =&gt; &#91;
    'admin_users' =&gt; &#91;
        'driver' =&gt; 'eloquent', //👈 Provider Driver
        'model' =&gt; Brackets\AdminAuth\Models\AdminUser::class, //👈 Класс модели
    &#93;, 
    
    'users' =&gt; &#91;
       'driver' =&gt; 'database', //👈 Provider Driver
       'table' =&gt; 'users', //👈 имя таблицы, в которой хранятся пользователи
    &#93;,
&#93;,</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Guard по-умолчанию</h2>

<p>В рамках одного приложения, как ты заметил, может быть несколько guard-ов. Один из этих guard-ов можно назначить guard-ом по-умолчанию. То есть, если ты явно не будешь указывать, к какому из guard-ов ты обращаешься, будет использоваться guard по-умолчанию.</p>

<p>В настройках приложения, а именно в файле config/auth.php есть такая настройка:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">...
'defaults' =&gt; &#91;
    'guard' =&gt; 'web', //👈 по-умолчанию используется guard 'web', который мы описали выше
    ...
&#93;,
...</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>AuthManager и фасад Auth</h2>

<p>При помощи фасада Auth и класса AuthManager, в который ведет этот фасад, в Laravel мы можем осуществлять операции, связанные с аутентификацией пользователя: аутентифицировать с проверкой реквизитов (логин/пароль), аутентифицировать безусловно по id пользователя, "разлогинивать" пользователя и так далее.</p>

<h2>Слабая связанность и абстракция</h2>

<p>Чтобы AuthManager мог абстрагироваться от конкретной реализации вашей модели пользователей и от того, каким классом представлен User Provider, на помощь приходят контракты (интерфейсы):</p>

<ul>
<li>Illuminate\Contracts\Auth\UserProvider</li>
<li>Illuminate\Contracts\Auth\Authenticatable</li>
</ul>

<p>Первый позволяет абстрагироваться от конкретной реализации того, каким именно способом мы будем вытаскивать пользователей из постоянного хранилища (как пример, базы данных).</p>

<p>Второй позволяет абстрагироваться от класса модели пользователя.</p>

<p>Все, что вам нужно, чтобы реализовать какую-либо свою, нестандартную логику — это реализовать методы данных интерфейсов в соответствующих своих классах.</p>

<p>По-умолчанию, модель пользователя App\Models\User, которая идет в Laravel "из коробки" уже реализует интерфейс Authenticatable неявным образом через наследуемый класс Illuminate\Foundation\Auth\User:</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">&lt;?php

namespace App\Models;
...
use Illuminate\Foundation\Auth\User as Authenticatable;
//обратите внимание на этот 👇 класс
class User extends Authenticatable &#123;
...
&#125;</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <p>А вот внутри класса Illuminate\Foundation\Auth\User уже реализован упомянутый выше интерфейс (контракт).</p>

<h2>Как аутентифицировать пользователя</h2>

<h3>Аутентификация с проверкой реквизитов с использованием guard по-умолчанию</h3>

<p>Метод attempt вернет true и аутентифицирует пользователя в случае, если указан корректный email и пароль и false — в ином случае.</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">Auth::attempt(&#91;'email' =&gt; 'blabla@email.com', 'password' =&gt; 'myVeryStrongPassword'&#93;);</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Аутентификация с проверкой реквизитов с явным указанием guard</h3>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">Auth::guard('admin')-&gt;attempt(&#91;'email' =&gt; 'blabla@email.com', 'password' =&gt; 'myVeryStrongPassword'&#93;);</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Безусловная аутентификация по id</h3>

<p>В отличие от метода attempt, данный метод ничего не возвращает, и просто успешно аутентифицирует пользователя с id = 5</p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">Auth::loginUsingId(5);</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h3>Безусловная аутентификация по id с указанием guard и запоминанием в сессии</h3>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-php">Auth::guard('admin')-&gt;loginUsingId(5, true);</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Работа с аутентифицированным пользователем</h2>

<p>После того, как мы аутентифицировали пользователя, мы можем обращаться к методу <code>Auth::user()</code> или <code>Auth::guard('имя_guard-a')-&gt;user()</code>, чтобы получить доступ к объекту пользователя, который в данный момент работает с приложением.</p>

<h2>Условное отображение блоков в зависимости от аутентифицированности пользователя в шаблонах blade</h2>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w">
    <div class="news_block">
        <div class="news_block_in single_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <pre class="line-numbers"><code class="language-html">&lt;strong&gt;Этот контент виден всем&lt;/strong&gt;
@auth
&lt;strong&gt;Этот контент виден только пользователям аутентифированным в guard-е по-умолчанию&lt;/strong&gt;
@endauth

@auth('admin')
&lt;strong&gt;Этот контент виден только пользователям аутентифированным в guard-е admin&lt;/strong&gt;
@endauth</code></pre>
                </div>
            </div>
        </div>
    </div>
</div>

<div class="news_block_w content_mod">
    <div class="news_block">
        <div class="news_block_in left_side_mod">
            <div class="news_block_body">
                <div class="news_block_body_in ">
                    <h2>Заключение</h2>

<p>Уверен, что теперь ты стал лучше понимать, как работает механизм аутентификации в Laravel, а если вдруг чего-то не понял, задавай вопросы в комментариях или в нашем <a href="https://t.me/lectoriachat">telegram-чате</a></p>
                </div>
                <div class="right_side_content_w">
                    <div class="right_side_content">
                        <div class="right_side_content_in">
                            
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>        ]]>
    </turbo:content>
</item>    </channel>
</rss>