Tarih: 2025-11-28
Hedef: Gerizekalı AI bile anlasın!
$tenant = App\Models\Tenant::find(2);
tenancy()->initialize($tenant);
$product = Modules\Shop\App\Models\ShopProduct::find(332);
KURAL:
⚠️ 11 KURAL FORMÜLÜ KULLAN: https://ixtif.com/readme/2025/11/26/11-kural-formulu/
SATIŞ ODAKLI GÖRSEL YAKLAŞIMI:
Bu formül SATIŞ amaçlı görseller için optimize edilmiştir.
Temiz, modern, profesyonel ortamlar. Kusursuz gibi gerçekçi ama minimal kusurlu.
❌ Orijinal 11 Kural (Belgesel Yaklaşım):
✅ SHOP Adaptasyonu (Satış Yaklaşım):
🔑 ANA FARK:
⚠️ ÖNEMLİ NOTLAR:
$leonardoService = app(\App\Services\Media\LeonardoAIService::class);
// 🔴 11 KURAL FORMÜLÜ - SHOP İÇİN ADAPTASYON (YATAY 16:9!)
// ⚠️ KRİTİK: Görseller DİKEY DEĞİL YATAY olacak! (16:9 aspect ratio)
// ⚠️ PARÇA ODAKLI: İnsan arka planda bulanık, parçalar ön planda keskin!
$prompt = "Cinematic widescreen product photography of forklift axle shaft covers systematically organized on professional industrial metal racking, hero component sharp and prominent in right third with multiple identical units creating rhythm and depth across frame, technician silhouette subtly visible in far background left adding scale and human context without distraction, dramatic golden hour sunlight streaming from high windows creating volumetric atmosphere and metallic highlights, shot from slightly elevated perspective using wide-angle lens emphasizing warehouse breadth and inventory organization, rule of thirds composition with main product at right golden ratio point and leading lines through shelving system, Canon EOS R5 with 24mm f/1.4L wide lens at f/2.8 for context sharpness with atmospheric depth, Kodak Portra 400 cinematic aesthetic delivering warm professional catalog tones with fine grain texture, minimal optical character - subtle vignetting gentle atmospheric haze natural light bloom on metal surfaces, mood of premium industrial supply and systematic professional inventory management, sophisticated color grading with lifted blacks warm highlights teal-orange cinematic separation --ar 16:9 --style raw";
$imageData = $leonardoService->generateFromPrompt($prompt, [
'width' => 1456, // 16:9 aspect ratio
'height' => 816,
'style' => 'cinematic'
]);
$image2Data = $leonardoService->generateFromPrompt($prompt2, [
'width' => 1024,
'height' => 1024,
'style' => 'cinematic'
]);
11 KURAL KONTROL (SHOP ADAPTASYONU):
⚠️ ÖNEMLİ: Kural 9 değişmedi, sadece SHOP için adaptasyon yaptık!
⚠️ $image1Data şu formatta döner:
array:2 [
"url" => "https://cdn.leonardo.ai/users/52776fa4-xxx/image.jpg" // ← LEONARDO CDN LINK!
"content" => (binary image data)
]
YANLIŞ:
<img src="https://cdn.leonardo.ai/users/52776fa4.../image.jpg"> ❌❌❌
DOĞRU:
// Leonardo'dan gelen görseli DOWNLOAD ET
$imageContent = $image1Data['content']; // Binary data
// Geçici dosyaya kaydet
$tempPath = '/tmp/product-332-image-1.jpg';
file_put_contents($tempPath, $imageContent);
// Spatie Media Library ile SISTEME YÜKLE
$media1 = $product->addMedia($tempPath)
->usingName('Akson Keçe Kapağı 422 - Workshop Scene')
->usingFileName('akson-kece-kapagi-422-workshop.jpg')
->withCustomProperties([
'alt' => 'Forklift Akson Keçe Kapağı 422 Montaj Görseli',
'title' => 'Akson Keçe Kapağı 422 - Profesyonel Montaj'
])
->toMediaCollection('gallery');
// İXTİF.COM LINK AL
$ixtifImage1Url = $media1->getFullUrl();
// https://ixtif.com/storage/tenant2/987/akson-kece-kapagi-422-workshop.jpg
echo "✅ Görsel sisteme yüklendi: " . $ixtifImage1Url;
$bodyTR = "<section class='mb-20'>
<div class='grid lg:grid-cols-3 gap-8'>
<div class='lg:col-span-2'>
<p>Akson Keçe Kapağı 422 serisi...</p>
</div>
<div>
<div class='sticky top-24'>
<a href='" . $ixtifImage1Url . "' class='glightbox'>
<img src='" . $ixtifImage1Url . "'
alt='Forklift Akson Keçe Kapağı 422'
loading='lazy' />
</a>
</div>
</div>
</div>
</section>
<!-- 2. Görsel -->
<section>
<img src='" . $ixtifImage2Url . "' alt='...' />
</section>";
$seo = $product->getOrCreateSeoSetting();
$seo->update([
'titles' => [
'tr' => 'Forklift Akson Keçe Kapağı 422 | OEM Kalite Yedek Parça',
'en' => 'Forklift Axle Seal Cover 422 | OEM Quality Spare Part'
],
'descriptions' => [
'tr' => 'Forklift arka dingil akson keçe kapağı 422 serisi...',
'en' => 'Forklift rear axle seal cover 422 series...'
],
'keywords' => [
'tr' => 'forklift, yedek parça, akson kapağı, keçe kapağı, 422',
'en' => 'forklift, spare part, axle cover, seal cover, 422'
],
'og_titles' => [
'tr' => 'Akson Keçe Kapağı - 422',
'en' => 'Axle Seal Cover - 422'
],
'og_descriptions' => [
'tr' => 'Forklift arka dingil sistemleri için yüksek kalite keçe kapağı.',
'en' => 'High quality seal cover for forklift rear axle systems.'
],
'focus_keywords' => [
'tr' => ['forklift', 'yedek parça', 'akson kapağı', 'keçe'],
'en' => ['forklift', 'spare part', 'axle cover', 'seal']
],
'schema_type' => ['Product'],
'robots_meta' => ['index', 'follow'],
]);
⚠️ DETAYLI BODY YAPISI ZORUNLU!
🎨 TASARIM KURALLARI:
📋 BODY YAPISI - TAM HTML ÖRNEĞİ:
⚠️ Aşağıdaki template'i AYNEN kullan! Sadece içerikleri değiştir, HTML yapısını ASLA değiştirme!
<div class="prose max-w-none">
<!-- 1. TANITIM + GÖRSEL -->
<section class="mb-20">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
<div class="lg:col-span-2">
<p class="text-lg text-gray-700 dark:text-gray-300 leading-relaxed mb-5">
<strong class="text-gray-900 dark:text-gray-100 font-semibold">[Ürün Adı Serisi]</strong>, [genel tanıtım cümlesi]. <strong class="text-gray-900 dark:text-gray-100 font-semibold">[Önemli özellik]</strong> [devam eden açıklama].
</p>
<p class="text-lg text-gray-700 dark:text-gray-300 leading-relaxed mb-5">
[İkinci paragraf detaylar...]
</p>
<p class="text-lg text-gray-700 dark:text-gray-300 leading-relaxed">
[Üçüncü paragraf kullanım alanları...]
</p>
</div>
<div class="lg:col-span-1">
<div class="sticky top-24">
<a href="https://ixtif.com/storage/tenant2/XXX/image.jpg" class="glightbox" data-gallery="product-gallery">
<img src="https://ixtif.com/storage/tenant2/XXX/image.jpg"
alt="[Ürün Adı]"
class="w-full rounded-xl object-cover shadow-lg hover:shadow-2xl transition-shadow duration-300"
loading="lazy">
</a>
<p class="text-sm text-gray-500 dark:text-gray-400 mt-3 italic text-center">[Ürün Adı]</p>
</div>
</div>
</div>
</section>
<!-- 2. SORUNLAR VE ÇÖZÜMLER -->
<section class="mb-20">
<h2 class="text-3xl font-bold text-gray-900 dark:text-gray-100 mb-8">
<i class="fas fa-lightbulb mr-3 text-blue-500"></i>Yaygın Sorunlar ve Çözümler
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
<div class="bg-gray-50 dark:bg-gray-800 p-6 rounded-lg border-2 border-gray-200 dark:border-gray-700 hover:border-blue-400 transition-all text-center">
<i class="fas fa-[icon] text-red-500 text-5xl mb-4"></i>
<h4 class="font-semibold text-lg mb-2 text-gray-900 dark:text-gray-100">[Sorun Başlığı]</h4>
<p class="text-gray-600 dark:text-gray-400">[Sorun açıklaması]</p>
</div>
<!-- 3 tane daha aynı kart (toplam 4) -->
</div>
<div class="bg-gradient-to-br from-blue-500 to-blue-600 p-8 rounded-xl text-white shadow-lg">
<h3 class="font-semibold text-2xl mb-4 flex items-center gap-3">
<i class="fas fa-check-circle text-3xl"></i> İXTİF Çözümü
</h3>
<p class="text-lg leading-relaxed">
<span class="font-semibold">[Ürün Adı]</span> ile [çözüm açıklaması]. <span class="font-semibold">[vurgu]</span> [devam].
</p>
</div>
</section>
<!-- 3. ÖZELLİKLER -->
<section class="mb-20">
<h2 class="text-3xl font-bold text-gray-900 dark:text-gray-100 mb-8">
<i class="fas fa-fire mr-3 text-blue-500"></i>Neden Bu Ürünü Tercih Etmelisiniz?
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<div class="bg-gray-50 dark:bg-gray-800 p-6 rounded-lg border-2 border-gray-200 dark:border-gray-700 hover:border-blue-500 hover:shadow-xl transition-all text-center">
<i class="fas fa-[icon] text-blue-500 text-5xl mb-4"></i>
<h4 class="font-semibold text-xl mb-2 text-gray-900 dark:text-gray-100">[Özellik Başlığı]</h4>
<p class="text-gray-600 dark:text-gray-400">[Özellik açıklaması]</p>
</div>
<!-- 5 tane daha aynı kart (toplam 6) -->
</div>
</section>
<!-- 4. KULLANIM ALANLARI -->
<section class="mb-20">
<h2 class="text-3xl font-bold text-gray-900 dark:text-gray-100 mb-8">
<i class="fas fa-industry mr-3 text-blue-500"></i>Kullanım Alanları
</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="bg-white/70 dark:bg-white/5 backdrop-blur-md p-6 rounded-xl border border-white/30 dark:border-white/10 hover:border-blue-400 transition-all">
<h4 class="font-semibold text-xl mb-3 text-gray-900 dark:text-white">
<i class="fas fa-[icon] mr-2 text-blue-500"></i>[Alan Başlığı]
</h4>
<p class="text-gray-700 dark:text-gray-300">[Alan açıklaması]</p>
</div>
<!-- 3 tane daha aynı kart (toplam 4) -->
<!-- ⚠️ TÜM KARTLAR AYNI RENK! GÖKKUŞAĞI YASAK! -->
</div>
</section>
<!-- 5. İLETİŞİM -->
<div class="bg-white/70 dark:bg-white/5 backdrop-blur-md border border-white/30 dark:border-white/10 p-8 rounded-xl">
<h3 class="text-2xl font-semibold text-gray-900 dark:text-white mb-4">[CTA Başlığı]</h3>
<p class="text-gray-700 dark:text-gray-300 mb-4 leading-relaxed">
[İlk paragraf...]
</p>
<p class="text-gray-700 dark:text-gray-300 leading-relaxed">
[İkinci paragraf...] <span class="font-semibold text-gray-900 dark:text-gray-100">Toplu siparişlerde özel indirim</span> [devam...]
</p>
</div>
</div>
⚠️ KRİTİK KURALLAR:
$product->update([
'title' => ['tr' => '...', 'en' => '...'],
'short_description' => ['tr' => '...', 'en' => '...'],
'body' => ['tr' => $bodyTR, 'en' => $bodyEN],
'primary_specs' => [
['label' => 'Malzeme', 'value' => 'Yüksek Kalite Keçe'],
['label' => 'Uyumluluk', 'value' => 'Forklift Dingil Sistemleri'],
['label' => 'Seri', 'value' => '422']
],
'faq_data' => [
[
'question' => ['tr' => '...', 'en' => '...'],
'answer' => ['tr' => '...', 'en' => '...']
]
],
'tags' => ['tr' => 'forklift, yedek parça, ...', 'en' => 'forklift, spare part, ...']
]);
Artisan::call('view:clear');
Artisan::call('responsecache:clear');
exec('curl -s -k https://ixtif.com/opcache-reset.php');
echo "✅ Tamamlandı! Sayfa: https://ixtif.com/shop/akson-kece-kapagi-422";
❌ YANLIŞ (String array):
$product->primary_specs = [
"tr" => ["OEM Kalite", "Yüksek Dayanıklılık"]
]; // ❌❌❌ BU HATALI!
✅ DOĞRU (Label/Value pairs):
$product->primary_specs = [
["label" => "Malzeme", "value" => "Yüksek Kalite Keçe"],
["label" => "Uyumluluk", "value" => "Forklift Dingil Sistemleri"],
["label" => "Seri", "value" => "422"],
["label" => "Kaplama", "value" => "Standart"]
]; // ✅✅✅ BU DOĞRU!
1. Tenant başlat + Ürün getir
2. İçerik oluştur (10K+ char, genel tanıtım)
3. Leonardo AI → 1 görsel üret (YATAY 16:9!)
4. ⚠️ Leonardo CDN linklerini KULLANMA!
5. file_put_contents() ile /tmp'ye kaydet
6. addMedia() ile Spatie Media Library'ye yükle
7. getFullUrl() ile ixtif.com linkini al
8. Body HTML'e gerçek linkleri embed et (TEMPLATE KULLAN!)
9. SEO ayarlarını doldur
10. Database'e kaydet
11. Cache temizle
12. Test et!
⚠️ ZORUNLU: Her ürün için progress log tut!
// İlk çalıştırmada log dosyası oluştur
$logFile = '/var/www/vhosts/tuufi.com/httpdocs/readme/claude-docs/shop-ai-progress.md';
if (!file_exists($logFile)) {
file_put_contents($logFile, "# Shop Product AI - Progress Log\n\nBaşlangıç: " . date('Y-m-d H:i:s') . "\n\n## Tamamlanan Ürünler\n\n");
}
// Her ürün tamamlandığında ekle
$logEntry = sprintf(
"- [✅] **Product %d** - %s\n - URL: https://ixtif.com/shop/%s\n - Tamamlanma: %s\n - Görsel: %s\n\n",
$product->product_id,
$product->getTranslation('title', 'tr'),
$product->getTranslation('slug', 'tr'),
date('Y-m-d H:i:s'),
$media->getFullUrl()
);
file_put_contents($logFile, $logEntry, FILE_APPEND);
echo "✅ Product {$product->product_id} tamamlandı ve log'a eklendi!\n";
Log Formatı Örneği:
# Shop Product AI - Progress Log
Başlangıç: 2025-11-28 06:00:00
## Tamamlanan Ürünler
- [✅] **Product 331** - Akson Mili Kapağı - 414
- URL: https://ixtif.com/shop/akson-mili-kapagi-414
- Tamamlanma: 2025-11-28 06:15:23
- Görsel: https://ixtif.com/storage/tenant2/1035/p331-akson-mili-kapagi-414-stock.jpg
- [✅] **Product 332** - Akson Keçe Kapağı - 422
- URL: https://ixtif.com/shop/akson-kece-kapagi-422
- Tamamlanma: 2025-11-28 06:18:45
- Görsel: https://ixtif.com/storage/tenant2/1036/p332-akson-kece-kapagi-422-stock.jpg
## İstatistikler
- Toplam işlenen: 2
- Başarılı: 2
- Hatalı: 0
⚠️ Sıralama:
// Sıradaki ürünü bul
$nextProduct = Modules\Shop\App\Models\ShopProduct::query()
->where('tenant_id', 2)
->whereRaw("JSON_UNQUOTE(JSON_EXTRACT(body, '$.tr')) IS NULL OR JSON_UNQUOTE(JSON_EXTRACT(body, '$.tr')) = ''")
->orderBy('product_id', 'ASC')
->first();
if ($nextProduct) {
echo "📌 Sıradaki ürün: Product {$nextProduct->product_id} - {$nextProduct->getTranslation('title', 'tr')}\n";
} else {
echo "🎉 TÜM ÜRÜNLER TAMAMLANDI!\n";
}