Этот урок связан с проектом Строим свою CMS на PHP и MySQL

Строим свою CMS на PHP и MySQL. Часть 9

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

demosourse

 

Клиентская часть

Сначала изменим клиентскую часть, для отображения категории статьи в общем списке и на страницах архива.

Клиентская часть CMS

homepage.php

Мы сделаем небольшие изменения в шаблоне homepage.php, который выводит главную страницу. Нужно, чтобы категория каждой статьи выводилась ниже названия. Новый код файла cms/templates/homepage.php будет выглядеть так:

<?php include "templates/include/header.php" ?>
 
      <ul id="headlines">
 
<?php foreach ( $results['articles'] as $article ) { ?>
 
        <li>
          <h2>
            <span class="pubDate"><?php echo date('j F', $article->publicationDate)?></span><a href=".?action=viewArticle&amp;articleId=<?php echo $article->id?>"><?php echo htmlspecialchars( $article->title )?></a>
            <?php if ( $article->categoryId ) { ?>
            <span class="category">in <a href=".?action=archive&amp;categoryId=<?php echo $article->categoryId?>"><?php echo htmlspecialchars( $results['categories'][$article->categoryId]->name )?></a></span>
            <?php } ?>
          </h2>
          <p class="summary"><?php echo htmlspecialchars( $article->summary )?></p>
        </li>
 
<?php } ?>
 
      </ul>
 
      <p><a href="./?action=archive">Article Archive</a></p>
 
<?php include "templates/include/footer.php" ?>

Мы вставили проверку вхождения статьи в категорию с помощью свойства $categoryId. Если статья имеет идентификатор категории, то вставляем элемент <span> с именем категории в код страницы. Для решения используем объект Category из массива $results['categories'], который выбирается с помощью ID категории, а затем выводим свойство name.

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

archive.php

Шаблон archive.php выводит архив статей. В базовом варианте нашей CMS архив просто выводил список всех статей. Однако, теперь функция archive() в index.php может выводить список статей только из указанной категории. То есть нам нужно внести изменения в шаблон для реализации новых возможностей.

Новый код файла cms/templates/archive.php:

<?php include "templates/include/header.php" ?>
 
      <h1><?php echo htmlspecialchars( $results['pageHeading'] ) ?></h1>
<?php if ( $results['category'] ) { ?>
      <h3 class="categoryDescription"><?php echo htmlspecialchars( $results['category']->description ) ?></h3>
<?php } ?>
 
      <ul id="headlines" class="archive">
 
<?php foreach ( $results['articles'] as $article ) { ?>
 
        <li>
          <h2>
            <span class="pubDate"><?php echo date('j F Y', $article->publicationDate)?></span><a href=".?action=viewArticle&amp;articleId=<?php echo $article->id?>"><?php echo htmlspecialchars( $article->title )?></a>
<?php if ( !$results['category'] && $article->categoryId ) { ?>
            <span class="category">in <a href=".?action=archive&amp;categoryId=<?php echo $article->categoryId?>"><?php echo htmlspecialchars( $results['categories'][$article->categoryId]->name ) ?></a></span>
<?php } ?>           
          </h2>
          <p class="summary"><?php echo htmlspecialchars( $article->summary )?></p>
        </li>
 
<?php } ?>
 
      </ul>
 
      <p><?php echo $results['totalRows']?> article<?php echo ( $results['totalRows'] != 1 ) ? 's' : '' ?> in total.</p>
 
      <p><a href="./">Return to Homepage</a></p>
 
<?php include "templates/include/footer.php" ?>

Мы изменили заголовок <h1> для вывода значения $results['pageHeading'], а не простой надписи "Article Archive" (архив статей). Новая функция archive() динамически формирует заголовок в зависимости от просматриваемой категории.

Затем мы добавляем код для проверки того, что нужно выводить список для определенной категории, а не всех статей в базе данных. Для этого просматриваем переменную $results['category']. Если она имеется, то нужно выводить список для категории, и код формирует в заголовке описание категории.

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

viewArticle.php

Шаблон viewArticle.php выводит страницу статьи. Новый код файла cms/templates/viewArticle.php:

