PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.6.5
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.6.5
1.6.5 1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 trunk All 48 releases
← All changes | app/Models/ProductVariation.php +65 -0 1.4.1 → 1.6.5 View file →
@@ -3,8 +3,9 @@
3 3 namespace FluentCart\App\Models;
4 4
5 5 use FluentCart\Api\ModuleSettings;
6 6 use FluentCart\App\App;
7 +use FluentCart\App\Helpers\AttributeHelper;
7 8 use FluentCart\App\Helpers\Helper;
8 9 use FluentCart\App\Helpers\Status;
9 10 use FluentCart\App\Models\Concerns\CanSearch;
10 11 use FluentCart\App\Models\Concerns\CanUpdateBatch;
@@ -130,8 +131,67 @@
130 131 return $this->belongsTo(ShippingClass::class, 'shipping_class', 'id');
131 132 }
132 133
133 134 /**
135 + * Labeled attribute combination for this variation, e.g. "Color: Red | Size: XS".
136 + *
137 + * Uses the batched `variation_display_title` when
138 + * AttributeHelper::attachVariationDisplayTitles() has already resolved it,
139 + * and otherwise resolves on demand — so callers get a correct value either
140 + * way, and a correctly batched caller costs no extra queries.
141 + *
142 + * @return string Falls back to the stored variation title.
143 + */
144 + public function getVariationLabel(): string
145 + {
146 + $resolved = (string) ($this->variation_display_title ?? '');
147 +
148 + if ($resolved !== '') {
149 + return $resolved;
150 + }
151 +
152 + $variationType = $this->product_detail ? $this->product_detail->variation_type : '';
153 +
154 + $label = AttributeHelper::getDisplayAttributesString(
155 + AttributeHelper::getProductItemAttributes($this->id, $this->post_id),
156 + [
157 + 'title' => $this->variation_title,
158 + 'variation_type' => $variationType,
159 + 'other_info' => ['variation_type' => $variationType],
160 + ],
161 + 'order_item'
162 + );
163 +
164 + return $label !== '' ? $label : (string) $this->variation_title;
165 + }
166 +
167 + /**
168 + * Full display title for this variation: "<product> - <attribute combination>".
169 + *
170 + * The catalogue-side counterpart to OrderItem::getDisplayTitle(), which
171 + * composes the same shape from a frozen line item. Product feeds, plan
172 + * names and CLI output all need the product name alongside the variation,
173 + * and each was concatenating it themselves.
174 + *
175 + * @return string
176 + */
177 + public function getDisplayTitle(): string
178 + {
179 + $label = $this->getVariationLabel();
180 + $productTitle = $this->product ? (string) $this->product->post_title : '';
181 +
182 + if ($productTitle === '' || $productTitle === $label) {
183 + return $label;
184 + }
185 +
186 + if ($label === '') {
187 + return $productTitle;
188 + }
189 +
190 + return $productTitle . ' - ' . $label;
191 + }
192 +
193 + /**
134 194 * One2One: Product Variation belongs to one Product detail
135 195 *
136 196 * @return \FluentCart\Framework\Database\Orm\Relations\BelongsTo
137 197 */
@@ -152,8 +212,13 @@
152 212 ->where('product_variation_id', 'like', '%' . $this->id . '%')
153 213 ->orWhereNull('product_variation_id')
154 214 ->orWhere('product_variation_id', '[]');
155 215
216 + }
217 +
218 + public function attrRelations(): \FluentCart\Framework\Database\Orm\Relations\HasMany
219 + {
220 + return $this->hasMany(AttributeRelation::class, 'object_id', 'id');
156 221 }
157 222
158 223 public function order_items()
159 224 {