Twórz kategorie, podkategorie i artykuły za pomocą php

10

Czy możliwe jest dynamiczne tworzenie kategorii, podkategorii i artykułów Joomla za pomocą skryptów PHP?

Czy jest jakiś przykładowy link?

użytkownik użytkownika
źródło
2
Tak, jest to możliwe, ale bardzo trudne i odradzam, chyba że jesteś bardzo zaznajomiony z PHP, ponieważ com_contentjest to najbardziej złożone wbudowane rozszerzenie w Joomla. Być może zechcesz podejść do tego inaczej, możliwe rozszerzenie niektórych obecnych funkcji i napisanie własnej klasy
Lodder
@Lodder dziękuję za odpowiedź. Szczerze mówiąc, mam wiedzę na temat php i używam Joomla za pomocą interfejsu zaplecza. Chcę stworzyć witrynę, w której dodałem niektóre funkcje za pomocą konsoli administracyjnej Joomla (menu, strony itp.) I chcę wprowadzić niewielkie zmiany za pomocą skryptów php. Czy istnieje jakiś samouczek, aby to zrobić?
useruseruser

Odpowiedzi:

15

Jest to dość obszerny proces, aby to zrobić, ale oto skrócona wersja kodu, którego zazwyczaj używam. Nie muszę koniecznie gwarantować, że będzie działał tak, jak pokazano, ponieważ wyciągnąłem kilka wewnętrznych rzeczy, które robimy po drodze, ale są to elementy, które musisz to zrobić.

Musisz spojrzeć na tabele #__categoriesi #__contentuzyskać wszystkie pola, które chcesz wypełnić, i dodać je do podanych $category_datai $article_datatablic.

Powinienem wspomnieć, że można to osiągnąć, wstawiając rekordy za pomocą jDatabase lub jTable, ale generalnie nie polecam tego, ponieważ ważną rzeczą, której będziesz brakować, są wbudowane reguły i logika Joomla, które robią rzeczy takie jak sprawdzanie wyjątkowości aliasu i zarządzanie listą ACL dla nowych elementów treści.

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;
    }
}
PKB
źródło
Joomla musi być oczywiście załadowana, więc jeśli nie robisz w istniejącym kodzie, musisz go załadować. Zaktualizowałem moją odpowiedź, aby to osiągnąć, więc możesz zacząć.
PKB
Nie dla tego kodu, używa modeli Joomla, aby je dodać, tak jak robi to sam Joomla. Powinieneś być w stanie umieścić ten kod w pliku php, uzupełnić tablicę danych $ innymi polami, które chcesz zaktualizować i pomyślnie go uruchomić. Daj mi kilka minut, a zaktualizuję swoją odpowiedź, aby zawierała 100% kodu funkcjonalnego.
PKB
Zaktualizowany kod tworzy teraz kategorię i artykuł, gdy jest wykonywany w niezmienionej postaci. Do Twojej wiadomości, jeśli podasz poprawny identyfikator zamiast 0 dla jednego z nich, zaktualizuje on tę kategorię lub artykuł zamiast go dodawać. Ponadto reguły ACL są opcjonalne ... Skopiowałem to z jednego ze moich skryptów, który używa ACL, dlatego właśnie tam jest, ale warto to również wiedzieć.
PKB
1
Mogę tylko zasugerować, abyś sformułował to, co chcesz osiągnąć, bez zakładania, że ​​szablony lub MVC są jego częścią. Wtyczki są na ogół najlepszym sposobem na dostosowanie tego, co robi Joomla, ale klarowność tego, co chcesz zrobić, jest najważniejsza dla określenia najlepszego rozwiązania.
PKB
1
To rozwiązanie nadal działa dobrze w Joomla! 3.9.11
AndyGaskell,