it-swarm.it

Joomla 3.7.x PHP API imposta il valore del campo utente personalizzato

Sto scrivendo uno PHP che attraversa gli utenti e legge e scrive alcuni campi utente personalizzati.

La parte di lettura è fatta, usando FieldsHelper. Funziona bene. Tuttavia, provare a riscrivere alcuni dati in questi campi utente personalizzati sembra più complicato ...

Ho provato diversi modi di scrivere nei campi, ma nessuno di loro ha funzionato. Ha mostrato una pagina di errore 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

Non scherzare direttamente con il tavolo! Utilizzare il modello di campo che ha una funzione setValue . Ti permette di scrivere il valore correttamente nel database come fatto nel plugin di sistema .

1
Laoneo

Lavoro con loro leggendo e scrivendo direttamente sul tavolo. Ci sono due - #__fields e #__fields_values. Il primo serve per cercare i campi con il loro alias, il secondo serve per interrogare e impostare valori.

Per recuperare un ID per un campo utente, farà quanto segue:

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();
}

Per interrogare un campo, questo:

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();
}

E così via. Mettere insieme un inserto e un aggiornamento sarebbe altrettanto banale.

Se esiste una buona API di alto livello per fare lo stesso, devo ancora trovarla.

0
Seva Alekseyev