Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
77a6f18
initial commit for jacademyseo_opengraph plugin for joomla seo improv…
shahzan01 Jun 2, 2025
eb22627
feat : added manifest and language files for jacademyseo_opengraph pl…
shahzan01 Jun 3, 2025
ece1af5
fix : rename plugin to opengraph and update language files
shahzan01 Jun 4, 2025
905cca3
fix : file name changed to opengraph.php
shahzan01 Jun 4, 2025
085ff65
feat: added forms for article and category to opengraph plugin
shahzan01 Jun 5, 2025
8cb7864
feat : add og tag injection into html
shahzan01 Jun 12, 2025
ce47b06
fix : added docblocks and comments
shahzan01 Jun 16, 2025
7ba727c
feat : form improvements - custom fields mapping and manual override …
shahzan01 Jun 18, 2025
768a2bf
feat : created opengraph service interface and field type for opengra…
shahzan01 Jun 19, 2025
6b71fbf
feat: add opengraph field mapping and form changes
shahzan01 Jun 24, 2025
2fac558
fix : updated form and used the interface check to render form
shahzan01 Jun 24, 2025
4b65016
Segregate fields for opengraph into different form dropdowns
shahzan01 Jun 26, 2025
89149f9
fix : Separated the mapping form and conditionally combined them only…
shahzan01 Jul 1, 2025
b05a861
fix : forms now correclty save values in both category and article
shahzan01 Jul 2, 2025
b41f698
feat : added custom fields options to opengraph mappings and used gro…
shahzan01 Jul 3, 2025
a6e28cd
fix : made some changes to the form and made isSupported function mor…
shahzan01 Jul 8, 2025
fea4185
feat : implemented the OGInterface in com_menus
shahzan01 Jul 8, 2025
6d37b9b
feat: add custom fields filtering to opengraph field
shahzan01 Jul 14, 2025
7cfde55
feat : og tag injection into html
shahzan01 Jul 17, 2025
1f95b29
fix : used the component helper to get the article and category
shahzan01 Jul 22, 2025
19fe1f7
fix : get custom fields for the respective category in dropdown
shahzan01 Jul 23, 2025
cbbff6c
Chore: Apply PHP-CS-Fixer formatting across the codebase
shahzan01 Jul 23, 2025
419dfa7
Chore: Normalize line endings and fix code style via PHPCBF
shahzan01 Jul 23, 2025
928ad4b
feat : add string sanitization and truncate to the plugin
shahzan01 Jul 29, 2025
063adfa
fix : sorted language strings
shahzan01 Jul 29, 2025
8a9441b
feat : added the javascript to auto update the placeholder values in …
shahzan01 Jul 31, 2025
30689d6
feat : added script for OpenGraph placeholder in build folder
shahzan01 Aug 5, 2025
8f94056
removed the custom field logic from this branch
shahzan01 Aug 5, 2025
c215b7a
fix : fix some bugs and modified the plugins settings page
shahzan01 Aug 7, 2025
53b3576
chore : changed opengraph.xml to use JYES/JNO instead of JENABLED/JDI…
shahzan01 Aug 7, 2025
9db1b2c
feat : added global default option in the settings and refactored Ope…
shahzan01 Aug 11, 2025
ff3a891
feat : made the OpenGraph field more flexible , removed hardcoded com…
shahzan01 Aug 15, 2025
3e47961
feat : added support for multi article page view
shahzan01 Sep 1, 2025
e63a335
fix : run php-cs-fixer and sorted language strings
shahzan01 Sep 1, 2025
e2f0c94
Merge remote-tracking branch 'Academy2025_SEO/6.1-dev' into academy/2…
bembelimen Sep 12, 2025
7e7aaea
fix : Check PHP code style fixes
shahzan01 Sep 15, 2025
775bc4b
Merge branch 'feature/seo-improvements' of https://github.com/joomla-…
shahzan01 Sep 15, 2025
0f8c467
fix : removed the phpstan error
shahzan01 Sep 15, 2025
64bf434
fix : many minor fixes and improvements for SEO plugin
shahzan01 Sep 30, 2025
a635837
fix : PHP-CS-Fixer applied
shahzan01 Sep 30, 2025
5b33522
fixed the function call to include the missing parameter.
shahzan01 Sep 30, 2025
27b2c30
fix : removed the hardcoded component name 'com_content' to make it d…
shahzan01 Sep 30, 2025
a8d5996
fix : made the OpenGraph plugin more generic to support other content…
shahzan01 Oct 1, 2025
10b1014
fix : added fallback for getModelName method if not exists in component
shahzan01 Oct 1, 2025
bdc382e
fix : changed $cmp to $component to avoid confusion and potential iss…
shahzan01 Oct 1, 2025
b721d72
fix : minor fixes and improvements
shahzan01 Oct 2, 2025
78a4e3b
fix : added getmodelname method to opengraph service interface and re…
shahzan01 Oct 3, 2025
1a98cc5
fix : add getModelName to MenusComponent
shahzan01 Oct 3, 2025
edd13bf
fix : Rename opengraph.php to Opengraph.php for consistency
shahzan01 Oct 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -107,3 +107,6 @@ cypress.config.mjs

