understeam / yii2-calendar-widget

Yii2日历小部件

v0.1.9 2019-05-31 17:33 UTC

This package is not auto-updated.

Last update: 2024-09-12 01:04:48 UTC


README

Latest Stable Version

该组件旨在显示日历内部的数据,并按周或按月进行划分。

安装

通过 Composer 进行安装

$ composer require understeam/yii2-calendar-widget:^0.1 --prefer-dist

之后,组件将被安装到 vendor 目录,其类将在命名空间 understeam\calendar 中可用。

配置

首先需要了解您希望在日历中显示哪个模型。例如,app\models\Event。所选模型应继承接口 understeam\calendar\ItemInterface,并使用特性(trait)understeam\calendar\ActiveRecordItemTrait

<?php
namespace app\models;

use understeam\calendar\ItemInterface;
use understeam\calendar\ActiveRecordItemTrait;

class Event extends \yii\db\ActiveRecord implements ItemInterface
{
    use ActiveRecordItemTrait;
}

还需要将组件添加到应用程序的配置中

'components' => [
    'calendar' => [
        'class' => 'understeam\calendar\ActiveRecordCalendar',  // Имя класса календаря
        'modelClass' => 'app\models\Event',                     // Имя класса модели
        'dateAttribute' => 'date',                              // Атрибут модели, в котором хранится дата (тип в БД timestamp или datetime)
        'dateRange' => [time() + 86400, time() + 2592000]       // период, в который будет доступно событие onClick
        // Так же в dateRange можно передать функцию, которая должна вернуть нужный массив в случае если нужны динамические вычисления
        // 'dateRange' => ['app\models\User', 'getCalendarRange'],
        'filter' => [ // Фильтр ActiveQuery, который будет применён. Возможно указывать callable для фильтрации
            'status' => 1,
        ],
        // Пример
        // 'filter' => function ($query, $startTime, $endTime) {
        //     return $query->andWhere(['userId' => Yii::$app->user->id]);
        // },
        // Или так
        // 'filter' => ['app\models\User', 'filterCalendarQuery'],
    ],
],

在控制器中连接

要在页面上显示日历,只需在所需控制器中添加 action

public function actions() {
    return [
        'calendar' => [
            'class' => 'understeam\calendar\CalendarAction',
            'calendar' => 'calendar',           // ID компонента календаря (да, можно подключать несколько)
            'usePjax' => true,                  // Использовать ли pjax для ajax загрузки страниц
            'widgetOptions' => [                // Опции виджета (см. CalendarWidget)
                'clientOptions' => [            // Опции JS плагина виджета
                    'onClick' => new JsExpression('showPopup'),   // JS функция, которая будет выполнена при клике на доступное время
                    'onFutureClick' => new JsExpression('buyPlan'),
                    'onPastClick' => new JsExpression('showError'),
                    // Все эти функции принимают 2 параметра: date и time
                    // Для тестирования можно использовать следующий код:
                    // 'onClick' => new JsExpression("function(d,t){alert([d,t].join(' '))}")
                ],
            ],
        ],
    ];
}

作为小部件连接日历

此选项用于将小部件作为另一页面的部分进行连接。这有点复杂,因为需要将一些数据传递给小部件,具体包括

  • grid - 日历网格的构建数组
  • viewMode - 查看模式(周/月)
  • period - DatePeriod 对象,其中开始和结束是日历中选择的时间段
  • calendar - CalendarInterface 的子类,日历组件

整体逻辑可以在 CalendarAction 中找到。

计划通过引入 CalendarGrid 实体来改进这一点,其中将包含网格的构建和确定时间段的方法。

计划

目前,日历已针对与 ActiveRecord 一起使用进行优化,但您可以为配置或数据提取编写自己的 CalendarInterface 组件继承者。将来计划开发一个简单的日历类,不依赖于 ActiveRecord