<?php include "templates/include/header.php" ?>
 
      <h1 style="width: 75%;"><?php echo htmlspecialchars( $results['article']->title )?></h1>
      <div style="width: 75%; font-style: italic;"><?php echo htmlspecialchars( $results['article']->summary )?></div>
      <div style="width: 75%;"><?php echo $results['article']->content?></div>
      <p class="pubDate">Published on <?php echo date('j F Y', $results['article']->publicationDate)?>
<?php if ( $results['category'] ) { ?>
        in <a href="./?action=archive&amp;categoryId=<?php echo $results['category']->id?>"><?php echo htmlspecialchars( $results['category']->name ) ?></a>
<?php } ?>
      </p>
 
      <p><a href="./">Return to Homepage</a></p>
 
<?php include "templates/include/footer.php" ?>

Здесь вносится небольшое добавление для вывода названия категории внизу. Название категории является ссылкой на соответствующую страницу архива.

Стили клиентской части

Также нужно внести изменения в таблицу стилей style.css для формирования внешнего вида имен категорий и описаний на главной странице и в архиве.

Новый код файла style.css из папки cms:

/* Style the body and outer container */
 
body {
  margin: 0;
  color: #333;
  background-color: #00a0b0;
  font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
  line-height: 1.5em;
}
 
#container {
  width: 960px;
  background: #fff;
  margin: 20px auto;
  padding: 20px;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  border-radius: 5px;
}
 
 
/* The logo and footer */
 
#logo {
  display: block;
  width: 300px;
  padding: 0 660px 20px 0;
  border: none;
  border-bottom: 1px solid #00a0b0;
  margin-bottom: 40px;
}
 
#footer {
  border-top: 1px solid #00a0b0;
  margin-top: 40px;
  padding: 20px 0 0 0;
  font-size: .8em;
}
 
 
/* Headings */
 
h1 {
  color: #eb6841;
  margin-bottom: 30px;
  line-height: 1.2em;
}
 
h2, h2 a {
  color: #edc951;
}
 
h2 a {
  text-decoration: none;
}
 
h3.categoryDescription {
  margin-top: -20px;
  margin-bottom: 40px;
}
 
 
/* Article headlines */
 
#headlines {
  list-style: none;
  padding-left: 0;
  width: 75%;
}
 
#headlines li {
  margin-bottom: 2em;
  clear: both;
}
 
.pubDate {
  font-size: .8em;
  color: #eb6841;
  text-transform: uppercase;
}
 
#headlines .pubDate {
  display: block;
  width: 100px;
  padding-top: 4px;
  float: left;
  font-size: .5em;
  vertical-align: middle;
}
 
#headlines.archive .pubDate {
  width: 130px;
}
 
.summary {
  padding-left: 100px;
}
 
#headlines.archive .summary {
  padding-left: 130px;
}
 
.category {
  font-style: italic;
  font-weight: normal;
  font-size: 60%;
  color: #999;
  display: block;
  line-height: 2em;
}
 
.category a {
  color: #999;
  text-decoration: underline;
}
 
 
/* "You are logged in..." header on admin pages */
 
#adminHeader {
  width: 940px;
  padding: 0 10px;
  border-bottom: 1px solid #00a0b0;
  margin: -30px 0 40px 0;
  font-size: 0.8em;
}
 
 
/* Style the form with a coloured background, along with curved corners and a drop shadow */
 
form {
  margin: 20px auto;
  padding: 40px 20px;
  overflow: auto;
  background: #fff4cf;
  border: 1px solid #666;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px; 
  border-radius: 5px;
  -moz-box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
  -webkit-box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
  box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
}
 
 
/* Give form elements consistent margin, padding and line height */
 
form ul {
  list-style: none;
  margin: 0;
  padding: 0;
}
 
form ul li {
  margin: .9em 0 0 0;
  padding: 0;
}
 
form * {
  line-height: 1em;
}
 
 
/* The field labels */
 
label {
  display: block;
  float: left;
  clear: left;
  text-align: right;
  width: 15%;
  padding: .4em 0 0 0;
  margin: .15em .5em 0 0;
}
 
 
/* The fields */
 
input, select, textarea {
  display: block;
  margin: 0;
  padding: .4em;
  width: 80%;
}
 
input, textarea, .date {
  border: 2px solid #666;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;   
  border-radius: 5px;
  background: #fff;
}
 
