Всем привет!
Тут возникла необходимость написать простенький клиент для блога, работающего на WordPress для андроида. Функционал пока что крайне не велик — просматривать содержимое статей с определенного web-сайта. Задача, как оказалось, вполне тривиальна и подходит для начинающих кодеров вроде нас.
Попутно мы разберемся со следующими вещами:
1) Как подключаться к SQLite базе данных под Android.
2) Как закачать файл с удаленного сервера
3) Как пользоваться компонентом WebView
4) Как работает класс AsyncTask
5) Как в простейшем виде использовать SaxParser
6) Дополнительно, вероятно, узнаем что я ничего не смыслю в php 🙂
ну может что-то еще, счас не помню, но по ходу написания статьи мы этот вопрос решим 🙂
Итак, приступаем!
И первое с чего мы начнем — реализуем серверную часть. Проще говоря добавим свой собственный php файлик на сайт с блогом WordPress 🙂 . Файлик примерно такого содержания:
<?php // Для корректной работы скрипта необходим файл // wp-config.php в котором храняться настройки // подключения к базе денных include 'wp-config.php'; // Функция возвращает первые $count слов из строки $str, // объединенные в одну строку с пробелами. за разделитель // слов считаем пробел 🙂 function getWords($str, $count) { $i = 0; $res = ""; $words = explode(" ", $str, $count + 1); for ($i = 0; $i < count($words) && $i < $count; $i++) { $res = $res . ' ' . $words[$i]; } return $res; } // Функция выводит пост из базы данных по его id // вообще ничего сложного в ней нет 🙂 function printPostByID($id) { // Здесь коннектимся к бд wordpress'a $db_name = DB_NAME; $db_user = DB_USER; $db_password = DB_PASSWORD; $db_host = 'localhost'; $db = mysql_connect($db_host, $db_user, $db_password); mysql_select_db($db_name, $db); // здесь готовим и посылаем запрос к бд $query = "SELECT `post_content` FROM `wp_zabposts` WHERE (`id`=$id)"; $res = mysql_query($query); if ($res) { // ну и соответственно выводим html с результатом ?> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <?php $arr = mysql_fetch_array($res); print($arr['post_content']); ?> </body> </html> <?php } } // Возвращает xml файл содержащий заголовоки и информацию // Обо всех постах на сайте начиная с даты $startDate // при этом в переменной $type должно быть значение "headers" function get_data($type, $startDate) { // Здесь коннектимся к бд wordpress'a $db_name = DB_NAME; $db_user = DB_USER; $db_password = DB_PASSWORD; $db_host = 'localhost'; $db = mysql_connect($db_host, $db_user, $db_password); mysql_select_db($db_name, $db); // здесь готовим и посылаем запрос к бд $query = "SELECT `post_content`, `post_title`, `post_date`, `ID`, `guid` FROM `wp_zabposts` WHERE (`post_status`='publish' AND `post_type`='post' AND `post_date`>'" . $startDate . "') ORDER BY `post_date` DESC"; $res = mysql_query($query); // А здесь выводим результат в xml файл 🙂 if ($res) { print '<?xml version="1.0" encoding="utf-8"?>' . "\n"; print '<update>'; for ($i = 0; $i < mysql_num_rows($res); $i++) { $arr = mysql_fetch_array($res); $post_name = $arr['post_title']; if ($type == 'headers') { print "<header title='" . $post_name . '\' date=\'' . $arr['post_date'] . '\' content=\'' . str_replace("\r\n", '', str_replace("\n", '', str_replace(" ", "", getWords(strip_tags($arr['post_content']), 20)))) . '\' id=\'' . $arr['ID'] . '\' guid=\'' . $arr['guid'] . '\'></header>' . "\n"; } } print "</update>"; } else print $res . 'вот так'; mysql_close($db); } // Собственно тут мы проверяем что у нас попросили // и запускаем ту или иную функцию if ($_GET['type'] != null || $_GET['date'] != null) { get_data($_GET['type'], $_GET['date'] != null); } else { if ($_GET['id']) { printPostByID($_GET['id']); } } ?>
Я вообще не мастак в php, поэтому если встретите страшные ошибки сразу пишите об этом в комментах и очень сильно не пинайте 🙂
Эта штука должна лежать там же где у Вас на сервере лежит файлик
wp-config.php
Именно в этом файлике wordpress хранит настройки подключения к базе данных, такие как логин, пароль и название базы данных. Мы будем использовать их, чтобы подключаться к базе блога напрямую и запрашивать там контент, который нас интересует. Собственно процесс подключения с комментариями описан в коде. Условимся на том, что в зависимости от передаваемых ему через метод GET параметров он вернет нам либо голый html с содержимым статьи, либо xml код вот такого вида:
<?xml version="1.0" encoding="utf-8"?> <update><header title='Название статьи 1' date='2012-05-05 13:20:05' content=' первые 20 слов статьи 1' id='701' guid='http://адрес_статьи1.в_сети'></header> <header title='Название статьи 2' date='2012-05-05 13:20:05' content=' первые 20 слов статьи 2' id='701' guid='http://адрес_статьи2.в_сети'></header> <header title='Название статьи 3' date='2012-05-05 13:20:05' content=' первые 20 слов статьи 3' id='701' guid='http://адрес_статьи3.в_сети'></header> </update>
Отлично. Теперь у нас есть какая-никакая серверная часть, с которой мы с Вами можем взаимодействовать из нашей программы.
Ну а на сегодня думаю хватит, к тому же я очень хочу получить фидбек по поводу того как сделать лучше то что я написал наверху 🙂 Я буду оооочень признателен тем, кто знает как сделать это правильно на php 🙂 Пожалуйста прокомментируйте и ждите на днях второй статьи
upd: А вот и она 🙂
А кроме SQLite что-то работает с Android?
Честно говоря не знаю
Все ошибки не буду говорить, но то что я заметил, все таки напишу:)
<?php
// Для корректной работы скрипта необходим файл
// wp-config.php в котором храняться настройки
// подключения к базе денных
include 'wp-config.php';
// Функция возвращает первые $count слов из строки $str,
// объединенные в одну строку с пробелами. за разделитель
// слов считаем пробел
function getWords($str, $count) {
$i = 0;
$res = «»;
$words = explode(» «, $str, $count + 1);
for ($i = 0; $i < count($words) && $i < $count; $i++) {
$res = $res . ' ' . $words[$i];
}
return $res;
}
// Функция выводит пост из базы данных по его id
// вообще ничего сложного в ней нет
function printPostByID($id) {
// Здесь коннектимся к бд wordpress’a
$db_name = DB_NAME;
$db_user = DB_USER;
$db_password = DB_PASSWORD;
$db_host = ‘localhost’;
$db = mysql_connect($db_host, $db_user, $db_password);
mysql_select_db($db_name, $db);
// здесь готовим и посылаем запрос к бд
$query = «SELECT `post_content` FROM `wp_zabposts` WHERE `id`= ‘$id'»; //здесь была ошибка
$res = mysql_query($query);
if ($res) {
// ну и соответственно выводим html с результатом
?>
‘$startDate’
ORDER BY `post_date` DESC»;
$res = mysql_query($query);
// А здесь выводим результат в xml файл
if ($res) {
print ‘ \n’;
print »;
for ($i = 0; $i < mysql_num_rows($res); $i++) {
$arr = mysql_fetch_array($res);
$post_name = $arr['post_title'];
if ($type == 'headers') {
print " \n»;
}
}
print «»;
}
else
print $res . ‘вот так’;
mysql_close($db);
}
// Собственно тут мы проверяем что у нас попросили
// и запускаем ту или иную функцию
if ($_GET[‘type’] != null || $_GET[‘date’] != null) {
get_data($_GET[‘type’], $_GET[‘date’] != null);
} else {
if ($_GET[‘id’]) {
printPostByID($_GET[‘id’]);
}
}
?>
я в php почти профи, но некоторого у тебя я вообще не понимаю, ну а так, для тех кто php знает, статья полезная:)