web-dev-qa-db-fra.com

Image d'article définie par programme

Je génère/mets à jour plusieurs articles via un script PHP (dans le dossier cli) qui analyse une source de données externe (tableaux personnalisés). Cela fonctionne bien.

Maintenant, si un article n'a pas encore d'image, le script doit lui en donner une au hasard.

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() obtient un chemin de fichier absolu sur le serveur.

Ma tentative avec $jarticle->set('image_fulltext',$filepath); ne semble rien faire, y a-t-il une meilleure façon de régler les images (fulltext_image et intro_image)?

3
nicolallias

Je ne vois pas set() dans les documents JTable . Vous devez également vous rappeler de ré-encoder la valeur complète de la colonne avant de la stocker. Voici un extrait non testé.

$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