Подскажите, в каком направлении правильнее двигаться.
Требуется создать материал, в котором нужно реализовать создание неограниченного количества расписаний.
например есть событие (этот материал1), которое выполняется в Понедельник с 19ч до 21ч и во Вторник с 20ч до 23ч и т.д. например.
Варианты решения:
1. Создать новый тип СКК, состоящий из ([1-7]дни недели,[0-23]часы начала,[0-59]минуты начала, [0-23]часы окончания,[0-59]минуты окончания)
2. Установив Node Reference создать материал2 "расписание" с полями ([1-7]дни недели, timebegin, timeend) и как-то привязать материал1-(один ко многим)-материал2, заставив пользователя при создании материала1 только создавать N маткриалов2
Или есть 3 вариант?
Комментарии
Посмотрите на модули Date и Calendar. Большим к сожалению ничем не смогу подсказать.
Файл cck_schedule.install:
<?php
// hook_field_schema
function cck_schedule_field_schema($field) {
//возращаем массив которые содержит
return array(
//колонку
'columns' => array(
'day' => array(
'type' => 'text',
),
'begin' => array(
// и поле имеет тип datetime
'type' => 'text',
),
'end' => array(
// и поле имеет тип datetime
'type' => 'text',
),
),
);
}
?>
файл Файл cck_schedule.module:
<?php
// хук для отображения типа поля
// hook_field_info
function cck_schedule_field_info() {
// возвращаем массив
return array(
// который называется schedule
'schedule' => array(
// имя нашего типа будет 'schedule field'
'label' => t('Расписание'),
// объяснение к нашему типу
'description' => t('sample schedule field'),
// стандартный виджет, который будет отображаться сразу
// после того, как мы выберем тип поля
'default_widget' => 'schedule_widget',
// стандартный формат, который будет
// отображаться сразу после того, как мы выберем тип поля
'default_formatter' => 'schedule_formatter',
),
);
}
//хук для отображеня и настройки виджета
// hook_field_widget_info
function cck_schedule_field_widget_info() {
//возращаем масив
return array(
//с именем schedule
'schedule' => array(
// называться наш виджет будет schedule label
'label' => t('Стандартное расписание'),
// работать наш виджет будет с полем в БД под названием schedule
'field types' => array('schedule'),
),
);
}
// хук для отображения формата для нашего поля
// hook_field_formatter_info
function cck_schedule_field_formatter_info() {
// возвращаем массив
return array(
//название нашего формата для кода
'schedule_formatter' => array(
// отображаемое название формата
'label' => t('Simple schedule field formatter'),
// поле в БД, с которым будет работать наш формат
'field types' => array('schedule'),
),
);
}
function cck_schedule_daycodes($sd = NULL) {
static $schedule_day = array(
'Пн' => array('day' => 'Понедельник', 'code' => '1'),
'Вт' => array('day' => 'Вторник', 'code' => '2'),
'Ср' => array('day' => 'Среда', 'code' => '3'),
'Чт' => array('day' => 'Четверг', 'code' => '4'),
'Пт' => array('day' => 'Пятница', 'code' => '5'),
'Сб' => array('day' => 'Суббота', 'code' => '6'),
'Вс' => array('day' => 'Воскресение', 'code' => '7'),
);
if (is_null($sd)) {
return $schedule_day;
}
elseif (isset($schedule_day[$sd])) {
return $schedule_day[$sd];
}
return FALSE;
}
function _cck_schedule_sd_options($show_custom = FALSE, $day_selection = array()) {
$options = array();
foreach (cck_schedule_daycodes() as $sd => $value) {
$sd_name = $value['day'];
// faster using array key instead of in_array
if ($show_custom && isset($custom_cc[$sd])) {
$sd_name .= ' *';
}
if (!empty($day_selection) && $day_selection[$sd] === 0) {
continue;
}
$options[$sd] = check_plain($sd_name);
}
return $options;
}
// hook_field_widget_form
function cck_schedule_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
// задаем в параметры switch, что будем работать с
// типами виджетов которые находиться в модуле.
switch ($instance['widget']['type']) {
// если параметр case есть 'schedule'
case 'schedule':
// тогда присваиваем элементу schedule массив
// с следующими значениями
$element['day'] = array(
// тип элемента 'select',
'#type' => 'select',
// заголовок заданный в настройках элемента
'#title' => t('День недели'),
// объяснение виджета даны в настройках элемента
'#description' => $element['#description'],
// в нашем виджете будет стандартное значение textfield
'#default_value' => 1,
// обязательный ли элемент будет задаваться в настройках самого элемента
'#required' => $element['#required'],
// место нахождение элемента –
// если оно задано тогда
// использовать значение, если же нет, тогда значение равно 0
'#weight' => isset($element['#weight']) ? $element['#weight'] : 0,
// строка, которая нам пригодится для вывода
'#delta' => $delta,
'#options' => _cck_schedule_sd_options(),
);
$element['begin'] = array(
// тип элемента 'textfield',
'#type' => 'textfield',
// заголовок заданный в настройках элемента
'#title' => t('Время начала'),
// объяснение виджета даны в настройках элемента
'#description' => $element['#description'],
// в нашем виджете будет стандартное значение textfield
'#default_value' => t('textfield'),
// обязательный ли элемент будет задаваться в настройках самого элемента
'#required' => $element['#required'],
// место нахождение элемента –
// если оно задано тогда
// использовать значение, если же нет, тогда значение равно 0
'#weight' => isset($element['#weight']) ? $element['#weight'] : 0,
// строка, которая нам пригодится для вывода
'#delta' => $delta,
);
$element['end'] = array(
// тип элемента 'textfield',
'#type' => 'textfield',
// заголовок заданный в настройках элемента
'#title' => t('Время окончания'),
// объяснение виджета даны в настройках элемента
'#description' => $element['#description'],
// в нашем виджете будет стандартное значение textfield
'#default_value' => t('textfield'),
// обязательный ли элемент будет задаваться в настройках самого элемента
'#required' => $element['#required'],
// место нахождение элемента –
// если оно задано тогда
// использовать значение, если же нет, тогда значение равно 0
'#weight' => isset($element['#weight']) ? $element['#weight'] : 0,
// строка, которая нам пригодится для вывода
'#delta' => $delta,
);
break;
}
return $element; // возвращаем $element;
}
?>
<?php
// hook_field_formatter_view
function cck_schedule_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
// создаем массив в $element, (так надо делать всегда)
$element = array();
// задаем в параметры switch, что будем работать с
// типами форматирования которые находиться в модуле.
switch ($display['type']) {
// если тип форматирование 'schedule_formatter', тогда
case 'schedule_formatter':
// выводим $items как $delta => $item
foreach ($items as $delta => $item) {
// если у нас есть $item в массиве которой есть значение 'day', тогда
if ($item['day']) {
// помещаем эту переменную в $formattedText
$formattedText = $item['day'];
// и выводим ее, в тегах ,
// думаю Вы уже поняли какой текст будет выводится.
$element[$delta]['#markup'] = '' . $formattedText .'';
// в дaнном случае вывод переменной всегда должен лежать в $element[$delta],
// и дальше проще говоря мы используем тип вывода, это ['#markup']
}
}
break;
}
// возвращаем $element
return $element;
}
?>
<?php
// hook_field_is_empty
function cck_schedule_field_is_empty($item, $field) {
// если у нас в $item['schedule'] ничего нет,
if (empty($item['schedule'])) {
// тогда возвращаем 1, то есть говорим Drupal что все хорошо..)
return true;
// и если же в поле ничего нет, ничего не выведется.
}
}
?>
Про сохранении материала появляется ошибка:
Warning: explode() expects parameter 2 to be string, array given в функции menu_node_submit() (строка 691 в файле ...\www\modules\menu\menu.module).