Datepicker jquery собственный модуль [Решено]

Главные вкладки

Аватар пользователя vitg vitg 5 июля 2010 в 11:47

Здравствуйте!
Сутки пытаюсь найти решение по проблеме "навешивания" календаря на клик по текстовому полю в собственном модуле. Натыкался на разные вещи, но конкретно этого решения не нашел.

Библиотеки подключил функцией drupal_add_js () вот так:

drupal_add_js (drupal_get_path ('module','leasing')."/js/jquery.ui.core.js");
drupal_add_js (drupal_get_path ('module','leasing')."/js/jquery.ui.datepicker.js");

Далее, как я понял, нужно изменить id textfielda. Вот так

$form['leasing_reserve']['start_date'] = array
(
        '#type' => 'textfield',
        '#title' => 'Дата начала бронирования',
        '#size' => 10,
        //'#element_validate' => array ('price_validate'),
        '#description' => 'Когда Вы планируете взять инструмент?',
        '#attributes' => array ('id' => 'datepicker')
);

не работает.

И еще, нужно включить неизвестный js-код в саму страницу. (Зачем текстом? Нельзя файлом? Где и как это правильно сделать? Пожалуйста, поясните, что этот код делает.)

Заранее всем спасибо!

PS. Можно и ссылку... но я искал...

Комментарии

Аватар пользователя xxandeadxx xxandeadxx 5 июля 2010 в 13:59

"vitg" wrote:
Нельзя файлом?

можно и файлом

<?php
drupal_add_js 
(drupal_get_path ('module','leasing')."/js/jquery.ui.core.js");
drupal_add_js (drupal_get_path ('module','leasing')."/js/jquery.ui.datepicker.js");
drupal_add_js (drupal_get_path ('module','leasing')."/js/file.js");
?>

в file.js что-то типа:

$(function(){
  $('#datepicker').datepicker();
});

"vitg" wrote:
Далее, как я понял, нужно изменить id textfielda. Вот так

в каком хуке этот код находится?

Аватар пользователя vitg vitg 5 июля 2010 в 14:55

"xxandeadxx" wrote:
в каком хуке этот код находится?

Думаю, в хуке block пока. Также думал вынести этот код в функцию, возвращающую форму.

"xxandeadxx" wrote:

$(function(){
$('#datepicker').datepicker();
});

А что этот код означает?

Аватар пользователя xxandeadxx xxandeadxx 5 июля 2010 в 14:59

"vitg" wrote:
Думаю

дак вы только думаете) ну поэтому и
"vitg" wrote:
не работает.

"vitg" wrote:
А что этот код означает?

ничего, это пример того
"vitg" wrote:
Где и как это правильно сделать?

Аватар пользователя vitg vitg 6 июля 2010 в 7:47

Ответ оказался следующим.
1) Подключаем три js файла (jquery уже имеется в drupal)

drupal_add_js (drupal_get_path ('module','leasing')."/js/jquery.ui.core.js");
drupal_add_js (drupal_get_path ('module','leasing')."/js/jquery.ui.datepicker.js");
drupal_add_js (drupal_get_path ('module','leasing')."/js/file.js");

2) При генерации формы средствами drupal у каждого элемента есть свой id. Насколько я понял, за него отвечает индекс в массиве при определении формы (массив для drupal_get_form).
В файле file.js пишем

$(function(){
  $('#edit-start-date').datepicker();
  $('#edit-finish-date').datepicker();
});

Пояснения:
$('#id_element').datepicker(); - прикрепит к элементу календарик, где id_element - идентификатор (id) элемента, про который было упомянуто выше.
Внутри {} в файле file.js таких строк, начинающихся со знака $, может быть несколько, как в примере.

3) Подключаем оформление.
Качаем тему на оформление, скидываем её в каталог с модулем, в модуле дописываем примерно следующее:

drupal_add_css (drupal_get_path ('module','leasing')."/css/start/jquery-ui-1.8.2.custom.css");

Здесь в под "/css/start/jquery-ui-1.8.2.custom.css" подразумевается путь к файлу со стилями.

4) Локализуем интерфейс
Из скачанного архива с datapicker'ом со копируем файл "jquery.ui.datepicker-ru.js". Подключаем его также, как и остальные js-скрипты. Все. Наслаждаемся работой других программистов.

Всем спасибо!

PS. Не все всегда решается "методом тыка", я часто сначала предпочитаю думать, а потом делать и не нахожу в этом ничего предосудительного.

Аватар пользователя bratok bratok 15 февраля 2011 в 11:35

Вместо всего этого можно написать следующую функцию
В файле template.php

<?php
function my_theme_name_theme()
{
    
/*
     * Регистрируем тему для формы my_module_my_form
     * При генерации будет вызвана функция my_theme_name_my_module_my_form для отображения html
     * см. модуль my_module   
     */
    
return array(
        
'my_module_my_form' => array( 
            
'arguments' => array('form' => Null), 
        ), 
    );
}
?>

И затем в файле my_module.module

<?php

function my_theme_name_my_module_my_form(&$element)
{
    
jquery_ui_add('ui.datepicker');
        
drupal_add_css(drupal_get_path('module''jquery_ui').'/jquery.ui/themes/default/ui.all.css');    
        
$output '
    <script type="text/javascript">
        $(document).ready(function(){
            // этот id можно посмотреть в Html коде страницы, например через FB
            $( "#edit-burthday" ).datepicker({
                changeMonth: true,
                changeYear: true
            });
        });
    </script>'
;
    
$output .= drupal_render($element['vacancy']); 
    
$output .= drupal_render($element['personal_data']['burthday']);
    return 
$output;
}
?>

И все, и здесь можно извращать HTML, как тебе угодно.
Все, кому нужно что-то подобное смотрите -"Темизация форм".