Kategorien und Artikel über die API anlegen

Ich bin neu im Oxid, wie kann ich über die API Kagetorien und Artikel anlegen.
Ein PHP script liest die aus einer anderen DB aus und soll sie über das Framework von Oxid in der DB richtig anlegen.

Ich hab’s mal so probiert, klappt aber nicht:

$ox_category = oxNew(“oxcategory”);
$ox_category->setId(“0”);
$ox_category->oxcategories__oxtitle = new oxField(“TEST-asdf”);
$ox_category->oxcategories__oxactive = new oxField(1);
$ox_category->oxcategories__oxid = new oxField(“0”);
$ox_category->oxcategories__oxparentid = new oxField(“oxrootid”);
$ox_category->oxcategories__oxsort = new oxField(1);
$ox_category->save();

danke für eure Hilfe!

Es geht schon also so ungefähr, die Oxid ist muss eine GUID sein und wird von OXID vergeben, daher habe ich das mal auskommentiert und so funktioniert es …


$oCategory = $this->make_category(
            array(
                'title'     => "TestTitle",
                'active'    => 1,
                'parentid'   => 'oxrootid',
                'sort'      => 1

        ));
        $oCategory->save();

public function make_category($aCategory){
        $ox_category = oxNew("oxcategory");
        $ox_category->setId("0");
        $ox_category->oxcategories__oxtitle = new oxField($aCategory['title']);
        $ox_category->oxcategories__oxactive = new oxField($aCategory['active']);
        #$ox_category->oxcategories__oxid = new oxField("0");
        $ox_category->oxcategories__oxparentid = new oxField($aCategory['parentid']);
        $ox_category->oxcategories__oxsort = new oxField($aCategory['sort']);
        return $ox_category;
    }

Hi,

vielen Dank für deine schnelle Hilfe! Werde ich gleich ausprobieren.



$oCategory = $this->make_category( 
            array( 
                'title'     => "TestTitle", 
                'active'    => 1, 
                'parentid'   => 'oxrootid', 
                'sort'      => 1 

        )); 
        $oCategory->save(); 

public function make_category($aCategory){ 
        $ox_category = oxNew("oxcategory");
        $this-> oxobject_from_array($ox_category, $aCategory,  'ox_category__ox')
}

public function oxobject_from_array($oObject, $aArray, $prefix = ''){
        foreach ($aArray as $key=>$value){
            $classvar = $prefix.$key;
            $oObject->$classvar = new OxField($value);
        }
    }


Hier mal ein bisschen universeller und erweiterbar auf anderen OXID Klasse …

Hallo,

ich bekomme da folgenden Fehler:

Fatal error: Using $this when not in object context in /opt/db.php on line 44

Muss ich $this irgendwo vorher referenzieren?

danke
M

aua => http://php.net/manual/de/language.oop5.php

Puhh, naja also war es mehr als Code Snippet gedacht, wo man mit etwas Know-how schon weiss was man tun muss, aber nun hier auch noch mal 2 Klassen mit Klassenaufruf:

eine Standard Klasse, welche alle Funktionalität enthält,
dann darauf beruhend - erweiternd eine makecategory Klasse, welche dann das Array als new Argument verarbeitet …



$mynew_oCategory = new htr_oxid_makecategory(
    array( 
                'title'     => "TestTitle", 
                'active'    => 1, 
                'parentid'   => 'oxrootid', 
                'sort'      => 1 

     )); 
$mynew_oCategory->save();

class htr_oxid_makecategory extends htr_oxid{
        public function __construct($aArray){
            return parent::construct('oxcategory',$aArray,'oxcategories__ox');        
        }
}
class htr_oxid{
        public function __construct($sObjectName, $aArray, $prefix = ''){
            return $this->oxobject_from_array($sObjectName, $aArray, $prefix);
        }
        public function oxobject_from_array($sObjectName, $aArray, $prefix = ''){
        $oObject = oxNew($sObjectName);
        foreach ($aArray as $key=>$value){
            $classvar = $prefix.$key;
            $oObject->$classvar = new OxField($value);
        }
        return $oObject;
    }
}


merci!
das mit der oop is mir alles etwas neu. Hilft aber nix, da muss man durch

Was mich jetzt noch wurmt, er kennt die ->save(); funktion nicht.
Was auch klar ist, ist bei der Klasse htr_oxid_makecategory nicht dabei.

Gibt’s da auch ein snippet, dass ich nehmen kann um die Daten in die DB dann zu speichern?

danke
Michael

was ich gerade sehe holger - du brauchst keine eigene oxobject_from_array zu schreiben, das macht assign schon:


$oCategory = oxNew("oxcategory");
$oCategory->assign(array(
  "oxtitle" => "foobar",
  "oxactive" => 1,
   ....
));
$oCategory->save();

danke @aggrsoft. Das klappt auch soweit. Der Code von Holger war ein guter Anfang für mich zum verstehen, ich hätte da aber die komplette Klasse ausprogrammieren müssen.

Ich bin jetzt soweit, dass mein Code mit der DB-Schnittstelle arbeitet. Das Problem nur an der Sache, dass ich auf der Commandline natürlich keine Sessions hab. OXID Will aber natürlich über die Sessionvariablen Checken ob ein Benutzer eingeloggt ist.

