Schlagwörter zu Artikel programmatisch zuordnen?

  • Salü zusammen,


    ich suche nach einer Möglichkeit, zu einer existierenden Liste von Artikeln programmgesteuert Schlagwörter zuzuordnen. Eine Liste der Artikel-IDs habe ich, ebenso eine Liste der Tags mit Titel, alias und IDs.
    Ich habe dieses Snippet hier gefunden:


    $basePath = JPATH_ADMINISTRATOR.'/components/com_content';
    require_once $basePath.'/models/article.php';
    $articlemodel = new ContentModelArticle(array('table_path' => $basePath . '/tables'));


    $params = array(
    'id' => 123, // Article being tagged
    'tags' => array(7,8,9,14) // Tag IDs from #__tags to tag article with
    );
    if($articlemodel->save($params)){
    echo 'Success!';
    }


    Aber es funktioniert nur halb, es werden nicht die Tags mit den angegebenen IDs (7,8,9,14) hinzugefügt, sondern neue Tags erzeugt, die dann 7, 8, 9, 14 heissen. Ich hab mir schon einen Wolf gegooglet, aber noch keine zielführende Lösung gefunden und stehe komplett auf dem Schlauch.
    Kann mir mal jemand einen Schubs in die richtige Richtung geben? Wie müsste man der Anweisung 'tags' => array(7,8,9,14) formulieren, damit die richtigen Tags gespeichert werden?


    Bin für jeden Tipp dankbar!


    Beste Grüße,
    Evi

  • Hallo Evi,


    das ist tatsächlich ein bisschen fies, weil auch in der Joomla Doku immer von IDs gesprochen wird (z.B. bei der JHelperTags Klasse).


    Änderst Du den Typ der IDs in Strings anstatt Integer, werden keine neuen Tags angelegt:


    Code
    1. $params = array('id' => 1, // Article being tagged'tags' => array('2', '3') // Tag IDs from #__tags to tag article with);


    Etwas eleganter finde ich den Weg, der im Category Model von com_categories benutzt wird. Von dort hab ich auch den entscheidenden Hinweis mit den Strings. Dort kommt der JTableObserverTags zum Einsatz, der neue Tags einfügen kann. Für Dich angepasst:


    Code
    1. $table = JTable::getInstance('Content', 'JTable', array());
    2. $table->load($params['id']);
    3. $tagsObserver = $table->getObserverOfClass('JTableObserverTags');
    4. $result = $tagsObserver->setNewTags($params['tags'], true);


    Damit sparst Du Dir das Einbinden vom Artikel Model und kannst auch einfach über mehrere Artikel loopen.


    Ciao,
    Nobbe

  • Nobbe, tausend Dank! Das mit dem Typecast zu String war die Lösung... habs gleich ausprobiert, funkt einwandfrei! Da hatte ich wohl einige Bretter vorm Kopf...
    Werde auch deinen zweiten Lösungsweg probieren, das sieht gut aus.
    Merci nochmal & beste Grüße,
    Evi