Oc-windows.ru

IT Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Phpdug view all

View в MVC

Сегодня мы сделаем компонент View, то самое “V” в архитектуре MVC. View – это представление, то есть та часть программы, которая формирует то, что видит пользователь.

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

Итак, давайте рассмотрим простейший пример и создадим для начала только шаблон. Путь до него будет следующим: templates/main/main.php

Давайте запишем в него HTML-код для нашей будущей странички
templates/main/main.php

Теперь давайте откроем наш контроллер MainController и изменим его метод main()
src/MyProject/Controllers/MainController.php

Теперь откроем http://myproject.loc/ и полюбуемся результатом:

Для начала давайте немного облегчим шаблон и вынесем стили в отдельный файл. Для этого в папке www создадим файл styles.css.
www/styles.css

Теперь подключим этот файл со стилями в шаблоне:

И снова убедимся, что всё работает.

Давайте теперь попробуем передавать в шаблон переменные. Вместо явно заданных статей сделаем переменную со статьями:
src/MyProject/Controllers/MainController.php

А теперь выведем эти статьи в шаблоне:
templates/main/main.php

Если нам понадобится в другом контроллере или другом экшне добавить логику для работы с шаблонами, нам снова придется перечислять список переменных, а затем писать include с указанием полного пути для шаблона. Звучит не очень хорошо. Поэтому мы просто вынесем логику с подключением нужного шаблона в отдельный класс.

Создадим класс View.php по пути src/MyProject/View/View.php

В конструкторе этого класса мы будем принимать путь до папки с шаблонами:
src/MyProject/View/View.php

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

Функция extract извлекает массив в переменные. То есть она делает следующее: в неё передаётся массив [‘key1’ => 1, ‘key2’ => 2], а после её вызова у нас имеются переменные $key1 = 1 и $key2 = 2.

После этого мы просто подключаем файл с нужным шаблоном, получив путь до него, склеив пути до папки с шаблонами и именем конкретного шаблона.

Пришло время опробовать этот код в нашем контроллере. Создадим новый объект View в конструкторе контроллера, а затем внутри экшена вызовем renderHtml().
src/MyProject/Controllers/MainController.php

Теперь мы можем снова открыть сайт, и убедиться, что всё прекрасно работает.

Буфер вывода

В тот момент, когда мы подключаем файл c HTML-кодом, либо пишем в PHP-коде echo, либо совершаем какой-либо другой вывод данных, эти данные начинают сразу передаваться в поток вывода. И если что-то пойдёт не так, мы не сможем вернуть этот вывод и вывести вместо него какую-нибудь ошибку. Но в PHP есть возможность весь этот поток вывода положить во временный буфер вывода. Выглядит его использование следующим образом:
src/MyProject/View/View.php

Если вы сейчас попробуете запустить наш скрипт, то увидите пустую страницу. Дело в том, что все данные, которые должны были быть переданы в поток вывода, оказались в переменной $buffer.
Для того, чтобы передать эти данные в поток вывода, достаточно только вывести переменную $buffer.
src/MyProject/View/View.php

Откройте страничку снова, и убедитесь, что всё вернулось на свои места.

Так в чём же профит? А профит в том, что мы можем обрабатывать ошибки, возникшие в процессе работы с шаблоном. Пока мы с вами не знакомы с понятием «Исключения», давайте предположим, что у нас при подключении шаблона произошла какая-то ошибка. Тогда мы могли бы обработать эту ошибку и не выводить пользователю неправильно отрисованный шаблон. Мы могли бы сделать что-то типа такого:
src/MyProject/View/View.php

Чуть позже мы вернёмся к обработке возможных ошибок, когда познакомимся с исключениями. А пока оставим этот код в таком состоянии:
src/MyProject/View/View.php

Реиспользование шаблонов

Давайте в наш контроллер вернём экшн из прошлых уроков, который выводил приветствие.
src/MyProject/Controllers/MainController.php

Давайте изменим его, чтобы он работал через шаблон.

Ну и создадим сам шаблон для него.
templates/main/hello.php

Давайте теперь перейдём по адресу http://myproject.loc/hello/username и увидим, что всё прекрасно сработало:

А теперь внимательно присмотритесь к нашим двум получившимся шаблонам. Согласитесь, у них всё абсолютно одинаковое, кроме текста, который мы выводим на странице. Давайте это исправим! Всё, что выше нашего контента – вынесем в один файл, всё что ниже – в другой. А в самих наших шаблонах будем эти два файла подключать.

Читать еще:  Исправление ошибок в тексте

Итак, выносим верхнюю часть (так называемую шапку сайта — хедер) в новый файл templates/header.php
templates/header.php

Затем выносим нижнюю часть (называемую футером или подвалом) в файл templates/footer.php
templates/footer.php

