Translate

Поиск по этому блогу

четверг, 25 января 2018 г.

Как сделать всплывающую картинку при уходе с сайта.

Иногда владельцы блогов хотят добавить некоторую интерактивность своим сайтам и сделать появляющиеся картинки, когда посетитель покидает сайт.

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

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

Код очень простой и работает в chrome, firefox, opera.

Вам только остается загрузить свою картинку в ваш блог, получить её адрес и поменять его вот в этой строке:

image.src='http://www.beautifulady.it/wp-content/uploads/2017/10/2bl.jpg';

То, что внутри одинарных кавычек - там должен быть url вашей картинки.

Теперь, идем в Шаблоны ->Добавить гаджет -> HTML & JavaScript Смотрите на картинке:



Не забудьте поместить скопированный код внутрь тегов <script></script> !!! Это важно!!!
  function addEvent(obj, evt, fn) {
   if (obj.addEventListener) {
    obj.addEventListener(evt, fn, false);
   }
   else if (obj.attachEvent) {
    obj.attachEvent("on" + evt, fn);
   }
  }
  addEvent(window,"load",function(e) {
   addEvent(document, "mouseout", function(e) {
    e = e ? e : window.event;
    var from = e.relatedTarget || e.toElement;
    if (!from || from.nodeName == "HTML") {

     var block=document.createElement('div');
     block.id='popup';
     var image=document.createElement('img');
     image.src='http://www.beautifulady.it/wp-content/uploads/2017/10/2bl.jpg';
     block.appendChild(image);
     var obj=document.querySelector('body');
     obj.appendChild(block);
     document.getElementById('popup').style.display="block";
     setTimeout(function() {
      document.getElementById('popup').style.display="none";
     }, 2000);
    }
   });
  });


Я сделал так, чтобы картинка показывалась только на короткое время - 2 сек. Вы можете изменить это по своему желанию, или отменить совсем. Для этого вам нужно изменить вот этот участок кода:

     setTimeout(function() {
      document.getElementById('popup').style.display="none";
     }, 2000);


Можно, или убрать функцию setTimeout совсем (оставив только среднюю строку), или изменив время (2000 миллисекунд = 2 сек), на более подходящее.

Теперь, осталось только добавить код CSS в ваш шаблон. Его вы можете изменить по собственному желанию таким образом, чтобы ваша картинка была оформлена соответствующим образом.

Для того, чтобы представлять, как и что вам оформлять, вам стоит понимать, что JS-кодом выше, мы создаем внутри документа новый div с id="popup" и внутри него тег img c url вашей картинки.

<div id="popup">
    <img src="адрес вашей картинки">
</div>


Зная это, вы можете отредактировать ваш CSS код как вам будет угодно, или добавить мой без изменений.

Идем как на картинке: Тема -> Настроить -> Продвинутые настройки -> Добавить CSS







  #popup {
   position: fixed;
   top: 30%;
   right: 40%;
   display: none;
  }
  #popup img{
   width: 100%;
  }


Не забывайте сохранить изменения.


Все!
Таким образом вы получите всплывающую картинку перед уходом пользователя с сайта.

Работающий пример можно посмотреть здесь: для блога Тренировка


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

Красным отметил изменения от вышеприведенного кода.

  function addEvent(obj, evt, fn) {
   if (obj.addEventListener) {
    obj.addEventListener(evt, fn, false);
   }
   else if (obj.attachEvent) {
    obj.attachEvent("on" + evt, fn);
   }
  }

  addEvent(window,"load",function(e) {

   addEvent(document, "mouseout", function(e) {
    e = e ? e : window.event;
    var from = e.relatedTarget || e.toElement;

    if ( !from || from.nodeName == "HTML" ) {
     
     var block=document.createElement('div');
     block.id='popup';
     var image=document.createElement('img');
     image.src='http://www.beautifulady.it/wp-content/uploads/2017/10/2bl.jpg';
     block.appendChild(image);
     // var obj=document.getElementById('img_container');
     var obj=document.querySelector('body');
     obj.appendChild(block);

     document.getElementById('popup').style.display="block";
     

var tm =

setTimeout(function() { document.getElementById('popup').style.display="none"; }, 2000);

document.addEventListener("click",function(){ clearTimeout(tm); });

} }); });



UPDATE

Предупреждение перед выходом веб-страницы с помощью JavaScript - jQuery

Во-первых, я хотел бы сказать, что во многих случаях выясняется, что пользователи по ошибке нажимают ссылку на веб-страницу или закрывают текущую вкладку по ошибке. Здесь я покажу вам, как предотвратить эту ошибку, добавив предупреждающее сообщение или предупреждающее сообщение с использованием JavaScript или jQuery.

Предупреждение перед выходом страницы в JavaScript - jQuery



 <script type="text/javascript">
 $(window).on('beforeunload', function(){
 var c=confirm();
 if(c){
 return true;
 }
 else
 return false;
});
</script>


Что делает вышеупомянутый скрипт на jQuery?

Если вы используете этот JavaScript на своей веб-странице, он выдает предупреждающее сообщение перед тем, как покинуть эту страницу.

Кроме того, если вы нажмете на ссылку или щелкните по чему-то, что будет перемещаться от веб-страницы, оно также предложит вам.

Ниже я предоставляю полный пример, чтобы вы могли его правильно понять.

 <!DOCTYPE html>
 <html>
 <body>


 <a href="https://google.com">Google</a>


 <script type="text/javascript">
 $(window).on('beforeunload', function(){
 var c=confirm();
 if(c){
 return true;
}
else
return false;
});
</script>

</body>
</html>