# WebAuthn FIDO metadata cache
/plugins/system/webauthn/fido.jwt
cccsocialmedia
administrator/language/en-GB/en-GB.plg_system_cccsocialmedia.ini
administrator/language/en-GB/en-GB.plg_system_cccsocialmedia.sys.ini
112 changes: 19 additions & 93 deletions plugins/system/opengraph/language/en-GB/plg_system_opengraph.ini
Original file line number Diff line number Diff line change
Expand Up @@ -35,43 +35,10 @@ PLG_SYSTEM_OPENGRAPH_ENABLE_CATEGORY_OVERRIDE_DESC="Allow categories to have cus
PLG_SYSTEM_OPENGRAPH_FALLBACK_TO_SITE_LOGO="Use Site Logo as Fallback"
PLG_SYSTEM_OPENGRAPH_FALLBACK_TO_SITE_LOGO_DESC="When no OG image is specified, use the site's logo as fallback image. If disabled, no image tag will be generated."

; Custom Fields Labels (for reference)
PLG_SYSTEM_OPENGRAPH_FIELD_OG_TITLE="Open Graph Title"
PLG_SYSTEM_OPENGRAPH_FIELD_OG_TITLE_DESC="Custom title for Open Graph sharing. Leave empty to use article title."

PLG_SYSTEM_OPENGRAPH_FIELD_OG_DESCRIPTION="Open Graph Description"
PLG_SYSTEM_OPENGRAPH_FIELD_OG_DESCRIPTION_DESC="Custom description for Open Graph sharing. Leave empty to use article meta description or intro text."

PLG_SYSTEM_OPENGRAPH_FIELD_OG_IMAGE="Open Graph Image"
PLG_SYSTEM_OPENGRAPH_FIELD_OG_IMAGE_DESC="Custom image for Open Graph sharing. Leave empty to use article intro image or site logo."

; Error Messages
PLG_SYSTEM_OPENGRAPH_ERROR_INVALID_CATEGORY="Invalid category specified for OG metadata"
PLG_SYSTEM_OPENGRAPH_ERROR_SAVE_FAILED="Failed to save OG metadata"
PLG_SYSTEM_OPENGRAPH_ERROR_DELETE_FAILED="Failed to delete OG metadata"
PLG_SYSTEM_OPENGRAPH_ERROR_FIELD_TOO_LONG="Field value exceeds maximum length"

; Success Messages
PLG_SYSTEM_OPENGRAPH_SUCCESS_SAVED="OG metadata saved successfully"
PLG_SYSTEM_OPENGRAPH_SUCCESS_DELETED="OG metadata deleted successfully"

; Information Messages
PLG_SYSTEM_OPENGRAPH_INFO_NO_ARTICLE="No article context available for OG tag generation"
PLG_SYSTEM_OPENGRAPH_INFO_USING_FALLBACK="Using fallback values for OG tag generation"
PLG_SYSTEM_OPENGRAPH_INFO_HIERARCHY_APPLIED="OG metadata hierarchy applied: %s level used"

