Personalizar dias que podem ser clicados em um pop-up do Calendário

10

Estou criando um formulário no Drupal 7 com a API do formulário. No momento, posso criar um campo de entrada de calendário comum com o seguinte código:

   $form['services_tab']['schedule_datepicker'] = array(
    '#title' => t('Pick the desired date'),
    '#type' => 'date_popup',
    '#date_year_range' => '0:0',
    '#date_format' => 'Y-m-d',
    '#prefix' => '<div id="datepicker-schedule">',
    '#suffix' => '</div>',
  );

No momento, posso exibir o lindo pop-up do calendário. O que estou tentando alcançar é ativar ou desativar determinadas datas com base em uma regra como: desativar todos os sábados e domingos; ou até remover o estado de clique de datas específicas com base em uma lista de feriados nacionais ...

Isso é algo que pode ser alcançado com a codificação PHP ou precisa ser feito com o jQuery? Caso o jQuery seja a solução, eu gostaria de receber dicas de como fazer isso ... O calendário é uma tabela, mas as células da tabela não têm um ID ou algo que possa me ajudar a encontrá-las e desativá-las com base em uma regra. ..

Obrigado.

Marcos Buarque
fonte
1
Esta resposta "[Como desativar fins de semana] [1]" ajudará você a desativar fins de semana e alguns dias. [1]: stackoverflow.com/questions/501943/…
Nikit

Respostas:

8

Você pode passar algumas opções do Datepicker do php para o elemento date_popup através da chave '#datepicker_options':

<?php
$form['date'] = array(
  '#title' => t('Pick the desired date'),
  '#type' => 'date_popup',
  '#datepicker_options' => array(
    'minDate' => 0,
  ),
);

Com esse método, você pode passar quase qualquer opção, exceto aquelas que aceitam uma função como valor, como beforeShowDaya necessária para restringir fins de semana ou feriados de acordo com a resposta referenciada pelo Nikit: /programming/501943/can- the-jquery-ui-datepicker-ser-feito-para-desativar-sabados-e-domingos-e-holid

Portanto, o javascript é necessário. Primeiro, você precisa incluir um arquivo js personalizado do código do módulo:

<?php
drupal_add_js(drupal_get_path('module', 'FOO') . '/FOO.js');

e forneça algum código FOO.jspara estender as configurações definidas pelo módulo date_popup com nossas próprias opções.

Aqui está um exemplo que adiciona a opção básica para desativar fins de semana para todos os widgets de selecionador de datas na página:

(function ($) {
Drupal.behaviors.FOO = {
  attach: function (context) {
    for (var id in Drupal.settings.datePopup) {
      Drupal.settings.datePopup[id].settings.beforeShowDay = $.datepicker.noWeekends;
    }
  }
};
})(jQuery);

Estender aos feriados é deixado como um exercício para o leitor :)

Nota: as três ocorrências de FOOmeus exemplos não precisam ser o mesmo literal, ou seja: você pode fornecer um BAZcomportamento BAR.jsde FOO.module.

Atualização: para estender o exposto acima para a disponibilidade de dias personalizados, basta adicionar uma função retornando verdadeiro / falso para o dia recebido pelos parâmetros.

(function ($) {
Drupal.behaviors.FOO = {
  attach: function (context) {
    for (var id in Drupal.settings.datePopup) {
      Drupal.settings.datePopup[id].settings.beforeShowDay = checkDate;
    }
  }
};

function checkDate(date) {
  if ((date.getDate() % 2) == 0) {
    return [false, 'Even days not available'];
  }
  else {
    return [true, 'Odd days are fine'];
  }
}
})(jQuery);

Você pode encontrar um exemplo mais completo no módulo Restrições de data .

jonhattan
fonte
Obrigado, Jonhattan! Eu configurei com sucesso o minDate e ele desativa todos os dias anteriores. Este é um ótimo começo para mim. Gostaria de saber se posso definir algo como um maxDate, pois quero manter apenas um intervalo de 15 dias ativado. Eu posso ver que existe um atributo 'fromTo', mas não tenho pistas sobre o que ele fará. Minha idéia é desativar todas as datas no passado (concluídas) e todas as datas no futuro (daqui a 15 dias ()). No meio, vou verificar a documentação javascript do pickeer da data para ver como desativar individualmente alguns dos dias abertos.
Marcos Buarque
1
sim, há também um MaxDate: api.jqueryui.com/datepicker/#option-maxDate
jonhattan
Obrigado, por algum motivo, quando estava pesquisando a documentação do campo date_popup, não consegui encontrar informações sobre a opção maxDate. Isso funcionou para mim e restringiu o calendário a um maxDate: '#datepicker_options' => array ('minDate' => 0, 'maxDate' => 30));
Marcos Buarque
jonhattan, lamento perguntar novamente. Estou puxando meu cabelo tentando executar uma função personalizada. Eu implementei seu modelo e funciona muito bem para mim. Mas agora eu quero executar uma função personalizada para permitir apenas datas específicas. Vejo que você sugeriu as férias como um exercício para o leitor ;-) Esse leitor é quase louco tentando resolver esse problema. Se não for um trabalho adicional enorme para você, você se importa de postar como resolver isso? Não se preocupe com detalhes, só preciso de uma ajuda geral para fazer a chamada para customFunction (date). Obrigado!
Marcos Buarque
Marcos, atualizei minha resposta com um exemplo simples do uso de uma função personalizada.
Jonhattan 18/04
0

Eu usei o módulo Data Restrictions. Isso fornece e opção para restringir a data no número de parâmetros, como data fixa, data relativa etc.

cchanana
fonte