Пользовательские типы записей в wordpress. Старт сессии пользователя

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

title . " | Widget News"; require(TEMPLATE_PATH . "/viewArticle.php"); } function homepage() { $results = array(); $data = Article::getList(HOMEPAGE_NUM_ARTICLES); $results["articles"] = $data["results"]; $results["totalRows"] = $data["totalRows"]; $results["pageTitle"] = "Widget News"; require(TEMPLATE_PATH . "/homepage.php"); } ?>

Разберем код скрипта подробно.

  1. Включаем файл конфигурации

    Первая строка кода включает файл config.php , и все установки приложения становятся доступны в скрипте. Мы используем функцию require() , а не include() , так как require() генерирует ошибку в случае отсутствия подключаемого файла.

  2. Получаем параметр action

    Сохраняем параметр $_GET["action"] в переменной $action , чтобы можно было использовать значение далее в скрипте. Но прежде проверяем наличие значения $_GET["action"] с помощью функции isset() . Если его нет, устанавливаем для переменной $action пустую строку ("").

    Проверять значения, поставляемые пользователем (такие как строки, значения из форм, куки), на наличие перед использованием - хорошая практика программирования. Так не только ограничивается количество дырок в системе безопасности, но и предотвращает вывод предупреждения "undefined index" при выполнении скрипта.

  3. Блок switch проверяет параметр action в URL для определения нужного действия (вывести архив, просмотреть статью). Если параметр action отсутствует в URL, то скрипт выводит главную страницу.

  4. archive()

    Данная функция выводит список всех статей в базе данных. Для этого используется метод getList() класса Article . Функция сохраняет результат и заголовок страницы в ассоциированном массиве $results , и шаблон может вывести его на странице. В завершении включается шаблон для вывода страницы. (Мы рассмотрим шаблоны в другом уроке нашей серии.)
  5. viewArticle()

    Данная функция выводит страницу одной статьи. Она получает ID статьи для вывода из параметра URL articleId , затем вызывает метод класса Article getById() для получения объекта статьи, который сохраняется в массиве $results для использования в шаблоне. (Если нет параметра articleId или статья не может быть найдена, то функция просто выводит главную страницу.)

    Обратите внимание, что мы используем преобразование типов (int) для явного приведения параметра запроса articleId к целому типу. Такое действие предотвращает передачу отличных от чисел значений в наш код.

  6. homepage()

    Последняя функция homepage() выводит главную страницу сайта, на которой содержится список из нескольких статей, количество которых указано в параметре конфигурации HOMEPAGE_NUM_ARTICLES (по умолчанию 5). Функция очень похожа на функцию archive() за исключением передачи параметра HOMEPAGE_NUM_ARTICLES методу getList() для ограничения количества возвращаемых статей.

2. Серверная часть

Скрипт серверной части несколько сложнее, чем index.php , так как в нем реализованы функции администрирования для нашей CMS. Хотя основная структура похожа на index.php .

Создаем файл admin.php в том же каталоге, что и файл index.php . И копируем в него код:

