Во второй части мы рассмотрим вариант парсинга контента по ключевым словам и автоматическим добавлением контента с определённым контекстом.
MODX Revo - это фреймворк, который всё сохраняет в базе и берёт из базы данных через xPDO, который в свою очередь получает значения в json. Нам нужно будет контент загружать в базу данных MySQL.
Контент загружается в таблицу modx_site_content, которая имеет вот такую структуру:
CREATE TABLE IF NOT EXISTS `modx_site_content` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(20) NOT NULL DEFAULT 'document',
`contentType` varchar(50) NOT NULL DEFAULT 'text/html',
`pagetitle` varchar(255) NOT NULL DEFAULT '',
`longtitle` varchar(255) NOT NULL DEFAULT '',
`description` varchar(255) NOT NULL DEFAULT '',
`alias` varchar(255) DEFAULT '',
`link_attributes` varchar(255) NOT NULL DEFAULT '',
`published` tinyint(1) unsigned NOT NULL DEFAULT '0',
`pub_date` int(20) NOT NULL DEFAULT '0',
`unpub_date` int(20) NOT NULL DEFAULT '0',
`parent` int(10) NOT NULL DEFAULT '0',
`isfolder` tinyint(1) unsigned NOT NULL DEFAULT '0',
`introtext` text,
`content` mediumtext,
`richtext` tinyint(1) unsigned NOT NULL DEFAULT '1',
`template` int(10) NOT NULL DEFAULT '0',
`menuindex` int(10) NOT NULL DEFAULT '0',
`searchable` tinyint(1) unsigned NOT NULL DEFAULT '1',
`cacheable` tinyint(1) unsigned NOT NULL DEFAULT '1',
`createdby` int(10) NOT NULL DEFAULT '0',
`createdon` int(20) NOT NULL DEFAULT '0',
`editedby` int(10) NOT NULL DEFAULT '0',
`editedon` int(20) NOT NULL DEFAULT '0',
`deleted` tinyint(1) unsigned NOT NULL DEFAULT '0',
`deletedon` int(20) NOT NULL DEFAULT '0',
`deletedby` int(10) NOT NULL DEFAULT '0',
`publishedon` int(20) NOT NULL DEFAULT '0',
`publishedby` int(10) NOT NULL DEFAULT '0',
`menutitle` varchar(255) NOT NULL DEFAULT '',
`donthit` tinyint(1) unsigned NOT NULL DEFAULT '0',
`privateweb` tinyint(1) unsigned NOT NULL DEFAULT '0',
`privatemgr` tinyint(1) unsigned NOT NULL DEFAULT '0',
`content_dispo` tinyint(1) NOT NULL DEFAULT '0',
`hidemenu` tinyint(1) unsigned NOT NULL DEFAULT '0',
`class_key` varchar(100) NOT NULL DEFAULT 'modDocument',
`context_key` varchar(100) NOT NULL DEFAULT 'web',
`content_type` int(11) unsigned NOT NULL DEFAULT '1',
`uri` text,
`uri_override` tinyint(1) NOT NULL DEFAULT '0',
`hide_children_in_tree` tinyint(1) NOT NULL DEFAULT '0',
`show_in_tree` tinyint(1) NOT NULL DEFAULT '1',
`properties` mediumtext,
PRIMARY KEY (`id`),
KEY `alias` (`alias`),
KEY `published` (`published`),
KEY `pub_date` (`pub_date`),
KEY `unpub_date` (`unpub_date`),
KEY `parent` (`parent`),
KEY `isfolder` (`isfolder`),
KEY `template` (`template`),
KEY `menuindex` (`menuindex`),
KEY `searchable` (`searchable`),
KEY `cacheable` (`cacheable`),
KEY `hidemenu` (`hidemenu`),
KEY `class_key` (`class_key`),
KEY `context_key` (`context_key`),
KEY `uri` (`uri`(333)),
KEY `uri_override` (`uri_override`),
KEY `hide_children_in_tree` (`hide_children_in_tree`),
KEY `show_in_tree` (`show_in_tree`),
KEY `cache_refresh_idx` (`parent`,`menuindex`,`id`),
FULLTEXT KEY `content_ft_idx` (`pagetitle`,`longtitle`,`description`,`introtext`,`content`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=464 ;
А вот вывод в обзоре нашей статьи:
11 - ID нашего документа;
'document' - Тип нашего документа;
'text/html' - Тип выводимых данных нашего документа;
'Заголовок' - Заголовок pagetitle нашего документа;
'Расширенный заголовок' - Расширенный заголовок longtitle нашего документа;
'Описание' - Описание description нашего документа;
'index' - Псевдоним нашего документа;
'', 1, 0, 0, 2 - ID родителя нашего документа, иначе 0;
0, 'Контент' - Здесь находится контент нашего документа; 1, 20, 1, 1, 1, 4, 1448572478 - Дата создания документа;
4, 1448572648 - Дата редактирования документа;
0, 0, 0, 1448572478 - Дата публикации документа;
4, '', 0, 0, 0, 0, 0, 'Ticket' - Класс документа, по-молчанию modDocument;
'web' - Контекст нашего документа;
1, 'index/' - URI нашего документа;
1, 0, 0, '{"tickets":{"disable_jevix":false,"process_tags":false}}' - наборы параметров, по-умолчанию NULL.
Давайте её разберём, чтобы понять в каком направлении нам двигаться дальше. При детальном изучении структуры мы видим, что разграничение контента идёт по полю context_key, тоесть в это поле вставляется ключ контентекста, к которому пренадлежит контент. Имеет таблица modx_context следующий вид.
Что нужно?
- Парсер у нас должен иметь выбор контекста по ключу;
- Выбор шаблона документа (возможно взять на заметку возможность подставлять определённый шаблон родителю и дочернему документу);
- Уметь создавать дочерние документы;
- Раставлять даты публикации с интервалом, для отсроченной публикации;
- Уметь делать автоматическую перелинковку по ключевым словам;
- Добавлять картинки к контенту, а также парсить видео с youtube.com к документам по ключевым словам.
Комментарии ()