Более ранние версии браузеров позволяли вам установить настраиваемые сообщения в диалоговом окне оповещения, но теперь это невозможно. Для того, чтобы их установить нам требуется подключить библиотеку jQuery По CDN -

<script src=”https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js”></script >


Или вы можете просто загрузить jquery.min.js и включить это.

Теперь просто протестируйте его в своем браузере.

Если вы нажмете на ссылку google, она предложит вам.

Ниже приведен снимок экрана с предупреждающим сообщением



Если вы попытаетесь закрыть текущую вкладку, появится одно и то же сообщение.

                                                                                                                                                             

среда, 24 января 2018 г.

Виды крауд ссылок и способы размещения на форумах

  1. Крауд-ссылки - виды, способы размещения Обучающий курс для начинающих сотрудников компании Link-Stream
  2. Виды ссылок активная анкорная неактивная безанкорная ссылка, при нажатии на которую вы переходите на другой сайт ссылка, при нажатии на которую вы не переходите на другой сайт; ссылку нужно скопировать в строку браузера и только тогда вы попадаете на сайт ссылка, закрытая другой ссылкой или словом ссылка ничем не закрыта сверху посетите сайт https://links-stream.ru/ посетите сайт https://links-stream.ru/ посетите сайт Линк-Стрим посетите сайт https://links-stream.ru/
  3. Параметры ссылок nofollow dofollow noindex редирект передают «вес» от форума сайту нашего клиента не передают «вес» от форума сайту нашего клиента не попадают в индекс поисковых систем промежуточная страница, которая забирает «вес» себе span
  4. Что такое редирект и как его определить? пост со ссылкой на форуме промежуточная страница (редирект) сайт клиента Виды редиректа скрытый простой двойной тройной зашифрованный реферральный redirect redir go to forum/sitesite/forum
  5. Как разместить ссылку ссылка-картинка безанкорная ссылка через ahref безанкорная ссылка через url анкорная ссылка через url анкорная ссылка через ahref [url=https://odmdetka.ru/]детские товары[/url] <a href=«https://odmdetka.ru/»>детские товары</a> [url=https://odmdetka.ru/][/url] <a href=«https://odmdetka.ru/»></a> [url=URL СТРАНИЦЫ][img]URL КАРТИНКИ[/img][/url] <a href=«URL СТРАНИЦЫ» ><img src=«URL картинки» ></a>
  6. Как поставить ссылку через код сайта?
    • находим любой пост любого пользователя с активной ссылкой на сайт
    • наводим курсор на ссылку и нажимаем правой кнопкой, выбираем Посмотреть код
    • копируем код ссылки, заменяем на свою ссылку и вставляем в свой комментарий
  7. Как поставить ссылку на форуме, в котором отключены ВВ-коды?
    • пробуем прокачать аккаунт
    • отправляем сначала без ссылки, затем редактируем
    • отправляем ссылку в подпись аккаунта
  8. Модерация vs бан есть надежда нет надежды аккаунт сохраняется аккаунт блокируется сообщение может быть опубликовано сообщение может быть опубликовано ссылка может быть удалена ссылка чаще всего удаляется
  9. Словарь терминов
    • Ссылка -
    1) так мы называем комментарий с активной ссылкой на сайт клиента;
    2) уникальный адрес страницы сайта, при нажатии на который происходит переход на эту страницу
    • Активная ссылка - ссылка, при нажатии на которую происходит переход на сайт
    • Неактивная ссылка - ссылка, при нажатии на которую переход на сайт не произойдет (необходимо сначала скопировать ссылку в адресную строку браузера)
    • Анкорная ссылка - ссылка, адрес которой закрывает другое слово
    • Безанкорная ссылка - ссылка, адрес которой сверху ничего не перекрывает
    • Атрибут ссылки - это ее параметры для поисковых систем
    • Сайт-донор - сайт, на котором вы ставите ссылку (форум, блог и т.д), который передает вес другим сайтам
    • Сайт-акцептор - сайт вашего заказчика, который получает «вес» донора
  10. Словарь терминов
    • Внешние (исходящие) ссылки - ссылки на форумах, которые ведут на сайт нашего клиента
    • Внутренние (входящие) ссылки - ссылки на сайте нашего клиента, которые ведут на любые другие сайты (или на другие страницы)
    • Редирект - промежуточная страница между форумом и сайтом клиента
    • ВВ-коды - коды, которые используются а форуме для установления правил разметки, включения ссылок, добавления картинок/аудио/видео и т.п.
    • Ссылка-картинка - картинка, при нажатии на которую вы попадете на сайт клиента
    • Модерация - рассмотрение администрацией сайта вашего сообщения и принятие решения, размещать его на форуме или нет
    • Бан - блокирование доступа аккаунта к форуму по причине нарушения его правил (например, размещение рекламных комментариев)
Link-Stream                                                                                                                                                              

среда, 11 октября 2017 г.

Как выйти из редактора VIM

Как выйти из vim редактора - это самый "больной вопрос" тех, кто не побоялся освоить это, достаточно полезное, приложение.
Ответов масса, но мне подошел именно такой.
Привожу его сразу, чтобы вас не утомлять - последовательно нажимать ESC : w q Enter - выход с сохранением

В некоторых случаях срабатывает - ESC : x Enter

ESC : q! Enter — выход без сохранения

Для терпеливых, о простой работе с этим редактором и Node.js
Последовательность действий при создании, сохранении и запуска файла в node.js из командной строки Bash.
  1. Проверить что раскладка ENG
  2. В нужной папке нажимаем пр клавишей и “Открыть Bash здесь”
  3. vim temp.js (temp.js - название файла который будет создан в той папке где вы открыли Bash)
  4. Для начала ввода нажимаем a и вводите код:
    Например:
     
    var a = 1;
    var b = 2;
    var sum = a + b;
    console.log(sum);
    
  5. Последовательно нажимаем ESC : w q Enter
  6. В консоле набираем node temp.js
Кстати, весь список команд теперь у вас всегда под рукой - https://vim.rtorr.com/. Есть русский перевод.

Vim Cheat Sheet


Ты не одинок!


В мае вопрос "Как выйти из vim?" отпраздновал свой юбилейный миллионный просмотр.


Чаще всего сложности с тем, чтобы покинуть Vim, возникают у фронт-енд разработчиков — то есть тех, которые преимущественно просматривают тэги JQuery, CSS и AngularJS. За ними следом идут разработчики на Microsoft (C# и SQL Server) и мобильные разработчики (Android и iOS). Они работают по большей части с интегрированными средами разработки (Visual Studio, Eclipse, Xcode и так далее), а не простыми текстовыми редакторами, поэтому неудивительно, что они более склонны угодить в Vim случайно, чем открыть его умышленно.

Разработчики, которые реже всего заходят в тупик, пишут на C, C++, Python и Ruby. Этот список, на мой взгляд, вполне закономерен: он представляет собой смесь низкоуровневых и скриптовых языков, которые обычно предполагают простой текстовый редактор без графической оболочки. Соответственно, у тех, кто работает с этими языками, достаточно опыта, чтобы выйти из Vim, не прибегая к помощи Google.

И еще раз :

ESC :q! Enter — выход без сохранения
ESC :wq Enter или ESC :x Enter — выход с сохранением


Да и приятности с плюшками - ниже шпаргалка для работы с vim

Файл настройки: ~/.vimrc
Можно редактировать файлы через сеть, например
:e ://user@host/path/to/the/file.txt
:Ex или :e ./ - файловый менеджер

== Основы ==
hjkl                      перемещение в разные стороны
i                         режим вставки
I                         добавление в начало строки
a                         режим добавления
A                         добавление в конец строки
o                         добавить строку сразу за текущей
O                         добавить строку перед текущей
R                         писать поверх имеющегося текста
u, :u[ndo]                отмена предыдущего действия (undo)
CTR-R, :red[o]            отмена отмены предыдущего действия (redo)
dd                        вырезать (удалить) строку
cc                        удалить и начать редактирование
yy                        копировать строку
p                         вставить из буфера обмена
d                      удалить n+1 строку
y                      скопировать n+1 строку
ESC                       перейти в режим просмотра
DEL                       удалить следующий символ
:                      перейти на строку #n
%                         перейти к парной скобке
:e **/filename.c          редактировать файл (с поиском по имени)
:w [fname]                записать изменения
:wa                       сохранить изменения во всех файлах
:q                        выйти из редактора
:q!                       выйти из редактора, не сохраняя изменения
:color              выбор цветовой схемы. цветвые схемы:
                            /usr/local/share/vim/vim72/colors/*.vim
:pwd                      текущий каталог
:cd [path]                перейти в другой каталог
:!команда                 выполнить команду - man, git, и так далее
                            стрелочками веерх и вниз можно автодополнять
                            команды и искать по истории
CTR+p или CTR+n           автоматическое дополнение текста
                            (в режиме редактирования)
CTR+r,=,            вставить выражение, например 5*2 - 3
                            (в режиме редактирования)
CTR+u, CTR+d              Page Up / Page Down
CTR+y, CTR+e              Перемотка вверх/вниз без движения курсора               

== Подсветка синтаксиса ==
:syntax on                включить подсветку
:syntax off               выключить подсветку (по умолчанию)

== Перенос строк ==
:set wrap                 разрешить word wrap (по умолчанию)
:set nowrap               запретить word wrap

== Печать ==
:ha[rdcopy]                   распечатать документ
:set printoptions=duplex:off  отключить двустороннюю печать

== Сворачивание ==
zc                        свернуть блок
zo                        развернуть блок
zM                        закрыть все блоки
zR                        открыть все блоки
za                        инвертирование
zf                        см :set foldmethod=manual
:set foldenable           включить свoрачивание
:set foldmethod=syntax    сворачивание на основе синтаксиса
:set foldmethod=indent    сворачивание на основе отступов
:set foldmethod=manual    выделяем участок с помощью v и говорим zf
:set foldmethod=marker    сворачивание на основе маркеров в тексте
:set foldmarker=bigin,end задаем маркеры начала и конца блока

== Маркеры ==
ma                        установить локальный маркер a
mB                        установить глобальный маркер B
`c                        перейти к локальному маркеру c
`0                        вернуться на позицию, на которой закончили
                            работу при закрытии vim
:marks                    просмотр маркеров
set viminfo='1000,f1      маркеры пишутся в ~/.viminfo, восстанавливаясь
                            при следующем запуске vim. маркер " хранит
                            последнюю позицию курсора в файле
== Сессии ==
mksession file.session    сохранить текущую сессию
source file.session       восстановить ранее сохраненную сессию

== Макросы ==
qa                        записать макрос с именем a
q                         в режиме записи макроса: закончить запись
@a                        выполнить макрос с именем a
@@                        повторить последний макрос

== Регистры ==
"ayy                      скопировать строку в регистр a
"bdd                      вырезать строку и поместить в регистр b
"С2d                      вырезать три строки и дописать в конец
                            регистра C
:reg [name1][name2][...]  просмотреть содержимое регистров

== Выделение ==
v + hjkl                  выделение текста
SHIFT + v                 выделить строку
CTR + v                   выделение прямоугольника
p                         вставить
y                         копировать
d                         удалить
gu                        к нижнему регистру
gU                        к верхнему регистру

== Отступы ==
[#]>                      сдвинуть выделенное вправо
[#]<                      сдвинуть выделенное влево
[#]>>                     сдвинуть строку вправо
[#]<<                     сдвинуть строку влево
set tabstop=#             для табуляции используется # пробелов
set shiftwidth=#          в командах отступа используется # пробелов 
set [no]expandtab         заменять ли табуляцию на соответствующее
                            число пробелов

== Поиск и замена в файле ==
/Выражение               поиск выражения в файле
\cВыражение              поиск без учета регистра
n                        следующее совпадение
N                        предыдущее совпадение
:%s/foo/bar/gi           замена строк, см http://eax.me/regular-expr/

== Поиск по всему проекту ==
:vimgrep /EXPR/ **/*.c   поиск по регулярному выражению
:copen                   показать все найденные места
:close                   скрыть все найденные места
:cn                      переход к следующему результату
:cp                      переход к предыдущему результату

== Нумерация строк ==
:set number              включить нумерацию строк
:set nonumber            отключить нумерацию строк

== Работа с вкладками (a.k.a табами) ==
:tabnew [fname]          создать таб
:tabs                    вывести список табов
:tabn                    следующий таб
:tabp                    предыдущий таб
gt                    перейти на таб #n
gt                       следующий таб
gT                       предыдущий таб
:tabm +1                 переместить таб вперед на одну позицию
:tabm -1                 переместить таб назад на одну позицию
:tabm 2                  переместить таб на заданную позицию
                           (нумерация начинается с нуля)

== Работа с окнами ==
:split                   горизонтальное разбиение
:vsplit                  вертикальное разбиение
Ctr+W, затем
  с                      закрыть окно
  +-                     изменение высоты текущего окна
  <>                     изменение ширины текущего окна
  =                      установить равный размер окон
  hjkl или стрелочки     перемещение между окнами

== Проверка орфографии ==
    mkdir -p ~/.vim/spell
    cd ~/.vim/spell
    wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.sug
    wget http://ftp.vim.org/vim/runtime/spell/ru.koi8-r.spl
    wget http://ftp.vim.org/vim/runtime/spell/en.ascii.sug
    wget http://ftp.vim.org/vim/runtime/spell/en.ascii.spl

:set spell spelllang=ru,en       включить проверку орфографии
:set nospell                     выключить проверку орфографии
]s                               следующее слово с ошибкой
[s                               предыдущее слово с ошибкой
z=                               замена слова на альтернативу из списка
zg                               good word
zw                               wrong word
zG                               ignore word

== Работа с кодировкой ==
e ++enc=<имя кодировки>         Редактирование файла в ??? кодировке
w ++enc=<имя кодировки>         Сохранить файл в новой кодировке
set fileencodings=utf-8,koi8-r  Список автоматически определяемых
                                  кодировок в порядке убывания
                                  приоритета

== Другое ==
:set [no]wildmenu          При авто-дополнении в командной строке над
                             ней выводятся возможные варианты
:set list                  Отображать табуляцию и переводы строк
q:                         История команд
.                          Повторение последней команды

Данная информация была любезно предоставлена сайтом - "Записки программиста"

                                                                                                                                                             

среда, 13 сентября 2017 г.

Создание сайта на PHP. Часть 1.

Схема работы сайта

Запос пользователя в адресной строке поступает в Front Controller где он обрабатывается с помощью роутера (маршрутизатора) в соответсвии с нашими маршрутами (роутами) прописанными в отдельном файле. Здесь же определяется какой контроллер и какой его метод (экшен) будет обрабатывать данный запрос. Уже назначенный контролер будет взаимодействовать с БД (базой данных) для получения необходимой информации и вызывать соответствующий файл представления (вид) для передачи пользователю запрашиваемой информации.

Для того, чтобы понять как это работает, лучше всего представить все в виде такой схемы:





Создаем файловую структуру сайта:

Папки:

  1. controller
  2. config
  3. components
  4. model
  5. views

Файлы:

  • index.php
  • .htaccess




Сразу приведу файл .htaccess полностью. Его нужно создать раньше, если вы работаете на OpenServer
DirectoryIndex index.php

AddDefaultCharset utf-8

RewriteEngine on
RewriteBase /
RewriteRUle ^(.*)$ index.php


index.php
<?php

// FRONT COTROLLER

// 1. Общие настройки

ini_set('display_errors', 1);
error_reporting(E_ALL);

// 2. Подключение файлов системы

define('ROOT', dirname(__FILE__));
require_once(ROOT.'/components/Router.php');

// 3. Установка соединения с БД


// 4. Вызов Router

$router = new Router();
$router->run();



В общих настройках мы задали отображение ошибок. Это нужно нам. но не посетителям, поэтому при завершении работ с сайтом, отладке и размещении на хосте, эти строки нам нужно будет изменить. Эта информация может испугать законопослушных и неопытных посетителей сайта, или может быть использована злоумышленниками для взлома сайта.


Для подключения мы используем полный путь на диске, который мы получаем с помощью функции dirname() и псевдо константы __FILE__.


Для проверки содержимого константы ROOT(полный путь от корня файловой системы), мы можем вывести переменную ROOT следующим образом:


еcho ROOT;

Сразу после строк создания константы ROOT и подключения файла Router.php -
define('ROOT', dirname(__FILE__));
require_once(ROOT . '/components/Router.php'); 

еcho ROOT;


Соединения с БД на этом этапе мы выполнять не будем и вернемся к нему позже.

Вызов роутера можно добавить сейчас или сразу после описания нашего ротера я следующем шаге. Он будет заключаться в создании экземпляра класса Роутер - $router = new Router() и запуске метода run() - $router->run();;

Коль скоро мы подключили файл Router.php, то нам остается его создать в папке components

B нем пропишем следующий строки :
<?php

class Router {

private $routes;//создаем массив в кот. хранятся наши маршруты

public function __constructor(){

}
public function run() {
    echo "It is file Roter.php";//Это для проверки подключения файла
}
}


Теперь, если мы откроем наш сайт, то увидим строки - It is file Roter.php -. Это говорит о том. что все подключено и правильно работает

Таким образом мы запустили наш Router и передали ему управление



Router

Первое с чего нам следует начать - маршруты (роуты). Они будут храниться в отдельном файле. Это очень удобно.

В папке config создадим для этого файл routes.php

Здесь мы и разместим наши роуты в виде массива:

routes.php

<?php
return array(
	'news' => 'news/index', // actionIndex in NewsController
	'products' => 'product/list', // actionList in ProductController
);


Роуты представляют собой пару в массиве.Запрос (то что пользователь набирает в адресной строке браузера) - Например: 'news' и строка - 'news/index', которая содержит имя контроллера news (первая часть), и имя экшена index(функции обработчика запроса) - вторая часть.

Этот код - 'news' => 'news/index' показывает, что будет вызван метод - actionIndex в контроллере - NewsController


Здесь мы сами решаем, какой метод и какой контроллер будет обрабатывать наш запрос. Делаем это мы на этапе разработки нашего сайта.


Теперь наша задача заставить наш Router прочитать маршруты и помнить их на время выполнения кода.


Специально для этого мы создали переменную private $routes; и конструктор public function __construct(), в котором мы прочитаем и запомним роуты.


В конструкторе пишем две строки:

$routesPath = ROOT.'/config/routes.php';
$this->routes = include($routesPath);

В первой - $routesPath = ROOT.'/config/routes.php'; мы указываем путь к роутам. Она состоит из пути к базовой директории ROOT и пути к созданному файлу.


Во второй строке мы присваиваем свойству routes -$this->routes массив, который хранится в файле routes.php

Теперь в наше свойство попадет нужный нам массив.

Для того чтобы проверить все ли у нас подключилось и правильно работает мы в методе run() сделаем распечатку массива : print_r($this->routes);

Получим такое сообщение на сайте :
Array ( [news] => news/index [products] => product/list ) It is file Router.php


Я буду выводить в тексте промежуточные состояния файла.

Все конечные версии вы можете посмотреть на Гугл Диске


Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {
        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    public function run() {
        print_r($this->routes);
        echo "It is file Router.php";
    }
}

ЗАДАЧА 3

Теперь нам нужно реализовать метод run(). Это та часть, которая отвечает за анализ запроса и передачу управления

  1. Получение запроса
  2. Проверить наличие такого запроса в файле routes.php
  3. Если найдется совпадение. то определить какой контроллер и экшен будут обрабатывать это запрос
  4. Подключить файл, который содержит класс-контроллер
  5. Создать объект этого класса контроллер и вызвать нужный метод

Теперь по порядку:

Получение запроса


Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {
        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    public function run() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        $uri = trim($_SERVER['REQUEST_URI'], '/');
        }
        echo $uri;
    }
}