input {
  font-size: .9em;
}
 
select {
  padding: 0;
  margin-bottom: 2.5em;
  position: relative;
  top: .7em;
}
 
textarea {
  font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
  font-size: .9em;
  height: 5em;
  line-height: 1.5em;
}
 
textarea#content {
  font-family: "Courier New", courier, fixed;
}
   
 
/* Place a border around focused fields */
 
form *:focus {
  border: 2px solid #7c412b;
  outline: none;
}
 
 
/* Display correctly filled-in fields with a green background */
 
input:valid, textarea:valid {
  background: #efe;
}
 
 
/* Submit buttons */
 
.buttons {
  text-align: center;
  margin: 40px 0 0 0;
}
 
input[type="submit"] {
  display: inline;
  margin: 0 20px;
  width: 12em;
  padding: 10px;
  border: 2px solid #7c412b;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px; 
  border-radius: 5px;
  -moz-box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
  -webkit-box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
  box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
  color: #fff;
  background: #ef7d50;
  font-weight: bold;
  -webkit-appearance: none;
}
 
input[type="submit"]:hover, input[type="submit"]:active {
  cursor: pointer;
  background: #fff;
  color: #ef7d50;
}
 
input[type="submit"]:active {
  background: #eee;
  -moz-box-shadow: 0 0 .5em rgba(0, 0, 0, .8) inset;
  -webkit-box-shadow: 0 0 .5em rgba(0, 0, 0, .8) inset;
  box-shadow: 0 0 .5em rgba(0, 0, 0, .8) inset;
}
 
 
/* Tables */
 
table {
  width: 100%;
  border-collapse: collapse;
}
 
tr, th, td {
  padding: 10px;
  margin: 0;
  text-align: left;
}
 
table, th {
  border: 1px solid #00a0b0;
}
 
th {
  border-left: none;
  border-right: none;
  background: #ef7d50;
  color: #fff;
  cursor: default;
}
 
tr:nth-child(odd) {
  background: #fff4cf;
}
 
tr:nth-child(even) {
  background: #fff;
}
 
tr:hover {
  background: #ddd;
  cursor: pointer;
}
 
 
/* Status and error boxes */
 
.statusMessage, .errorMessage {
  font-size: .8em;
  padding: .5em;
  margin: 2em 0;
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  border-radius: 5px;
  -moz-box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
  -webkit-box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
  -box-shadow: 0 0 .5em rgba(0, 0, 0, .8);
}
 
.statusMessage {
  background-color: #2b2;
  border: 1px solid #080;
  color: #fff;
}
 
.errorMessage {
  background-color: #f22;
  border: 1px solid #800;
  color: #fff;
}

Добавляем селектор h3.categoryDescription для описания категории, идентификатор #headlines для имени категории и класс .category для вывода названия категории на главной странице и в архиве.

 

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

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

Серверная часть CMS

Добавляем шаблон listCategories.php

Создаем шаблон listCategories.php, который выводит список категорий в базе данных. Он очень похож на listArticles.php (шаблон списка статей).

Код файла listCategories.php в папке cms/templates/admin:

<?php include "templates/include/header.php" ?>
<?php include "templates/admin/include/header.php" ?>
 
      <h1>Article Categories</h1>
 
<?php if ( isset( $results['errorMessage'] ) ) { ?>
        <div class="errorMessage"><?php echo $results['errorMessage'] ?></div>
<?php } ?>
 
 
<?php if ( isset( $results['statusMessage'] ) ) { ?>
        <div class="statusMessage"><?php echo $results['statusMessage'] ?></div>
<?php } ?>
 
      <table>
        <tr>
          <th>Category</th>
        </tr>
 
<?php foreach ( $results['categories'] as $category ) { ?>
 
        <tr onclick="location='admin.php?action=editCategory&amp;categoryId=<?php echo $category->id?>'">
          <td>
            <?php echo $category->name?>
          </td>
        </tr>
 
<?php } ?>
 
      </table>
 
      <p><?php echo $results['totalRows']?> categor<?php echo ( $results['totalRows'] != 1 ) ? 'ies' : 'y' ?> in total.</p>
 
      <p><a href="admin.php?action=newCategory">Add a New Category</a></p>
 