; Priority Levels
PLG_SYSTEM_OPENGRAPH_PRIORITY_ARTICLE="Article"
PLG_SYSTEM_OPENGRAPH_PRIORITY_CATEGORY="Category"
PLG_SYSTEM_OPENGRAPH_PRIORITY_GLOBAL="Global"
PLG_SYSTEM_OPENGRAPH_PRIORITY_AUTO="Auto-generated"

; Form Fieldsets
PLG_SYSTEM_OPENGRAPH_FIELDSET_ARTICLE="OpenGraph Settings"
;fieldsets
PLG_SYSTEM_OPENGRAPH_FIELDSET_ARTICLE="OpenGraph"
PLG_SYSTEM_OPENGRAPH_FIELDSET_ARTICLE_DESC="Configure OpenGraph metadata for social media sharing. These settings override global defaults."

PLG_SYSTEM_OPENGRAPH_FIELDSET_CATEGORY="OpenGraph Category Settings"
PLG_SYSTEM_OPENGRAPH_FIELDSET_CATEGORY_DESC="Configure OpenGraph metadata for this category. These settings will be used for articles in this category when no article-specific settings are defined."

; Common Field Labels
PLG_SYSTEM_OPENGRAPH_OG_TITLE_LABEL="OpenGraph Title"
Expand All @@ -87,6 +54,7 @@ PLG_SYSTEM_OPENGRAPH_OG_IMAGE_DESC="Image for social media sharing. Recommended

PLG_SYSTEM_OPENGRAPH_OG_IMAGE_ALT_LABEL="OpenGraph Image Alt Text"
PLG_SYSTEM_OPENGRAPH_OG_IMAGE_ALT_DESC="Alternative text for the OpenGraph image for accessibility."
PLG_SYSTEM_OPENGRAPH_OG_IMAGE_ALT_HINT="Enter a brief description of the image for accessibility"

PLG_SYSTEM_OPENGRAPH_OG_TYPE_LABEL="OpenGraph Type"
PLG_SYSTEM_OPENGRAPH_OG_TYPE_DESC="Content type for social media platforms."
Expand All @@ -110,67 +78,25 @@ PLG_SYSTEM_OPENGRAPH_TYPE_PROFILE="Profile"
PLG_SYSTEM_OPENGRAPH_TYPE_PRODUCT="Product"
PLG_SYSTEM_OPENGRAPH_TYPE_EVENT="Event"

; Article Specific
PLG_SYSTEM_OPENGRAPH_ARTICLE_SECTION_LABEL="Article Section"
PLG_SYSTEM_OPENGRAPH_ARTICLE_SECTION_DESC="Section or category tag for the article."
PLG_SYSTEM_OPENGRAPH_ARTICLE_SECTION_HINT="e.g., Technology, Sports, News"
;advanced settings
PLG_SYSTEM_OPENGRAPH_SHOW_ADVANCED_LABEL="Show Advanced Settings"
PLG_SYSTEM_OPENGRAPH_SHOW_ADVANCED_DESC="Show advanced settings for OpenGraph metadata."

PLG_SYSTEM_OPENGRAPH_PRIORITY_NOTE_LABEL="Priority Information"
PLG_SYSTEM_OPENGRAPH_PRIORITY_NOTE_DESC="These article settings take priority over category and global settings. Leave fields empty to inherit from higher levels."
PLG_SYSTEM_OPENGRAPH_TWITTER_CARD_LABEL="Twitter Card Type"
PLG_SYSTEM_OPENGRAPH_TWITTER_CARD_DESC="Select the type of Twitter card to use for this content."

; Category Specific
PLG_SYSTEM_OPENGRAPH_CATEGORY_TITLE_DESC="Custom title for this category's social media sharing."
PLG_SYSTEM_OPENGRAPH_CATEGORY_TITLE_HINT="Enter a title that represents this category"
PLG_SYSTEM_OPENGRAPH_TWITTER_TITLE_LABEL="Twitter Title"
PLG_SYSTEM_OPENGRAPH_TWITTER_TITLE_DESC="Custom title for Twitter sharing. Recommended length: 70 characters."
PLG_SYSTEM_OPENGRAPH_TWITTER_TITLE_HINT="Enter a compelling title for Twitter sharing"

