Обновление движка DLE и адаптация шаблона DLE с 9.6 до 9.7

Обновление движка DLE на сайте с рецептамиДобрый день, вот и выдался свободный денек для написания статьи. Сегодня я расскажу о моем новом Клиенте: Это сайт всевозможных рецептов и о том, какие задачи его админ поставил передо мной.

Первая задача: Обновить движок сайта с версии 9.6 до 9.7. И адаптировать шаблон под новую версию.

Вторая задача: убрать из URL новости идентификатор и оставить только название.
Например Статья об «Облаве иранской полиции на кафе» имеет URL: menuy.ru/articles/news/70-oblava-iranskoy-policii-nravov-na-kafe.html
Дак вот цифру 70 необходимо было вырезать из строки. Чтобы осталось:
menuy.ru/articles/news/oblava-iranskoy-policii-nravov-na-kafe.html

Задача третья: Изменить главную категорию после того как добавлена новость или в момент ее добавления.

Давайте вместе посмотрим на решение каждой из них.

Первая задача:

Обновление движка DLE не вызвало больших проблем. Все делал по инструкции, как указано на офф сайте DLE. Скопировал файлы движка и запустил систему обновления.
1. Скопировал файл картинки из стандартного шаблона /templates/Default/dleimages/noavatar.png в папку вашего шаблона. Хотя это можно и не делать.