<?php include "templates/include/footer.php" ?>

Данный шаблон достаточно простой. Он включает стандартный заголовок страницы и файл заголовка администратора, где выводится также сообщения о статусе и ошибках. Затем выводится таблица категорий в базе данных. Цикл проходит по всем категориям в массиве $results['categories'] и формирует строку таблицы с именем категории. Строка таблицы ссылается на admin.php?action=editCategory, передавая ID категории, так что администратор может редактировать категорию, нажав на строку таблицы.

Шаблон также выводит общее количество категорий в базе данных, включая ссылку функцию добавления новой категории.

 

Добавляем editCategory.php

Шаблон editCategory.php выводит форму редактирования, позволяя администратору добавлять категорию или редактировать существующую. Он очень похож на editArticle.php, но немного проще.

Код файла editCategory.php в папке cms/templates/admin:

<?php include "templates/include/header.php" ?>
<?php include "templates/admin/include/header.php" ?>
 
      <h1><?php echo $results['pageTitle']?></h1>
 
      <form action="admin.php?action=<?php echo $results['formAction']?>" method="post">
        <input type="hidden" name="categoryId" value="<?php echo $results['category']->id ?>"/>
 
<?php if ( isset( $results['errorMessage'] ) ) { ?>
        <div class="errorMessage"><?php echo $results['errorMessage'] ?></div>
<?php } ?>
 
        <ul>
 
          <li>
            <label for="name">Category Name</label>
            <input type="text" name="name" id="name" placeholder="Name of the category" required autofocus maxlength="255" value="<?php echo htmlspecialchars( $results['category']->name )?>" />
          </li>
 
          <li>
            <label for="description">Description</label>
            <textarea name="description" id="description" placeholder="Brief description of the category" required maxlength="1000" style="height: 5em;"><?php echo htmlspecialchars( $results['category']->description )?></textarea>
          </li>
 
        </ul>
 
        <div class="buttons">
          <input type="submit" name="saveChanges" value="Save Changes" />
          <input type="submit" formnovalidate name="cancel" value="Cancel" />
        </div>
 
      </form>
 
<?php if ( $results['category']->id ) { ?>
      <p><a href="admin.php?action=deleteCategory&amp;categoryId=<?php echo $results['category']->id ?>" onclick="return confirm('Delete This Category?')">Delete This Category</a></p>
<?php } ?>
 
<?php include "templates/include/footer.php" ?>

В шаблон включаются файлы заголовков, затем выводится содержание  $results['pageTitle'], которое имеет значения либо "New Article Category"(новая категория статьи), либо "Edit Article Category"(редактирование категории статьи). И создается форма, которая отправляется в admin.php со значением переменной $results['formAction'] ("newCategory" или "editCategory") в параметре action.

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

Шаблон также включает ссылку на удаление текущей редактируемой категории и нижний колонтитул страницы.

Изменяем listArticles.php

Нужно изменить шаблон для списка статей, чтобы реализовать новый функционал. Сохраняем новый код файла cms/templates/admin/listArticles.php:

<?php include "templates/include/header.php" ?>
<?php include "templates/admin/include/header.php" ?>
 
      <h1>All Articles</h1>
 
<?php if ( isset( $results['errorMessage'] ) ) { ?>
        <div class="errorMessage"><?php echo $results['errorMessage'] ?></div>
<?php } ?>
 
 
<?php if ( isset( $results['statusMessage'] ) ) { ?>
        <div class="statusMessage"><?php echo $results['statusMessage'] ?></div>
<?php } ?>
 
      <table>
        <tr>
          <th>Publication Date</th>
          <th>Article</th>
          <th>Category</th>
        </tr>
 
<?php foreach ( $results['articles'] as $article ) { ?>
 
        <tr onclick="location='admin.php?action=editArticle&amp;articleId=<?php echo $article->id?>'">
          <td><?php echo date('j M Y', $article->publicationDate)?></td>
          <td>
            <?php echo $article->title?>
          </td>
          <td>
            <?php echo $results['categories'][$article->categoryId]->name?>
          </td>
        </tr>
 
<?php } ?>
 
      </table>
 
      <p><?php echo $results['totalRows']?> article<?php echo ( $results['totalRows'] != 1 ) ? 's' : '' ?> in total.</p>
 
      <p><a href="admin.php?action=newArticle">Add a New Article</a></p>
 
