Packages/RbnFactory — içerik fabrikası ayarı ve VPS sözleşmesi
Kapsam: Bu sayfa yalnız fabrika ayar dosyasındaki
directionbloğunun VPS'e giden alanlarını anlatır. Paketin tam dosya envanteri henüz yazılmadı.
Kaynak klasör:Packages/RbnFactory/· ayar örneği:Packages/RbnFactory/factory-settings.example.php
direction.site_domain — sitenin kendi alan adı
| Ayar | Jobs yanıtı alanı | Eşleme |
|---|---|---|
direction.site_domain |
site_alan_adi |
Models/FactoryContract.php (FIELDS), değer Services/FactoryService.php içinde trim edilerek yazılır |
- Biçim: yalnız alan adı, ör.
site.com(şemasız,wwwöneksiz). - Ne işe yarar: VPS, yazının CTA ve bağlantılarında yalnız bu alan adını bilir; başka bir alan adı içeren yazıyı reddeder. Böylece model alan adı uyduramaz.
- Boş bırakılırsa:
site_alan_adiboş gider; VPS tarafında alan adı kuralı uygulanmaz (eski davranış). Canlı sitede doldurmanız önerilir. - Örnek:
'direction' => [
'site_note' => 'Sitenin konusu ve bölgesi hakkında kısa not',
'location' => '',
'site_domain' => 'site.com',
],
Yazı tarihleri — published_at ve modified_at (ZORUNLU sütunlar)
İçerik/yazı tablolarında published_at (yayın tarihi) ve modified_at (değişiklik tarihi) zorunlu sütunlardır. Çalışma zamanında "sütun var mı" diye bakan dal, created_at/updated_at yedeği ve "sütunsuz sitede eski davranış" YOKTUR: sütunları olmayan site blog sayfalarını çalıştıramaz (kurulum: aşağıda factory:published-at --apply). Yayındaki (is_active = 1) yazıda iki sütun HER ZAMAN dolu; pasif yazıda ikisi de NULL (public yüzeyde gösterilmez).
Kurallar (tek yol)
| Olay | published_at |
modified_at |
Kod |
|---|---|---|---|
| İlk yayın (fabrika cron'u) | şimdi | published_at ile aynı değer |
FactoryPostRepository::publishPost() (yalnız published_at IS NULL iken; yeniden yayınlayan iş tarihi ileri kaydırmaz) |
İlk yayın (panel / API: savePost ile is_active = 1) |
şimdi | published_at ile aynı |
ContentServiceTrait::savePost() → stampPostDates() |
| İlk yayın (otomatik görev hattı) | şimdi | published_at ile aynı |
AutoTaskTrait::publishPost() |
| Yayındaki yazının içeriği değişti | değişmez | şimdi | ContentServiceTrait::savePost() (içerik alanı eski değerden farklıysa) |
| Sayaç, aynı içerikle kayıt, kategori/görünürlük değişimi | değişmez | değişmez | — |
İçerik alanları: title, slug, summary, content, image, images, seo_title, seo_description, seo_keywords, cta, faqs, pros_cons, author_comment (JSON alanlar biçimden bağımsız karşılaştırılır). Panel (RbnStudio) düzenlemesi ve fabrika yenilemesi (FactoryAuditService::applyRenewal) aynı savePost yolundan geçer; yenileme published_at'i ileri taşımaz.
Okuma (FormatHelper, yedeksiz)
FormatHelper::publishedAt($post)yalnızpublished_atokur. Görünen yayın tarihi (enrichPost), JSON-LDdatePublished, RSSpubDate, kategori sırası ve liste/sitemap sıralaması buradan gelir.FormatHelper::modifiedAt($post)yalnızmodified_atokur. JSON-LDdateModified, sitemaplastmodveenrichPostiçindekimodified_date/time/relative(eskiupdated_*adları aynı değerle) buradan gelir.created_atveupdated_atHİÇBİR içerik tarihi çıktısında okunmaz (updated_atsayfa görüntüleme sayacı gibi teknik yazmalarla da yenilenir:ON UPDATE CURRENT_TIMESTAMP).- Liste sorgusu (
ContentQueryTrait::getPosts())published_at, modified_atseçer; varsayılan sıraORDER BY published_at DESC. - Yazı detayında "Güncelleme: …" metnini yalnız
modified_dateyayın gününden farklıysa gösterin; liste kartlarında göstermeyin.
Sitemap, feed, crawler
| Çıktı | Kaynak |
|---|---|
Sitemap lastmod |
Yalnız satırın modified_at değeri (FormatHelper::modifiedAt() → SitemapResolver::entryLastmod()): yazı, sayfa, ürün, kategori aynı kural. Tarihi olmayan girdide (ana sayfa, veri satırı olmayan rota) <lastmod> etiketi HİÇ basılmaz; SitemapBuilder üretim anı yazmaz. Sitemap indeksi her alt sitemap için o dosyadaki en büyük lastmod değerini yazar (SitemapResolver::getSummary()); girdisinde tarih olmayan alt sitemapte etiket yoktur. Özel getSitemapEntries() kendi sorgusunda published_at ile sıralar ve modified_at seçer. Sayfa/ürün/kategori tabloları için bkz. docs/Core/Database/Models.md §5.1 ($contentFields). |
RSS pubDate |
FormatHelper::publishedAt() → FormatHelper::toRfc822() (FeedResolver); tarih yoksa <pubDate> yazılmaz, lastBuildDate en yeni yazının tarihidir (üretim anı yazılmaz) |
JSON-LD datePublished / dateModified |
publishedAt() / modifiedAt() → SchemaBuilder::schema() değeri FormatHelper::toIso8601() ile yazar (2026-10-13T10:00:03+03:00, ISO 8601 + saat dilimi); boş tarih alanı düşer, blogPost() tarih uydurmaz |
İçerik adresi (sitemap loc, feed link/guid, llms.txt) |
TEK üretici CrawlerResolver::resolveEntryPath(): girdinin url değeri, yoksa kaynağın prefix ayarı (/blog/{category_slug}) + slug; {category_slug} girdinin category_id değerinden resolveCategorySlugMap() ile çözülür. Önek varsayımı yoktur: CrawlerMap kaynağında prefix verin; canonical bu adresle aynı olmalıdır |
| Kaynak sırası (sitemap/feed/llms) | CrawlerMap kaynağında order_by (içerik kaynağı için 'order_by' => 'published_at'); verilmezse birincil anahtar (CrawlerResolver::callServiceMethod()). Tarih sütunu varsayımı yoktur. |
CrawlerMap içerik kaynağı örneği:
'blog' => [
'model' => \Rbn\Project\App\Models\BlogPostModel::class,
'entries_method' => 'getSitemapEntries',
'order_by' => 'published_at',
// ...
],
Sütunları kurma ve eski yazıları doldurma
php rbn factory:published-at --project=<anahtar> [--type=blog] # plan (salt okunur)
php rbn factory:published-at --project=<anahtar> [--type=blog] --apply # sütunlar + indeks + doldurma
--applysütunları ekleyen TEK yerdir (FactorySchemaHandler):published_at DATETIME NULL(+ indeks) vemodified_at DATETIME NULL; sütun sırası kuralı için aşağıya bakın.- Doldurma yalnız yayındaki yazılara dokunur:
published_atboşsa fabrika yazısındaapp_factory_jobs.published_at, yoksascheduled_at, o da yoksacreated_atile doldurulur vemodified_ataynı değere eşitlenir;published_atdolu,modified_atboşsamodified_at = published_atolur.updated_atDEĞİŞMEZ (keepUnchanged). Pasif yazılara dokunulmaz. İkinci koşu 0 satır yazar. - Eski sitelerde bu komut çalıştırılmadan blog çalışmaz (geriye dönük uyum yok). Yüklemeden sonra
rbn cache:cleargerekir (sayfa, liste ve sitemap önbelleği).
Sütun sırası
Tablo kolon sırası kuralı (docs/kavramlar/03-veritabani-ve-kiracilik.md §8): son iki sütun sırayla updated_at, created_at. published_at ve modified_at updated_at'ten ÖNCE eklenir (FactorySchemaHandler::ensurePostPublishedAt() / ensurePostModifiedAt(), AFTER koddan hesaplanır). Sütun yanlış yerdeyse (örneğin sonda) factory:published-at --apply MODIFY … AFTER ile taşır ve created_at'i tablonun sonuna alır (ensurePostTimestampTail(); veri, tip ve ON UPDATE CURRENT_TIMESTAMP korunur); plan çıktısındaki "sütun sırası" sütunu doğru/YANLIŞ gösterir.
Kapı testi
fw-regresyon\birim\fw_icerik_tarihi_tek_kaynak.php: K1-K2 tarih çıktısında updated_at kırmızı; K3 publishedAt() / modifiedAt() yalnız kendi sütununu okur; K4 modified_at ham okuması yalnız izinli dosyalarda; K5 framework (Core/Packages/Bundles) ve proje kodunda tarih bağlamında çalışma zamanı sütun denetimi (hasColumn, hasPublishedAt…), published_at/modified_at için ?? yedeği, aynı satırda created_at/updated_at yedeği ve COALESCE(published_at|modified_at|created_at) YASAK (baseline yok; tek istisna sütunu ekleyen FactorySchemaHandler).
Sürüm notu: .github/UPGRADING.md ve .github/CHANGELOG.md [Unreleased].