Архив за месяц: Июнь 2013

ЧПУ для сайта php+mysql часть 1

Копирование полей в базе mysql

Для реализации мне потребовалось создать в базе поле titleEn c английским вариантом русского заголовка страницы title.

в phpmyadmin создаем новое поле titleEn в нужной таблице.

И копируем туда данные из русской версии заголовков:

1
UPDATE `table_name` SET `titleEn`=`title`
UPDATE `table_name` SET `titleEn`=`title`

 Транслитерация заголовков в базе

Для перевода используем простую функцию

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function translitIt($str){
$tr = array(
"А"=>"a","Б"=>"b","В"=>"v","Г"=>"g","Д"=>"d",
"Е"=>"e","Ё"=>"yo","Ж"=>"j","З"=>"z","И"=>"i",
"Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
"О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
"У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"c","Ч"=>"ch",
"Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
"Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"yo","ж"=>"j",
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
"ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
"ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
" "=> "-", "."=> "", "/"=> "-"
);
return strtr($str,$tr);
}
function translitIt($str){
$tr = array(
"А"=>"a","Б"=>"b","В"=>"v","Г"=>"g","Д"=>"d",
"Е"=>"e","Ё"=>"yo","Ж"=>"j","З"=>"z","И"=>"i",
"Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
"О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
"У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"c","Ч"=>"ch",
"Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
"Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ё"=>"yo","ж"=>"j",
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
"ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
"ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
" "=> "-", "."=> "", "/"=> "-"
);
return strtr($str,$tr);
}

После чего убираем лишние символы

1
2
$fl = translitIt($fl);
$fl = preg_replace('/[^A-Za-z0-9_\-]/', '', $fl);}
$fl = translitIt($fl);
$fl = preg_replace('/[^A-Za-z0-9_\-]/', '', $fl);}

Заголовок получает вид: kak-propisat-klyuch-v-standartnoy-signalizacii из исходного Как прописать ключ в стандартной сигнализации

Автоматизируем процесс

Можно создать скрипт, для автоматической замены всего поля таблицы на транслит

Полезные для этого дела запросы к базе:

Вывод всех таблиц в базе database_name

1
$sql = "SHOW TABLES FROM database_name";
$sql = "SHOW TABLES FROM database_name";

Вывод всех полей в таблице table_name

1
$sql = "SHOW COLUMNS FROM `{table_name}`";
$sql = "SHOW COLUMNS FROM `{table_name}`";

и соответственно запись новых значений в поля базы
Обновление в таблице
table_name установить значение поля field равным fieldvalue где значение поля field равно fieldrus(то есть старому значению)

1
$editfl = mysql_query ("UPDATE table_name SET field='fieldvalue' WHERE field='fieldrus'");
$editfl = mysql_query ("UPDATE table_name SET field='fieldvalue' WHERE field='fieldrus'");

Далее

Теперь мы имеем валидный адрес для каждой страницы сайта, к которому мы можем обращатся через базу и настроить красивые url’ы через rewrite_modeule apache. to be continued…

 

Информер погоды через openweathermap.org

Наткнулся на набор бесплатных картинок с погодными условиями. Пришла в голову мысль сделать информер погоды со своими иконками погоды. С яндексом подружить не удалось, но попался сайт http://openweathermap.org/. Есть открытый API, многое правда самому пришлось додумывать)

