Как постить из php в блоголёте
18.08.2009Меня спрашивают - как программно из php постить в блоголёте. Это просто. Для начала - в блоголёте почти все - это объекты и их свойства, и дело нужно иметь с ними. Первое - создание новой записи
$post = new TPost(); //создаю новый обект для нового поста
$post->title = 'какой нибудь заголовок';
$post->content = 'Какой то текст поста, он будет приведен к html, и из него будут заполнены другие свойства, такие как description, moretitle, excerpt...';
$post->tagnames = 'метка первая, метка вторая';
$post->catnames = 'Новости, Запись'; //рубрики будут созданы, если их еще не было
// и остальные поля
//далее надо добавить новый пост к другим записям
$posts= TPosts::Instance();
$posts->Add($post)
//это все - пост добавлен;
Если хочется отредактировать существующий пост, то это следует делать следующим образом:
$id = 1;//необходимо знать id поста для редактирования
$post = TPost::Instance($id); //получаем обект с полным содержанием поста
$post->title = 'Новый заголовок';
// .. меняем другие свойства
$posts = TPosts::Instance();
$posts->Edit($post); //сохранить сделанные изменения
Сохранять можно также и прямым путем, через метод Save(), но я не рекомендую его использовать, если вы только начинаете изучать блоголёт, так как этот метод сохранить изменения в записи, но без изменений в всем остальном, в том числе без цепочки событий настроенных на редактирование записи.
Также следует рассказать, как добавить новый коммент. Вообще же говоря все примеры можно найти в installerclass.php - там по умолчанию создаются пост, меню, комментарий. И так комментарий:
$post = TPost::Instance($id); //надо знать id записи, куда добавлять комментарий
//вначале надо задать автора
$users = TCommentUsers::Instance();
$userid = $users->Add('Имя комментатора', 'email@domain.com', 'http://litepublisher.com/');
<pre><code>$CommentManager = &TCommentManager::Instance();
$CommentManager->AddToPost($post, $userid,'текс комментария');
Сейчас вот написал пример и призадумался - что то как то слишком сложно, сейчас объеденю все это в одну функцию для TCommentManager - в следующей версии уже будет, а назову как я новый метод Add. Чтобы редактировать комментарий, необходимо знать, что редактируется: собственно текст комментария, или информация об авторе. Если автор - то для этого есть класс TCommentUsers, с которым необходимо работать. Если текст комментария, то для этого надо знать id комментария. Вот пример редакции:
$comment = TComments::GetComment($postid, $id);
//альтернативный способ:
//$CommentManager = TCommentManager::Instance();
//$comment = $CommentManager->Getcomment($id);
//независимо от спсоба мы имеем комментарий, с которым можно делать желаемое
$comment->content = 'Новый текст комментария';
$comment->Save(); //не забыть после этого очистить кеш, чтобы результат был виден
Класс TComment предназначен прежде всего для получения информации о комментарии, например для вывода списка, где удобно управлять при помощи этого класса. Если же требуется массовое редактирование комментариев, то для этого есть класс TComments, чтобы получить комментарии для записи, следует написать одну строку:
$comments = $post->comments; //где $post уже ранее был создан
Комментарии (48) на запись “Как постить из php в блоголёте”
Оставить комментарий
Сейчас можно без проблем:
$post->url = '/my-url.html';
Генерируется урл в случае его отсутствия, если редактируешь, и урл у поста будет изменен, то адрес записи тоже поменяется, а со старого адреса будет сделан редирект на новый адрес.
Отложенные из php-скрипта работают.
Не по теме, но атуально:
Сейчас обновил Блоголет с версии 2.49 руганулся вот так:
Caught exception: Unknown property basename in class TTemplate
trace error
0 lib/kernel.php(335): TDataClass->Error('Unknown propert...')
1 lib/include/update251.php(14): TEventClass->__set('basename', 'template.pda')
2 lib/updater.php(40): Update251()
3 lib/updater.php(59): TUpdater->Update()
4 lib/adminservice.php(96): TUpdater->AutoUpdate()
5 lib/adminpage.php(104): TAdminService->ProcessForm()
6 lib/kernel.php(745): TAdminPage->Request(NULL)
7 lib/kernel.php(737): TUrlmap->PrintClassContent('TAdminService', Array)
8 lib/kernel.php(659): TUrlmap->PrintContent(Array)
9 lib/kernel.php(636): TUrlmap->DoRequest('/admin/service/')
10 index.php(33): TUrlmap->Request('dvizok-cms.pp.r...', '/admin/service/')
11 {main}
(у себя я восстановил старую из бекапа, а это для коррекции)
Небольшой обзор блог-клиентов:
post2blog
тип блога: Wordpress
предидущие посты не грузятся
ошибка:
Query failed or login/password are wrong for "site"
please veryfy yuor login and password
"Tstruct.GetString(userid)-item is not a string"
Response is: <xml version="1.0"?>
<methodResponse>
<params>
</params>
</methodResponse>
Загружается название блога, категорий нет.
Изменение типа блога ничего не дает.
При попытке запостить:
20.08.2009 19:48:58 : Starting (Post will be posted and then PUBLISHED)...
20.08.2009 19:48:58 : Server-side pinging control=False
20.08.2009 19:48:58 : Indexing images and files to upload...
20.08.2009 19:48:58 : 0 images/files to upload
20.08.2009 19:48:58 : Loading account info
20.08.2009 19:48:58 : Preparing post content...
20.08.2009 19:48:58 : Posting new post...
20.08.2009 19:48:58 : ERROR occured while posting: No argument for format '%s'
Запись добавляется, но без категории т.к. их нет.
Zounri Raven
тип блога: Wordpress
не загружает посты, вместо них грузит страницы меню
нет категорий
не публикует новые посты
тип блога: Custom Metaweblog
предидущие посты не грузятся
есть категории
можно постить!
w.bloggar
все работает
На очереди Thingamablog, Blog Desk, Bleezer.
Мне же от блог-клиента нужно чтобы он грузил картинки не в одну папку, а создавал вложенные папки, например год/месяц/.
Это умеет делать post2blog, но он не присваивает категорию для записи :(
Можете что-нибудь посоветовать?
С кодировками все ок: в серверном заголовке и в html стоит utf-8, так что все браузеры обязаны однозначно определять кодировку, да и у меня не было еще жалоб на кодировку, и на мобильниках все работает отлично.
По поводу блогклиентов написал в личку - буду разбираться
Спасибо за интересный отчет по блогклиентам - завтра посмотрю где какие есть в блоголёте ошибки, чтобы
их устранить.
Принципиальных ограничений на подпапки для файлов в блоголёте нет, но это
пока не реализовано, точнее мне надо посмотреть можно ли делать подпапки и
как, ведь вопрос стоит не только о создании подпапок, а также и об едином
управлении файлами, а имено переименование, удаление, уникальность имени
файла. А почему именно такая потребность во вложенных папках?
Thingamablog, Blog Desk, Bleezer тоже не работают, но они не дотягивают до функционала предыдущих трех, так что их можно в расчет не брать.
Частично нашел решение для post2blog:
Поставить кавычки в xmlrpc-metaweblogclass.php
private function GetStruct(&$Item) {
global $Options;
return array(
'dateCreated' => new IXR_Date($Item->date),
'userid' => '1',
'postid' => '\'' . $Item->id . '\'',
'description' => '\'' . $Item->rawcontent . '\'',
'title' => '\'' . $Item->title . '\'',
'link' => '\'' . $Options->url . $Item->url . '\'',
'permaLink' => '\'' . $Options->url . $Item->url . '\'',
Остается такая ошибка:
Unable to select categories for selected post update categories for blog.
если поставить 'categories' => '\'' . $Item->catnames . '\'',
то такая:
Tstruct.GetArray(categories)-item is not inarray
видимо нужно отправлять каждую категорию в кавычках, но я не знаю как это сделать
при попытке опубликовать:
ERROR occured while posting: No argument for format '%s'
после изменений w.bloggar перестает работать.
Мне нужно добалять 5-8 картинок в каждый пост, причем еще на сервере создаются версии с водяными знаками, так что количество увеличивается вдвое. Вложенные папки нужны для более удобного управления изображениями.
Можно сделать чтобы картинки грузились в подпапки без возможности управлять ими (управлять по ftp), а остальные появлялись в админке. Не знаю еще кому-нибудь это нужно или нет. Так что лучше поскорее добавить поддержку post2blog.
В xmlrpc-metaweblogclass.php:
private function GetStruct(&$Item) {
global $Options;
return array(
'dateCreated' => new IXR_Date($Item->date),
'userid' => '1',
'postid' => '$Item->id',
можно редактировать предыдущие записи, если поставитьпоставить тип блога MetaWeblog API enabled, если Wordpress, то грузит только названия постов, а потом ошибка загрузки категорий.
Изменение public function getCategories(&$args) не помогает.
sartas: мог бы ты проделать еще раз все тесты, но только со включенным режимом отладки, когда будет писатться лог в папку data/domain/log.txt - который потом мне выслать? Отладка в блоголёте включается строкой
define('debug', '');
в корневом файле index.php, либо надо поправить файл xmlrpcclass.php две строки:
заменить на
TFiler::log("request:\n" .
и вторая строка
if (defined('debug')) TFiler::log("responnse:\n".$Result);
заменить на
TFiler::log("responnse:\n".$Result);
тогда можно обойтись без define в корневом файле (debug влияет еще и на почту - письма будут не отправляться, а сохраняться в файл). Также для тестов можешь посмотреть мой старый блогклиент на
http://blogclient.ru/
с блоголётом работает нормально. После анализа логов (там будет пароль, если тестируешь на живом блоге), я смогу сказать что то более определенное о проблемах xmlrpc. А кстати говоря - почему в списке клиентов нет LiveWriter?
Социальный блог клиент
Достоинства:
Получение записей
Получение категорий
Создание категорий
Управление большим количеством блогов
Недостатки:
Нельзя навесить свои html теги на горячие клавиши.
Чтобы загрузить второй файл нужно удалить имя предыдущего загруженного файла.
Нет настройки прокси сервера.
Нет выбора типа блога (я например не знаю как подключить blogspot.com)
При попытке зайти в свойства аккаунта и при отправке сообщения начинается установка MS Office 2007 (у меня он некорректно удален, точнее я просто удалил папку с офисом:), затем ошибка программы.
Сама программа выглядит так как будто она была написана еще в прошлом веке. Стоило хотябы сделать приятные значки и нормальные подписи к ним.
Вот http://packages.debian.org/squeeze/oxygen-icon-theme
Лицензия GPL, правда не помню какие там иконки. Посмотри еще тут
http://packages.debian.org/search?keywords=icon+kde&searchon=all&suite=testing§ion=all
http://kde-look.org/index.php?xcontentmode=22x27
Программы же в Линуксе нормально выгледят и идут под лицензией GPL.
А вообще надо спросить на форуме линуксоидов.
Все очень просто, во первых подключить блоголёт две строки:
$mode = 'external';
include('index.php');
это все - блоголёт подключен, дальше делай что хочется. Например добавить новый пост:
$post = new TPost();
$post->title = 'заголовок';
$post->content = 'какой то текст поста';
$posts = TPosts::Instance();
$posts->Add($post);
все - новый пост создан и добавлен - больше ничего не надо.
Что бы потом на хостинг - инсталл - и у меня установленный блоголет уже со всеми созданными мной постами...
$Options->url = 'http://newdomain.ru';
Пытаюсь постить удаленно, пока на локальном сервере.
Файл постера находится на другом домене, а сам движок на другом.
При подключении include($pathblogolet.'/index.php'); выдает форму установки блоголета.
Как правильно постить с другого хоста?
Для начала надо жестко прописать имя домена в корневом index.php
$domain = 'example.ru';
подключать движок следует так
$mode = 'external'; //не имеет значение, лишь бы было определено
include('index.php');
тогда движок не будет обраббатывать текущий урл, а всего лишь загрузится ядро. Далее можно делатьвсе что угодно
почему не работает? Версия 3.70
прописал
$mode = 'external';
include('index.php');
в начале скрипта-постера, теперь просто пишет "Не найдено"
Этот скрипт относится (и был написан) для старой версии (линейка 2.xx), и в новой версии не будет работать
Для новой версии необходимо все имена привести к нижнему регистру, то есть
$post = new tpost();
$posts = tposts::instance();
$posts->add($post);
движок подключается другим способом:
define('litepublisher_mode', 'externl');
include('index.php');
тоже касается и остальных имен класов и методов
<?php
define('litepublisher_mode', 'externl');
include('index.php');
$post = new tpost(); //создаю новый обект для нового поста
$post->title = 'какой нибудь заголовок';
$post->content = 'Какой то текст поста, он будет приведен к html, и из него будут заполнены другие свойства, такие как description, moretitle, excerpt...';
$post->tagnames = 'метка первая, метка вторая';
$post->catnames = 'Новости, Запись'; //рубрики будут созданы, если их еще не было
// и остальные поля
//далее надо добавить новый пост к другим записям
$posts = tpost::instance();
$posts->add($post);
?>
вот мой код
Надо быть внимательным, ошибка
$posts = tpost::instance();
надо
$posts = tposts::instance();
$post = new tpost();
$post->title = $title;
$post->content = $content;
$post->tagnames = $tagnames;
$post->catnames = $catnames;
$posts = tposts::instance();
$posts->add($tpost);
Хотя не думаю, что дело в автопостинге. При постинге руками <title></title> тоже нет...
Если привел точный код, то
$posts->add($tpost);
переменная $tpost выше отсутствует - должно было бытьисключение в php. Где title напримери добавь с пробеллами : чтобы точно знать еесть ли ошибка в пустом заголовке
Я устанавливал блоголет автоматом. Вот так:
?lang=en&email=mymail%mail.ru&name=Myname&Mydescription=description&checkrewrite=0&mode=1&dbversion=0
может в этом проблема?