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");
}
}
}
?>
テーブルを直接いじらないでください。 setValue関数 を持つフィールドモデルを使用します。 システムプラグイン と同様に、データベースに値を正しく書き込むことができます。
私はテーブルに直接読み書きすることで彼らと協力します。二つあります - #__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がある場合、私はそれをまだ見つけていません。