Crie categorias, subcategorias e artigos usando php

10

É possível criar dinamicamente categorias, subcategorias e artigos do Joomla usando scripts PHP?

Existe algum link de exemplo?

useruseruser
fonte
2
Sim, é possível, mas muito difícil e eu sugeriria, a menos que você esteja familiarizado com o PHP, pois com_contenté a extensão interna mais complexa do Joomla. Você pode querer abordar esta questão de forma diferente, possível estender um pouco da funcionalidade atual e escrever sua própria classe
Lodder
@Lodder obrigado pela sua resposta. Para ser sincero, conheço php e uso o Joomla usando a interface de back-end. O que eu quero fazer é ter um site no qual adicionei alguns recursos usando o console de administração do Joomla (menu, páginas etc.) e quero fazer pequenas alterações usando scripts php. Existe algum tipo de tutorial para fazer isso?
Useruseruser 23/11

Respostas:

15

É um processo bastante extenso para fazer isso, mas aqui está uma versão reduzida do código que eu geralmente uso. Não garantirei necessariamente que funcione como mostrado, desde que rasguei um monte de coisas internas que fazemos ao longo do caminho, mas essas são as peças que você precisa fazer.

Você precisará examinar as tabelas #__categoriese #__contentobter todos os campos que deseja preencher e adicioná-los aos dados $category_datae $article_datamatrizes.

Devo mencionar que você poderia fazer isso inserindo os registros com jDatabase ou jTable, mas geralmente não recomendo isso porque o importante que você está perdendo são as regras e a lógica internas do Joomla que fazem coisas como verificar a exclusividade do alias e gerenciar a ACL para os novos itens de conteúdo.

if (!defined('_JEXEC')) {
    define( '_JEXEC', 1 );
    define('JPATH_BASE', realpath(dirname(__FILE__)));
    require_once ( JPATH_BASE .'/includes/defines.php' );
    require_once ( JPATH_BASE .'/includes/framework.php' );
    defined('DS') or define('DS', DIRECTORY_SEPARATOR);
}
$app = JFactory::getApplication('site');

$category_data['id'] = 0;
$category_data['parent_id'] = 0;
$category_data['title'] = 'My Category Title';
$category_data['alias'] = 'my-categegory-title-alias';
$category_data['extension'] = 'com_content';
$category_data['published'] = 1;
$category_data['language'] = '*';
$category_data['params'] = array('category_layout' => '','image' => '');
$category_data['metadata'] = array('author' => '','robots' => '');

$category_id = createCategory($category_data);
if(!$category_id){
    echo "Category create failed!";
}else{
    $article_data = array(
        'id' => 0,
        'catid' => $category_id,
        'title' => 'My article title',
        'alias' => 'my-article-alias',
        'introtext' => 'My intro text',
        'fulltext' => '<p>My full text</p>',
        'state' => 1,
        'language' => '*'
    );
    $article_id = createArticle($article_data);
    if(!$article_id){
        echo "Article create failed!";
    }
}

function createCategory( $data )
{
    $data['rules'] = array(
        'core.edit.state' => array(),
        'core.edit.delete' => array(),
        'core.edit.edit' => array(),
        'core.edit.state' => array(),
        'core.edit.own' => array(1=>true)
    );

    $basePath = JPATH_ADMINISTRATOR.'/components/com_categories';
    require_once $basePath.'/models/category.php';
    $config  = array('table_path' => $basePath.'/tables');
    $category_model = new CategoriesModelCategory($config);
    if(!$category_model->save($data)){
        $err_msg = $category_model->getError();
        return false;
    }else{
        $id = $category_model->getItem()->id;
        return $id;
    }
}
function createArticle($data)
{
    $data['rules'] = array(
        'core.edit.delete' => array(),
        'core.edit.edit' => array(),
        'core.edit.state' => array(),
    );

    $basePath = JPATH_ADMINISTRATOR.'/components/com_content';
    require_once $basePath.'/models/article.php';
    $config = array();
    $article_model = new ContentModelArticle($config);
    if(!$article_model->save($data)){
        $err_msg = $article_model->getError();
        return false;
    }else{
        $id = $article_model->getItem()->id;
        return $id;
    }
}
PIB
fonte
É claro que o Joomla precisa ser carregado, portanto, se você não estiver usando algum código existente, precisará carregá-lo. Atualizei minha resposta para fazer isso, então você está pronto.
GDP
Não para este código, ele usa os modelos do Joomla para adicioná-los, assim como o próprio Joomla. Você deve poder colocar esse código em um arquivo php, completar a matriz $ data com outros campos que deseja atualizar e executá-la com êxito. Aguarde alguns minutos e atualizarei minha resposta para incluir código 100% funcional.
GDP
O código atualizado agora cria uma categoria e um artigo dentro dela quando executado como está. Para sua informação, se você especificar um ID válido em vez de 0 para qualquer um dos itens, ele atualizará essa categoria ou artigo em vez de adicioná-lo. Além disso, as regras da ACL são opcionais ... Copiei isso de um dos meus scripts que usa a ACL; é por isso que está lá, mas é útil saber também.
GDP
1
Só posso sugerir que você formule o que deseja realizar sem assumir que modelos ou MVC fazem parte dele. Os plugins geralmente são a melhor maneira de personalizar o que o Joomla faz, mas a clareza do que você deseja fazer é mais importante para determinar qual é a melhor solução.
GDP
1
Esta solução ainda está funcionando bem no Joomla! 3,9.11
AndyGaskell