После чего редактируем наши шаблоны:
templates/main/main.php

Должна получиться вот такая структура в шаблонах:

После этого заходим на странички http://myproject.loc/hello/username и http://myproject.loc/ и радуемся результату 🙂

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

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

stevetaivn / socialbookmark.txt

«Published scoops»
inurl:»/published/top365days»
inurl:»/published/top30days»
inurl:»/published/top7days»
inurl:»/published/top365days»
inurl:»/upcoming/leastpopular»
«Sosbook Power» Drigg
«Please visit GetBoo’s wiki for more information about the project.»
«stored on GetBoo»
«Get your bookmarks!» getboo
«Keep all your bookmarks in one place, accessible from anywhere.»
«Share some of your bookmarks with the world, and keep»
Hotaru Popular Upcoming Latest «Best from»
«Enter your username, email and password to register:» Hotaru
«al menos cinco caracteres»+»es importante que sea correcta, recibirás un correo para validar la cuenta»
«Copyright * TeraPix.de»
«save and share interesting links»
«Interessante Links speichern und teilen»
«die Top * aus * Bookmarks»
«our top * out of * bookmarks»
«als UND Verknüpfung suchen»
«Neu hier? Jetzt kostenlos mitmachen»
«Are you new? Sign up for free»
«combine keywords with AND»
Startseite Charts Anmelden Tools Schlagwörter Mitgliederbereich
«Submit Story» Popular Upcoming «View All»
Categories Join Login «View All» Popular Upcoming «Powered By PHPDug version»
inurl:/viewall/1.html
inurl:/upcoming/0/viewall/1.html
«Powered By PHPDug» inurl:signup.php
«Powered By PHPDug» inurl:login.php
«Powered By PHPDug» inurl:add_story.php
«Who Dugg this story?» «Email This Link»
inurl:phpdug/signup
digs «dig it» Popular Upcoming Join Login «Submit Story»
«I agree to the Terms and Conditions for using PHPDug»
«PHPDug View All»
inurl:»html.php? >
«Published News» «Upcoming News» «Submit a New Story» Groups «Create a Group»
«Published News» «Upcoming News» «Submit a new story» «What is Pligg?»
«Published News» «Upcoming News» «Submit a New Story» «Powered by Pligg»
inurl:/register «Powered by Pligg»
inurl:story.php?title=
«Pligg is a Web 2.0 open source content management system»
«Powered By Pligg» «Legal: License and Source»
«Designed by Pligg Templates»
«Already have an account? Fantastic, log in below!»
«My Pligg Site gives you a place to save and share your favorite web links»
«Pligg Content Management System» «Register an Account»
«Powered by Pligg CMS»
«Sort news by: Recently Popular» «Top Today» Yesterday Week Month Year
inurl:»/pligg» inurl:/register.php
inurl:»cloud.php» intitle:»pligg»
inurl:»faq-en.php» pligg
inurl:»live_comments» intitle:»pligg»
inurl:»register» intitle:»pligg»
inurl:»upcoming» intitle:»pligg»
inurl:/register upcoming published submit «Tag Cloud» -inurl:.php
inurl:»/register» upcoming published submit
inurl:»/register» upcoming published submit -inurl:.php intitle:»register»
inurl:»/register» upcoming published submit «Tag Cloud»
inurl:»/register.php» «Powered by Pligg»
inurl:»register.php» upcoming published submit
«Email:» «Lowercase letters only» «Password:» «Five character minimum» «Lowercase letters only» «Five character minimum»
«Du hast bereits einen Account? Prima, log dich hier ein!»
«Pligg is an open source content management system that lets you easily create your own social network»
inanchor:»Pligg beta 9 Home»
inurl:/register intext:»upcoming» intext:»published» intext:»submit» -inurl:.php
inurl:/register intext:»upcoming» intext:»published» intext:»submit» -inurl:.php intitle:»register»
«Powered by Pligg»
«What Is Pligg?»
intitle:»Pligg Beta 9″
«http://www.pligg.com»
«Published News» «Upcoming News»
«Submit a New Story» «Powered by Pligg»
inurl:»story.php?title=»
«There is No need to Register an Account» «Just Go And Submit Your Story on Click Below Link» «Submit a New Story»
«Submit a New Story» «Please follow a few simple guidelines to make this site a better place» «Avoid duplicate submissions»
inurl:/bookmark-button/
intitle:Favoriten, Bookmarks bzw. Lesezeichen Online verwalten
Anmeldung Charts Bookmark-Button
«Recent Bookmarks» register «log in» «Recent Tags»
scuttle inurl:»sort=url_asc»
scuttle inurl:»/search.php/all/»
inurl:populartags.php «Popular tags»
«Propulsed by SemanticScuttle»
«Scuttle: Recent bookmarks»
«Social bookmarking by scuttlePLUS»
inurl:»scuttle/about.php»
inurl:»scuttle/register.php»
inurl:»scuttle/register»
inurl:»scuttle/about.php»
inurl:»bookmarks.php scuttle»
«by scuttlePLUS»
«Store, share and tag your favourite links» scuttle
«Don’t ask for my password for 2 weeks»
«Store all your favourite links in one place, accessible from anywhere»
bookmarks «Store, share and tag your favourite links»
date «Store, share and tag your favourite links»
first «Store, share and tag your favourite links»
next «Store, share and tag your favourite links»
Previous «Store, share and tag your favourite links»
register «Store, share and tag your favourite links»
«Sort by:» «Store, share and tag your favourite links»
«Speicher alle Deine Webseiten-Favoriten an einem Ort»
inurl:»/populartags.php/»
«Visit website» «Post permalink» «Welcome, visitor!»
«Latest Bookmarks» «Story Title» «Source» «Posted» «Submit New!»
inurl:/entries/order/user/
inurl:/entries/order/24hrs/
inurl:/entries/order/7days/
inurl:/entries/order/30days/
inurl:/entries/order/popular/
inurl:/entries/order/latest/
«Order by popular» «TEXT LINK PARTNER» «HOT NEWS»
Latest Upcoming Popular «24 Hrs» «7 Days» «30 Days» RSS
inurl:»/page/detail/privacy-policy.html»
  • © 2020 GitHub, Inc.
  • Terms
  • Privacy
  • Security
  • Status
  • Help

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Документация Django 1.5.2

