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