From 772462eeca3002a1d52508aeba485aab2b4742ad Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Tue, 03 Mar 2026 19:06:19 +0000
Subject: [PATCH] =MAJOR OVERHAUL. Likely should have made a new branch ages ago. Key changes: Registrar.php is the base for custom post types, taxonomies, and user roles. Replaces JVB_CONTENT, JVB_TAXONOMY, and JVB_USER constants, eliminates most of Features.php (except for JVB_SITE, JVB_MEMBERSHIP), and has built in sanitizing and validation via sub-classes. Also started a major overhaul of the Schema output. Created a shit ton of property traits and classes to help sanitize and ensure proper data for different schema types. Still a bunch to do, but better to be starting committing changes here on this other branch.

---
 inc/meta/Meta.php |   38 +++++++++++++++++++++++++++++++++++++-
 1 files changed, 37 insertions(+), 1 deletions(-)

diff --git a/inc/meta/Meta.php b/inc/meta/Meta.php
index 1316684..8984345 100644
--- a/inc/meta/Meta.php
+++ b/inc/meta/Meta.php
@@ -1,6 +1,8 @@
 <?php
 namespace JVBase\meta;
 
+use JVBase\registrar\Registrar;
+
 if (!defined('ABSPATH')) {
 	exit;
 }
@@ -245,7 +247,7 @@
 			return [];
 		}
 
-		return jvbGetFields($contentType ?? 'options', $objectType);
+		return Registrar::getFieldsFor($contentType??'options');
 	}
 
 	// ─────────────────────────────────────────────────────────────
@@ -276,6 +278,11 @@
 	 */
 	public function get(string $name): mixed
 	{
+		// Handle repeater subfield path
+		if (str_contains($name, ':')) {
+			return $this->getByPath($name);
+		}
+
 		// Check computed fields first
 		if (isset($this->computed[$name])) {
 			return ($this->computed[$name])($this);
@@ -301,6 +308,11 @@
 	 */
 	public function set(string $name, mixed $value): self
 	{
+		// Handle repeater subfield path (e.g., "services:2:image")
+		if (str_contains($name, ':')) {
+			return $this->setByPath($name, $value);
+		}
+
 		$config = $this->item->getFieldConfig($name);
 
 		if (!$config) {
@@ -442,6 +454,30 @@
 		return new Repeater($this, $name);
 	}
 
+	protected function setByPath(string $path, mixed $value): self
+	{
+		$parts = explode(':', $path, 3);
+		if (count($parts) !== 3) {
+			return $this;
+		}
+
+		[$repeaterName, $rowIndex, $subField] = $parts;
+		$this->repeater($repeaterName)->setField((int) $rowIndex, $subField, $value);
+
+		return $this;
+	}
+
+	protected function getByPath(string $path): mixed
+	{
+		$parts = explode(':', $path, 3);
+		if (count($parts) !== 3) {
+			return null;
+		}
+
+		[$repeaterName, $rowIndex, $subField] = $parts;
+		return $this->repeater($repeaterName)->field((int) $rowIndex, $subField);
+	}
+
 	// ─────────────────────────────────────────────────────────────
 	// Utility Methods
 	// ─────────────────────────────────────────────────────────────

--
Gitblit v1.10.0