Программное создание материала
Joomla 4-5
$mvcFactory = $app->bootComponent('com_content')->getMVCFactory();
$model = $mvcFactory->createModel('Article', 'Administrator', ['ignore_request' => true]);
$article = [
'id' => 0,
'title' => 'Article Title', // заголовок
'alias' => '', // пустой, чтобы не было notice
'introtext' => 'Article Text', // текст
'catid' => 2, // категория
'state' => 0, // состояние публикации
'language' => '*', // язык
'access' => $app->get('access', 1) // уровень доступа
];
$form = $model->getForm($article, false);
// Получаем форму материала, чтобы провалидировать данные.
$form = $model->getForm($article, false);
if (!$form)
{
throw new \RuntimeException('Error getting form: ' . $model->getError());
}
// Валидируем данные.
if (!$model->validate($form, $article))
{
throw new \RuntimeException('Error validating article: ' . $model->getError());
}
// Эмулируем действие сохранения.
$app->input->set('task', 'save');
// Сохраняем (создаём) материал.
if (!$model->save($article))
{
throw new \RuntimeException('Error saving article: ' . $model->getError());
}
// Чтоб работало сохранение доп.полей - нужна авторизация юзером, имеющим права
$user = Factory::getUser(103);
$session = Factory::getSession();
$session->set('user', $user);
// Сохранение доп. полей
saveArticleFields($model->getItem()->id);
function saveArticleFields($articleId){
$model = $this->app->bootComponent('com_fields')->getMVCFactory()->createModel('Field', 'Administrator', ['ignore_request' => true]);
$fields = [
1 => 'Text', // текстовое поле
3 => ['Value 2', 'Value 1'], // список
4 => [2, 1] // чекбоксы
];
foreach ($fields as $key => $value){
$model->setFieldValue($key, $articleId, $value);
}
}
Более новый вариант
$newapp = JFactory::getApplication();
$mvcFactory = $newapp->bootComponent('com_content')->getMVCFactory();
$articleModel = $mvcFactory->createModel('Article', 'Administrator', ['ignore_request' => true]);
$title_article = 'My Article title';
$article = [
'catid' => 2,
'title' => $title_article,
'introtext' => 'My Article Intro Text',
'fulltext' => 'My Article Full Text',
'state' => 1,
'language' => '*',
'com_fields' => [
'field-name' => 'field value',
],
];
if (!$articleModel->save($article)){
throw new Exception($articleModel->getError());
}
// При этом, нужно обязательно быть залогиненым как админ. Или под другим аккаунтом, позволяющм редактировать поля.
Старый вариант
//Получаем объект базы данных
$db
= JFactory::getDbo();
//Создаем объект таблички #__content
$contentTable
=
new
JTableContent(
$db
);
//Определяем идентификатор пользователя от которого будет создан материал
$userid
= JFactory::getUser()->guest ? 472 : JFactory::getUser()->id;
//Данные материала
$dataContent
=
array
(
'title'
=>
'Новый материал'
,
'alias'
=>
'new-article'
,
'catid'
=> 2,
//Идентификатор категории в которой создадим материал
'state'
=> 1,
//Указываем что материал опубликован
'introtext'
=>
'Вступительный текст нового материала'
,
'fulltext'
=>
'Продолжение теккста нового материала'
,
'created'
=>
date
(
'Y-m-d H:i:s'
),
'publish_up'
=>
date
(
'Y-m-d H:i:s'
),
'created_by'
=>
$userid
,
'metakey'
=>
'Ключевые слова'
,
'metadesc'
=>
'Описания'
,
'featured'
=> 1
//Если хотим что бы материал был в избранном
);
//Вносим данные в таблицу
$contentTable
->bind(
$dataContent
);
//Проверяем или данные корректны
if
(
$contentTable
->check() ) {
//Создаем новую запись
$contentTable
->store();
}