/** * WPML compatibility functions * * @global array $duplicated_posts Array to store the posts being duplicated. * * @package Yoast\WP\Duplicate_Post * @since 3.2 */ add_action( 'admin_init', 'duplicate_post_wpml_init' ); /** * Add handlers for WPML compatibility. */ function duplicate_post_wpml_init() { if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { add_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'shutdown', 'duplicate_wpml_string_packages', 11 ); } } global $duplicated_posts; // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: Renaming a global variable is a BC break. $duplicated_posts = []; /** * Copy post translations. * * @global SitePress $sitepress Instance of the Main WPML class. * @global array $duplicated_posts Array of duplicated posts. * * @param int $post_id ID of the copy. * @param WP_Post $post Original post object. * @param string $status Status of the new post. */ function duplicate_post_wpml_copy_translations( $post_id, $post, $status = '' ) { global $sitepress; global $duplicated_posts; remove_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10 ); remove_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10 ); $current_language = $sitepress->get_current_language(); $trid = $sitepress->get_element_trid( $post->ID ); if ( ! empty( $trid ) ) { $translations = $sitepress->get_element_translations( $trid ); $new_trid = $sitepress->get_element_trid( $post_id ); foreach ( $translations as $code => $details ) { if ( $code !== $current_language ) { if ( $details->element_id ) { $translation = get_post( $details->element_id ); if ( ! $translation ) { continue; } $new_post_id = duplicate_post_create_duplicate( $translation, $status ); if ( ! is_wp_error( $new_post_id ) ) { $sitepress->set_element_language_details( $new_post_id, 'post_' . $translation->post_type, $new_trid, $code, $current_language ); } } } } // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: see above. $duplicated_posts[ $post->ID ] = $post_id; } } /** * Duplicate string packages. * * @global array() $duplicated_posts Array of duplicated posts. */ function duplicate_wpml_string_packages() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: renaming the function would be a BC-break. global $duplicated_posts; foreach ( $duplicated_posts as $original_post_id => $duplicate_post_id ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $original_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $original_post_id ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $new_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $duplicate_post_id ); if ( is_array( $original_string_packages ) ) { foreach ( $original_string_packages as $original_string_package ) { $translated_original_strings = $original_string_package->get_translated_strings( [] ); foreach ( $new_string_packages as $new_string_package ) { $cache = new WPML_WP_Cache( 'WPML_Package' ); $cache->flush_group_cache(); $new_strings = $new_string_package->get_package_strings(); foreach ( $new_strings as $new_string ) { if ( isset( $translated_original_strings[ $new_string->name ] ) ) { foreach ( $translated_original_strings[ $new_string->name ] as $language => $translated_string ) { do_action( // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. 'wpml_add_string_translation', $new_string->id, $language, $translated_string['value'], $translated_string['status'] ); } } } } } } } } Odoo 開発ポータル フィールド – Raqqa

Odoo 開発ポータル フィールド

フィールド設定方法

Odoo開発ポータル 操作ガイド

フィールド設定編(コンサルタント向け)

この資料は、Odoo Studioを使わずに開発ポータル上でモデルにフィールドを追加・設定するための手順とルールをまとめたものです。
Odoo Studioの知識がなくても、この資料を見れば操作手順を理解できます。


1. フィールド追加の基本方針

1.1 フィールド追加の対象

  • モデル単位でフィールドを追加可能。
  • 新規フィールド既存フィールドの2種類の追加方法があります。
追加方法説明操作手順
新規フィールド追加モデルに新しいフィールドを作成「新しいフィールド」ボタン → 必須項目を入力
既存フィールド追加他モデルで既に存在するフィールドを再利用「新しいフィールド」→「既存フィールド」→「フィールド選択」で既存項目を選択

2. フィールド一覧の仕様

開発ポータル上では、モデルに紐づくフィールドを一覧管理します。

カラム名内容
フィールド名(日/英)Odoo内部のフィールド名と表示名
データ型Char / Integer / Selection / Many2one など
関連情報Selection候補値、Many2one先モデルなど
単位kg, 円, %, など必要に応じて設定
出自フィールドが Studio で作られたか、コード開発されたか
コード出力可否AIまたは開発者によるコード生成の進捗状況

3. コード出力可否のルール

状態説明
生成済AIまたは開発者によりコードが確定済み
手動生成要AIで生成したコードに修正が必要で、開発者への依頼が必要
未実装コード未生成、または意図したコードを生成できなかった状態

4. 新規フィールド作成時の定義項目

新規フィールドを追加する際は、以下の項目を入力します。

4.1 基本情報

項目説明入力例
フィールド名(内部名)Odoo内部で利用する名称x_customer_rank
表示名(ラベル)画面上に表示される名称顧客ランク
フィールドタイプ(型)Char / Integer / Selection などテキスト
Widget(表示タイプ)フィールドのUI表示形式ラジオボタン
デフォルト値新規作成時の初期値bronze
プレイスホルダー入力欄に表示するガイドテキストランクを選択してください
単位数値系項目の場合の単位kg
ヘルプテキストフィールドの説明をツールチップで表示ランクに応じて自動割引が適用されます

4.2 表示制御設定

設定項目説明入力例
非表示フィールドをUI上に表示するかトグル
必須必須入力項目にするかトグル
必須条件特定条件下でのみ必須に設定state = draft
読み取り専用編集不可にするかトグル

4.3 UI設定

設定項目説明入力例
水平配置複数選択肢を横並びで表示するトグル

4.4 権限設定

設定項目説明入力例
表示権限グループ特定ユーザーグループだけが表示できる設定Sales Manager など

5. 運用上の注意点

  • Studioで設定可能な項目 → ポータルから入力可能。
  • Studioでできない複雑な設定 → 開発者へ依頼。
  • AI自動生成の利用
    • 成功 → 「生成済」 開発後に開発者がステートを変更
    • 修正要 → 「手動生成要」 コンサル側が入力した場合
    • 未対応 → 「未実装」


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です