web-dev-qa-db-fra.com

Joomla 3.7.x PHP Valeur définie par l'API du champ d'utilisateur personnalisé

J'écris un script PHP) qui passe par les utilisateurs, lit et écrit des champs utilisateur personnalisés.

La lecture s’effectue à l’aide de FieldsHelper. Ça marche bien. Cependant, essayer de réécrire des données dans ces champs utilisateur personnalisés semble plus délicat ...

J'ai essayé plusieurs façons d'écrire dans les champs, mais aucune d'entre elles n'a fonctionné. Il a montré une page d'erreur 404 ...

<?php
define('_JEXEC', 1);
if (file_exists(__DIR__ . '/defines.php')) {
    include_once __DIR__ . '/defines.php';
}
if (!defined('_JDEFINES')) {
    define('JPATH_BASE', __DIR__);
    require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';

// Load the fields helper
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');

// Instantiate the application.
$app = JFactory::getApplication('site');
jimport('joomla.plugin.helper');
// JFactory
require_once (JPATH_BASE .'/libraries/joomla/factory.php');

// Read & write custom fields
ReadWriteCustomFields();

function ReadWriteCustomFields() {
    // query users
    $db = JFactory::getDBO();
    $query = "SELECT id FROM #__users" ;
    $db->setQuery($query);

    $rows = $db->loadObjectList();

    $model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));

    //run through users
    foreach ($rows as $row) {
        //get the user object
        $user = JUser::getInstance($row->id);
        //get custom fields
        $customFields = FieldsHelper::getFields('com_users.user', $user, true);

        if($customFields[1]->value == "") {
            // write into custom field
            //$customFields[1]->value = "TRIED THIS";
            $model->setFieldValue($customFields[1]->id, $user->id, "AND ALSO THIS");
            $model->setFieldValue(1, $user->id, "AND ALSO THIS");
        }
    }
}
?>
3
Laureant

Ne plaisante pas directement avec la table! Utilisez le modèle de champ qui a fonction setValue . Cela vous permet d'écrire correctement la valeur dans la base de données, comme indiqué dans le plugin système .

1
Laoneo

Je travaille avec eux en lisant et en écrivant directement à la table. Il y en a deux - #__fields et #__fields_values. Le premier permet de rechercher les champs par leur alias, le second permet de rechercher et de définir des valeurs.

Pour récupérer un identifiant pour un champ utilisateur, procédez comme suit:

function GetFieldID($Alias)
{
    $db = JFactory::getDBO();
    $db->setQuery($db->getQuery(true)
        ->select('id')
        ->from('#__fields')
        ->where("context = 'com_users.user'")->where("name='".$Alias."'"));
    return $db->loadResult();
}

Pour interroger un champ, ceci:

function GetField($UserID, $FieldID)
{
    $db = JFactory::getDBO();
    $db->setQuery($db->getQuery(true)
        ->select('value')
        ->from('#__fields_values')
        ->where("field_id = $FieldID")->where("item_id=$UserID"));
    return $db->loadResult();
}

Et ainsi de suite. Mettre en place un insert et une mise à jour serait également trivial.

S'il existe une bonne API de haut niveau pour faire la même chose, je ne l'ai pas encore trouvée.

0
Seva Alekseyev