<?php include "templates/include/footer.php" ?>

Мы добавили новый столбец для категорий в списке статей. В цикле формирования строк происходит поиск соответствующего объекта Category по ID в массиве $results['categories'] и выводится название категории.

Редактируем editArticle.php

Также нужно модифицировать форму редактирования статьи editArticle.php для добавления возможности назначать категорию статье.

Новый код файла cms/templates/admin/editArticle.php:

<?php include "templates/include/header.php" ?>
<?php include "templates/admin/include/header.php" ?>
 
      <h1><?php echo $results['pageTitle']?></h1>
 
      <form action="admin.php?action=<?php echo $results['formAction']?>" method="post">
        <input type="hidden" name="articleId" value="<?php echo $results['article']->id ?>"/>
 
<?php if ( isset( $results['errorMessage'] ) ) { ?>
        <div class="errorMessage"><?php echo $results['errorMessage'] ?></div>
<?php } ?>
 
        <ul>
 
          <li>
            <label for="title">Article Title</label>
            <input type="text" name="title" id="title" placeholder="Name of the article" required autofocus maxlength="255" value="<?php echo htmlspecialchars( $results['article']->title )?>" />
          </li>
 
          <li>
            <label for="summary">Article Summary</label>
            <textarea name="summary" id="summary" placeholder="Brief description of the article" required maxlength="1000" style="height: 5em;"><?php echo htmlspecialchars( $results['article']->summary )?></textarea>
          </li>
 
          <li>
            <label for="content">Article Content</label>
            <textarea name="content" id="content" placeholder="The HTML content of the article" required maxlength="100000" style="height: 30em;"><?php echo htmlspecialchars( $results['article']->content )?></textarea>
          </li>
 
          <li>
            <label for="categoryId">Article Category</label>
            <select name="categoryId">
              <option value="0"<?php echo !$results['article']->categoryId ? " selected" : ""?>>(none)</option>
            <?php foreach ( $results['categories'] as $category ) { ?>
              <option value="<?php echo $category->id?>"<?php echo ( $category->id == $results['article']->categoryId ) ? " selected" : ""?>><?php echo htmlspecialchars( $category->name )?></option>
            <?php } ?>
            </select>
          </li>
 
          <li>
            <label for="publicationDate">Publication Date</label>
            <input type="date" name="publicationDate" id="publicationDate" placeholder="YYYY-MM-DD" required maxlength="10" value="<?php echo $results['article']->publicationDate ? date( "Y-m-d", $results['article']->publicationDate ) : "" ?>" />
          </li>
 
 
        </ul>
 
        <div class="buttons">
          <input type="submit" name="saveChanges" value="Save Changes" />
          <input type="submit" formnovalidate name="cancel" value="Cancel" />
        </div>
 
      </form>
 
<?php if ( $results['article']->id ) { ?>
      <p><a href="admin.php?action=deleteArticle&amp;articleId=<?php echo $results['article']->id ?>" onclick="return confirm('Delete This Article?')">Delete This Article</a></p>
<?php } ?>
 
<?php include "templates/include/footer.php" ?>

Добавляем поле Article Category (категория статьи) к форме. Оно представляет меню select, которое содержит список всех категорий в базе данных, получаемый из массива $results['categories']. Каждый элемент option хранит ID категории в атрибуте value и выводит название категории. Если происходит редактирование существующей статьи, то код выполняет проверку соответствия текущего ID категории статьи и ID выбранной категории. Если они совпадают, то добавляется атрибут selected для предварительного выбора опции в списке.

Элемент select также включает опцию "(none)"(нет категории) вверху списка с нулевым значением. Таким образом, администратор может создавать статьи, которые не включены ни в какую категорию.

Редактируем заголовок страниц серверной части

Также нам нужно изменить заголовок, который выводится на страницах серверной части. Пока он включает небольшое меню ( Edit Articles (редактировать статьи) и Log Out(выход)). Нам нужно добавить пункт Edit Categories (редактировать категории), чтобы дать возможность администратору просматривать, редактировать, добавлять и удалять категории.

