Создание собственного фреймворка. Мультиязычность. Часть 4. Урок 29

preview_player
Показать описание
Посмотрите уроки по разработке веб-приложения на PHP:

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

В этом уроке мы завершим реализацию мультиязычности для сайта, создаваемого на нашем фреймворке. В предыдущем уроке мы расширили паттерн MVC базовым классом Language и реализовали в результате паттерн MVCL. Созданный класс умеет переводить статические надписи в шаблонах и представлениях приложения (заголовки, надписи на кнопках и т.п.).

Однако, для мультиязычного сайта этого недостаточно. Поэтому в данном уроке мы добавим многоязычность для динамического контента сайта. Сделать это будет достаточно просто – нам всего-то нужно получить код активного языка сайта и, в зависимости от него, выбрать из базы данных контент на том или ином языке.
Рекомендации по теме
Комментарии
Автор

Спасибо ещё раз! Андрей за ваш труд! все ясно и понятно)) все на месте

yaokouassi
Автор

Лайк, подписка .. спасибо за ваш труд и свечка за ваше здоровье)

ЕгорБахов-кп
Автор

Потрясающе. Спасибо. Вы лучший без сомнения.

виртуоз_ру
Автор

На этом видео, я заканчиваю ваш курс спасибо вам огромное я многому научился.. И все благодаря вам

Олександр-птж
Автор

Андрей! Слов благодарности не хватит. Очень интересно рассказываете. Смотрю с открытым ртом. Но хотел бы вас попросить подправить .htaccess в следующем уроке. INSERT - двойная запись без указания id. двойное срабатывание .htaccess.

serzhsk
Автор

Андрей! Решил вам тему предложить. Во первых реализацию одного единственного шаблона. Примерно это выглядит так: В файле View добавляем пару методов
public
function headers( $hers = '' ) {
if (
$this->route[ 'action' ] == 'index'
or $this->route[ 'action' ] == 'login' ) {
$hers = '<link rel="stylesheet" type="text/css">';
}
echo '<!doctype html>
<html>
<head>
<link rel="shortcut icon" type="image/x-icon">
<meta charset="utf-8">
<title>' . $this->route[ 'action' ] . '</title>
' . $hers . '
</head>
<body>';

}
public

function footer() {
echo '
</body>
</html>';

}
Сразу под ob_start() в render вставляем $this->headers( $this->route[ 'action' ] );
и $this->footer(); вставляем перед $content = ob_get_clean();
а из дефолтного шаблона все удаляем кроме контент. Вариант такой что его можно тогда использовать и под ajax. Все в одном шаблоне.
Вариант такой. Может стоит написать отдельный класс для этих методов?
И вообще я тут голову почесал, ту что большая и у меня родилась идея создать статические html.
В render() перед include $file_layout; я повторно включил ob_srart();
и ниже добавил три строчки:
$contents = ob_get_contents();
$file_html = ROOT .
file_put_contents( $file_html, $contents . PHP_EOL, FILE_APPEND );
создал в корне папку upview и в нее поместил папки как во views.
Сразу после render() написал условие:
$file_html = ROOT .
if ( is_file( $file_html ) ) {
include $file_html;
} else {
и в else заключил все что ниже. Теперь у меня грузятся html файлы вместо layout и буфера.
Но я так думаю что им надо сделать так же срок жизни как и cache. Но лучше по условию, в котором очистка html файлов будет если например были затронуты определенные поля UPDATE в базе или еще что-то в этом роде. Я в php особенно в oop не силен. Хотелось бы услышать ваше мнение наставника, дополнения и замечания.
Вы давно не делали уроки. Я скучаю. И я думаю мое мнение разделяют многие. Жду с нетерпением. АМИНЬ!

serzhsk
Автор

Добрый день! А как в админке редактировать одновременно две статьи? Я имею в виду как их найти (SQL запрос), по какому признаку. Заголовки разные, алиасы тоже. Неужели по одиночке искать из большого списка? Подкиньте пожалуйста хотя бы идею.

БорисПращурович
Автор

Можно ли взять исходники из данного видео?

middle
Автор

Андрей здравствуй!
При регистрации и при авторизации как Вы защищаетесь от sql-инъекций? Защищает redbeanphp или подготовленные запросы. Если у моего сайта не установлен redbean, но запросы выполняются через вашу функцию
public function findBySql($sql, $params = []){
return $this->pdo->query($sql, $params);
}
Можно ли сказать, что авторизация полностью защищена или необходимо дополнительно обрабатывать данные?

ivantarabukin
Автор

(с) - МАЛАВАТА БУДЕТ!!!! МАЛАВАТА!!!
-ну и что, что я жадничаю... зато от чистого сердца!

Андрей, подскажите, вы записываете еще видео к этому курсу?

СергейВасиленко-мп
Автор

Андрей, Здравствуйте! Предлагаю реализовать UI страницу, где можно управлять текущими страницами(url). тайтлы описание и какой шаблон используется. Думаю не простая тема. Если такого не будет, то прошу хотя бы в комментарии описаться, то как правильно это реализовать

TheNcoding
Автор

(c) - Когда мы доберемся до админки (если доберемся)...

Помните как с старом добром фильме про Электроника - "не надо "и"..."
Андрей, "если" - недобрый знак.
Очень хочется добраться до админки).