PLG_SYSTEM_OPENGRAPH_CATEGORY_DESCRIPTION_DESC="Description for articles in this category when no article-specific description is set."
PLG_SYSTEM_OPENGRAPH_CATEGORY_DESCRIPTION_HINT="Describe what this category contains"
PLG_SYSTEM_OPENGRAPH_TWITTER_DESC_LABEL="Twitter Description"
PLG_SYSTEM_OPENGRAPH_TWITTER_DESC_DESC="Custom description for Twitter sharing. Recommended length: 120-160 characters."
PLG_SYSTEM_OPENGRAPH_TWITTER_DESC_HINT="Enter a brief, engaging description"

PLG_SYSTEM_OPENGRAPH_CATEGORY_IMAGE_DESC="Default image for articles in this category."
PLG_SYSTEM_OPENGRAPH_CATEGORY_TYPE_DESC="Default content type for articles in this category."
PLG_SYSTEM_OPENGRAPH_CATEGORY_URL_DESC="Custom URL for this category page."
PLG_SYSTEM_OPENGRAPH_CATEGORY_URL_HINT="Leave empty to use the category's URL"
PLG_SYSTEM_OPENGRAPH_CATEGORY_ENABLE_DESC="Enable OpenGraph tags for this category and its articles."
PLG_SYSTEM_OPENGRAPH_TWITTER_IMAGE_LABEL="Twitter Image"
PLG_SYSTEM_OPENGRAPH_TWITTER_IMAGE_DESC="Image for Twitter sharing. Recommended size: 1200x630 pixels."

PLG_SYSTEM_OPENGRAPH_INHERIT_PARENT_LABEL="Inherit from Parent"
PLG_SYSTEM_OPENGRAPH_INHERIT_PARENT_DESC="Inherit OpenGraph settings from parent category when available."
PLG_SYSTEM_OPENGRAPH_FB_APP_ID_LABEL="Facebook App ID"
PLG_SYSTEM_OPENGRAPH_FB_APP_ID_DESC="Enter your Facebook App ID to enable Facebook Open Graph debugging."
PLG_SYSTEM_OPENGRAPH_FB_APP_ID_HINT="Enter your Facebook App ID to enable Facebook Open Graph debugging."

PLG_SYSTEM_OPENGRAPH_DEFAULT_ARTICLES_LABEL="Default for Articles"
PLG_SYSTEM_OPENGRAPH_DEFAULT_ARTICLES_DESC="Use these settings as defaults for articles in this category."

PLG_SYSTEM_OPENGRAPH_CATEGORY_SPECIFIC_LABEL="Category-Specific Options"

PLG_SYSTEM_OPENGRAPH_SHOW_CATEGORY_LABEL="Show Category in Articles"
PLG_SYSTEM_OPENGRAPH_SHOW_CATEGORY_DESC="Include category name in article OpenGraph metadata."

PLG_SYSTEM_OPENGRAPH_USE_KEYWORDS_LABEL="Use Category Keywords"
PLG_SYSTEM_OPENGRAPH_USE_KEYWORDS_DESC="Include category keywords in OpenGraph metadata."

PLG_SYSTEM_OPENGRAPH_INHERITANCE_NOTE_LABEL="Inheritance Information"
PLG_SYSTEM_OPENGRAPH_INHERITANCE_NOTE_DESC="Category settings are inherited by articles unless overridden at the article level. Global settings serve as the final fallback."

; Character Counters
PLG_SYSTEM_OPENGRAPH_TITLE_COUNTER_DESC="Character counter for title optimization"
PLG_SYSTEM_OPENGRAPH_DESCRIPTION_COUNTER_DESC="Character counter for description optimization"

; Note Fields
PLG_SYSTEM_OPENGRAPH_CATEGORY_NOTE_LABEL="Category Settings Note"
PLG_SYSTEM_OPENGRAPH_CATEGORY_NOTE_DESC="These settings apply to this category and can be inherited by articles within it."

; Additional Missing Constants
PLG_SYSTEM_OPENGRAPH_CATEGORY_SETTINGS="Category OpenGraph Settings"
PLG_SYSTEM_OPENGRAPH_GLOBAL_SETTINGS="Global OpenGraph Settings"
PLG_SYSTEM_OPENGRAPH_ARTICLE_SETTINGS="Article OpenGraph Settings"