2. В самый низ файла style/engine.css добавил:
[css] /*—Вывод результатов голосования на сайте—*/
.voteprogress {
overflow: hidden;
height: 15px;
margin-bottom: 5px;
background-color: #f7f7f7;
background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
background-image: linear-gradient(top, #f5f5f5, #f9f9f9);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#f5f5f5′, endColorstr=’#f9f9f9′, GradientType=0);
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}

.voteprogress span {
color: #ffffff;
text-align: center;
text-indent: -2000em;
height: 15px;
display: block;
overflow: hidden;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background: #0e90d2;
background-image: -moz-linear-gradient(top, #149bdf, #0480be);
background-image: -ms-linear-gradient(top, #149bdf, #0480be);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
background-image: -o-linear-gradient(top, #149bdf, #0480be);
background-image: linear-gradient(top, #149bdf, #0480be);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#149bdf’, endColorstr=’#0480be’, GradientType=0);
}

.voteprogress .vote2 {
background-color: #dd514c;
background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
background-image: linear-gradient(top, #ee5f5b, #c43c35);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#ee5f5b’, endColorstr=’#c43c35′, GradientType=0);
}

.voteprogress .vote3 {
background-color: #5eb95e;
background-image: -moz-linear-gradient(top, #62c462, #57a957);
background-image: -ms-linear-gradient(top, #62c462, #57a957);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
background-image: -webkit-linear-gradient(top, #62c462, #57a957);
background-image: -o-linear-gradient(top, #62c462, #57a957);
background-image: linear-gradient(top, #62c462, #57a957);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#62c462′, endColorstr=’#57a957′, GradientType=0);
}

.voteprogress .vote4 {
background-color: #4bb1cf;
background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
background-image: linear-gradient(top, #5bc0de, #339bb9);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#5bc0de’, endColorstr=’#339bb9′, GradientType=0);
}

.voteprogress .vote5 {
background-color: #faa732;
background-image: -moz-linear-gradient(top, #fbb450, #f89406);
background-image: -ms-linear-gradient(top, #fbb450, #f89406);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
background-image: -o-linear-gradient(top, #fbb450, #f89406);
background-image: linear-gradient(top, #fbb450, #f89406);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#fbb450′, endColorstr=’#f89406′, GradientType=0);
}

/*—Вывод результатов опросов в новостях—*/
.pollprogress {
overflow: hidden;
height: 18px;
margin-bottom: 5px;
background-color: #f7f7f7;
background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
background-image: linear-gradient(top, #f5f5f5, #f9f9f9);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#f5f5f5′, endColorstr=’#f9f9f9′, GradientType=0);
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-webkit-border-radius: 4px;
-moz-border-radius: 4px;
border-radius: 4px;
}

.pollprogress span {
color: #ffffff;
height: 18px;
display: block;
overflow: hidden;
font-size: 12px;
text-align: center;
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
background: #0e90d2;
background-image: -moz-linear-gradient(top, #149bdf, #0480be);
background-image: -ms-linear-gradient(top, #149bdf, #0480be);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
background-image: -o-linear-gradient(top, #149bdf, #0480be);
background-image: linear-gradient(top, #149bdf, #0480be);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#149bdf’, endColorstr=’#0480be’, GradientType=0);
}

.pollprogress .poll2 {
background-color: #dd514c;
background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
background-image: linear-gradient(top, #ee5f5b, #c43c35);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#ee5f5b’, endColorstr=’#c43c35′, GradientType=0);
}

.pollprogress .poll3 {
background-color: #5eb95e;
background-image: -moz-linear-gradient(top, #62c462, #57a957);
background-image: -ms-linear-gradient(top, #62c462, #57a957);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
background-image: -webkit-linear-gradient(top, #62c462, #57a957);
background-image: -o-linear-gradient(top, #62c462, #57a957);
background-image: linear-gradient(top, #62c462, #57a957);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#62c462′, endColorstr=’#57a957′, GradientType=0);
}

.pollprogress .poll4 {
background-color: #4bb1cf;
background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
background-image: linear-gradient(top, #5bc0de, #339bb9);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#5bc0de’, endColorstr=’#339bb9′, GradientType=0);
}

.pollprogress .poll5 {
background-color: #faa732;
background-image: -moz-linear-gradient(top, #fbb450, #f89406);
background-image: -ms-linear-gradient(top, #fbb450, #f89406);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
background-image: -o-linear-gradient(top, #fbb450, #f89406);
background-image: linear-gradient(top, #fbb450, #f89406);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=’#fbb450′, endColorstr=’#f89406′, GradientType=0);
}
[/css]

3. В файле feedback.tpl нашел:
[html] </tr>[/recaptcha] [/html] Ниже добавил:
[html] [question] <tr>
<td class="label">
Вопрос:
</td>
<td>
<div>{question}</div>
</td>
</tr>
<tr>
<td class="label">
Ответ:<span class="impot">*</span>
</td>
<td>
<div><input type="text" name="question_answer" id="question_answer" class="f_input" /></div>
</td>
</tr>
[/question] [/html]

4. В файле pm.tpl нашел:
[html] </tr>
[/recaptcha] [/html] Ниже добавил:
[html] [question] <tr>
<td class="label">
Вопрос:
</td>
<td>
<div>{question}</div>
</td>
</tr>
<tr>
<td class="label">
Ответ:<span class="impot">*</span>
</td>
<td>
<div><input type="text" name="question_answer" id="question_answer" class="f_input" /></div>
</td>
</tr>
[/question] [/html]

5. В файле userinfo.tpl добавил тег not-logged:

Было: {edituser}

Стало: [not-logged] [ {edituser} ] [/not-logged]

Вторая задача:

Напомню нужно было убрать из URL новости идентификатор и оставить только название.
Например Статья об «Облаве иранской полиции на кафе» имеет URL: menuy.ru/articles/news/70-oblava-iranskoy-policii-nravov-na-kafe.html
Дак вот цифру 70 необходимо было вырезать из строки. Чтобы осталось:
menuy.ru/articles/news/oblava-iranskoy-policii-nravov-na-kafe.html

При анализе работы движка я пришел к выводу, что это сделать не получится.

В чем же причина:
Переходя по ссылке с красивым URL
menuy.ru/articles/news/70-oblava-iranskoy-policii-nravov-na-kafe.html
Обработку ведет файл .htaccess который лежит в корне сайта, а за фильтрацию URL отвечает строка 17:
RewriteRule ^([^.]+)/([0-9]+)-(.*).html(/?)+$ index.php?newsid=$2&seourl=$3&seocat=$1 [L]

Т.е. после перехода по ссылке нас перенаправляют в новость по тому самому номеру который и просил заказчик убрать. А все, что идет после номера нужно только для лучшего визуального восприятия ссылки человеком и поисковой системой.
Вот как выглядит исходный уже готовый запрос после обработки:
menuy.ru/index.php?newsid=70
И если его убрать цифру 70 из URL то движок при переходе по такому URL оставит вас на главной страничке сайта.

Таким образом вторая задача не была реализована.

Задача третья:

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

Для чего вы спросите это вообще нужно? =) Я тоже не сразу понял.
Заказчик разрешил мне опубликовать текст который он мне прислал на почту.

Вот текст задачи присланный заказчиком:
Например: есть категория «Вторые блюда (id47)» и две подкатегории «Морепродукты (id54)» и «Овощи (id55)». Сейчас скрипт настроен так, что в независимости от того какую подгатегорию я присвою материалу, главная категория «Вторые блюда» будет родительской и если перейти по ссылке это категории мы увидим это материал.

Задача в другом. Сейчас если я хочу добавить материал в подкатегорию Овощи и Морепродукты после добавления имеет вид Морепродукты и Овощи. Т.е. у Морепродуктов id меньше, соответственно старше и скрипт считает, что эта категория главнее Овощей и статью добавляет к Морепродуктам. Если зайти в Овощи там будет этот материал, но ссылка будет вести в раздел «Морепродукты». Задача как-то избавиться от сортировки по id чтоли, чтобы независимо от расположения в разделе админки Категории я мог бы выбирать какой подгатегории я отдаю материал. Выбрать эту подкатегорию первой и соответственно скрипт бы туда материал и пихал (привязывать).

Скриншот во вложении, для наглядности.

Настройка главной категории в DLE

В чем заключалась проблема:
Если посмотреть на картинку то видно, что категория «Морепродукты (id54)» стоит выше чем «Овощи (id55)». Что же происходит при добавлении новости(рецепта).
Если Вы в момент добавление публикации выберите обе эти категории «Морепродукты (id54)» и «Овощи (id55)».
Выбор главной категории в DLE
То скрипт поместит новость в категорию «Морепродукты (id54)», а категория «Овощи (id55)» будет как добавочная.
И если даже Вы в момент добавления выберете их в другом порядке, сначала «Овощи (id55)», а потом «Морепродукты (id54)», то новость все равно будет помещена в «Морепродукты (id54)» потому, что она отсортирована в админке так, что стоит выше. И по этому считается главной.

Почему так происходит ?
Разбирая сам механизм работы системы добавления новости я понял понял, что в момент добавления новости в админке или на сайте Вам предлагается заполнить форму добавления новости. Указать заголовок, выбрать категорию, ввести полную и краткую новость.
Вот здесь то и кроется разгадка, DLE при показе данной формы уже считала категории и их порядок сортировки в админке. Затем она вывела их Вам в удобном окошечке для добавления(выбора) категории, но в самом начале оно пустое.
Для выбора категории Вы кликаете и выбираете нужные Вам. И порядок их выбора не имет значения, потому что они вам просто подсвечиваются для Вашего удобства и легкого визуального восприятия, того куда же Вы определите новость.

После нажатия кнопки опубликовать в скрипт addnews.php передается массив catlist[] содержащий ID`ы выбранных категорий и причем массив уже отсортирован.

Я вышел из положения простым способом: предложил заказчику добавлять новость и не задумываться о том, какая категория главная, а после публикации открывать новость для просмотра на сайте и в выпадающем списке внизу, уже указывать главную категорию. Используя мой маленький скрипт внедренный в шаблон полной новости. Выводиться он естественно только администратору. Через тег [group=1][/group].

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

На основе данной разработки в скором времени появится мой маленький мод «Главная категория v1».

ps: занимался я сайтом примерно неделю.

Если есть вопросы то пишите в комментариях, или на почту, обязательно отвечу.

Дополнение от 25-11-2012

Плагин Главная категория v1 немного был видоизменен. Заказчик попросил перенести окно выбора главной категории в вверх под окно выбора категорий DLE.
Скрин: Плагин для DLE 9.7  "Главная категория v1"

Метки: нет меток

2 комментария

Добавить комментарий для Кот_ДаWINчи Отменить ответ

Your email address will not be published. Required fields are marked *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.