Спасибо за уроки.

СергейВасиленко-мп
Автор

Еще возник один вопрос к Вам Андрей. Мы как-то очень быстро проскочили подключение к базе в 5 уроке. Не было такого досконального тестирования как при создании class Router. Меня очень заинтересовала тема “Singleton”. Я ее решил протестировать и! Когда в конструкторе Model мы вызываем
$this->pdo = Db::instance();
то через print_r() получаем
Db Object ( [pdo:protected] => PDO Object ( ) )
1
Db Object ( [pdo:protected] => PDO Object ( ) )
1
Два вызова в подряд.
А когда вызываем new Model - то там я вижу гигантскую строку -
Model Object ( [pdoss:protected] => Db Object ( [pdo:protected] => PDO Object ( ) ) [table:protected] => [pdo:protected] => )
Очень буду Вам благодарен Андрей если вы разъясните или подправите данный пример и также пример .htaccess о котором я писал чуть ранее. И Андрей я новичок. И меня Ваши уроки просто завораживают. Спасибо Вам.

serzhsk
Автор

Спасибо за уроки! Нужен класс по выводу картинок.

alexandralchin
Автор

Андрей я больше писать - постараюсь не писать. Это же конечно не форум. Просто хочу сообщить вам что для себя через бухты барахты разрешил вопрос создание объекта ну и все о чем сопутствующе писал кроме .htaccess . .htaccess конечно я тоже подправил и все работает. Но в .htaccess я профан. Хотелось бы увидеть волшебное касание мастера, а не извращения недоделкина. В htaccess в корне я кроме public дописал и index.php а в public htaccess строку index.php удалил. Но мне кажется что в дальнейшем это может вызвать проблемы неизвестного характера. Очень жду ваших рекомендаций.

serzhsk
Автор

Здравствуйте Андрей написал метод findOne создал экшен view вызываю метод findOne(5) работает когда передаю параметр $id чтобы он работал из браузера не работает .... Запишите урок по отображению одной записи... Спасибо огромное....

nikoskullez
Автор

Блин извините меня, но у меня тут опять неприятность. Начал еще дополнительно тестировать функцию instance() . Сделал echo на создание объекта и на возврат $instance. И в браузере вижу только создание объекта и не разу возврата. Я вас не в коем случае не виню. Интернет напичкан данной функцией с разными вариациями. Но вы же учите нас. Помогите! Какой смысл переписывать готовый код без объяснений? И работает он не так как обещано. Андрей! - будьте нам еще и другом. Ну!

serzhsk
Автор

Фреймворк для новичков, уровня 0+. Делегирования нет, а нужно, для модульности, хотя бы, уровень абстракции почти нулевой, контроллеры не тонкие, инфраструктура низкоуровневого кода не вынесена отдельно от бизнес логики моделей, ни одного интерфейса, как подключиться и работать с чем то своим, не переписывая главный функционал, не понятно(не возможно). И еще много, много....Такой фреймворк сложно назвать ООП, скорее всего, описание классов процедурным подходом. И в довесок PSR4 в помощь.
Хорошее ООП:
Привносит модульность
Повышает совместимость
Локализует изменения
Абстрагируется от реализации
Упрощает код
Легко тестируется

sozidatel