Программное создание материала

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();
}