Von der Commandline mit PHP aus ein Script auszuführen, welches Kategorien in Oxid anlegt, erstreckt sich nun in der Tat sehr schwierig. Es hat halt den Charme, dass man es über einen Cron-Job Triggern kann!

Hat einer von euch sowas überhaupt schon mal geschafft, oder ist es sinnvoller den Code als Modul im Oxid anzustarten, wie ander Import-Module?

Also mir wäre neu das Oxid ohne dass du die oxshopcontrol startest irgendwas session abhängiges prüft - im Endeffekt reicht so ein kleiner “bootstrapper” wie dieser hier als include bevor du irgendwas anderes im script machst:

[I]bootstrap.php:[/I]

// Setting error reporting mode
error_reporting( E_ALL ^ E_NOTICE );

//Know exactly where in the code the event occurred.
//Zend platform only.
if (function_exists('monitor_set_aggregation_hint') && isset($_REQUEST['cl'])) {
    $sAgregationHint = htmlentities($_REQUEST['cl'], ENT_QUOTES, 'UTF-8') . '/';
    if (isset($_REQUEST['fnc']))
        $sAgregationHint .= htmlentities($_REQUEST['fnc'], ENT_QUOTES, 'UTF-8');
    monitor_set_aggregation_hint($sAgregationHint);
}


//setting basic configuration parameters
ini_set('session.name', 'sid' );
ini_set('session.use_cookies', 0 );
ini_set('session.use_trans_sid', 0);
ini_set('url_rewriter.tags', '');
ini_set('magic_quotes_runtime', 0);

/**
 * Returns shop base path.
 *
 * @return string
 */
function getShopBasePath()
{
    return dirname(__FILE__).'/';
}


if ( !function_exists( 'isAdmin' )) {
    /**
     * Returns false.
     *
     * @return bool
     */
    function isAdmin()
    {
        return false;
    }
}

// custom functions file
require getShopBasePath() . 'modules/functions.php';

// Generic utility method file
require_once getShopBasePath() . 'core/oxfunctions.php';


// set the exception handler already here to catch everything, also uncaught exceptions from the config or utils

// initializes singleton config class
$myConfig = oxConfig::getInstance();

//strips magics quote if any
oxUtils::getInstance()->stripGpcMagicQuotes();

// reset it so it is done with oxnew
$iDebug = $myConfig->getConfigParam('iDebug');
set_exception_handler(array(oxNew('oxexceptionhandler', $iDebug), 'handleUncaughtException'));
// Admin handling
if ( isAdmin() ) {
    $myConfig->setConfigParam( 'blAdmin', true );
    $myConfig->setConfigParam( 'blTemplateCaching', false );
    if ($sAdminDir)
        $myConfig->setConfigParam( 'sAdminDir', $sAdminDir );
    else
        $myConfig->setConfigParam( 'sAdminDir', "admin" );
}

Ist eigentlich nur eine Kopie der index.php ohne die shopcontrol zu starten - nach diesem include kannst du auf alle oxid klassen zugreifen und alles machen.

meincron.php:


include('bootstrap.php');
$oCategory = oxNew("oxcategory");
$oCategory->assign(array(
  "oxtitle" => "Cron rockt",
  "oxactive" => 1,
  "oxparentid" => "oxrootid"
));
$oCategory->save();

Danke :wink: der wars…
Ich hatte noch ein Problem mit Pfaden, deshalb kam das mit dem Session Fehler… ;-D

Ihr seid Klasse Jungs!! danke für die großzügige Hilfe!

Ja, ist eventuell nicht immer ganz so einfach - aber ich liebe es an Oxid dass man es ohne großes gewurste “headless” verwenden kann.

…und wie kann ich dann Artikel einer Kategorie zuordnen?
Ich raffs nicht.

dazu musst du einen Eintrag in der oxobject2category machen:


$myUtilsObj = oxUtilsObject::getInstance();
$oNew = oxNew( 'oxbase' );
$oNew->init( 'oxobject2category' );
$oNew->setId( $myUtilsObj->generateUID() );
$oNew->oxobject2category__oxobjectid = new oxField($sArticleOxid);
$oNew->oxobject2category__oxcatnid   = new oxField($sCategoryOxid);
$oNew->oxobject2category__oxtime     = new oxField(time());
$oNew->save();

Hi,

danke das mit der Verknüpfungstablle hab ich auch gefunden.
Nun aber eher eine basische Frage, wenn ich nun den Artikel ersellt hab und dann mit
->save(); auch gespeichert hab. Wie komme ich dann zu der “oxid” die für diesen Artikel gerade erstellt wurde?

weil $oxArticle->oxid ist nämlich NULL. (vor und nach dem save)

da hast du 2 Möglichkeiten:


//getId verwenden
$sOxid = $oxArticle->getId();
//Oder einfach das feld ansprechen
$sOxid = $oxArticle->oxarticles__oxid->value;

…und wie bekommt man dann die Bilder in den Shop?
das macht wirklich Spass wenn das einer mal erklärt.
Danke an alle.

Also das mit den Bildern ist etwas komplexer, du kannst aber die Oxid Routine dafür nutzen. Ich bin jetzt nicht ganz motiviert dass bis ins detail zu erklären aber schau dir mal die Datei admin/article_pictures.php an - da steht alles drin.