Codeigniter (php)

APPTASK
0 Комментарии
Время чтения: 5 минут(ы)
Статья отправлена на e-mail

Оглавление

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

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

Кроме того, CodeIgniter поддерживает архитектурный стиль MVC (Model-View-Controller), что позволяет разделять бизнес-логику, пользовательский интерфейс и управление данными. Это, в свою очередь, облегчает поддержку и расширение приложений, так как делает код более структурированным и управляемым.

Полное руководство по CodeIgniter: лучший PHP фреймворк для веб-разработки

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

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

Что такое CodeIgniter?

CodeIgniter — это фреймворк на основе PHP, который следует паттерну проектирования MVC (Model-View-Controller). Он предоставляет набор библиотек и инструментов для упрощения разработки, включая поддержку работы с базами данных, обработку форм, а также возможность создания RESTful API. Благодаря такому подходу разработчики могут разделить бизнес-логику, представление и управление данными, что улучшает код и снижает вероятность ошибок.

Основные компоненты CodeIgniter

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

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

Преимущества CodeIgniter

Использование CodeIgniter имеет множество преимуществ:

  • Легкость и простота: CodeIgniter предоставляет простой и интуитивно понятный интерфейс, что позволяет быстро освоить его даже новичкам.
  • Высокая производительность: фреймворк оптимизирован для быстрой работы и требует минимальное количество ресурсов сервера.
  • Гибкость: позволяет легко интегрировать сторонние библиотеки и модули.
  • Хорошая документация: CodeIgniter имеет обширную и понятную документацию, что облегчает процесс разработки.

Недостатки CodeIgniter

Хотя CodeIgniter имеет много положительных сторон, его использование также имеет свои ограничения:

  • Устаревшие технологии: некоторые части фреймворка используют устаревшие технологии, что может вызвать проблемы с совместимостью.
  • Меньшая популярность: по сравнению с другими фреймворками, такими как Laravel, у CodeIgniter меньшая популярность и меньшее сообщество.

Установка CodeIgniter

Установка CodeIgniter не занимает много времени и состоит из нескольких простых шагов:

  1. Скачайте последнюю версию CodeIgniter с официального сайта.
  2. Разархивируйте файлы в папку вашего сервера.
  3. Настройте файл config.php для настройки базы данных и других параметров.
  4. Запустите ваш проект через локальный сервер и проверьте, все ли работает корректно.

Создание базового приложения на CodeIgniter

Давайте рассмотрим, как создать простое приложение на CodeIgniter. Мы создадим простую систему управления записями.

1. Создание базы данных: Ваша первая задача — создать базу данных. Вам потребуется таблица, которая может содержать такие поля как id, title и content.

2. Создание модели: Далее создайте модель, которая будет взаимодействовать с вашей таблицей. Например:

class Record_model extends CI_Model {    public function __construct() {        $this->load->database();    }        public function get_records() {        $query = $this->db->get('records');        return $query->result_array();    }}

3. Создание контроллера: Затем нужно создать контроллер, который будет обрабатывать запросы и обращаться к модели:

class Records extends CI_Controller {    public function index() {        $this->load->model('record_model');        $data['records'] = $this->record_model->get_records();        $this->load->view('records/index', $data);    }}

4. Создание представления: Наконец, создайте представление, которое будет отображать запасы:

    

SEO-оптимизация приложений на CodeIgniter

При создании веб-приложений важно учитывать SEO, чтобы ваше приложение было заметным в поисковых системах. Вот несколько рекомендаций:

1. Чистые URL: Используйте ЧПУ (человекопонятные URL) для улучшения индексации и понимания контента. В CodeIgniter вы можете использовать метод url_title() для автоматического создания ЧПУ из заголовков.