В базовом варианте заголовок был встроен в каждый шаблон серверной части (listArticles.php и editArticle.php). Вынесем код заголовка в отдельный файл header.php. Теперь изменения нужно будет вносить в одно место.

Шаблоны listArticles.php и editArticle.php уже изменены для включения файла заголовка, а новые файлы  listCategories.php и editCategories.php сразу содержат правильный код.

Итак, создаем папку include в каталоге cms/templates/admin и сохраняем следующий код в файле header.php, который размещается в новой папке:

<div id="adminHeader">
  <h2>Widget News Admin</h2>
  <p>You are logged in as <b><?php echo htmlspecialchars( $_SESSION['username']) ?></b>. <a href="admin.php?action=listArticles">Edit Articles</a> <a href="admin.php?action=listCategories">Edit Categories</a> <a href="admin.php?action=logout"?>Log Out</a></p>
</div>

Код представляет разметку, которая ранее была встроена в шаблоны listArticles.php и editArticle.php с добавлением новой опции "Edit Categories", которая ссылается на admin.php?action=listCategories.

Выбор категории статьи

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

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.elated.com/articles/add-article-categories-to-your-cms/
Перевел: Сергей Фастунов
Урок создан: 19 Декабря 2012
Просмотров: 54305
Правила перепечатки


5 последних уроков рубрики "PHP"

  • Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.

  • Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

  • Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

  • Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

  • Подборка PHP песочниц

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

