Добавляем поле «Дата публикации» в Pav Blog для OpenCart 1.5

Оказалось, что в модуле Pav Blog нет поля с датой публикации, есть только дата создания, которую можно изменить. Казалось бы, зачем городить огород, если можно изменить дату создания и не париться? А затем, что статья все равно выводится, не смотря на то, что дата стоит «завтрашняя». Пора это дело исправить.

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

ПОЭТОМУ! Если вы не видите у себя какой-то кусок кода (привет, копипастеры) — это не значит, что «все не работает», это значит, что надо подумать и, скорее всего, тот же кусок (может быть, немного отличающийся по виду) должен найтись в другом месте файла.

Для начала определимся, что будем делать:

1. добавим поле в базу (надо же где-то хранить дату публикации);
2. выведем поле в админке на странице редактирования записи;
3. ограничим вывод статей датами, не превышающими текущую.

Собственно, приступим.

Поле в базу я добавил через phpMyAdmin, с этим проблем быть не должно:

Выбираем таблицу oc_pavblog_blog.
Добавляем ей поле publishDate (я добавил после created). Тип поля «date«, остальное можно не заполнять.

Теперь надо добавить возможность заполнения этого поля.

Открываем /admin/view/template/module/pavblog/blog.tpl и добавляем после

<tr>
        <td><?php echo $this->language->get('entry_created');?></td>
        <td>
                <input type="text" name="pavblog_blog[created]" value="<?php echo $blog['created'];?>" class="date">
        </td>
</tr>

Вот такое:

<tr>
        <td>Дата публикации</td>
        <td>
                <input type="text" name="pavblog_blog[publishDate]" value="<?php echo (!empty($blog['publishDate'])) ? $blog['publishDate'] : date('Y-m-d');?>" class="date">
        </td>
</tr>

Это будет примерно с 96 строки.

Теперь надо добавить информацию о дате публикации в список статей. Для этого открываем /admin/view/template/module/pavblog/blogs.tpl и ищем строки:

<td class="right"  width="100"><?php echo $this->language->get('text_created');?></td>

и ниже

<td class="right"><?php echo $blog['created'];?></td>

После первой вставляем это:

<td class="right"  width="100">Дата публикации</td>

После второй — это:

<td class="right"><?php echo $blog['created'];?></td>

Обратите внимание, что я не стал заморачиваться с локализацией (постольку поскольку сайт только на русском). На самом деле, стоит это сделать, но мне лень.

Ну вот, теперь прямо из админки можно рулить датой публикации материала, но список в фронтенде все еще об этом не знает. Продолжим.

Открываем /catalog/controller/pavblog/blogs.php и меняем строку

$output .= '<pubDate>' . date('D, j F Y H:i:s e', strtotime($blog['created'])) . '</pubDate>';

на

$output .= '<pubDate>' . date('D, j F Y H:i:s e', strtotime($blog['publishDate'])) . '</pubDate>';

Это для RSS (зачем пользователю знать, когда материал был написан? Ему надо знать, когда он появился в сети.)

Та же история с файлом /catalog/controller/pavblog/category.php

Ищем

$output .= '<pubDate>' . date('D, j F Y H:i:s e', strtotime($blog['created'])) . '</pubDate>';

и меняем на пиво

$output .= '<pubDate>' . date('D, j F Y H:i:s e', strtotime($blog['publishDate'])) . '</pubDate>';

Теперь открываем /catalog/view/theme/mytheme/template/pavblog/_item.tpl и меняем

		<span class="created">
			<span class="day"><?php echo date("d",strtotime($blog['created']));?></span>
			<span class="month"><?php echo date("M",strtotime($blog['created']));?></span> /
			<span class="month"><?php echo date("Y",strtotime($blog['created']));?></span>
		</span>

на

<span>
<span><?php echo date("d",strtotime($blog['publishDate']));?></span>
<span><?php echo date("M",strtotime($blog['publishDate']));?></span> /
<span><?php echo date("Y",strtotime($blog['publishDate']));?></span>
</span>

Открываем /catalog/view/theme/mytheme/template/pavblog/blog.tpl и меняем

<span class="created"><span><?php echo $this->language->get("text_created_date");?> <?php echo $blog['created'];?></span></span>

на

<span class="created"><span><?php echo $this->language->get("text_created_date");?> <?php echo $blog['publishDate'];?></span></span>

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

Открываем /catalog/controller/module/pavbloglatest.php.

В самом начале файла после объявления функции вставляем это:

$nowDate = date("Y-m-d");

Оно забирает текущую дату в формате, в котором OpenCart хранит даты в базе.

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

foreach( $blogs as $key => $blog ){

Вот весь этот блок (с 62 по 80 строки примерно) заменяем на это:

		foreach( $blogs as $key => $blog ){
                    if ($nowDate < $blog['publishDate']) {
                         unset($blogs[$key]);
                    } else {
			if( $blogs[$key]['image'] ){	
				$blogs[$key]['thumb'] = $this->model_tool_image->resize($blog['image'], $setting['width'], $setting['height'] );
			}else {
				$blogs[$key]['thumb'] = '';
			}					

			$blogs[$key]['date'] = $blog['created'];
			$blogs[$key]['publishDate'] = $blog['publishDate'];
			$blogs[$key]['description'] = html_entity_decode($blog['description'], ENT_QUOTES, 'UTF-8');
			$blogs[$key]['author'] = isset($users[$blog['user_id']])?$users[$blog['user_id']]:$this->language->get('text_none_author');
			$blogs[$key]['category_link'] =  $this->url->link( 'pavblog/category', "path=".$blog['category_id'] );
			$blogs[$key]['comment_count'] =  10;
			$blogs[$key]['link'] =  $this->url->link( 'pavblog/blog','id='.$blog['blog_id'] );
                    }
		}

Тут самое важное это:

                    if ($nowDate < $blog['publishDate']) {
                         unset($blogs[$key]);
                    } else {

Именно здесь мы проверяем дату.

Все бы было ничего, но массив получается не такой, какой хочет Pav Blog (по крайней мере, то, что было напилено до меня, оно не совсем верно работало после внедрения), а именно, блог ждет массив с ключами от нуля и с правильным шагом. Чтобы это пофиксить (ключи-то будут не все после убиения не нужных постов), спускаемся ниже до строчки

$this->data['blogs'] = $blogs;

и меняем ее на

$this->data['blogs'] = array_values($blogs);

Теперь внимание! В строке 74 (у меня) изначально было это:

$blogs[$key]['description'] = strip_tags(html_entity_decode($blog['description'], ENT_QUOTES, 'UTF-8'));

Я не знаю, разработчиками это было сделано, или каким-то доброжелателем, кто до меня работал над сайтом, но тут из записи убиваются все теги. Нафига? Ни картинку не вставить, ни верстку сваять. В общем, поплевался я и убрал оттуда strip_tags, ибо заказчик выл, аки раненый слон, что картинки не вставляются.

Но хватит соплей, поехали дальше.

Теперь надо в файле, который наши записи заменить дату создания на дату публикации. Открываем файл /catalog/view/theme/mytheme/template/module/pavbloglatest.tpl и строку

<?php echo $blog['created'];?>

меняем на

<?php echo $blog['publishDate'];?>

На этом, вроде бы, все.

Вопросы в комментарии. Не обещаю, что сразу смогу отвечать, но постараюсь как только так сразу.

ЗЫ: Голого Pav Blog у меня нет, поэтому не пинайте за несоответствие номеров строк ))

0

Добавить комментарий