2. Оптимизация заголовков: Каждый контроллер и метод должен иметь соответствующие теги заголовков. Не забудьте использовать теги </code> и <code><meta></code> для описания страницы.</p><p>3. <strong>Содержимое:<strong> Убедитесь, что ваше содержимое уникально и ценно для пользователей. Это важно не только для SEO, но и для привлечения пользователей.</p><p>4. <strong>Использование sap:</strong> Создайте и загрузите sap, чтобы поисковые системы знали о страницах вашего приложения.</p><p>5. <strong>Мобильная оптимизация:</strong> Убедитесь, что ваше приложение хорошо отображается на мобильных устройствах, так как это один из факторов ранжирования для Google.</p><p><strong>Заключение</strong></p><p>CodeIgniter — это мощный инструмент для разработки веб-приложений на PHP. Его простота и высокая производительность делают его отличным выбором как для новичков, так и для опытных разработчиков. Соблюдая основные принципы SEO-оптимизации, вы можете сделать свои приложения более заметными в поисковых системах и привлечь больше пользователей. Если вы ищете фреймворк, способный быстро реализовать ваши идеи, CodeIgniter станет отличным решением.</p><blockquote> <p>Программирование — это не просто механическая работа, это искусство.</p> <p>— Стивен Ковей</p></blockquote><div class="table-wrapper"><table class="blog-custom__table"> <thead> <tr> <th>Тема</th> <th>Описание</th> <th>Примечания</th> </tr> </thead> <tbody> <tr> <td>Контроллеры</td> <td>Управляют потоками данных в приложении.</td> <td>Контроллеры обрабатывают запросы пользователей.</td> </tr> <tr> <td>Модели</td> <td>Отвечают за взаимодействие с базой данных.</td> <td>Используются для получения и сохранения данных.</td> </tr> <tr> <td>Вьюхи</td> <td>Представляют пользовательский интерфейс.</td> <td>Отображают данные, переданные контроллерами.</td> </tr> <tr> <td>Библиотеки</td> <td>Содержат переиспользуемый код.</td> <td>Вы можете создавать свои собственные библиотеки.</td> </tr> <tr> <td>Помощники</td> <td>Функции для упрощения разработки.</td> <td>Позволяют разграничить логику и представление.</td> </tr> <tr> <td>Конфигурации</td> <td>Настройки вашего приложения.</td> <td>Позволяют управлять параметрами работы.</td> </tr> </tbody></table></div><h2>Основные проблемы по теме "Codeigniter (php)"</h2><p class="h3">Проблемы с архитектурой и структурой</p><p>CodeIgniter, хотя и популярен среди разработчиков, сталкивается с проблемами в плане архитектуры. Подход MVC (Model-View-Controller) может не всегда обеспечивать необходимую гибкость для больших и сложных приложений. Некоторые разработчики находят, что структура проекта не интуитивно понятна, особенно когда дело касается управления зависимостями и модульностью. Это может привести к затруднениям при масштабировании приложений и добавлении новых функций, что в свою очередь увеличивает время разработки и усложняет сопровождение кода. В результате, разработчики могут столкнуться с трудностями в интеграции сторонних библиотек и внедрении современных практик разработки, что негативно сказывается на производительности и поддерживаемости проектов.</p><p class="h3">Отсутствие современных функций</p><p>Хотя CodeIgniter предлагает множество базовых функциональных возможностей, он не всегда соответствует современным требованиям разработчиков. Например, отсутствие встроенной поддержки RESTful API и ограниченные возможности для работы с асинхронным кодом могут стать препятствием для создания современных веб-приложений. Разработчики часто вынуждены прибегать к сторонним библиотекам или собственным решениям, что может вести к дополнительным затратам времени и усложнять проект. Кроме того, некоторые функции, такие как ORM (Object-Relational Mapping), реализованы в CodeIgniter недостаточно гибко и современно, что ограничивает возможности работы с базами данных и затрудняет переход на более сложные архитектурные решения.</p><p class="h3">Проблемы с документацией и поддержкой</p><p>Документация CodeIgniter, хотя и обширная, иногда оставляет желать лучшего. Это может вызвать недопонимание у новых пользователей и даже у опытных разработчиков, которые ищут решения для специфических задач. Бывают случаи, когда примеры кода устарели или недостаточно полны, что затрудняет процесс обучения и разработки. К тому же, сообщество CodeIgniter меньше по сравнению с другими фреймворками, такими как Laravel или Symfony, что приводит к меньшему количеству доступных ресурсов и поддержки. Такие проблемы могут заставить разработчиков искать альтернативы или тратить больше времени на решение возникающих задач, что в конечном итоге влияет на сроки и качество проектов.</p><div class="faq"><h3>Что такое CodeIgniter?</h3><p>CodeIgniter — это фреймворк для разработки веб-приложений на PHP, который облегчает создание динамических сайтов с использованием модели MVC.</p></div><div class="faq"><h3>Как подключить библиотеку в CodeIgniter?</h3><p>Для подключения библиотеки в CodeIgniter нужно использовать метод $this->load->library('имя_библиотеки') в контроллере.</p></div><div class="faq"><h3>Что такое маршрутизация в CodeIgniter?</h3><p>Маршрутизация в CodeIgniter — это способ определения того, какой контроллер и метод будут вызваны в ответ на определенный URL-адрес запроса.</p></div> </div> </section> <div class="blog-subscribe"> <div class="blog-subscribe__left"> <div class="blog-subscribe__image"> <picture> <source srcset="/distributor/assets/images/webp/blog/blog-subscribe.webp"> <img src="/distributor/assets/images/blog/blog-subscribe.png" alt=""> </picture> </div> </div> <div class="blog-subscribe__right"> <div class="blog-subscribe__title">Будь в курсе наших новостей, <br>подписывайся!</div> <div class="blog-subscribe__social"> <a href="https://vk.com/apptask" class="blog-subscribe__link blog-subscribe__link-vk" target="_blank"></a> </div> </div> </div> <div class="blog-entry__footer"> <div class="blog-entry__share blog-entry__share-bottom"> </div> </div> <div class="blog-author"> <div class="blog-author__title">Автор</div> <div class="blog-author__user"> <div class="blog-author__avatar"> <img src="/distributor/assets/images/logo.svg" alt=""> </div> <div class="blog-author__name">APPTASK</div> </div> <div class="a-tags__list blog-author__tags"> </div> </div> </article> </div> </div> <div class="b-download__done-modal"> <div class="b-download__done-back js-modal-download-close"></div> <div class="b-download__done-info"> <p>Почти готово!</p> <p>Завершите установку, нажав на загруженный файл <br>ниже и выполнив инструкции.</p> <span>Примечание. Если загрузка не началась автоматически, <a class="js-download-link-recipient" href="/" download>нажмите здесь</a>.</span> </div> <div class="b-download__done-banner"> <div class="b-download__done-logo"> <img src="/distributor/assets/images/download-done-banner-1.svg" alt="#"> </div> <p>Щелкните этот файл, что бы начать установку Apptask</p> <img class="b-download__done-arrow" src="/distributor/assets/images/download-done-banner-2.svg" alt="#"> </div> </div> <div class="to-top" id="to-top"><img src="/distributor/assets/images/to-top.svg" alt=""></div> <footer class="b-footer"> <div class="b-footer__container _b-container"> <div class="b-footer__body"> <a class="b-footer__logo b-logo b-logo--secondary" href="/"> <div class="b-logo__block"> <span class="b-logo__title">APPTASK</span> <span class="b-logo__subtitle">Управление проектами</span> </div> </a> <div class="b-footer__menu"> <div class="b-footer__menu-column"> <p>Основное</p> <a href="/terms">Условия использования</a> <a><span>Партнерская программа</span><span class="b-footer__menu-soon">Скоро</span></a> <a><span>Интеграции</span><span class="b-footer__menu-soon">Скоро</span></a> <a><span>Мультиязычность</span><span class="b-footer__menu-soon">Скоро</span></a> <a><span>Почтовый сервер</span><span class="b-footer__menu-soon">Скоро</span></a> <a><span>API</span><span class="b-footer__menu-soon">Скоро</span></a> </div> <div class="b-footer__menu-column"> <p>Полезно</p> <a href="/blog">Блог</a> <a href="/distributor/content/promotional-materials.pdf" target="_blank">Рекламные материалы</a> <a><span>Расширение для браузера</span><span class="b-footer__menu-soon">Скоро</span></a> <a href="/distributor/content/user-instruction.pdf" target="_blank">Инструкция пользователя</a> <a href="/distributor/assets/pdf/logotypes.pdf" target="_blank">Наш лого</a> </div> <div class="b-footer__menu-column"> <p>Клиентам</p> <a href="/c/support">Поддержка</a> <a href="/download">Скачать клиент</a> <a><span>Мобильное приложение</span><span class="b-footer__menu-soon">Скоро</span></a> <a><span>GPS трекинг</span><span class="b-footer__menu-soon">Скоро</span></a> <a><span>Трекинг процессов ПК</span><span class="b-footer__menu-soon">Скоро</span></a> <a><span>Автобилды</span><span class="b-footer__menu-soon">Скоро</span></a> </div> <div class="b-footer__menu-column"> <p>О Нас</p> <a href="/reviews">Отзывы</a> <a href="/faq">FAQ</a> <a href="/vacancies">Вакансии</a> </div> </div> <div class="b-footer__social"> <div class="b-footer__social-links"> <a class="b-footer__social-link"> <img src="/distributor/assets/images/footer/mail.svg" alt="#"> <span class="b-footer__social-text js-copy">support@apptask.ru</span> <span class="copy-tooltip">Скопировать</span> </a> <a href="https://t.me/appfoxRU" class="b-footer__social-link"> <img src="/distributor/assets/images/footer/tg.svg" alt="#"> <span class="b-footer__social-text">Telegram</span> </a> <a class="b-footer__social-link"> <img src="/distributor/assets/images/footer/phone.svg" alt="#"> <span class="b-footer__social-text js-copy">+7 (499) 110-73-09</span> <span class="copy-tooltip">Скопировать</span> </a> </div> <div class="b-footer__social-info"> <a href="https://startupguide.innoagency.ru/startups/9418" target="_blank" class="b-footer__social-link" title="Startup Guide"> <svg width="43" height="22" viewBox="0 0 43 22" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M24.4359 3.22267C20.1781 7.48052 20.1639 14.3696 24.4042 18.6098L39.8231 3.19099C35.5828 -1.04932 28.6937 -1.03512 24.4359 3.22267Z" fill="#828282"/><path d="M24.4358 3.22317C20.178 7.48096 20.1638 14.3701 24.4041 18.6103L39.823 3.19144C35.5827 -1.04883 28.6936 -1.03463 24.4358 3.22317Z" fill="#828282"/><mask id="mask0_15275_25165" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="21" y="0" width="19" height="19"><path d="M24.4358 3.22317C20.178 7.48096 20.1638 14.3701 24.4041 18.6103L39.823 3.19144C35.5827 -1.04883 28.6936 -1.03463 24.4358 3.22317Z" fill="#0458FE"/></mask><g mask="url(#mask0_15275_25165)"><path d="M26.2539 13.9009L40.1538 0.000952355L40.8795 0.726615L26.9796 14.6265L26.2539 13.9009Z" fill="white"/><path d="M20.9552 10.6335L34.3218 -2.73306L35.0475 -2.0074L21.6809 11.3592L20.9552 10.6335Z" fill="white"/><path d="M24.6021 12.6873L38.1897 -0.900428L38.9154 -0.174766L25.3277 13.4129L24.6021 12.6873Z" fill="white"/><path d="M22.3507 6.37256L32.4795 -3.75623L33.2052 -3.03057L23.0764 7.09822L22.3507 6.37256Z" fill="white"/><path d="M23.7828 10.6731L36.0821 -1.6262L36.8078 -0.900534L24.5085 11.3988L23.7828 10.6731Z" fill="white"/></g><path d="M24.4361 18.6774C28.6939 22.9353 35.5829 22.9495 39.8232 18.7092L24.4043 3.29028C20.1641 7.5306 20.1783 14.4196 24.4361 18.6774Z" fill="#828282"/><path d="M19.3871 10.9503H6.5065C3.41229 10.9503 0.90625 8.49715 0.90625 5.47511C0.90625 2.45004 3.41542 0 6.5065 0H19.3871V10.9503Z" fill="#A0A0A0"/><path d="M9.87959e-07 10.9509L12.845 10.951C15.9306 10.951 18.4297 13.3973 18.4297 16.4109C18.4297 19.4277 15.9276 21.8709 12.845 21.8709H0L9.87959e-07 10.9509Z" fill="#828282"/><path d="M32.0751 10.9509C38.1087 10.9509 43 15.8422 43 21.8759H32.0751V10.9509Z" fill="#A0A0A0"/><path d="M12.97 10.9509H12.97C15.9853 10.9509 18.4298 13.3954 18.4298 16.4108V16.4108C18.4298 19.4261 15.9853 21.8706 12.97 21.8706H12.97C9.95458 21.8706 7.51013 19.4261 7.51013 16.4108V16.4108C7.51013 13.3954 9.95458 10.9509 12.97 10.9509Z" fill="white"/><path d="M12.9701 11.9875C15.4129 11.9875 17.3932 13.9678 17.3932 16.4106C17.3932 18.8534 15.4129 20.8337 12.9701 20.8337C10.5273 20.8337 8.547 18.8534 8.547 16.4106C8.547 13.9678 10.5273 11.9875 12.9701 11.9875Z" fill="#828282"/><path d="M12.97 13.0618H12.97C14.8193 13.0618 16.3184 14.5609 16.3184 16.4102V16.4102C16.3184 18.2595 14.8193 19.7586 12.97 19.7586H12.97C11.1207 19.7586 9.62158 18.2595 9.62158 16.4102V16.4102C9.62158 14.5609 11.1207 13.0618 12.97 13.0618Z" fill="white"/><path d="M12.97 14.1719C14.2064 14.1719 15.2088 15.1742 15.2088 16.4107C15.2088 17.6471 14.2064 18.6494 12.97 18.6494C11.7335 18.6494 10.7312 17.6471 10.7312 16.4107C10.7312 15.1742 11.7335 14.1719 12.97 14.1719Z" fill="#828282"/><path d="M12.9699 15.2505C13.6106 15.2505 14.1299 15.7698 14.1299 16.4105V16.4105C14.1299 17.0511 13.6106 17.5705 12.9699 17.5705C12.3293 17.5705 11.8099 17.0511 11.8099 16.4105V16.4105C11.8099 15.7698 12.3293 15.2505 12.9699 15.2505Z" fill="white"/><path d="M6.39649 0H6.39651C9.42039 0 11.8717 2.45134 11.8717 5.47523V5.47524C11.8717 8.49913 9.42039 10.9505 6.39651 10.9505H6.39649C3.37261 10.9505 0.921265 8.49913 0.921265 5.47524V5.47523C0.921265 2.45134 3.37261 0 6.39649 0Z" fill="white"/><path d="M6.39636 1.05249H6.39636C8.83916 1.05249 10.8194 3.03277 10.8194 5.47558C10.8194 7.91838 8.83916 9.89867 6.39636 9.89867H6.39636C3.95355 9.89867 1.97327 7.91838 1.97327 5.47558C1.97327 3.03277 3.95355 1.05249 6.39636 1.05249Z" fill="#A0A0A0"/><path d="M6.39637 2.12671H6.39639C8.24566 2.12671 9.74479 3.62584 9.74479 5.47511V5.47512C9.74479 7.32439 8.24566 8.82352 6.39639 8.82352H6.39637C4.5471 8.82352 3.04797 7.32439 3.04797 5.47512V5.47511C3.04797 3.62584 4.5471 2.12671 6.39637 2.12671Z" fill="white"/><path d="M6.39637 3.23682C7.63282 3.23682 8.63516 4.23915 8.63516 5.4756C8.63516 6.71204 7.63282 7.71438 6.39637 7.71438C5.15993 7.71438 4.15759 6.71204 4.15759 5.4756C4.15759 4.23915 5.15993 3.23682 6.39637 3.23682Z" fill="#A0A0A0"/><path d="M6.39643 4.31519H6.39643C7.03707 4.31519 7.55642 4.83453 7.55642 5.47517C7.55642 6.11581 7.03707 6.63515 6.39643 6.63515H6.39643C5.75579 6.63515 5.23645 6.11581 5.23645 5.47517C5.23645 4.83453 5.75579 4.31519 6.39643 4.31519Z" fill="white"/></svg> </a> <div class="b-footer__social-link" title="Страна"> <img src="/distributor/assets/images/footer/earth.svg" alt=""> <span class="b-footer__social-text">Россия</span> </div> <div class="b-footer__social-link" title="Язык"> <img src="/distributor/assets/images/footer/lang.svg" alt=""> <span class="b-footer__social-text">Россия</span> </div> </div> </div> <div class="b-footer__contacts"> <div class="b-footer__contacts-box"> <address class="b-footer__text b-footer__text--address">Адрес: Москва, Россия, 117342 улица Обручева, 34/63с2</address> <p class="b-footer__text"> Электронная почта: <a class="b-footer__link"> <span class="js-copy">support@apptask.ru</span> <span class="copy-tooltip">Скопировать</span> </a> </p> <p class="b-footer__text"> Телефоны: <a class="b-footer__link"> <span class="js-copy">+7 (499) 110-73-09</span> <span class="copy-tooltip">Скопировать</span> </a> </p> </div> <p class="b-footer__text copyright"> <a href="/distributor/assets/pdf/prog-prod-info.pdf" target="_blank">Информация о программном продукте AppTask</a> <a href="/distributor/assets/pdf/patent.pdf" target="_blank" download>Патент</a> <a href="/distributor/assets/pdf/trading-mark.pdf" target="_blank" download>Товарный знак</a> <a href="https://fips.ru/EGD/4cb4871a-e4dd-4be5-bd9c-87f2c7b07cda" target="_blank">Copyright</a> © 2010-2024 Apptask.ru </p> </div> </div> </div> </footer> <script> const topTopEl = document.getElementById('to-top') window.onscroll = () => { if (window.scrollY > window.innerHeight) { topTopEl.classList.add('show') } else { topTopEl.classList.remove('show') } } topTopEl.addEventListener('click', () => window.scrollTo({top: 0, behavior: 'smooth'})) </script> </div> <script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script> <!--vendor scripts--> <script src="/distributor/assets/libs/svgxuse.min.js?v=lDHooEHIkSffnxlC1M3Wf9QMRZgVt1n9hcHHTwHgUWs"></script> <script src="/distributor/assets/libs/dynamicAdapt.js?v=ajCBnMwSdOagHNTDhTJT4ht7gsjnMxMwC3UCVmc5GjA"></script> <!--capcha scripts--> <script src="https://www.google.com/recaptcha/api.js"></script> <!--user scripts--> <script src="/distributor/assets/js/common.min.js?v=Vf9piwCqEA2y2v7urcKnPSc6rvOJOr5RswCNrbQMJDw"></script> <script src="/distributor/assets/js/index_common.min.js?v=qL0R4XOfs7FCWa5Wea-pftAvplQaiVxYTXdHZaaI8ao"></script> <!-- Yandex.Metrika counter --> <script> (function (m, e, t, r, i, k, a) { m[i] = m[i] || function () { (m[i].a = m[i].a || []).push(arguments) }; m[i].l = 1 * new Date(); k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.async = 1, k.src = r, a.parentNode.insertBefore(k, a) }) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(72389917, "init", { clickmap: true, trackLinks: true, accurateTrackBounce: true, webvisor: true }); </script> <noscript><div><img src="https://mc.yandex.ru/watch/72389917" style="position:absolute; left:-9999px;" alt="#"></div></noscript> <!-- /Yandex.Metrika counter --> <script> var Id = -1; var ParrentId = -1; function VisibilityTextAria(id) { var hiddens = document.getElementsByClassName('commentHidden'); for (var item of hiddens) { item.style.display = 'none'; } if (id != -1) { var commentAria = document.getElementById('comment_' + id); commentAria.style.display = 'block'; } } function Answer(id, parrentId, name) { Id = id; ParrentId = parrentId; var textArea = document.getElementById('CommentText'); textArea.value = name; } function CollapsedComment(id) { var collapseElement = document.getElementById(id.id); if (collapseElement.classList.contains('is-collapsed')) { collapseElement.classList.remove('is-collapsed'); } else { collapseElement.classList.add('is-collapsed'); } } function OnTextAreaEmpty() { if (document.getElementById("CommentText").value == '') { Id = -1; ParrentId = -1; } } function SendComment() { var commentText = document.getElementById('CommentText').value; if (!commentText || commentText == undefined || commentText == "" || commentText.length == 0) { return; } let formData = new FormData(); formData.append('CommentText', commentText); formData.append('CommentId', Id); formData.append('id', 7822); var xhr = new XMLHttpRequest(); xhr.open("POST", '/blogapi/add_comment'); xhr.send(formData); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { debugger; if (Id == -1) { var innetComment = document.getElementById('Comment_Container_Parent'); var newDiv = document.createElement("div"); newDiv.innerHTML = xhr.responseText; innetComment.appendChild(newDiv); var comments = document.getElementById('Comment_Container_Parent'); document.getElementById('CommentText').value = ''; comments.reload(true); } else { var innetComment = document.getElementById('Comment_Container_' + ParrentId); if (ParrentId == -1) { innetComment = document.getElementById('Comment_Container_' + Id); var hidder = document.getElementById('div__' + Id); hidder.classList.remove('hidden'); hidder = document.getElementById('a__' + Id); hidder.classList.remove('hidden'); } var newDiv = document.createElement("div"); newDiv.innerHTML = xhr.responseText; innetComment.appendChild(newDiv); Id = -1; ParrentId = -1; var comments = document.getElementById('comments'); document.getElementById('CommentText').value = ''; comments.reload(true); } var textArea = document.getElementById('CommentText'); textArea.value = ''; } } } function DeleteComment(id) { let formData = new FormData(); formData.append('id', id); var xhr = new XMLHttpRequest(); xhr.open("POST", '/blogapi/delete_comment'); xhr.send(formData); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { debugger; var commentChilds = document.getElementById(`${id}_arrayComment`); var comment = document.getElementById(`${id}_parentComment`); var CommentContainer = comment.parentElement.parentElement; if (comment.parentElement.id != 'Comment_Container_Parent') { comment.parentElement.remove(); if (CommentContainer.childElementCount == 0) { var toggleElem = CommentContainer.parentElement.getElementsByClassName('blog-comment-reply__toggle'); if (toggleElem.length > 0) { toggleElem[0].classList.add('hidden'); } } } else { comment.remove(); commentChilds.remove(); } } } } window.onload = function () { if (window.location.href.includes('Blog')) { window.location.href = window.location.href.replace('Blog', 'blog'); } var h2s = document.getElementsByTagName("h2"); var innetTitles = document.getElementById('Titles'); for (index = 0; index < h2s.length; ++index) { var blockDiv = document.createElement("div"); var divCounter = document.createElement("span"); divCounter.className = "blog-entry-contents__list-counter"; divCounter.innerHTML = index + 1; var divName = document.createElement("div"); divName.className = "blog-entry-contents__list-name"; var newA = document.createElement("a"); newA.innerHTML = h2s[index].innerText; if (h2s[index].id == undefined || h2s[index].id == "" || h2s[index].id == null) { h2s[index].id = 'h2s' + (index + 1); } newA.href = '#' + h2s[index].id; divName.appendChild(newA); blockDiv.appendChild(divCounter); blockDiv.appendChild(divName); innetTitles.appendChild(blockDiv); } } function SendMark(Mark) { for (var i = 1; i <= 5; i++) { var star = document.getElementById('Star' + i); star.classList.remove('empty'); } var emptyStar = Number.parseInt(Mark) + 1; if (emptyStar < 6) { var newStar = document.getElementById('Star' + emptyStar); newStar.classList.add('empty'); } let formData = new FormData(); formData.append('Mark', Mark); formData.append('Id', 7822); let xhr = new XMLHttpRequest(); xhr.open("POST", '/blogapi/set_mark'); xhr.send(formData); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { } }; } function shareClick() { let formData = new FormData(); formData.append('Id', 7822); let xhr = new XMLHttpRequest(); xhr.open("POST", '/blogapi/shared'); xhr.send(formData); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { } }; } function notifyClick() { document.querySelector('.blog-entry-time__message').classList.remove('transition-message'); document.querySelector('.blog-entry-time__message').classList.remove('active-message'); document.querySelector('.blog-entry-time__form-wrap').classList.add('active'); let formData = new FormData(); formData.append('Id', 7822); formData.append('Email', document.getElementById("mailSendForm_email").value); let xhr = new XMLHttpRequest(); xhr.open("POST", '/blogapi/notify'); xhr.send(formData); xhr.onreadystatechange = function () { if (xhr.readyState == XMLHttpRequest.DONE) { document.querySelector('.blog-entry-time__message').classList.add('active-message'); document.querySelector('.blog-entry-time__form-wrap').classList.remove('active'); setTimeout(() => { document.querySelector('.blog-entry-time__message').classList.add('transition-message'); }, 2000); } }; } const readingProgress = document.querySelector('#b-progress-line'); document.addEventListener('scroll', function (e) { let w = (document.body.scrollTop || document.documentElement.scrollTop) / (document.documentElement.scrollHeight - document.documentElement.clientHeight) * 100; readingProgress.style.setProperty('width', w + '%'); }); </script> </body> </html>