или авторизуйтесь, чтобы добавлять комментарии, оценивать уроки и сохранять их в личном кабинете
  • 19 Декабря 2012 15:07
    namaz
    ????
  • 21 Декабря 2012 21:58
    positiveman
    О ужас! Шаблонизатор бы вам.
  • 1 Января 2013 19:24
    tonygraund
    у меня один вопрос, как публиковать новости на русском языке?? Чет не получается(
    • 17 Января 2013 00:34
      pinautis
      У меня тоже не получилось на русском, что делал???
    • 14 Февраля 2013 01:34
      barbotkin
      поставь в article.php вместо: a-zA-Z0-9 это: а-яА-ЯёЁa-zA-Z0-9 и будут тебе русские новости добавляться.
    • 23 Декабря 2013 16:57
      kladmax
      Поставил данную CMS из исходников, не добавляются категории, новости, на любом языке, база данных подключена, вообще стоит вопрос о работоспособности... как можно что то учить если не работает основа... в демке тоже какие то ошибки.
  • 4 Января 2013 21:15
    x_365
    tonygraund, кодировку на utf-8 поменяй
  • 18 Января 2013 13:53
    neru.evgen
    А когда будет 10 часть?
  • 20 Января 2013 16:53
    Валентин Зубченко
    если utf-8 не поможет, то сохраняйте файлы в кодировке CP1251 - кирилица И кстати у меня такой вопрос: Как русифицировать дату публикации???
  • 20 Января 2013 16:54
    Валентин Зубченко
    А все же, когда 10 часть??? А то интерестно, чем все закончится)))
  • 22 Января 2013 19:21
    qvazar178945
    С нетерпением жду десятой части, интересно почитать такие статьи... Сразу умные идеи в голову приходят=)
  • 23 Января 2013 18:24
    tsurka
    А не лучше пустить серию статей про разбор какого нибуть php фрэймворка, как например Yii Framework, невысокий порог вхождения.
  • 24 Января 2013 07:09
    stol_cs
    Люди, я вот не как могу перевести на UTF-8(Просто не знаю как, помогите пожалуйста:(
    • 30 Января 2013 23:11
      ergashev
      stol_cs если у тебя notepad++ то нварху в меню есть закладка - "кодировки". Там ниже есть преобразовать в UTF-8 (без BOM) кликаешь и сохраняешь. Все!
  • 8 Февраля 2013 15:42
    Shut
    При обращении к сайту выводит Sorry, a problem occurred. Please try later. Убрал из config.php код с выводом ошибки, в итоге получил
    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[28000] [1045] Access denied for user 'Shut'@'localhost' (using password: YES)' in X:\home\localhost\www\demo\classes\Article.php:110 Stack trace: #0 X:\home\localhost\www\demo\classes\Article.php(110): PDO->__construct('mysql:host=loca...', 'Shut', 'qFAsAET') #1 X:\home\localhost\www\demo\index.php(47): Article::getList(5) #2 X:\home\localhost\www\demo\index.php(14): homepage() #3 {main} thrown in X:\home\localhost\www\demo\classes\Article.php on line 110
    Кто подскажет как исправить, в php.ini все модули с PDO разкомментированы...
    • 20 Октября 2013 09:35
      woolden
      У тебя не правильное подключение к БД. Есть соединение с MySQLем? Существует БД и таблицы? Создан пользователь БД Shut? А права у него какие? Решите эти вопросы и ошибка исчезнет.
  • 9 Февраля 2013 13:39
    cronmix
    И всетаки, как сделать, чтоб работало на UTF-8 кодировке! Я понимаю, что вся проблема кроется в PDO подключении. Поменял у себя в настройках апачи и SQL все параметры связанные с кодировкой.Таблицы в базе то-же в UTF-8 кодировке. Страницы все в UTF кодировке, заголовки заданы UTF-8. Но с базы русские буквы просто не выводятся! (Латиница, цифры, символы - все ок) помогитееееее
    • 9 Февраля 2013 18:56
      Shut
      В .htaccess пробовал ставить кодировку ?
      • 10 Февраля 2013 12:59
        cronmix
        нет и даже пробовать не хочу! должен быть более простой путь!
        • 11 Февраля 2013 12:54
          molegx
          попробуй mysql_query("SET NAMES cp1251"); - это там где при подключении к бд прописовать
          • 17 Февраля 2013 09:10
            cronmix
            Разобрался!!! Проблема с русскими буквами кроется в неверной кодировке Базы Данных (таблиц). PDO тут не причем, с ним все в порядке :) mysql_query("SET NAMES cp1251"); - это уместно если бы вы программировали не под PDO. так-же PDO не имеет ни какого прямого отношения к классам которые вы пишите (articles, category, и т.п.) з.ы. я как не любил (не понимал до конца), так и не люблю использовать ООП в программировании. По не так это все слишком замудрено и в частности WEB программировании не очень уж оправдано. По крайней мере для малых и средних сайтов. Кстате в данной статье и предидущих уроках использован не самый хороший способ получения даннх из базы. Начиная уже от 10000 тысяч записей код будет тормозить и давать высокую нагрузку на сервер.
            • 20 Марта 2013 11:53
              lungdesire
              Я какие только кодировки уже менял в базе, но русские буквы так и не пишет. Что за кодировку ставить то?)))
              • 20 Октября 2013 09:00
                woolden
                В базе все нормально, ничего ставить не нужно. Должна быть кодировка по умолчанию utf8_general_ci
  • 10 Февраля 2013 20:31
    molegx
    Здравствуйте! Я столкнулся с одной проблемой и который час не могу решить. Как в этой cms вывести список всех категорий? Просто список в столбик :) Я просто не могу представить как тут это сделать, я ещё плохо с php знаком, но стараюсь его понять на примерах! Заранее огромное спасибо!
    • 11 Февраля 2013 00:17
      cronmix
      У вас нет проблем с русским языком ? (имею ввиду ывод из базы.) А что касательно категорий, то это просто. Надо немного дописать класс категории.
      • 11 Февраля 2013 11:47
        molegx
        не разу не сталкивался с pdo да и есть ли уроки? Я то погуглил, но сайты про pdo с 3 страницами мне не о чем не говорят... Значит и дописать класс не смогу. печально...
    • 25 Января 2014 04:48
      a096d3ffe3bdc79346dd
      <?php foreach ( $results['categories'] as $category ) { ?><a href="?action=archive&categoryId=<?php echo $category->id?>"> > <?php echo $category->name?></a></br><?php } ?></div> 
      вот
  • 21 Марта 2013 09:51
    TroL929
    А еще беда с переадресацией, если например я хочу узнать переменные через var_dump(); для отладки при авторизации то выскакивает всем знакомая ошибка "Cannot modify header information". Как побороть ее я не знаю, может быть что нибудь подскажете? Через скрипт способ известен, охота через пхп
  • 21 Марта 2013 10:50
    TroL929
    нашел выход. в самом начале, или же в конфиг файле добавить ob_start();
  • 20 Октября 2013 09:12
    woolden
    Для того, что бы система работала с русским языком нужно изменить такие строки: 1) в файле classes/Article.php, в функции _construct это
    if ( isset( $data['title'] ) ) $this->title = preg_replace ( "/[^\.\,\-\_\'\"\@\?\!\:\$ a-zA-Z0-9()]/", "", $data['title'] );
    if ( isset( $data['summary'] ) ) $this->summary = preg_replace ( "/[^\.\,\-\_\'\"\@\?\!\:\$ a-zA-Z0-9()]/", "", $data['summary'] );
    на
    if ( isset( $data['title'] ) ) $this->title = preg_replace ( "/[^\.\,\-\_\'\"\@\?\!\:\$ а-яА-ЯёЁa-zA-Z0-9()]/", "", $data['title'] );
    if ( isset( $data['summary'] ) ) $this->summary = preg_replace ( "/[^\.\,\-\_\'\"\@\?\!\:\$ а-яА-ЯёЁa-zA-Z0-9()]/", "", $data['summary'] );
    2) в файле templates/include/header.php а. это
    <html lang="en">
    на
    <html>
    b. добавить
    <meta charset="utf-8">
    3) в файле config.php это
    define( "DB_DSN", "mysql:host=localhost;dbname=cms;" );
    на
    define( "DB_DSN", "mysql:host=localhost;dbname=cms;charset=utf8" );
    и будет Вам счастье :)
  • 10 Декабря 2013 16:15
    zbarazskiistason
    Через что может быть такая ошибка Sorry, a problem occurred. Please try later.
    • 15 Января 2014 17:43
      jamkhan
      в файле config.php измени define( "DB_USERNAME", "root" ); define( "DB_PASSWORD", "" ); на свой логин и пароль от базы.
  • 25 Июня 2014 12:01
    EuRo123
    Помогу с проектами любой сложности! mail -san4ob148@gmail.com skype - san4o123123
  • 22 Сентября 2014 08:56
    Aidyn
    когда захожу в админку выдает вот это
    Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\cms\config.php:1) in Z:\home\localhost\www\cms\admin.php on line 59
    что делать? кстати, даже у вас в демо есть ошибки. Исправьте пожалуйста
  • 22 Сентября 2014 14:26
    Aidyn
    Извините беру слова обратно. Оказывается это у меня блокнот сохранял с BOM(у меня в блокноте при сохранении не упоминается ВОМ). Ошибку, которая отображается в демо при входе в админку я сам у себя исправил. Спасибо за урок! очень понятно для новичков!
  • 3 Октября 2014 14:54
    nfs102ai
    ---хороший урок
  • 25 Января 2015 21:28
    dzelentsov
    Хорошая статья! но прошу вашей помощи, не добавляются ни записи ни категории. когда нажимаю на кнопку добавить на экран выводится сообщение что все ок но нечего не создается и не добавляется. в хедере постоянно выводиться ошибка
    Deprecated: mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead. in /var/www/vhosts/site.ru/httpdocs/demo/classes/Article.php on line 105
  • 11 Февраля 2015 22:17
    karamel
    Где же последний урок, с изображениями? Очень надо)
  • 22 Февраля 2015 22:11
    Nastromo
    Правильная строка для русификации a-za-я0-9 вместо a-zA-Z0-9 в файле Article.php
  • 3 Марта 2015 23:30
    av_green
    а уменя при добавлении новости или категории выскакивает ошибка: Fatal error: Category::insert(): Attempt to insert a Category object that already has its ID property set (to 0). in .... вчем проблема? сначала все добавлялось без проблемм, а после удаления полностью всех категорий и постов стала выскакивать такия ошибка и ничего не добавляеться
  • 4 Октября 2015 10:53
    bakhteek
    Скажите пожалуйста, как можно русифицировать дату? Заранее спасибо!
  • 30 Октября 2015 08:18
    EuRo123
    Помогу с настройкой этого скрипта или другого, могу написать любой скрипт под заказ. san4o123123
  • 3 Декабря 2015 02:39
    Игорь Кочетков
    Создал через phpMyAdmin базу cms, импортировал в неё tables.sql, вроде всё успешно (Импорт успешно завершен, запросов выполнено: 2. (tables.sql)), но втф всёравно: Sorry, a problem occurred. Please try later. Что не так? :)
^ Наверх ^