Translate

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

среда, 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

вторник, 30 мая 2017 г.

Git - добавление репозитория на GitHub

Допустим, что у нас есть папка проекта на нашем компьютере, в которой находятся файлы html, css, js и прочие. наша задача сделать некоторые изменения в наших файлах, сохранит их и разместить наш проект на GitHub




  1. Переходим к папке проекта и нажимаем на нее правой кнопкой мыши. Вызываем Git Bash
  2. В нем делаем инициализацию репозитория - git init
  3. Добавляем наш проект в этот репозиторий (пока что все в Git)git add .
  4. Делаем первый коммит git commit -m"Первый коммит"
  5. Смотрим статус нашего проектаgit status

  6. Все изменения на панели - здесь :



  7. Теперь делаем изменения в нашем проекте. Например, мы добавим что-то в файл index.html
  8. Проверяем статус нашего проекта git status Видим, что изменения есть в файле index.html (отмечены красным).
  9. Делаем добавление наших файлов git add .
  10. Делаем второй коммит git commit -m"Второй коммит"
  11. Проверяем статус проекта git status - показывает что все чисто - см фото ниже :




  12. Теперь что -то удалим из файла и что-то добавим. Это важно сделать, для того, чтобы потом можно было увидеть разницу в изменениях (удаление, добавление), когда мы выложим проект на GitHub
  13. .
  14. Повторяем все снова -пункты 7, 8, 9.
  15. Теперь создаем пустой репозиторий на GitHub. Называем его - все равно как. Нас интересуют только две ссылки На фото ниже они отмечены красными стрелками. Они для каждого проекта свои и их нужно взять при создании репозитория.








  16. Добавляем их по очереди нажимая клавишу Enter
  17. Пришло время перейти в репозиторий и убедиться что все файлы добавлены. Там же мы можем увидеть и наши коммиты. Нажав на них мы сможем посмотреть, как изменялись наши файлы. Добавления - (+)выделены зеленым, а удаления красным (-)

Материалы по Git, которые могут быть вам интересны:


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


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

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

понедельник, 29 мая 2017 г.

Git - Клонирование репозитория GitHub на компьютер

  1. Заходим на сайт GitHub, выбираем интересующий нас репозиторий и получаем ссылку.
  2. На компьютере создаем новую пустую папку. Щелкаем правой кнопкой мыши и выбираем Git Bash Here
  3. В открывшемся окне Git Bash пишем git clone вставляем здесь ссылку (пр.кнопкой мыши - "Paste")
  4. Нажимаем Enter и ждем когда все файлы репозитория GitHub будут скопированы в вашу вновь созданную папку.
Материалы по Git, которые могут быть вам интересны:


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


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

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


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