; Default values text
PLG_SYSTEM_OPENGRAPH_DEFAULT_TITLE="Use site title"
PLG_SYSTEM_OPENGRAPH_DEFAULT_DESCRIPTION="Use site description"
PLG_SYSTEM_OPENGRAPH_DEFAULT_IMAGE="Use site logo"

; Status messages for category fields
PLG_SYSTEM_OPENGRAPH_CATEGORY_ENABLED="OpenGraph enabled for this category"
PLG_SYSTEM_OPENGRAPH_CATEGORY_DISABLED="OpenGraph disabled for this category"
PLG_SYSTEM_OPENGRAPH_CATEGORY_INHERIT="Inherit from global settings"

; Help text for complex fields
PLG_SYSTEM_OPENGRAPH_TYPE_HELP="Select the content type that best describes this category. This affects how social media platforms display shared links."
PLG_SYSTEM_OPENGRAPH_IMAGE_HELP="Upload an image that represents this category. Recommended dimensions: 1200x630 pixels for optimal display on social media."
18 changes: 9 additions & 9 deletions plugins/system/opengraph/opengraph.xml
Original file line number Diff line number Diff line change
Expand Up @@ -71,15 +71,15 @@
label="PLG_SYSTEM_OPENGRAPH_GLOBAL_OG_TYPE"
description="PLG_SYSTEM_OPENGRAPH_GLOBAL_OG_TYPE_DESC"
>
<option value="website">website</option>
<option value="article">article</option>
<option value="blog">blog</option>
<option value="profile">profile</option>
<option value="video">video</option>
<option value="music">music</option>
<option value="book">book</option>
<option value="product">product</option>
<option value="event">event</option>
<option value="website">PLG_SYSTEM_OPENGRAPH_TYPE_WEBSITE</option>
<option value="article">PLG_SYSTEM_OPENGRAPH_TYPE_ARTICLE</option>
<option value="blog">PLG_SYSTEM_OPENGRAPH_TYPE_BLOG</option>
<option value="profile">PLG_SYSTEM_OPENGRAPH_TYPE_PROFILE</option>
<option value="video">PLG_SYSTEM_OPENGRAPH_TYPE_VIDEO</option>
<option value="music">PLG_SYSTEM_OPENGRAPH_TYPE_MUSIC</option>
<option value="book">PLG_SYSTEM_OPENGRAPH_TYPE_BOOK</option>
<option value="product">PLG_SYSTEM_OPENGRAPH_TYPE_PRODUCT</option>
<option value="event">PLG_SYSTEM_OPENGRAPH_TYPE_EVENT</option>
</field>
</fieldset>

Expand Down
177 changes: 84 additions & 93 deletions plugins/system/opengraph/src/Extension/opengraph.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,27 +15,22 @@
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\SubscriberInterface;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Document\HtmlDocument;
use Joomla\CMS\Table\Table;
use Joomla\Registry\Registry;
use Joomla\CMS\Document\Document;
use Joomla\CMS\Uri\Uri;

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects


/**
* OpenGraph Metadata plugin.
*
* @since __DEPLOY_VERSION__
*/

\defined('_JEXEC') or die;

