Импорт RSS и некоторые исправления
23.09.2009В этой версии добавлен плагин простого импорта из RSS в блоголёт. Плагин устанавливается на странице плагинов, где и имеет свою страницу в админке. Файл можно загрузить через браузер, указать путь на сервере, или адрес файла в Интернете. поддерживаются gz архивы. В админке имеется дополнительные настройки плагина, а именно список пар тег = свойство записи, куда следует вставить дополнительные строки, если теги простые и не имеют вложенных тегов. Если хочется обрабатывать более сложные xml конструкции, то есть дополнительный редактор для php вставки в функцию создания поста, где можно будет обработать эти теги. Есть галочка тестирование - означает, что посты не будут добавлены, а будет произведен тестовая попытка импорта, ни одна запись не будет сохранена, и сайт останется прежним. Придумано для оценки правильности импорта и возможной коррекции импорта. Плагин пока что предназначен для выявление ошибок в нем - найдете сообщайте.
Также исправлены некоторые ошибки и недочеты, отредактирован немного фильтр контента -пока не знаю, насколько удачно или нет, скорее всего будет еще обновление фильтра контента.
Комментарии (26) на запись “Импорт RSS и некоторые исправления”
Оставить комментарий
Убрать отсюда |div.
$result = preg_replace('/\n<(a|img|div)(.*)>/im', "<br />\n<$1$2>", $result);
$result = preg_replace('/<\/(a|b|i|u|div)>\n/im', "</$1><br/>\n", $result);
Ты еще немного не понял меня про замену <p>:
$result = str_replace("\n\n", "</p>\n<p>", $result); Нужно делать вместо:
//ставятся два праграфа если небыло тегов
$result = preg_replace('/(?<!\>)\n\n(?!\s\<)/im', "</p>\n<p>",$result);
//закрывается параграф перед тегом через строку
$result = preg_replace('/(?<!\>)(\s?)?\n\n(\s\<)/im', "</p>\n<",$result);
//через строку открывается параграф после закрытия тега
$result = preg_replace('/(\>)(\s)\n\n(?!\s*\<)/im', ">\n<p>",$result);
И тогда в конце </p> ставить. return "<p>" . $result . "</p>\n";
Или оставить
//ставятся два праграфа если небыло тегов
$result = preg_replace('/(?<!\>)\n\n(?!\s\<)/im', "</p>\n<p>",$result);
//закрывается параграф перед тегом через строку
$result = preg_replace('/(?<!\>)(\s?)?\n\n(\s\<)/im', "</p>\n<",$result);
//через строку открывается параграф после закрытия тега
$result = preg_replace('/(\>)(\s)\n\n(?!\s*\<)/im', ">\n<p>",$result);
if (!preg_match('/>$/', $result)) $result = $result . "</p>\n";
return "<p>" . $result;
Тогда $result = str_replace("\n\n", "</p>\n<p>", $result); не надо.
Мысли по созданию анонса:
Сосчитать кол-во символов, которое будет после обрезки по словам.
Из исходного текста найти открывающиеся теги preg_match_all(<(a|b|div)([^>]*)>).
Если есть закрывающий тег, узнать кол-во символов в нем и прибавить для обрезки.
Если закрывающего нет, либо удалить тег либо вычесть колво его символов.
Для одиночных тегов (img|br), прибавлять кол-во символов.
Обрезать текст с тегами по полученному кол-ву символов.
Задача вполне реализуема.
Про фильтр - что то я начиаю путаться, мог бы написать полный вариант фильтра? То боюсь со строками напутаю.
Про анонс - порой кажется, что проще самому ставить тег more, и не иметь сложностей с разрывов тегов?
public function GetPostContent($content) {
$result = trim($content);
$result = self::ReplaceCode($result);
return "<p>" . $result . "</p>";
}
public function GetPostContent($content) {
$result = trim($content);
$result = self::ReplaceCode($result);
return "<p>" . $result;
}
Какой вариант лучше я не знаю, надо тестировать.
Лучше сделать второй вариант фильтра.
Моя версия чекера:
function checkAll(form)
{
if(form.elements[0].checked == true){
} else {
for (i = 1, n = form.elements.length; i < n; i++) {
if(form.elements[i].type == "checkbox") {
if(form.elements[i].checked == true)
form.elements[i].checked = false;
}
}
}
}
//-->
</script>
<input type="checkbox" name="invertcheck" onclick="checkAll(this.form);" />
Можно даже попроще
<script type="text/javascript">
<!--
function checkAll(form)
{
if(form.elements[0].checked == true){
for (i = 1, n = form.elements.length; i < n; i++) {
if(form.elements[i].type == "checkbox")
form.elements[i].checked = true;
}
} else {
for (i = 1, n = form.elements.length; i < n; i++) {
if(form.elements[i].type == "checkbox")
form.elements[i].checked = false;
}
}}
//-->
</script>
А почему никто не пишет про импортер? многие же его просили. RSS ленту нормально парсит.
Небольшая ошибочка:
<textarea name='items' cols='57ows='10'>title = title
<textarea name='extra' cols='57ows='10'></textarea ></p>
Может я чего не понимаю, для чего сделан этот импорт?
Я пытался ему подсунуть xml файл от wordpress но не видит рубрики и теги. Может я чего не так сделал?
Список поле для связывания в форме тег RSS = свойство записи: Может тут нужно добавить теги и категории? и как это сделать?
Сейчас при импорте из xml файла выдало:
Caught exception: The requested property 12 not found in class TPost
0 lib\kernel.php(30): TDataClass->Error('The requested p...')
1 lib\itemclass.php(33): TDataClass->__get('12')
2 lib\linkgenclass.php(35): TItem->__get('12')
3 lib\postsclass.php(60): TLinkGenerator->Create(Object(TPost), 'post')
4 plugins\simpleimporter\simpleimporter.php(80): TPosts->Add(Object(TPost))
5 lib\importer.php(48): TSimpleImporter->import('<?xml version="...')
6 plugins\simpleimporter\simpleimporter.php(39): TImporter->ProcessForm()
7 lib\adminplugins.php(99): TSimpleImporter->ProcessForm()
8 lib\adminplugins.php(117): TAdminPlugins->GetPluginContent('simpleimporter', 'ProcessForm')
9 lib\adminpage.php(104): TAdminPlugins->ProcessForm()
10 lib\kernel.php(810): TAdminPage->Request('simpleimporter')
11 lib\kernel.php(802): TUrlmap->PrintClassContent('TAdminPlugins', Array)
12 lib\kernel.php(697): TUrlmap->PrintContent(Array)
13 lib\kernel.php(676): TUrlmap->DoRequest('/admin/plugins/...')
14 index.php(33): TUrlmap->Request('bl2', '/admin/plugins/...')
15 {main}
Пробую под денвером 3стоит галочка:
Только протестировать импорт, без реального добавления записей
Вообще то этот плагин простого импорта из рсс, если хочется особенного - настраивай и дописывай скрипт связывания. 12 - такого свойства нет, убери мусор из таблицы полей. Метки и категории не входят в стандарт рсс, точнее входят но без разницы - все в одной куче. В поле скрипта можешьдобавить
var_dump($item);
чтобы знать в каком формате приходят данные.
С фильтром промашка вышла, ставит лишний закрывающий тег:
текст</p><br /><b>текст
На очереди еще один вариант фильтра, он же первый.
public function GetPostContent($content) {
$result = trim($content);
$result = self::ReplaceCode($result);
$result = str_replace("\r\n", "\n", $result);
$result = str_replace("\r", "\n", $result);
//послетега до конца строки удаляются пробеллы
$result = preg_replace('/\>(\s?)?\n/',">\n", $result);
$result = str_replace("\n\n", "</p>\n<p>", $result);
$result = preg_replace('/\n<(a|img)(.)>/im', "<br />\n<$1$2>", $result);
$result = preg_replace('/<img src=(.)>\n/im', "<img src=$1><br />\n", $result);
$result = preg_replace('/\n<(b|i|u)>/im', "<br />\n<$1>", $result);
$result = preg_replace('/<\/(a|b|i|u)>\n/im', "</$1><br/>\n", $result);
//переводы строки если нет в конце тегов
$result = preg_replace('/(?<!\>)\n(?!\s\<)/im', "<br />\n", $result);
return "<p>" . $result . "</p>"
Этот вариант выводит мои посты правильно.
Вот с комментариями:
public function GetPostContent($content) {
$result = trim($content);
$result = self::ReplaceCode($result);
$result = str_replace("\r\n", "\n", $result);
$result = str_replace("\r", "\n", $result);
//после тега до конца строки удаляются пробеллы
$result = preg_replace('/\>(\s?)?\n/',">\n", $result);
//ставятся параграфы вместо двух разрывов строк
$result = str_replace("\n\n", "</p>\n<p>", $result);
//замена разрывов строк на <br /> до и после тегов a|img|b|i|u
$result = preg_replace('/\n<(a|img)(.)>/im', "<br />\n<$1$2>", $result);
$result = preg_replace('/<img src=(.)>\n/im', "<img src=$1><br />\n", $result);
$result = preg_replace('/\n<(b|i|u)>/im', "<br />\n<$1>", $result);
$result = preg_replace('/<\/(a|b|i|u)>\n/im', "</$1><br/>\n", $result);
//переводы строки если нет в конце тегов
$result = preg_replace('/(?<!\>)\n(?!\s\<)/im', "<br />\n", $result);
return "<p>" . $result . "</p>";
}