Joomla Webサイトの記事にカスタムフィールドをいくつか追加しました: 以下のコードを使用してプログラムで新しい記事を作成するカスタムJoomlaモジュールに取り組んでいます。
static function createArticle(GNGLocation $loc, GNGLang $lang, $title, $alias, $intro, $summary, $imageStr) {
$table = JTable::getInstance('Content', 'JTable', array());
$jcat = $loc->get('jcat_id_tour');
$jlang = $lang->get('joomlaName');
$data = array(
'catid' => $jcat,
'title' => $title,
'alias' => $alias,
'language' => $jlang,
'introtext' => $summary,
'fulltext' => $intro,
'state' => 0,
);
// Bind data
if (!$table->bind($data))
{
throw new Exception("Failed to bind article data. Error: " . $table->getError());
}
// Check the data.
if (!$table->check())
{
throw new Exception("Failed to check article data. Error: " . $table->getError());
}
// Store the data.
if (!$table->store())
{
throw new Exception("Failed to store article data. Error: " . $table->getError());
}
}
これは正常に機能し、新しい記事を作成しますが、記事に属するカスタムフィールドの値を書き込む方法も見つかりませんでした。これは この投稿 に基づいてこれまでに試したものですが、動作しないようですつまり、バックエンドの記事に移動して確認すると空のままのカスタムフィールド。エラーメッセージも何もない:
JModelLegacy::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_fields/models');
$model =& JModelLegacy::getInstance('Article', 'ContentModel', array('ignore_request'=>true));
$appParams = JFactory::getApplication()->getParams();
$model->setState('params', $appParams);
$item =& $model->getItem($table->id);
$custom_fields = FieldsHelper::getFields('com_content.article', $item, True);
$custom_fields_by_name = \Joomla\Utilities\ArrayHelper::pivot($custom_fields, 'name');
$your_custom_field_value = 'haliho';
$model_field = JModelLegacy::getInstance('Field', 'FieldsModel', ['ignore_request' => true]);
$model_field->setFieldValue(
$custom_fields_by_name['excluded']->id,
$item->id,
$your_custom_field_value
);
更新:次の行を実行すると、以下の診断が得られます。
JFactory::getApplication()->enqueueMessage("<pre>" . json_encode($custom_fields_by_name, JSON_PRETTY_PRINT). "</pre><br>" . $custom_fields_by_name['excluded']->id . "<br>" . $item->id , 'info');
出力:
info
{
"included": {
"id": "2",
"title": "Included",
"name": "included",
"checked_out": "0",
"checked_out_time": "0000-00-00 00:00:00",
"note": "",
"state": "1",
"access": "1",
"created_time": "2019-11-24 16:10:18",
"created_user_id": "919",
"ordering": "0",
"language": "*",
"fieldparams": {
"filter": "",
"maxlength": ""
},
"params": {
"hint": "",
"class": "",
"label_class": "",
"show_on": "",
"render_class": "",
"showlabel": "1",
"label_render_class": "",
"display": "0",
"layout": "",
"display_readonly": "2"
},
"type": "text",
"default_value": "",
"context": "com_content.article",
"group_id": "1",
"label": "Included",
"description": "",
"required": "0",
"language_title": null,
"language_image": null,
"editor": null,
"access_level": "Public",
"author_name": "Administrator",
"group_title": "Tour Extension",
"group_access": "1",
"group_state": "1",
"group_note": "",
"value": "",
"rawvalue": ""
},
"excluded": {
"id": "3",
"title": "Excluded",
"name": "excluded",
"checked_out": "0",
"checked_out_time": "0000-00-00 00:00:00",
"note": "",
"state": "1",
"access": "1",
"created_time": "2019-12-01 14:40:45",
"created_user_id": "919",
"ordering": "0",
"language": "*",
"fieldparams": {
"filter": "",
"maxlength": ""
},
"params": {
"hint": "",
"class": "",
"label_class": "",
"show_on": "",
"render_class": "",
"showlabel": "1",
"label_render_class": "",
"display": "0",
"layout": "",
"display_readonly": "2"
},
"type": "text",
"default_value": "",
"context": "com_content.article",
"group_id": "1",
"label": "Excluded",
"description": "",
"required": "0",
"language_title": null,
"language_image": null,
"editor": null,
"access_level": "Public",
"author_name": "Administrator",
"group_title": "Tour Extension",
"group_access": "1",
"group_state": "1",
"group_note": "",
"value": "",
"rawvalue": ""
}
}
3
332
私は何を間違っていますか、どうすればいいですか?
その「除外された」カスタムフィールドに値を設定する権限のないJoomlaユーザーの下でコードを実行しているためと思われます。 setFieldValue()
のJoomlaフィールドモデルコード内にFieldsHelper::canEditFieldValue($field)
への呼び出しがあり、ユーザーのグループのカスタムフィールド値の編集権限が許可に設定されていない場合、setFieldValue()
関数はfalseを返しますが、エラーメッセージは出力しません。
このフィールドの[カスタムフィールド値の編集]アクションで[公開許可]アクセスを設定してみて、問題が解決するかどうかを確認することをお勧めします。このように永続的に設定したくない場合は、権限チェックを省略した独自のコードを使用して、setFieldValue()
メソッドをオーバーライドできます。
私は自分のインスタンスでコードを実行しましたが、権限を設定した後は問題なく動作しました。デバッガーで関連するJoomlaコードを確認したところ、問題の原因となっている可能性のある他の行は見つかりませんでした。