Здесь мы из супер глобального массива $_SERVER по ключу 'REQUEST_URI' получаем нужную строке запроса

Теперь идем на наш сайт и в строке запроса дописываем /news/ - например. Или любое другое значение. Нажимаем Enter и видим значение из строки на нашем сайте.





Теперь, для того, чтобы сделать наш код понятнее и красивее, мы можем вынести этот код в отдельный метод - private function getURI(),а вызов сделаем из функции run() таким образом - $uri = $this->getURI();



Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;
       
    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
//Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        echo $uri;
    }
}

Метод getURI() мы сделали приватным, тем самым применили инкапсуляцию, потому как обращаться к этому методу мы планируем только из класса Роутер

Еще раз проверяем. Должно все работать точно так же как и в прошлый раз.

Проверить наличие такого запроса в файле routes.php

Теперь нам нужно найти такую строку запроса, которая содержится в переменной - $uri в наших маршрутах в файле -routes.php

Файл Router.php на данный момент полностью:
foreach ($this->routes as $uriPattern => $path) {
            echo "
$uriPattern -> $path"; }


Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    //Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path) {
            echo "
$uriPattern -> $path"; } } }

Здесь для каждого маршрута $this->routes, который находится в нашем массиве,мы помещаем в переменную -$uriPattern строку запросов из роутов файла- routes.php(левая часть до => знака), а в переменную $path - путь обработчика


Перезагружаем страницу и видим:





Теперь мы будем сравнивать строку запроса $uri с данными которые содержатся в роутах- $uriPattern

Это легко сделать используя функцию preg_match() Для этого мы передаем в нее строку запроса - $uri и данные из наших роутов - $uriPattern

Для проверки выводим +. То есть если наш запрос в адресной строке будет совпадать с роутами то увидим на странице +.
 if(preg_match("~$uriPattern~", $uri)) {
                echo '+';
            }
        }