Узнаем id нужного города, получаем xml файл с погодой,  закидываем данные в массив, раскладываем данные по переменным.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
$city2_id=524901; // id города openweather.org
$data_file2="http://api.openweathermap.org/data/2.5/weather?id=$city2_id&mode=xml&lang=ru&units=metric"; // адрес xml файла
$data_file2 = file_get_contents($data_file2,0); //получаем данные о погоде из xml файла
$xml2 = new SimplexmlElement($data_file2); //помещаем данные в массив
$city2= $xml2->city[name];//забиваем необходимые данные в переменные
$temperarure = $xml2->temperature[value];
$weather_id = $xml2->weather[number];
$weather_icon = $xml2->weather[icon];
$weather_type = $xml2->weather[value];
$pressure = $xml2->pressure[value];
$humidity = $xml2->humidity[value];
$sunrise = $xml2->city->sun[rise];
$sunset = $xml2->city->sun[set];
$windspeed = $xml2->wind->speed[value];
$windcode = $xml2->wind->direction[code];
?>
<?
$city2_id=524901; // id города openweather.org
$data_file2="http://api.openweathermap.org/data/2.5/weather?id=$city2_id&mode=xml&lang=ru&units=metric"; // адрес xml файла
$data_file2 = file_get_contents($data_file2,0); //получаем данные о погоде из xml файла
$xml2 = new SimplexmlElement($data_file2); //помещаем данные в массив
$city2= $xml2->city[name];//забиваем необходимые данные в переменные
$temperarure = $xml2->temperature[value];
$weather_id = $xml2->weather[number];
$weather_icon = $xml2->weather[icon];
$weather_type = $xml2->weather[value];
$pressure = $xml2->pressure[value];
$humidity = $xml2->humidity[value];
$sunrise = $xml2->city->sun[rise];
$sunset = $xml2->city->sun[set];
$windspeed = $xml2->wind->speed[value];
$windcode = $xml2->wind->direction;
?>

Выполняем нужные преобразования  с данными,

1
2
3
4
5
6
7
8
<?
if ($temperarure>0) {$temperarure='+'.$temperarure;}// Если значение температуры положительно, для наглядности добавляем "+"
$pressure = $pressure * 0.75006375541921; //переводим из hPa в mmHg
$pressure = round($pressure); //округляем
$temperarure = round($temperarure);
$sunrise = date('H:i',strtotime("+4 hours", strtotime($sunrise)));//меняем формат даты и прибавляем 4 часа
$sunset = date('H:i',strtotime("+4 hours", strtotime($sunset)));
?>
<?
if ($temperarure>0) {$temperarure='+'.$temperarure;}// Если значение температуры положительно, для наглядности добавляем "+"
$pressure = $pressure * 0.75006375541921; //переводим из hPa в mmHg
$pressure = round($pressure); //округляем
$temperarure = round($temperarure);
$sunrise = date('H:i',strtotime("+4 hours", strtotime($sunrise)));//меняем формат даты и прибавляем 4 часа
$sunset = date('H:i',strtotime("+4 hours", strtotime($sunset)));
?>

Формируем вывод и выводим все это дело

1
2
3
4
5
6
<?
$title = "Город: ".$city2."\n".
$weather_type." \nДавление: ".$pressure." мм рт. ст.\nВетер: ".$wind[trim ($windcode)].", ".$windspeed." м/с \nВлажность: ".$humidity."% \nВосход: ".$sunrise."\nЗакат: ".$sunset;//формируем данные для вывода в title картинки
echo ("<img src=\"/blocks/weather/images/$weather_icon.png\" alt=\"$weather_type\" title=\"$title\" >"); //путь к кртинкам должен быть абсолютным
echo ("$temperarure<sup>o</sup>C<br>");//выводим все безобразие
?>
<?
$title = "Город: ".$city2."\n".
$weather_type." \nДавление: ".$pressure." мм рт. ст.\nВетер: ".$wind[trim ($windcode)].", ".$windspeed." м/с \nВлажность: ".$humidity."% \nВосход: ".$sunrise."\nЗакат: ".$sunset;//формируем данные для вывода в title картинки
echo ("<img src=\"/blocks/weather/images/$weather_icon.png\" alt=\"$weather_type\" title=\"$title\" >"); //путь к кртинкам должен быть абсолютным
echo ("$temperarure<sup>o</sup>C<br>");//выводим все безобразие
?>

Стандартные картинки подменяем своим, не меняя имени.

13d 11d 10n 10d 09n 09d04n 04d 03n 03d 02n 02d 01n 01d

У меня получилось вот так:

1
http://web.scgarage.ru/blocks/weather/index.php
http://web.scgarage.ru/blocks/weather/index.php

При наведении на иконку, отображается дополнительная информация.