Следующие три класса реализуют достаточный набор функциональности, чтобы создать представление Django. Вы можете рассматривать их как родительские представления, которые можно использовать как непосредственно, так и в наследовании. Конечно, эти классы не всегда могут удовлетворить все требования к представлению в проекте: в таком случае рекомендуется “присмотреться” к примесям(Mixins) и общим представлениям классам(Generic class-based views)

Множество из встроенных CBV в Django наследуют другие представления-классы или классы-примеси. Это цепочка наследований(и порядок классов) очень важна, поэтому информация о классах-предках находится в разделе Ancestors (MRO). MRO — это акроним для Method Resolution Order.

Самый главный класс в CBV. Все остальные представления-классы наследуются от него.

Диаграмма методов

Пример views.py:

Пример urls.py:

Атрибуты

Список методов HTTP, которые принимает(обрабатывает) данное представление.

Значения по умолчанию:

Методы

Возвращает выполняемое(callable) представление, которое принимает запрос(request) и возвращает ответ(response):

view часть представления – метод, который принимает аргумент request плюс дополнительные аргументы, и возвращает HTTP ответ(response).

Реализация по умолчанию анализирует HTTP метод запроса и делегирует его соответствующему методу класса; GET будет обработан методом get() , запрос POST делегируется к post() , и т.д.

По умолчанию, запрос HEAD будет делегирован в метод get() . Если вам необходимо обработать HEAD запрос другим способом, вы можете переопределить метод head() . Смотри Поддержка других методов HTTP для примера.

Если реализация по умолчанию также устанавливает request , args и kwargs в качестве переменных экземпляра, то любой метод представления может узнать “подробности” о запросе, который вызвал данное представление.

Если представление было вызвано с неподдерживаемым методом HTTP, будет вызван данный метод.

Реализация по умолчанию возвращает HttpResponseNotAllowed со списком разрешенных методов в виде простого текста.

Обрабатывает запросы на определение “глаголов”(методов) OPTIONS HTTP. Возвращает список всех разрешенных для представления методов HTTP.

TemplateView¶

Обрабатывает заданный шаблон, используя контекст(context), содержащий параметры из URL.

Классы-предки, Ancestors (MRO)

Представление наследует методы и атрибуты из следующего представления:

Диаграмма методов

Пример views.py:

Пример urls.py:

Контекст(Context)

params : словарей ключевых аргументов, “отловленных” из шаблона URL, который обрабатывается данным представлением.

RedirectView¶

Редирект на заданный URL.

Переданный URL может содержать строку с форматированием (dictionary-style), которая будет обработана в соответствии с параметрами “отловленными” в URL. Поскольку ключевая интерполяция всегда выполняется (даже если не было передано никаких аргументов), любые символы «%» в URL должны быть написаны как «%%» , а затем Python преобразует их в один знак процента на выходе.

Если переданный URL равен None , Django вернет исключение HttpResponseGone (410).

Классы-предки, Ancestors (MRO)

Представление наследует методы и атрибуты из следующего представления:

Диаграмма методов

Пример views.py:

Пример urls.py:

Атрибуты

Адрес URL для редиректа, в виде строки. Или None для генерации 410 (Gone) HTTP ошибки.