Сохранили изменения в файле. Заходим на сайт, перезагружаем и получаем:





Причем, если теперь вы введете в строку запроса значение несоответствующее нашим роутам ('news' => 'news/index','products' => 'product/list' ), то ничего не увидите на сайте.

То есть, пока что наш роутер готов обработать два запроса - news и products по определенному правилу.

Обратите внимание, что в качестве разделителей в патерне "~$uriPattern~" я использовал тильду, так как в нашем патерне могут содержаться слэши- '/' например при таком адресе страницы (' news/archive' => 'news/archive'). Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    //Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path) {
            if(preg_match("~$uriPattern~", $uri)) {
                echo '+';
            }
        }
    }
}

Итак, если условие соблюдается. то в переменной $path будут находиться имя контроллера и экшена. Чтобы в этом убедиться вам нужно заменить + в выводе echo на переменную $path - вот так: echo $path;

Идем на страницу сайта, вводим запрос (существующий) и получаем:





Определяем какой контроллер и экшен обрабатывают запрос

Мы можем это получить с помощью функции - explode(), чтобы разделить строку на две части

Результат вы можете увидеть на скриншоте, а код файла Router.php ниже





Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    //Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path) {
            if(preg_match("~$uriPattern~", $uri)) {
                $segments = explode('/', $path);
                echo '
';
                print_r ($segments);
                echo '
'; } } } }


В результате мы получили два элемента, первый относящийся к контроллеру и второй к экшену

Теперь мы можем получить имя контроллера:

$controllerName = array_shift($segments).'Controller';

Здесь мы используем функцию array_shift(), она получает первый элемент из массива $segments и удаляет его. К этому значению мы добавляем слово 'Controller', поскольку мы приняли за систему такое именование конроллеров.


теперь нам остается сделать заглавной первую букву в названии контроллера функцией :


$controllerName = ucfirst($controllerName);
И теперь можно сохранить и проверить наш сайт.



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


$actionName = 'action'.ucfirst((array_shift($segments)));



Файл Router.php на данный момент полностью:
<?php

class Router {
    private $routes;

    public function __construct() {

        $routesPath = ROOT.'/config/routes.php';
        $this->routes = include($routesPath);
    }
    //Returns request string
    private function getURI() {

        if (!empty($_SERVER['REQUEST_URI'])) {
        return trim($_SERVER['REQUEST_URI'], '/');
        }
    }
    public function run() {

        $uri = $this->getURI();
        foreach ($this->routes as $uriPattern => $path) {
            if(preg_match("~$uriPattern~", $uri)) {
                $segments = explode('/', $path);

                $controllerName = array_shift($segments).'Controller';
                $controllerName = ucfirst($controllerName);
                $actionName = 'action'.ucfirst((array_shift($segments)));
                    echo $controllerName.'
'.$actionName; } } } }


Да, кстати, теперь самое время добавить в папку controllers новые файлы ArticleController.php , NewsController.php и ProductController.php


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


Вначале нам нужно создать наши контроллеры.


И вот теперь самое время добавить в папку controllers новые файлы ArticleController.php , NewsController.php и ProductController.php

Содержимое файлов NewsController.php и ProductController.php и ArticleController.php это соответствующий класс и один метод, который пустой и просто возвращает - true



NewsController.php
<?php

class NewsController {
	public function actionIndex()
		{
			return true;
		}

		
}




ProductController.php
<?php

class ProductController
{


		public function actionList()
		{
			return true;
		}


}


ArticleController.php
&jt;?php

class ArticleController
{


		public function actionList()
		{
			return true;
		}


}



Продолжаем работать над файлом Router.php и далее нам нужно подключить файл класса контроллера. Так как мы уже знаем его имя - $controllerName и используем определенный подход к названию фалов в папке контролеров, то сделать это очень просто вот таким кодом:



$controllerFile = ROOT . '/controllers/' .$controllerName. '.php';
				if (file_exists($controllerFile)) {
					include_once($controllerFile);
				}

В этой части кода $controllerFile = ROOT . '/controllers/' .$controllerName. '.php'; мы определяем файл который необходимо подключить. Для этого мы прописываем путь к нему используя имя класса


Далее мы непосредственно подключаем его, предварительно проверяя существует ли он?



if (file_exists($controllerFile)) {
                    include_once($controllerFile);
                } 


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


Создаем объект класса контрллера - $controllerObject = new $controllerName;. Вместо имени класса мы подставляем переменную, которая содержит строку с именем этого класса.


Далее для этого объекта $controllerObject мы вызываем метод $actionName(), точно так же мы используем переменную, которая содержит строку с названием нужного метода. В наших методах в файлах контолерах, мы писали return true для того, чтобы мы могли передать это значение определенной переменной - $result. В рузельтате, если метод сработал, то мы сможем об этом узнать и оборвать весь цикл - if ($result != null) { break; }. , который ищет совпадения в наших маршрутах.



$controllerObject = new $controllerName;
				$result = $controllerObject->$actionName();
				if ($result != null) {
					break;
				}



Теперь наша система практически готова. Осталось добавить несколько штрихов в наши методы контроллеров и проверим ее на работоспособность. Например в NewsController.php (перед return true) - echo "NewsController.php actionIndex ";





Это позволило нам убедиться, что зaпущенн нужный нам метод. Точно тоже мы проделаем и с другим контроллером


Теперь если мы зайдем по другому адресу, мы получим уже совсем другой контроллер с новым экшеном. Если мы зайдем по адресу, которого нет в таблице наших маршрутов (роутах) то мы не получим ничего.





Все файлы проекта можно посмотреть на Гугл Диске

Далее Модель, Представление и усовершенствования класса Роутер

                                                                                                                                                             

среда, 9 августа 2017 г.

Laravel Начало работы (1)

Установка фреймворка Laravel на OpenServer

Идем на сайт - laravel.com.Перед началом работы стоит проверить версию рнр (должна быть PHP >= 5.6.4). Для проверки версии зайдите в Настройки - > Модули OpenServer.
После этого, скопируйте ссылку на официальном сайте и откройте командную строку, как показано на картинке ниже. Можно использовать КС вашей операционной системы, но я пользуюсь от OpenServer. Для того, чтобы убедиться, что у вас установлен composer, нужно ввести composer в КС и нажать Enter. Если он не установлен, то его следует установить самостоятельно.
Далее нам нужно перейти в диреторию domains.Для этого используем команду cd c:\OpenServer\domains (путь к папке - c:\OpenServer\domains - измените, если он у вас отличается).
Далее введите скопированную команду в КС. Можно изменить название конечной папки установки (blog) на любое другое.
composer create-project --prefer-dist laravel/laravel blog

Нажмите Enter и дождитесь окончания установки.
Из всей структуры файлов, нас сейчас интересует .env На картинке он обведен красным. Открываем его в вашем текстовом редакторе.

Вверху второй абзац :-) Это то, что нам следует изменить, введя свои данные:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=minilaravel
- здесь имя вашей Базы Данных
DB_USERNAME=root - ваше имя пользователя
DB_PASSWORD= - ваш пароль (если нет, то оставить пустое место)
Теперь, если зайти на ваш сайт по адресу, то мы попадем не на главную страницу, а увидим список файлов. Чтобы это исправить, можно создать специальные настройки для OpenServer или в корневой директории вашего сайта создать отдельный файл .htaccess (подчеркнут красным на картинке выше). В него нужно прописать следующее:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^public
RewriteRule ^(.*)$ public/$l [L]
Для настроек на локальном сервере - перейдите в Настройки -> Домены и Укажите имя вашего доена в первой графе, а во второй выберете папку public, как показано на картинке ниже.
Нажмете кнопку Добавить
Теперь при переходе на сайт посетители будут попадать на главную страницу сайта
                                                                                                                                                             

вторник, 8 августа 2017 г.

Создание Базы Данных на OpenServer

При изучении PHP по книгам и руководствам часто возникают проблемы с созданием базы данных (далее - БД) при работе с OpenSrver. Я решил рассмотреть этот вопрос по шагам. И так, приступаем!
  1. Открываем КС - командную строку и переходим в директорию БД OpenServer
    cd C:\OpenServer\modules\database\MariaDB-5.5\bin
    Соединяемся с БД - mysql -u root
    Получаем подтверждение об установленном соединении или повторяем все с начала.

  2. Для просмотра уже существующих БД набираем SHOW DATABASES;

  3. Для работы и перехода к существующей БД - набираемuse name_database;name_database - имя уже существующей БД.ИЛИ создаем новую БД с помощью команды CREATE DATABASE name_database;
    набираемuse name_database; для работы с вновь созданной базой данных

  4. Создаем таблицу в нашей БД, следующей командой:
    CREATE TABLE `aliens_abduction` (
    `first_name` VARCHAR(30) ,
    `last_name` VARCHAR(30) ,
    `whеп_it_hаррепеd` varchar(30) ,
    `hоw_lопg` VARCHAR(30) ,
    `how_many` VARCHAR(30) ,
    `alien_description` VARCHAR(lOO) ,
    `what_they_did` VARCHAR(lOO) ,
    `fang_spotted` VARCHAR(lO) ,
    `other` VARCHAR(lOO) ,
    `email` VАRСНАR(50)
    ) ;
    При наборе использовал Гравис - одинарная кавычка (буква Ё в англ раскладке)

  5. Для того, чтобы добавить данные в новую таблицу:
    INSERT INTO alien_abduction (first_name, last_name, when_it_happened, how_long, how_many, alien_description, what_they_did, fang_spotted, other, email)
    VALUES ('Салли', 'Джонс', '3 дня назад', '1 день' ,'четыре', 'зеленые с шестью щупальцами', 'мы просто разговаривали и играли с со6акой' , ' да', ' возможно, я видела вашу собаку, свяжитесь со мной','sally@mail.com');

  6. Для того, чтобы посмотреть все данные в таблице набираем:
    SELECT * FROM aliens_abduction



Теперь нам осталось сделать так, чтобы данные в таблицу добавлялись автоматически рнр-сценарием


  1. На OpenServer в папке domains у нас есть папка с нашим сайтом mysite. Внутри нее есть два файла report.html и report.php.

    report.html


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>Aliens Abducted Me - Report an Abduction</title>
      <link rel="stylesheet" type="text/css" href="style.css" />
    </head>
    <body>
      <h2>Aliens Abducted Me - Report an Abduction</h2>
    
      <p>Share your story of alien abduction:</p>
      <form method="post" action="report.php">
        <label for="firstname">First name:</label>
        <input type="text" name="firstname" /><br />
        <label for="lastname">Last name:</label>
        <input type="text" name="lastname" /><br />
        <label for="email">What is your email address?</label>
        <input type="text" name="email" /><br />
        <label for="whenithappened">When did it happen?</label>
        <input type="text" name="whenithappened" /><br />
        <label for="howlong">How long were you gone?</label>
        <input type="text" name="howlong" /><br />
        <label for="howmany">How many did you see?</label>
        <input type="text" name="howmany" /><br />
        <label for="aliendescription">Describe them:</label>
        <input type="text" name="aliendescription" size="32" /><br />
        <label for="whattheydid">What did they do to you?</label>
        <input type="text" name="whattheydid" size="32" /><br />
        <label for="fangspotted">Have you seen my dog Fang?</label>
        Yes <input name="fangspotted" type="radio" value="yes" />
        No <input name="fangspotted" type="radio" value="no" /><br />
        <img src="fang.jpg" width="100" height="175"
          alt="My abducted dog Fang." /><br />
        <label for="other">Anything else you want to add?</label>
        <textarea name="other"></textarea><br />
        <input type="submit" value="Report Abduction" name="submit" />
      </form>
    </body>
    </html>
    
    


    report.php


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
      <title>Aliens Abducted Me - Report an Abduction</title>
    </head>
    <body>
      <h2>Aliens Abducted Me - Report an Abduction</h2>
    
    <?php
      $first_name = $_POST['firstname'];
      $last_name = $_POST['lastname'];
      $when_it_happened = $_POST['whenithappened'];
      $how_long = $_POST['howlong'];
      $how_many = $_POST['howmany'];
      $alien_description = $_POST['aliendescription'];
      $what_they_did = $_POST['whattheydid'];
      $fang_spotted = $_POST['fangspotted'];
      $email = $_POST['email'];
      $other = $_POST['other'];
    
      $dbc = mysqli_connect('localhost', 'root', '', 'aliendatabase')
        or die('Error connecting to MySQL server.');
    
      $query = "INSERT INTO alien_abduction (first_name, last_name, when_it_happened, how_long, " .
        "how_many, alien_description, what_they_did, fang_spotted, other, email) " .
        "VALUES ('$first_name', '$last_name', '$when_it_happened', '$how_long', '$how_many', " .
        "'$alien_description', '$what_they_did', '$fang_spotted', '$other', '$email')";
    
      $result = mysqli_query($dbc, $query)
        or die('Error querying database.');
    
      mysqli_close($dbc);
    
      echo 'Thanks for submitting the form.<br />';
      echo 'You were abducted ' . $when_it_happened;
      echo ' and were gone for ' . $how_long . '<br />';
      echo 'Number of aliens: ' . $how_many . '<br />';
      echo 'Describe them: ' . $alien_description . '<br />';
      echo 'The aliens did this: ' . $what_they_did . '<br />';
      echo 'Was Fang there? ' . $fang_spotted . '<br />';
      echo 'Other comments: ' . $other . '<br />';
      echo 'Your email address is ' . $email;
    ?>
    
    </body>
    </html>
    
    

  2. Для соединения с уже созданной базой данных мы создали переменную с запросом:
    $dbc = mysqli_connect('localhost', 'root', '', 'aliendatabase') or die('Error connecting to MySQL server.');
    Первый параметр -localhost остается без изменений, затем идет имя пользователя (в моем случае - root), пароля нет - '' и имя БД - aliendatabase

  3. В следующей перменной мы поместили все действия с данными (куда попадет тот или иной параметр введенный пользователем)
    $query = "INSERT INTO alien_abduction (first_name, last_name, when_it_happened, how_long, " . "how_many, alien_description, what_they_did, fang_spotted, other, email) " . "VALUES ('$first_name', '$last_name', '$when_it_happened', '$how_long', '$how_many', " . "'$alien_description', '$what_they_did', '$fang_spotted', '$other', '$email')";
  4. Запрос к БД - $result = mysqli_query($dbc, $query) or die('Error querying database.');

  5. РНР-функция die () прерывает ход выполнения сценария и выводит сообщение о коде, который выполнить не удалось. Хотя это и не раскрывает всех причин неудачи в подробностях, функция die () все же сообщает нам: что-то случилось и необходимо принимать меры по решению проблемы. Если что-то не так с одним из четырех аргументов, необходимых для соединения функции mysqli_connect ( ) , или сервер баз данных не может быть найден, функция die () останавливает ход выполнения сценария и выводит сообщение об ошибке, которое передается ей в качестве аргумента в скобках.

  6. Функции mysqli_query () необходимо передать в качестве аргумента SQL-запрос в виде РНР-строки (значения переменной $query), для того чтобы произвести добавление данных о похищении космическими пришельцами.

  7. После всего закрываем БД - mysqli_close($dbc);

Более подробно о работе с базой данных смотрите мой пост —Введение в MySQL
                                                                                                                                                             

среда, 31 мая 2017 г.

Добавление файлов в существующий репозиторий GitHub

Вот то что я делал: Для начала я переместил все нужные файлы в папку, с которой уже отправлял файлы на этот репозиторий. Затем ввел последовательно следующие команды:
  1. git add .
  2. git commit -m""
  3. git status
  4. git push shared master
  5. git clone https://github.com/YaroslavW/templates.git
  6. git push https://github.com/YaroslavW/templates.git master


Результат всех действий на фото ниже:



В итоге все мои файлы оказались в нужном репозитории.

Иногда, требуется ввести и такую последовательность (пример c сайта "Тостер")

git init
git remote add origin https://github.com/splincode/unitrack.git
git checkout -b master
git clone https://github.com/splincode/unitrack.git
git add .
git config --global user.name 'splincode'
git config --global user.email 'omaxphp@yandex.com'
git config --global color.diff 'auto'
git config --global color.status 'auto'
git config --global color.branch 'auto'
git commit -m "Комментарий для коммита"
git push https://github.com/splincode/unitrack.git master

Если вы уже добавили сайт в репозиторий, но вспомнили, что забыли приложить к нему (скриншот например - site.jpg), то тогда последовательность действий следующая:


  1. git add site.jpg
  2. git commit -m'Your text for commit'
  3. git push
Материалы по Git, которые могут быть вам интересны:


Хотите освоить самые современные методы написания React приложений? Надоели простые проекты? Нужны курсы, книги, руководства, индивидуальные занятия по React и не только? Хотите стать разработчиком полного цикла, освоить стек MERN, или вы только начинаете свой путь в программировании, и не знаете с чего начать, то пишите через форму связи, подписывайтесь на мой канал в Телеге, вступайте в группу на Facebook.


Удачного кодирования!                                                                                                                                                              

Телеграм канал - Full Stack JavaScript Developer
Помочь проекту (любая валюта). DONATE


Хотите освоить самые современные методы написания React приложений? Надоели простые проекты? Нужны курсы, книги, руководства, индивидуальные занятия по React и не только? Хотите стать разработчиком полного цикла, освоить стек MERN, или вы только начинаете свой путь в программировании, и не знаете с чего начать, то пишите через форму связи, подписывайтесь на мой канал в Телеге, вступайте в группу на Facebook.Пишите мне - kolesnikovy70 почта gmail.com