Многие базовые схемы виртуальных URL-адресов могут быть достигнуты без использования RewriteRules. Apache позволяет запускать скрипты PHP без расширения .php
и с виртуальным аргументом PATH_INFO
.
AcceptPathInfo On
часто включается по умолчанию. В основном это позволяет .php
и другим URL-адресам ресурсов переносить виртуальный аргумент: http://example.com/script.php/virtual/path
Теперь этот /virtual/path
отображается в PHP как $_SERVER["PATH_INFO"]
, где вы можете обрабатывать любые дополнительные аргументы, как вам нравится. Это не так удобно, как разделить сегменты входного пути Apache на $1
, $2
, $3
и передать их как различные переменные $_GET
в PHP. .php
.php
«Расширения файлов» в URL-адресах разрешены: Options +MultiViews
Это означает, что Apache выбирает article.php
для HTTP-запросов на /article
из-за соответствующего базового имени. И это хорошо работает вместе с вышеупомянутой функцией PATH_INFO. Таким образом, вы можете просто использовать URL-адреса, такие как http://example.com/article/virtual/title
. Это имеет смысл, если у вас есть традиционное веб-приложение с несколькими точками / сценариями PHP-скриптов. Обратите внимание, что MultiViews имеет другую / более широкую цель. Это повлечет за собой незначительное исполнение, потому что Apache всегда ищет другие файлы с соответствующими базовыми именами. Это фактически означает Content-Negotiation , поэтому браузеры получают лучшую альтернативу доступным ресурсам (например, article.en.php
, article.fr.php
, article.jp.mp4
). .php
.php
в URL-адресах, - это настройка обработчика PHP для других файловых схем. Самый простой вариант - переопределить тип MIME / обработчика по умолчанию с помощью .htaccess
: DefaultType application/x-httpd-php
Таким образом, вы можете просто переименовать свой скрипт article.php
только в article
(без расширения), но все же обработать его как PHP-скрипт. Теперь это может иметь некоторые последствия для безопасности и производительности, поскольку теперь все файлы без расширения будут переданы через PHP. Поэтому вы можете альтернативно установить это поведение только для отдельных файлов:
SetHandler application/x-httpd-php
# or SetType
Это несколько зависит от настройки вашего сервера и используемого PHP SAPI. Общие альтернативы включают ForceType application/x-httpd-php
или AddHandler php5-script
. Снова обратите внимание, что такие настройки распространяются от одного .htaccess
до подпапок. Вы всегда должны отключать выполнение сценария (SetHandler None
и Options -Exec
или php_flag engine off
и т. Д.) Для статических ресурсов и загрузки / каталогов и т. Д. mod_alias
, которые иногда работают так же хорошо, как и mod_rewrite
s RewriteRules. Обратите внимание, что большинство из них должны быть настроены в разделе
, но не в файлах конфигурации .htaccess
для каждого каталога. ScriptAliasMatch
в первую очередь предназначен для скриптов CGI, но также должен работать для PHP. Он позволяет регулярные выражения так же, как и любые RewriteRule
. На самом деле это, пожалуй, самый надежный вариант для конфигурирования переднего контроллера. И простой Alias
помогает с несколькими простыми схемами перезаписи. Даже простая директива ErrorDocument
может использоваться, чтобы позволить скрипту PHP обрабатывать виртуальные пути. Обратите внимание, что это обходное решение kludgy, однако, запрещает все, кроме запросов GET, и наводняет error.log по определению. См. http://httpd.apache.org/docs/2.2/urlmapping.html для получения дополнительных советов. Предполагая, что у вас есть mm / dd / yyyy mask, , как в демо , вы можете сделать так:
UPD2. Использование API Datepicker
function ChangeMonth(month)
{
var initialVal = $('#datepicker').datepicker('getDate')
curMonth = date.getMonth(),
if(month > 0 && curMonth < 12){
initialVal.setMonth(curMonth + 1)
}
if(month < 0 && curMonth > 1) {
initialVal.setMonth(curMonth - 1)
}
$('#datepicker').datepicker('setDate', initialVal);
}
Вызывающие ChangeMonth(1)
или ChangeMonth(-1)
должны изменить дату в вашем поле datapicker.
UPD1. Если вы используете встроенную версию
Вы можете просто щелкнуть кнопками с событием jQuery click:
$('#datepicker .ui-datepicker-prev').click() // month back
$('#datepicker .ui-datepicker-next').click() //month forward
Чтобы установить месяц выбора даты, используйте следующий код:
var date = $("#datepicker").datepicker( 'getDate' );
date.setMonth(month);
$("#datepicker").datepicker("setDate", date);
JSFIDDLE https://jsfiddle.net/seadonk/uh9g9sn4/ Это пример как установить месяц, уменьшить месяц или увеличить месяц выбора даты.
JQUERY
$().ready(function(){
$("#SetMonth").click(function(){SetMonth(parseInt($('#month').val())-1);});
$("#NextMonth").click(function(){NextMonth();});
$("#PrevMonth").click(function(){PrevMonth();});
$("#datepicker").datepicker();
$("#datepicker").datepicker("setDate",new Date());
});
function SetMonth(month)
{
var date = $("#datepicker").datepicker( 'getDate' );
date.setMonth(month);
$("#datepicker").datepicker("setDate", date);
}
function NextMonth()
{
var date = $("#datepicker").datepicker( 'getDate' );
date.setMonth(date.getMonth() + 1);
$("#datepicker").datepicker("setDate", date);
}
function PrevMonth(month)
{
var date = $("#datepicker").datepicker( 'getDate' );
date.setMonth(date.getMonth() - 1);
$("#datepicker").datepicker("setDate", date);
}
HTML
<input type="button" id="SetMonth" value="Set Month" />
<input type="text" id="month" value = "1"/><br /><br />
<input type="button" id="PrevMonth" value="Prev Month" />
<div id="datepicker"></div>
<input type="button" id="NextMonth" value="Next Month" />
Факты:
$("#datepicker").datepicker("setDate", date)
следует использовать для установки «выбранная дата». В качестве побочного эффекта он также изменит «месяц показа». но использовать его только для установки «месяца показа» не является хорошей практикой. $('#datepicker .ui-datepicker-prev').click()
и $('#datepicker
.ui-datepicker-next').click()
следует использовать для установки «месяца показа» и у него нет побочных эффектов. Но имейте это в виду, это медленно, если вы установите «показательные месяцы» на несколько лет. Исходя из фактов, вот решение:
var currentDate = new Date ();
var currentMonth = new Date (currentDate.getFullYear(), currentDate.getMonth(), 1);
//Keep currentMonth sync with "display month"
$("#datepicker").datepicker({
onChangeMonthYear: function (year, month, inst) {
currentMonth = new Date(year, month - 1, 1);
//JavaScript used 0...11 for months. Jquery UI used 1...12 for months.
},
});
function ChangeMonth(month)
{
while (currentMonth < month) {
$('#datepicker .ui-datepicker-next').click();
};
while (currentMonth > month) {
$('#datepicker .ui-datepicker-prev').click();
};
};