Должно ли перенаправление должно быть постоянным. Единственная разница состоит в возвращаемом HTTP коде статуса. Если True , то для редиректа используется код статуса(use status) 301. Если False , то 302. По умолчанию, permanent установлен в True .

Передавать ли строку GET запроса в новую локацию. Если True ,то строка запроса добавляется к URL. Если False , то строка запроса обрасывается. По умолчанию, query_string равно False .

Методы

Создает целевой URL для редиректа

Реализация по умолчанию использует url в качестве отправной строки, выполняет подстановку % параметров в этой строке, а также добавляет строку запроса если указано в атрибуте query_string . Подклассы могут реализовать любое поведение, важно лишь чтобы метод возвращал корректную строку URL для редиректа.

Документация Django 1.5.2

Следующие три класса реализуют достаточный набор функциональности, чтобы создать представление Django. Вы можете рассматривать их как родительские представления, которые можно использовать как непосредственно, так и в наследовании. Конечно, эти классы не всегда могут удовлетворить все требования к представлению в проекте: в таком случае рекомендуется “присмотреться” к примесям(Mixins) и общим представлениям классам(Generic class-based views)

Множество из встроенных CBV в Django наследуют другие представления-классы или классы-примеси. Это цепочка наследований(и порядок классов) очень важна, поэтому информация о классах-предках находится в разделе Ancestors (MRO). MRO — это акроним для Method Resolution Order.

Самый главный класс в CBV. Все остальные представления-классы наследуются от него.

Диаграмма методов

Пример views.py:

Пример urls.py:

Атрибуты

Список методов HTTP, которые принимает(обрабатывает) данное представление.

Значения по умолчанию:

Методы

Возвращает выполняемое(callable) представление, которое принимает запрос(request) и возвращает ответ(response):

view часть представления – метод, который принимает аргумент request плюс дополнительные аргументы, и возвращает HTTP ответ(response).

Реализация по умолчанию анализирует HTTP метод запроса и делегирует его соответствующему методу класса; GET будет обработан методом get() , запрос POST делегируется к post() , и т.д.

По умолчанию, запрос HEAD будет делегирован в метод get() . Если вам необходимо обработать HEAD запрос другим способом, вы можете переопределить метод head() . Смотри Поддержка других методов HTTP для примера.

Если реализация по умолчанию также устанавливает request , args и kwargs в качестве переменных экземпляра, то любой метод представления может узнать “подробности” о запросе, который вызвал данное представление.

Если представление было вызвано с неподдерживаемым методом HTTP, будет вызван данный метод.

Реализация по умолчанию возвращает HttpResponseNotAllowed со списком разрешенных методов в виде простого текста.

Обрабатывает запросы на определение “глаголов”(методов) OPTIONS HTTP. Возвращает список всех разрешенных для представления методов HTTP.

TemplateView¶

Обрабатывает заданный шаблон, используя контекст(context), содержащий параметры из URL.

Классы-предки, Ancestors (MRO)

Представление наследует методы и атрибуты из следующего представления:

Диаграмма методов

Пример views.py:

Пример urls.py:

Контекст(Context)

params : словарей ключевых аргументов, “отловленных” из шаблона URL, который обрабатывается данным представлением.

RedirectView¶

Редирект на заданный URL.

Переданный URL может содержать строку с форматированием (dictionary-style), которая будет обработана в соответствии с параметрами “отловленными” в URL. Поскольку ключевая интерполяция всегда выполняется (даже если не было передано никаких аргументов), любые символы «%» в URL должны быть написаны как «%%» , а затем Python преобразует их в один знак процента на выходе.

Если переданный URL равен None , Django вернет исключение HttpResponseGone (410).

Классы-предки, Ancestors (MRO)

Представление наследует методы и атрибуты из следующего представления:

Диаграмма методов

Пример views.py:

Пример urls.py:

Атрибуты

Адрес URL для редиректа, в виде строки. Или None для генерации 410 (Gone) HTTP ошибки.

Должно ли перенаправление должно быть постоянным. Единственная разница состоит в возвращаемом HTTP коде статуса. Если True , то для редиректа используется код статуса(use status) 301. Если False , то 302. По умолчанию, permanent установлен в True .

Передавать ли строку GET запроса в новую локацию. Если True ,то строка запроса добавляется к URL. Если False , то строка запроса обрасывается. По умолчанию, query_string равно False .

Методы

Создает целевой URL для редиректа

Реализация по умолчанию использует url в качестве отправной строки, выполняет подстановку % параметров в этой строке, а также добавляет строку запроса если указано в атрибуте query_string . Подклассы могут реализовать любое поведение, важно лишь чтобы метод возвращал корректную строку URL для редиректа.

Ссылка на основную публикацию
Adblock
detector