final class Opengraph extends CMSPlugin implements SubscriberInterface
{
/**
* Returns an array of events this subscriber will listen to.
*
* @return array
*
* @since __DEPLOY_VERSION__
*/
protected $app;
protected $autoloadLanguage = true;

public static function getSubscribedEvents(): array
{
return [
Expand All @@ -44,53 +39,43 @@ public static function getSubscribedEvents(): array
];
}

/**
* Application object
*
* @var CMSApplication
* @since __DEPLOY_VERSION__
*/
protected $app;

/**
* Load the language file on instantiation.
*
* @var boolean
* @since __DEPLOY_VERSION__
*/
protected $autoloadLanguage = true;

/**
* Method to handle the onBeforeCompileHead event
*
* @param BeforeCompileHeadEvent $event The event object
*
* @return void
*
* @since __DEPLOY_VERSION__
*/
public function onBeforeCompileHead(BeforeCompileHeadEvent $event)
public function onBeforeCompileHead(BeforeCompileHeadEvent $event): void
{
$app = $this->getApplication();

// Only run in frontend
if (!$app->isClient('site')) {
return;
}

// Will add OpenGraph meta tags logic here in the future
// This method will be called to generate OpenGraph tags
$input = $app->input;
$option = $input->get('option', '', 'cmd');
$view = $input->get('view', '', 'cmd');
$id = $input->getInt('id');

if ($option !== 'com_content' || $view !== 'article' || !$id) {
return;
}

$table = Table::getInstance('Content');
if (!$table->load($id)) {
return;
}

$attribs = new Registry($table->attribs);

if ($attribs->get('og_enabled', '') === '0') {
return;
}

$document = $this->app->getDocument();

if (!$document instanceof HtmlDocument) {
return;
}

$this->injectOpenGraphData($document, $attribs);
}

/**
* Method to add OpenGraph fields to content forms
*
* @param PrepareFormEvent $event The event object.
*
* @return void
*
* @since __DEPLOY_VERSION__
*/
public function onContentPrepareForm(PrepareFormEvent $event): void
{
$app = $this->getApplication();
Expand All @@ -100,55 +85,61 @@ public function onContentPrepareForm(PrepareFormEvent $event): void
}

$form = $event->getForm();
$data = $event->getData();

$name = $form->getName();



// Check if it's the article form
if ($name === 'com_content.article') {
$xmlFile = __DIR__ . '/../Forms/Article/Article.xml';
if (file_exists($xmlFile)) {
$result = $form->loadFile($xmlFile, false);

$xml = __DIR__ . '/../forms/opengraph.xml';
if (file_exists($xml)) {
$form->loadFile($xml, false);
}
}
}

// Check if it's the category form
if (strpos($name, 'com_categories.category') === 0) {
$extension = '';

// Extract extension from form name if it's concatenated
if ($name === 'com_categories.categorycom_content') {
$extension = 'com_content';
} else {
// Try to get extension from different sources
if (is_object($data) && isset($data->extension)) {
$extension = $data->extension;
} elseif (is_array($data) && isset($data['extension'])) {
$extension = $data['extension'];
} else {
$extension = $form->getValue('extension');
}

// If still empty, try from request
if (empty($extension)) {
$input = $this->getApplication()->input;
$extension = $input->get('extension', '', 'cmd');
}
}
private function injectOpenGraphData(Document $document, Registry $params): void
{


$this->setMetaData($document, 'og:title', $params->get('og_title'), 'property');
$this->setMetaData($document, 'og:description', $params->get('og_description'), 'property');
$this->setMetaData($document, 'og:type', $params->get('og_type'), 'property');

// Load form only for content categories
if ($extension === 'com_content') {
$xmlFile = __DIR__ . '/../Forms/Category/Category.xml';
if (file_exists($xmlFile)) {
$result = $form->loadFile($xmlFile, false);

}
}
$this->setMetaData($document, 'twitter:card', $params->get('twitter_card'), 'name');
$this->setMetaData($document, 'twitter:title', $params->get('twitter_title'), 'name');
$this->setMetaData($document, 'twitter:description', $params->get('twitter_description'), 'name');

$this->setMetaData($document, 'fb:app_id', $params->get('fb_app_id'), 'property');

$this->setOpenGraphImage(
$document,
$params->get('og_image'),
$params->get('og_image_alt'),
Uri::base()
);


}

private function setMetaData(Document $document, string $name, ?string $value, string $attributeType): void
{
if (!empty($value)) {
$document->setMetaData($name, $value, $attributeType);
}
}
}

private function setOpenGraphImage(Document $document, ?string $image, ?string $alt = '', ?string $baseUrl = ''): void
{
if (empty($image)) {
return;
}

$url = rtrim((string) $baseUrl, '/') . '/' . ltrim($image, '/');

$this->setMetaData($document, 'og:image', $url, 'property');
$this->setMetaData($document, 'og:image:alt', $alt, 'property');
$this->setMetaData($document, 'twitter:image', $url, 'name');
$this->setMetaData($document, 'twitter:image:alt', $alt, 'name');
}


}
Loading