web-dev-qa-db-ja.com

Joomla 3.7.x PHPカスタムユーザーフィールドのAPI設定値

PHPスクリプトを作成して、ユーザーを通過し、いくつかのカスタムユーザーフィールドを読み書きします。

読み取り部分は、FieldsHelperを使用して行われます。それはうまくいきます。ただし、これらのカスタムユーザーフィールドにデータを書き戻そうとすると、注意が必要です...

フィールドに書き込む方法を複数試しましたが、どれもうまくいきませんでした。 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

テーブルを直接いじらないでください。 setValue関数 を持つフィールドモデルを使用します。 システムプラグイン と同様に、データベースに値を正しく書き込むことができます。

1
Laoneo

私はテーブルに直接読み書きすることで彼らと協力します。二つあります - #__fieldsおよび#__fields_values。前者はエイリアスでフィールドを検索するためのもので、後者は値をクエリおよび設定するためのものです。

ユーザーフィールドのIDを取得するには、次のようにします。

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

フィールドをクエリするには、次のようにします。

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

などなど。挿入と更新を組み合わせると、同じように簡単です。

同じことを行うための優れた高レベルAPIがある場合、私はそれをまだ見つけていません。

0
Seva Alekseyev