adding attributes
This commit is contained in:
parent
4ff5a67fda
commit
64ddd5bb01
|
|
@ -26,6 +26,10 @@ public function index()
|
||||||
$m1Categories = $this->migrationService->getMagento1Categories();
|
$m1Categories = $this->migrationService->getMagento1Categories();
|
||||||
$m2Categories = $this->migrationService->getMagento2Categories();
|
$m2Categories = $this->migrationService->getMagento2Categories();
|
||||||
$m2CategoriesNotInM1 = $this->migrationService->getM2CategoriesNotInM1();
|
$m2CategoriesNotInM1 = $this->migrationService->getM2CategoriesNotInM1();
|
||||||
|
$m1Attributes = $this->migrationService->getMagento1Attributes();
|
||||||
|
$m2Attributes = $this->migrationService->getMagento2Attributes();
|
||||||
|
$m1AttributeGroups = $this->migrationService->getMagento1AttributeGroups();
|
||||||
|
$m2AttributeGroups = $this->migrationService->getMagento2AttributeGroups();
|
||||||
|
|
||||||
return view('migration.index', [
|
return view('migration.index', [
|
||||||
'm1Stores' => $m1Stores,
|
'm1Stores' => $m1Stores,
|
||||||
|
|
@ -34,6 +38,10 @@ public function index()
|
||||||
'm1CategoriesCount' => $m1Categories->count(),
|
'm1CategoriesCount' => $m1Categories->count(),
|
||||||
'm2CategoriesCount' => $m2Categories->count(),
|
'm2CategoriesCount' => $m2Categories->count(),
|
||||||
'm2CategoriesNotInM1' => $m2CategoriesNotInM1,
|
'm2CategoriesNotInM1' => $m2CategoriesNotInM1,
|
||||||
|
'm1Attributes' => $m1Attributes,
|
||||||
|
'm2Attributes' => $m2Attributes,
|
||||||
|
'm1AttributeGroups' => $m1AttributeGroups,
|
||||||
|
'm2AttributeGroups' => $m2AttributeGroups,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -968,6 +968,180 @@ public function testConnections()
|
||||||
return $results;
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all category attributes from Magento 1
|
||||||
|
*/
|
||||||
|
public function getMagento1Attributes()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// Get entity type ID for catalog_category
|
||||||
|
$entityTypeId = DB::connection($this->magento1Connection)
|
||||||
|
->table($this->magento1Prefix . 'eav_entity_type')
|
||||||
|
->where('entity_type_code', 'catalog_category')
|
||||||
|
->value('entity_type_id');
|
||||||
|
|
||||||
|
if (!$entityTypeId) {
|
||||||
|
return collect([]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get all attributes for catalog_category
|
||||||
|
$attributes = DB::connection($this->magento1Connection)
|
||||||
|
->table($this->magento1Prefix . 'eav_attribute')
|
||||||
|
->where('entity_type_id', $entityTypeId)
|
||||||
|
->select('attribute_id', 'attribute_code', 'backend_type', 'frontend_input', 'frontend_label', 'is_required', 'is_user_defined', 'default_value')
|
||||||
|
->orderBy('attribute_code')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return $attributes;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
Log::error('Error fetching Magento 1 attributes: ' . $e->getMessage());
|
||||||
|
return collect([]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all category attributes from Magento 2
|
||||||
|
*/
|
||||||
|
public function getMagento2Attributes()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// Get entity type ID for catalog_category
|
||||||
|
$entityTypeId = DB::connection($this->magento2Connection)
|
||||||
|
->table($this->magento2Prefix . 'eav_entity_type')
|
||||||
|
->where('entity_type_code', 'catalog_category')
|
||||||
|
->value('entity_type_id');
|
||||||
|
|
||||||
|
if (!$entityTypeId) {
|
||||||
|
return collect([]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get all attributes for catalog_category
|
||||||
|
$attributes = DB::connection($this->magento2Connection)
|
||||||
|
->table($this->magento2Prefix . 'eav_attribute')
|
||||||
|
->where('entity_type_id', $entityTypeId)
|
||||||
|
->select('attribute_id', 'attribute_code', 'backend_type', 'frontend_input', 'frontend_label', 'is_required', 'is_user_defined', 'default_value')
|
||||||
|
->orderBy('attribute_code')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return $attributes;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
Log::error('Error fetching Magento 2 attributes: ' . $e->getMessage());
|
||||||
|
return collect([]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get attribute groups from Magento 1
|
||||||
|
*/
|
||||||
|
public function getMagento1AttributeGroups()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// Get entity type ID for catalog_category
|
||||||
|
$entityTypeId = DB::connection($this->magento1Connection)
|
||||||
|
->table($this->magento1Prefix . 'eav_entity_type')
|
||||||
|
->where('entity_type_code', 'catalog_category')
|
||||||
|
->value('entity_type_id');
|
||||||
|
|
||||||
|
if (!$entityTypeId) {
|
||||||
|
return collect([]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get attribute sets for catalog_category
|
||||||
|
$attributeSets = DB::connection($this->magento1Connection)
|
||||||
|
->table($this->magento1Prefix . 'eav_attribute_set')
|
||||||
|
->where('entity_type_id', $entityTypeId)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$groups = collect([]);
|
||||||
|
|
||||||
|
foreach ($attributeSets as $set) {
|
||||||
|
// Get attribute groups for this set
|
||||||
|
$setGroups = DB::connection($this->magento1Connection)
|
||||||
|
->table($this->magento1Prefix . 'eav_attribute_group')
|
||||||
|
->where('attribute_set_id', $set->attribute_set_id)
|
||||||
|
->select('attribute_group_id', 'attribute_set_id', 'attribute_group_name', 'sort_order')
|
||||||
|
->orderBy('sort_order')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
foreach ($setGroups as $group) {
|
||||||
|
// Get attributes in this group
|
||||||
|
$attributeIds = DB::connection($this->magento1Connection)
|
||||||
|
->table($this->magento1Prefix . 'eav_entity_attribute')
|
||||||
|
->where('attribute_set_id', $set->attribute_set_id)
|
||||||
|
->where('attribute_group_id', $group->attribute_group_id)
|
||||||
|
->pluck('attribute_id')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
$group->attribute_set_name = $set->attribute_set_name ?? 'Default';
|
||||||
|
$group->attribute_count = count($attributeIds);
|
||||||
|
$group->attribute_ids = $attributeIds;
|
||||||
|
$groups->push($group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $groups;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
Log::error('Error fetching Magento 1 attribute groups: ' . $e->getMessage());
|
||||||
|
return collect([]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get attribute groups from Magento 2
|
||||||
|
*/
|
||||||
|
public function getMagento2AttributeGroups()
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
// Get entity type ID for catalog_category
|
||||||
|
$entityTypeId = DB::connection($this->magento2Connection)
|
||||||
|
->table($this->magento2Prefix . 'eav_entity_type')
|
||||||
|
->where('entity_type_code', 'catalog_category')
|
||||||
|
->value('entity_type_id');
|
||||||
|
|
||||||
|
if (!$entityTypeId) {
|
||||||
|
return collect([]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get attribute sets for catalog_category
|
||||||
|
$attributeSets = DB::connection($this->magento2Connection)
|
||||||
|
->table($this->magento2Prefix . 'eav_attribute_set')
|
||||||
|
->where('entity_type_id', $entityTypeId)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
$groups = collect([]);
|
||||||
|
|
||||||
|
foreach ($attributeSets as $set) {
|
||||||
|
// Get attribute groups for this set
|
||||||
|
$setGroups = DB::connection($this->magento2Connection)
|
||||||
|
->table($this->magento2Prefix . 'eav_attribute_group')
|
||||||
|
->where('attribute_set_id', $set->attribute_set_id)
|
||||||
|
->select('attribute_group_id', 'attribute_set_id', 'attribute_group_name', 'sort_order')
|
||||||
|
->orderBy('sort_order')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
foreach ($setGroups as $group) {
|
||||||
|
// Get attributes in this group
|
||||||
|
$attributeIds = DB::connection($this->magento2Connection)
|
||||||
|
->table($this->magento2Prefix . 'eav_entity_attribute')
|
||||||
|
->where('attribute_set_id', $set->attribute_set_id)
|
||||||
|
->where('attribute_group_id', $group->attribute_group_id)
|
||||||
|
->pluck('attribute_id')
|
||||||
|
->toArray();
|
||||||
|
|
||||||
|
$group->attribute_set_name = $set->attribute_set_name ?? 'Default';
|
||||||
|
$group->attribute_count = count($attributeIds);
|
||||||
|
$group->attribute_ids = $attributeIds;
|
||||||
|
$groups->push($group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $groups;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
Log::error('Error fetching Magento 2 attribute groups: ' . $e->getMessage());
|
||||||
|
return collect([]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively delete all children of a category
|
* Recursively delete all children of a category
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -499,6 +499,7 @@
|
||||||
<button class="tab active" onclick="switchTab('connections', this)">Database Connections</button>
|
<button class="tab active" onclick="switchTab('connections', this)">Database Connections</button>
|
||||||
<button class="tab" onclick="switchTab('categories', this)">Category Trees</button>
|
<button class="tab" onclick="switchTab('categories', this)">Category Trees</button>
|
||||||
<button class="tab" onclick="switchTab('migration', this)">Category Migration</button>
|
<button class="tab" onclick="switchTab('migration', this)">Category Migration</button>
|
||||||
|
<button class="tab" onclick="switchTab('attributes', this)">Attribute List</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Database Connections Tab -->
|
<!-- Database Connections Tab -->
|
||||||
|
|
@ -735,6 +736,185 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Attribute List Tab -->
|
||||||
|
<div id="tab-attributes" class="tab-content">
|
||||||
|
<!-- Attribute Groups Section -->
|
||||||
|
<div class="section">
|
||||||
|
<h2>📦 Attribute Groups</h2>
|
||||||
|
<p>View attribute groups that organize attributes within attribute sets:</p>
|
||||||
|
|
||||||
|
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px;">
|
||||||
|
<!-- Magento 1 Attribute Groups -->
|
||||||
|
<div>
|
||||||
|
<h3 style="margin-bottom: 15px; color: #667eea;">Magento 1 Attribute Groups ({{ $m1AttributeGroups->count() }})</h3>
|
||||||
|
<div style="background: white; border: 1px solid #ddd; border-radius: 6px; padding: 20px; max-height: 600px; overflow-y: auto;">
|
||||||
|
@if($m1AttributeGroups->count() > 0)
|
||||||
|
<table style="width: 100%; border-collapse: collapse;">
|
||||||
|
<thead>
|
||||||
|
<tr style="background: #f8f9fa; border-bottom: 2px solid #dee2e6;">
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Group ID</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Group Name</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Attribute Set</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Attributes</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Sort Order</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($m1AttributeGroups as $group)
|
||||||
|
<tr style="border-bottom: 1px solid #e0e0e0;">
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">{{ $group->attribute_group_id }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; font-weight: 500; color: #667eea;">{{ $group->attribute_group_name ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; color: #666;">{{ $group->attribute_set_name ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">
|
||||||
|
<span style="font-weight: 600; color: #667eea;">{{ $group->attribute_count ?? 0 }}</span>
|
||||||
|
</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; color: #666;">{{ $group->sort_order ?? 'N/A' }}</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
@else
|
||||||
|
<div style="text-align: center; padding: 40px; color: #999;">
|
||||||
|
No attribute groups found. Please check your database connection.
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Magento 2 Attribute Groups -->
|
||||||
|
<div>
|
||||||
|
<h3 style="margin-bottom: 15px; color: #764ba2;">Magento 2 Attribute Groups ({{ $m2AttributeGroups->count() }})</h3>
|
||||||
|
<div style="background: white; border: 1px solid #ddd; border-radius: 6px; padding: 20px; max-height: 600px; overflow-y: auto;">
|
||||||
|
@if($m2AttributeGroups->count() > 0)
|
||||||
|
<table style="width: 100%; border-collapse: collapse;">
|
||||||
|
<thead>
|
||||||
|
<tr style="background: #f8f9fa; border-bottom: 2px solid #dee2e6;">
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Group ID</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Group Name</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Attribute Set</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Attributes</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Sort Order</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($m2AttributeGroups as $group)
|
||||||
|
<tr style="border-bottom: 1px solid #e0e0e0;">
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">{{ $group->attribute_group_id }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; font-weight: 500; color: #764ba2;">{{ $group->attribute_group_name ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; color: #666;">{{ $group->attribute_set_name ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">
|
||||||
|
<span style="font-weight: 600; color: #764ba2;">{{ $group->attribute_count ?? 0 }}</span>
|
||||||
|
</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; color: #666;">{{ $group->sort_order ?? 'N/A' }}</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
@else
|
||||||
|
<div style="text-align: center; padding: 40px; color: #999;">
|
||||||
|
No attribute groups found. Please check your database connection.
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Category Attributes Section -->
|
||||||
|
<div class="section" style="margin-top: 30px;">
|
||||||
|
<h2>📋 Category Attributes</h2>
|
||||||
|
<p>View all category attributes from Magento 1 and Magento 2</p>
|
||||||
|
|
||||||
|
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px;">
|
||||||
|
<!-- Magento 1 Attributes -->
|
||||||
|
<div>
|
||||||
|
<h3 style="margin-bottom: 15px; color: #667eea;">Magento 1 Attributes ({{ $m1Attributes->count() }})</h3>
|
||||||
|
<div style="background: white; border: 1px solid #ddd; border-radius: 6px; padding: 20px; max-height: 600px; overflow-y: auto;">
|
||||||
|
@if($m1Attributes->count() > 0)
|
||||||
|
<table style="width: 100%; border-collapse: collapse;">
|
||||||
|
<thead>
|
||||||
|
<tr style="background: #f8f9fa; border-bottom: 2px solid #dee2e6;">
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">ID</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Code</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Label</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Type</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Input</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Required</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($m1Attributes as $attr)
|
||||||
|
<tr style="border-bottom: 1px solid #e0e0e0;">
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">{{ $attr->attribute_id }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; font-weight: 500; color: #667eea;">{{ $attr->attribute_code }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">{{ $attr->frontend_label ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; color: #666;">{{ $attr->backend_type ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; color: #666;">{{ $attr->frontend_input ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">
|
||||||
|
@if($attr->is_required ?? 0)
|
||||||
|
<span style="color: #d32f2f; font-weight: 600;">Yes</span>
|
||||||
|
@else
|
||||||
|
<span style="color: #666;">No</span>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
@else
|
||||||
|
<div style="text-align: center; padding: 40px; color: #999;">
|
||||||
|
No attributes found. Please check your database connection.
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Magento 2 Attributes -->
|
||||||
|
<div>
|
||||||
|
<h3 style="margin-bottom: 15px; color: #764ba2;">Magento 2 Attributes ({{ $m2Attributes->count() }})</h3>
|
||||||
|
<div style="background: white; border: 1px solid #ddd; border-radius: 6px; padding: 20px; max-height: 600px; overflow-y: auto;">
|
||||||
|
@if($m2Attributes->count() > 0)
|
||||||
|
<table style="width: 100%; border-collapse: collapse;">
|
||||||
|
<thead>
|
||||||
|
<tr style="background: #f8f9fa; border-bottom: 2px solid #dee2e6;">
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">ID</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Code</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Label</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Type</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Input</th>
|
||||||
|
<th style="padding: 10px; text-align: left; font-weight: 600; color: #333; font-size: 0.9em;">Required</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($m2Attributes as $attr)
|
||||||
|
<tr style="border-bottom: 1px solid #e0e0e0;">
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">{{ $attr->attribute_id }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; font-weight: 500; color: #764ba2;">{{ $attr->attribute_code }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">{{ $attr->frontend_label ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; color: #666;">{{ $attr->backend_type ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em; color: #666;">{{ $attr->frontend_input ?? 'N/A' }}</td>
|
||||||
|
<td style="padding: 8px 10px; font-size: 0.85em;">
|
||||||
|
@if($attr->is_required ?? 0)
|
||||||
|
<span style="color: #d32f2f; font-weight: 600;">Yes</span>
|
||||||
|
@else
|
||||||
|
<span style="color: #666;">No</span>
|
||||||
|
@endif
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
@else
|
||||||
|
<div style="text-align: center; padding: 40px; color: #999;">
|
||||||
|
No attributes found. Please check your database connection.
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue