it-swarm.com.de

Artikelbild programmgesteuert einstellen

Ich generiere/aktualisiere mehrere Artikel über ein PHP Skript (im CLI-Ordner), das eine externe Datenquelle (benutzerdefinierte Tabellen) analysiert. Dies funktioniert gut.

Wenn ein Artikel noch kein Bild enthält, muss das Skript ihm ein zufälliges Bild geben.

foreach($arr_articles as $custom_id => $article_data)
{
    // test if article exists
    $sql = 'SELECT '.$db->quoteName('item_id')
        .' FROM '.$db->quoteName($db_prefix.'fields_values')
        .' WHERE '.$db->quoteName('field_id').' = 14 ' # my custom id
        .' AND '.$db->quoteName('value').' = '.$db->quote($custom_id);

    $db->setQuery($sql);
    $article_id = $db->loadResult();

    $jarticle = JTable::getInstance('content');

    $article_has_image = False;

    if(!is_null($article_id))
    {
        // article exists, load it
        $jarticle->load($article_id);

        // and look for its images
        $images = json_decode($jarticle->images);
        if(isset($images->image_fulltext) && !empty($images->image_fulltext))
        {
            $article_has_image = True;
        }
    }
    if(! $article_has_image)
    {
         //set new one
         $filepath = getRandomImage();
         $jarticle->set('image_fulltext',$filepath);
    }
    //do more stuff, update custom fields...
    //save
    $jarticle->store();
}

getRandomImage() erhält einen absoluten Dateipfad auf dem Server.

Mein Versuch mit $jarticle->set('image_fulltext',$filepath); scheint nichts zu bewirken. Gibt es eine bessere Möglichkeit, die Bilder festzulegen (fulltext_image und intro_image)?

3
nicolallias

Ich sehe set() nicht in der JTable docs . Sie müssen auch daran denken, den vollständigen Spaltenwert vor dem Speichern neu zu codieren. Das Folgende ist ein ungetesteter Ausschnitt.

$db = JFactory::getDbo();
$query = $db->getQuery(true)
            ->select(db->qn("item_id"))
            ->from($db->qn("#__fields_values"));  // build all of the non-changing clauses for the query
$where = [$db->qn('field_id') . " = 14"];  // declare the first condition for the WHERE clause

foreach ($arr_articles as $custom_id => $article_data)
{
    // only modify the where clause within the loop (re-use the rest of the query string)
    $where[1] = $db->qn('value') . ' = ' . (int)$custom_id;  // declare the new/second condition for the WHERE clause
    $query->clear('where')->where($where);  // append fresh where conditions to query

    $article_id = $db->setQuery($query)->loadResult();
    if ($article_id)
    {
        $jarticle = JTable::getInstance('content');  // I am not sure if this can be declared before the foreach (reused like $db)
        $jarticle->load($article_id);
        $imageData = json_decode($jarticle->images);  // string to object
        if(empty($imageData->image_fulltext))
        {
            $imageData->image_fulltext = getRandomImage();  // modify object property
            $jarticle->images = json_encode($imageData);  // object back to string and overwrite the fetched property
        }
        //do more stuff, update custom fields...
        $jarticle->store();
    }
}
2
mickmackusa