Yii: Добавляем архив статей по месяцам

Yii: Добавляем архив статей по месяцам Добавляем на сайт, работающий на фреймворке Yii, блок архива статей с разбиением по месяцам. В скобках указываем количество статей, опубликованных в каждом месяце. Это удобный с точки зрения навигации способ. Информация на сайте становится структурирована и понятна история, особенно если вы регулярно добавляете новые материалы.

Добавляем в шаблон вызов виджета MonthlyArchives с архивом материалов (/protected/views/layouts/column3.php)

<?php $this->widget('MonthlyArchives', array(
        'maxItems'=>Yii::app()->params['monthlyArchivesCount'],
)); ?>

В компонентах создаем этот виджет /protected/components/MonthlyArchives.php

<?php

class MonthlyArchives extends CWidget
{
  public $title='Архив статей';
  public $maxItems=10;

  public function findAllMaterialDate()
  {
    $yearmonth = array();
    $materials = Material::model()->findRecentMaterials($this->maxItems);

    $count = 0;
    foreach ($materials as $material) {
      $ym = date('F Y', strtotime($material->create_time)); // December 2011
      if (!isset($yearmonth[$ym])) {
        if (++$count > $this->maxItems) break;
        $yearmonth[$ym] = 1;
      } else {
        $yearmonth[$ym]++;  // 2, 3, 4
      }
    }
    return $yearmonth;
  }

  public function run()
  {
    $this->render('monthlyArchives');
  }

}


Добавляем вид компонента - /protected/components/views/monthlyArchives.php

<div id="materialsHeader">
    <div id="materials" class="portlet-materials">
        <h3>Архив статей</h3>
		
		<ul>
		<?php foreach ($this->findAllMaterialDate() as $month=>$val): ?>
			<li>
			<?php echo CHtml::link("$month ($val)", array('material/PostedInMonth',
                                              		'time'=>strtotime($month),
                                              		'pnc'=>'c'));  ?>
			</li>
		<?php endforeach; ?>
		</ul>
	</div>
	<div id="materialsFooter"></div>
</div>


Также необходимо добавить в контроллер материалов (статей) функцию

                /**
	         * Collect posts issued in specific month
	         */
	        public function actionPostedInMonth()
	        {
	                $month = date('n', $_GET['time']); // 1 through 12
	                $year = date('Y', $_GET['time']); // 2011
	                if ($_GET['pnc'] == 'n') $month++;
	                if ($_GET['pnc'] == 'p') $month--;

	                $criteria = new CDbCriteria(array(
	                        'condition' => 'status='.Material::STATUS_PUBLISHED.' AND create_time > :time1 AND create_time < :time2',
	                        'order' => 'update_time DESC',
	                        'params' => array(
	                                ':time1' => ($firstDay = date("Y-m-d", mktime(0,0,0,$month,1,$year))),
	                                ':time2' => date("Y-m-d", mktime(0,0,0,$month+1,1,$year))),
	                ));

	                $pages = new CPagination(Material::model()->count($criteria));
	                $pages->pageSize = Yii::app()->params['materialsPerPage'];
	                $pages->applyLimit($criteria);

	                $materials = Material::model()->findAll($criteria);

	                $this->render('month',array(
	                        'materials' => $materials,
	                        'pages' => $pages,
	                        'firstDay' => $firstDay,
	                ));
	        }


и в /protected/config/params.php количество статей отбираемых при составлении блока Архив статей по месяцам (отбираем пока все статьи, поэтому просто укажем число побольше; вы же можете убрать ограничение на выборку записей в функции findRecentMaterials в моделе, нам же это ограничение нужно, потому что эта же функция используется для списка статей в выводе на главной странице)

'monthlyArchivesCount'=>100000,


almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.