Tag Archives: Kategorie kopieren

Kategorien in Magento duplizieren

*wieder mal als Gedankenstütze für mich gedacht*

 

Da es in Magento von Haus aus keine eingebaute Methode gibt Kategoriebäume zu duplizieren, habe ich was gefunden, womit das einfach und schmutzig geht. Ich habe ja oft Kategorien, die dann bis zu 10 Unterkategorien und die dann wiederum zig Unterunterkategorien enthalten. Wer nen Magento hat, weiß wie langweilig das ist, wenn man das manuell duplizieren muß…

Man legt sich ein PHP-Dokument an und benennt das z.B. kategorie-kopieren.php.

 

Hier der Quellkot: (das “< ? php" (ohne Leerzeichen) zu Beginn müßt ihr Euch dazudenken - das wird in diesem Mistwordpress nicht dargestellt)
global->resources->default_setup->connection->host;
$username = $xml->global->resources->default_setup->connection->username;
$password = $xml->global->resources->default_setup->connection->password;
$dbname = $xml->global->resources->default_setup->connection->dbname;
$res = mysql_pconnect($host, $username, $password);
mysql_select_db($dbname);

$catsDone = 0;
duplicate_entity($catId);
echo $catsDone . ‘ Categories duplicated.’;

function duplicate_entity($id, $parent_id = null){
global $catsDone;

// Grab category to copy
$sql = “SELECT * FROM catalog_category_entity WHERE entity_id = ” . $id;
$query_entity = mysql_query($sql);

$entity = mysql_fetch_object($query_entity);

if(!$parent_id)$parent_id = $entity->parent_id;

mysql_query(“INSERT INTO catalog_category_entity (entity_type_id, attribute_set_id, parent_id, created_at, updated_at, path, position, level, children_count)
VALUES ({$entity->entity_type_id}, {$entity->attribute_set_id}, {$parent_id}, NOW(), NOW(), ”, {$entity->position}, {$entity->level}, {$entity->children_count})”);
$newEntityId = mysql_insert_id();

$query = mysql_query(“SELECT path FROM catalog_category_entity WHERE entity_id = ” . $parent_id);
$parent = mysql_fetch_object($query);
$path = $parent->path . ‘/’ . $newEntityId;

mysql_query(“UPDATE catalog_category_entity SET path=’”. $path.”‘ WHERE entity_id=”. $newEntityId);

foreach(array(‘datetime’, ‘decimal’, ‘int’, ‘text’, ‘varchar’) as $dataType){
$sql = “SELECT * FROM catalog_category_entity_”.$dataType.”
WHERE entity_id=” . $entity->entity_id;
//die($sql);
$query = mysql_query($sql);
while ($value = mysql_fetch_object($query)){
mysql_query(“INSERT INTO catalog_category_entity_”.$dataType.” (entity_type_id, attribute_id, store_id, entity_id, value)
VALUES ({$value->entity_type_id}, {$value->attribute_id}, {$value->store_id}, {$newEntityId}, ‘{$value->value}’)”);
}
}

$sql = “SELECT entity_id FROM catalog_category_entity WHERE parent_id = ” . $id;
$query = mysql_query($sql);

while ($entity = mysql_fetch_object($query)){
duplicate_entity($entity->entity_id, $newEntityId);
}
$catsDone++;
}

?>

Das Dokument in die root des Magento speichern (also zu index.php, .htaccess, etc.).
Dann guckt man im Adminbackend, welche ID die zu kopierende Kategorie hat. (Nehmen wir mal als Beispiel die 7)
Im Browser rufen wir dann einfach http://meine-domain.de/kategorie-kopieren.php?=7 auf.

Im Adminbackend erscheint die kopierte Kategorie dann direkt unter der Originalkategorie. Die kopierte Kategorie kann man dann drag&drop an die gewünschte Stelle ziehen.

Getestet in Magento 1.5.x und 1.7.0.2

EDIT: Es wäre natürlich auch ganz sinnvoll, wenn man die Datei nach Gebrauch vom Server löscht oder zumindest in den Rechten einschränkt (400 wäre fein).
Denn jeder Dummbot kann diese URL durchtesten und Zufallsparameter anhängen. Und wie dann der Shop aussieht, muß ich nicht mehr erwähnen…