Crea categorías, subcategorías y artículos usando php

10

¿Es posible crear dinámicamente categorías, subcategorías y artículos de Joomla usando scripts PHP?

¿Hay algún enlace de ejemplo?

useruseruser
fuente
2
Sí, es posible pero muy difícil y sugeriría que no, a menos que esté extremadamente familiarizado con PHP, ya que com_contentes la extensión integrada más compleja de Joomla. Es posible que desee abordar esto de una manera diferente, posible ampliar algunas de las funciones actuales y escribir su propia clase
Lodder
@Lodder gracias por tu respuesta. Para ser honesto, conozco php y uso Joomla con la interfaz de back-end. Lo que quiero hacer es tener un sitio en el que agregué algunas funciones usando la consola de administración de Joomla (menú, páginas, etc.) y quiero hacer cambios menores usando scripts php. ¿Hay algún tipo de tutorial para hacerlo?
useruseruser

Respuestas:

15

Es un proceso bastante extenso para hacer esto, pero aquí hay una versión recortada del código que generalmente uso. No necesariamente garantizaré que se ejecutará como se muestra, ya que eliminé un montón de cosas internas que hacemos en el camino, pero estas son las piezas que necesita para hacerlo.

Tendrá que mirar las tablas #__categoriesy #__contentobtener todos los campos que desea llenar y agregarlos a las matrices $category_datay a los dados $article_data.

Debo mencionar que podría lograrlo insertando los registros con jDatabase o jTable, pero generalmente no lo recomendaría porque lo importante que se estaría perdiendo son las reglas y la lógica incorporadas de Joomla que hacen cosas como verificar la unicidad del alias y administrar la ACL para los nuevos elementos de contenido.

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
fuente
Joomla tiene que cargarse, por supuesto, por lo que si no lo está haciendo en algún código existente, debe cargarlo. He actualizado mi respuesta para lograr eso, así que ya está listo.
PIB
No para este código, usa los modelos de Joomla para agregarlos tal como lo hace Joomla. Debería poder poner este código en un archivo php, completar la matriz $ data con otros campos que desea actualizar y ejecutarlo con éxito. Dame unos minutos y actualizaré mi respuesta para incluir un código 100% funcional.
PIB
El código actualizado ahora crea una categoría y un artículo dentro de él cuando se ejecuta tal cual. Para su información, si especifica una ID válida en lugar de 0 para cualquiera, actualizará esa categoría o artículo en lugar de agregarlo. Además, las reglas de ACL son opcionales ... Copié esto de uno de mis scripts que usa ACL, por eso está ahí, pero también es útil saberlo.
PIB
1
Solo puedo sugerirle que formule lo que desea lograr sin suponer que las plantillas o MVC son parte de esto. Los complementos son generalmente la mejor manera de personalizar lo que hace Joomla, pero la claridad de lo que quiere hacer es lo más importante para determinar cuál es la mejor solución.
PIB
1
Esta solución todavía funciona bien en Joomla! 3.9.11
AndyGaskell