новую статью $article = new Article; $article->storeFormValues($_POST); $article->insert(); header("Location: admin.php?status=changesSaved"); } elseif (isset($_POST["cancel"])) { // Пользователь сбросил результаты редактирования: возвращаемся к списку статей header("Location: admin.php"); } else { // Пользователь еще не получил форму редактирования: выводим форму $results["article"] = new Article; require(TEMPLATE_PATH . "/admin/editArticle.php"); } } function editArticle() { $results = array(); $results["pageTitle"] = "Edit Article"; $results["formAction"] = "editArticle"; if (isset($_POST["saveChanges"])) { // Пользователь получил форму редактирования статьи: сохраняем изменения if (!$article = Article::getById((int)$_POST["articleId"])) { header("Location: admin.php?error=articleNotFound"); return; } $article->storeFormValues($_POST); $article->update(); header("Location: admin.php?status=changesSaved"); } elseif (isset($_POST["cancel"])) { // Пользователь отказался от результатов редактирования: возвращаемся к списку статей header("Location: admin.php"); } else { // Пользвоатель еще не получил форму редактирования: выводим форму $results["article"] = Article::getById((int)$_GET["articleId"]); require(TEMPLATE_PATH . "/admin/editArticle.php"); } } function deleteArticle() { if (!$article = Article::getById((int)$_GET["articleId"])) { header("Location: admin.php?error=articleNotFound"); return; } $article->delete(); header("Location: admin.php?status=articleDeleted"); } function listArticles() { $results = array(); $data = Article::getList(); $results["articles"] = $data["results"]; $results["totalRows"] = $data["totalRows"]; $results["pageTitle"] = "All Articles"; if (isset($_GET["error"])) { if ($_GET["error"] == "articleNotFound") $results["errorMessage"] = "Error: Article not found."; } if (isset($_GET["status"])) { if ($_GET["status"] == "changesSaved") $results["statusMessage"] = "Your changes have been saved."; if ($_GET["status"] == "articleDeleted") $results["statusMessage"] = "Article deleted."; } require(TEMPLATE_PATH . "/admin/listArticles.php"); } ?>

Рассмотрим интересные места нашего скрипта:

  1. Старт сессии пользователя

    В начале скрипта мы вызываем функцию session_start() . Данная функция PHP запускает новую сессию пользователя, которая позволяет нам контролировать регистрацию пользователя в системе. Если сессия для пользователя уже имеется, то PHP автоматически возобновит ее и будет использовать.

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

  2. Получаем параметр action и переменную сессии username

    Затем мы сохраняем параметр $_GET["action"] в переменной $action , а переменную сессии $_SESSION["username"] в $username , чтобы затем использовать данные значения в скрипте. Перед сохранение осуществляем проверку с помощью функции isset() . Если значение не существует, устанавливаем в соответствующей переменной пустую строку ("").

  3. Проверяем, зарегистрирован ли пользователь

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

  4. Определяем действие для выполнения

    Блок switch работает так же как и в index.php: производится вызов соответствующей функции на основании значения параметра URL action . По умолчанию выводится список статей.

  5. login()

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

    Если пользователь отправил форму регистрации (что проверяется по параметру формы login), то функция сопоставляет введенные имя и пароль со значениями параметров конфигурации ADMIN_USERNAME и ADMIN_PASSWORD . Если они соответствуют, то мы устанавливаем ключ сессии username в значение имени администратора, а затем перенаправляем обратно скрипту admin.php , который выводит список статей. Если пароль и имя пользователя неверные, то будет выведена форма регистрации с сообщением об ошибке.

    Если пользователь еще не отправил форму регистрации, то просто выводим ее.

  6. logout()

    Данная функция вызывается, когда пользователь выходит из системы. Здесь просто удаляется ключ сессии username и производится перенаправление обратно в admin.php .

  7. newArticle()

    Данная функция позволяет пользователю создавать новую статью. Если пользователь уже отправил форму для новой статьи, то функция создает новый объект Article , сохраняет данные формы в объекте с помощью вызова функции storeFormValues() , вставляет статью в базу данных с помощью функции insert() и перенаправляет обратно на список статей, выводя сообщение об успешном завершении операции.

    Если пользователь не отправил форму для новой статьи, то функция создает новый пустой объект Article без значений, затем использует шаблон editArticle.php для вывода формы редактирования статьи для только что созданного объекта.

  8. editArticle()

    Данная функция похожа на newArticle() , за исключением того, что пользователю предоставляется возможность редактировать статью. Когда пользователь сохраняет изменения, функция получает существующую статью с помощью getById() , записывает новые значения в объекте Article , затем сохраняет измененный объект с помощью функции update() . (Если статья не найдена в базе данных, функция выведет сообщение об ошибке.)

    Когда выводится форма редактирования статьи, функция использует метод getById() для загрузки текущих значений в поля формы.

    Скрипт использует один и тот же шаблон (editArticle.php) и для создания новой статьи и для редактирования имеющейся. То есть нужно создавать только одну форму HTML. Параметр formAction используется для определения операции со статьей.

  9. deleteArticle()

    Когда пользователь удаляет статью, данная функция сначала получает ее (если статьи нет в базе данных, то выводится сообщение об ошибке), а затем вызывает метод delete() для удаления данных из базы. После завершения операции функция перенаправляет пользователя на страницу со списком статей и выводит сообщение о удалении.

  10. listArticles()

    Последняя функция функция в скрипте admin.php выводит список статей в CMS. Используется метод getList() класса Article для получения всех статей. Затем применяем шаблон listArticles.php для вывода списка. Кроме того, функция проверяет параметры запроса URL error и status , чтобы вывести сообщения об ошибке и состоянии системы, если нужно.

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

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

Мне нравится, как сделано наследование шаблонов в Django . Идея простая - есть базовый шаблон, в нем выделены контентные блоки, которые будут меняться в зависимости от страницы. При рендеренге страницы можно указать, что за основу берется базовый шаблон и переопределить только нужные блоки. Если в проекте много однотипных страниц, то можно сделать промежуточный шаблон, наследующий от главного, а затем переопределять его данные. При умелом проектировании количество повторяющегося кода можно свести на нет, а также облегчить жизнь при изменении дизайна.

Похоже этот подход нравится не только мне и разработчикам Django, но и Fabien Potencier автору фреймворка Symfony и шаблонизатора Twig . Twig обладает множеством интересных функций, включая компиляцию шаблонов в нативные PHP-классы, фильтрацию данных, встроенными циклами и т.д. - в общем всем тем, что полагается иметь современному шаблонизатору. Но самое интересное - это то самое наследование шаблонов, о котором я говорил выше. Вот пример из официальной документации:

Базовый шаблон:

{% block head %} {% block title %}{% endblock %} - My Webpage {% endblock %}

{% block content %}{% endblock %}

Дочерний шаблон:

{% extends "base.html" %} {% block title %}Index{% endblock %} {% block head %} {{ parent() }} {% endblock %} {% block content %}

Index

Welcome on my awesome homepage.

{% endblock %}

В базовом шаблоне определены основные блоки, а в дочернем - пример их переопределения. Копания в исходных кодах показало, что реализуется это наследование также нативно - путем наследования “скомпилированных” классов. Отличная идея! Все хорошо, но меня несколько смущала необходимость изучения пусть простого, но все-таки отличного от PHP синтаксиса шаблонизатора. А моя нелюбовь к ненативным шабонам началась еще со Smarty (в котором тоже есть наследование) и до сегодняшнего дня не претерпела существенных изменений.

Совсем близко к иделу подошел разработчик из Сан-Франциско Adam Shaw . Очевидно, он также как и я не любит эксперименты с синтаксисом шаблонизаторов и придумал незамысловато названную библиотеку Template Inheritance На сайте жирным по желтому написано, что «There is no need to learn another template language», мол не нужно учить другой язык шаблонов. С этим я согласен. Что же он предлагает? Смотрим пример опять же из официальной документации:

Базовый шаблон:

Дочерний шаблон:

This is the title This is the article

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

Вот здесь-то мы и подходим к главной теме нашего повествования. А не сможет ли PHP сам переопределить блоки базового шаблона? Я думаю, что вполне! Смотрите:

Вот базовый шаблон:

<?php echo isset($title) ? $title: ""; ?>

Default content

Здесь в 3 блоках шаблона проверяется наличие соответствующей переменной, хранящей некоторый контент и, если она присутствует в области видимости, то ее можно выводить в шаблон, а если нет, то выводится контент по-умолчанию. Нам остается только переопределить эти переменные в дочернем шаблоне. А вот собственно и он:

Переопределенный контент

В этом примере переопределяется переменная $content, если она не была установлена заранее. Это сделано для того, чтобы была возможность наследовать этот шаблон и переопределить блок контента. Думаю, идея понятна. Не требуется никаких библиотек - просто пишите шаблоны в таком стиле и будет вам счастье.

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

Function render($pathToTemplate, $data) { extract($data); ob_start(); require $pathToTemplate; return trim(ob_get_clean()); }

Эта функция возвращает вывод шаблона из файле $pathToTemplate с подстановкой переменных, полученных из массива $data. extract - на любителя - можно и не делать, а обращаться напрямую к $data. Перед выводом из контента убираются начальные и конечные пробелы. В шаблоне можно делать все, что позволит делать ваша совесть, не нарушая принципы разделения логики и представления, и PHP. Например, в зависимости от ситуации подключать тот или иной базовый файл.

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

Формат news report или news article сложно назвать популярным, однако он всё же встречается в некоторых олимпиадах. Например, «Покори Воробьёвы горы!» уже несколько лет даёт новостные статьи на отборочных турах во всех классах.

Цель любой новостной статьи - рассказать читателю о каком-либо событии, предоставить ему фактическую информацию. Дальнейшие детали отличаются в зависимости от конкретных требований, указанных в задании.

В данной статье мы рассмотрим свойства, которыми обладает любой news report.

Общая структура новостной статьи

Новостная статья состоит из трёх частей: вступление , основная часть и заключение . Основная часть делится, в свою очередь, на несколько абзацев (как правило, 2–3). Кроме этого, у news report должен быть заголовок .

Заголовок

Представьте, что вы купили газету или открыли сайт новостей в интернете. Информации много, читать всё подряд некогда, да и незачем. Что помогает сориентироваться в этом изобилии и выбрать нужную вам статью? Заголовок. Мы скользим глазами по заголовкам и читаем те новости, заголовок которых нас привлёк. Таким образом, цель заголовка - привлечь внимание читателя и дать ему понять, на какую тему написана новость . Поэтому заголовок должен быть кратким и ёмким .

Вступление

Главная задача вступления в новостной статье - кратко описать событие: где, когда, что произошло, кто участвовал. Читатель должен сразу получить информацию, на которую намекал заголовок, поэтому писать нужно по делу, не уходя в отвлеченные описания и рассуждения.

Основная часть

В основной части излагаются подробности кратко описанных во вступлении событий. Например, если во вступлении вы сообщили, что 1–го сентября в Хогвартсе прошла ежегодная церемония начала учебного года, то в основной части можно рассказать, как именно она прошла: о чём говорили, чем угощали и т.д.

Кроме того, в основной части может содержаться любая другая информация, относящаяся к событию: объяснение причин и результатов события, цитаты участников и очевидцев.

Заключение

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

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

Стиль

Доклад пишется в формальном стиле и не должен быть эмоциональным. Чувства автора остаются за бортом, излагаются факты, а не впечатления. Используйте продвинутую лексику, страдательный залог, прямую и косвенную речь, подходящие средства логической связи. Разговорных выражений и сокращений быть не должно.

Аннотация : В статье рассматриваются вопросы, связанные с проведением в сентябре 2014 г. референдума о независимости Шотландии. Автор освещает основные этапы деволюционного движения в Шотландии с тем, чтобы выявить предпосылки происходящих сейчас событий. Затем исследуется отношение населения региона к идеям независимости, для того чтобы попытаться спрогнозировать исход предстоящего референдума. В целях прогнозирования и понимания будущих процессов в регионе, автор представляет основные плюсы и минусы более радикального варианта развития событий - отделения Шотландии от Великобритании. В статье использованы, как теоретические методы - анализ и синтез, так и исторический (рассмотрение процессов деволюции в исторической ретроспективе), а так же практические: мониторинг и прогнозирование (попытка предсказать исход референдума с помощью наличия определенных количественных данных). Анализ возможных последствий отделения региона показал, что независимость приведет к множеству как положительных, так и негативных моментов в политической и социально-экономической сферах жизни шотландского общества. Изучив отношение населения к идеям независимости региона за последние 35 лет, автор заключает, что Шотландия останется в составе Великобритании, но с предоставлением ее институтам власти еще больших полномочий в будущем.

Ключевые слова : независимость, референдум, деволюция, отношение к независимости, плюсы отделения Шотландии, минусы отделения Шотландии, политические аспекты, социально-экономические аспекты, Шотландская Национальная партия, этнический сепаратизм

DOI : 10.7256/1812-8696.2014.7.12577

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

Библиография:
Еремина Н. В. Проблема развития региональных инноваций: фактор культурно-исторического наследия в отношениях «центр-периферия» (на примере национальных регионов Великобритании) // Политика как фактор инновационного развития. Материалы международной научной конференции / Под ред. А.Ю. Сунгурова. СПб., 2010.
Еремина Н. В. Проблема статуса Шотландии в 90-е гг. XX в. Спб.: Изд-во С.-Петерб. Ун-та, 2005.
Кагриманян А. С. Экономические факторы периферийного сепаратизма в Европе // Федерализм. – 2014.-№ 1 (73).
Curtis J., Steven M. The 2011 Scottish parliament election. The electoral reform society. London, 2011.
Keating M. The Government of Scotland: Public Policy Making After Devolution. Edinburgh, 2010.
Kellas J. G. The Scottish political system. New York, 1973.
McLean I., Gallagher J., Lodge G. Scotland"s Choices: The Referendum and what Happens Afterwards. Edinburgh, 2013.
Philips D. Government spending on benefits and state pensions in Scotland: current patterns and future issues. Institute for fiscal studies. London, 2013.
Pilkington C. Devolution in Britain today. Manchester, 2002.
Smith K. Beyond Evidence Based Policy in Public Health: The Interplay of Ideas. Basingstoke.: Palgrave Macmillan, 2013.

Правильная ссылка на статью:
просто выделите текст ссылки и скопируйте в буфер обмена
Кагриманян А.С. Независимость Шотландии: быть или не быть. // Политика и Общество. - 2014. - № 7. - C. 745-752. DOI: 10.7256/1812-8696.2014.7.12577



Понравилась статья? Поделиться с друзьями: