first commit

This commit is contained in:
2025-06-17 11:53:18 +02:00
commit 9f0f7ba12b
8804 changed files with 1369176 additions and 0 deletions

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<form>
<field
name="hour"
type="number"
label="PLG_SCHEMAORG_RECIPE_FIELD_HOUR_LABEL"
/>
<field
name="min"
type="number"
label="PLG_SCHEMAORG_RECIPE_FIELD_MINUTE_LABEL"
max="59"
/>
</form>

View File

@ -0,0 +1,276 @@
<?xml version="1.0" encoding="UTF-8"?>
<form>
<fields name="schema">
<fieldset
name="schema"
label="PLG_SYSTEM_SCHEMA_FIELD_SCHEMA_LABEL"
>
<field
name="Recipe"
type="subform"
showon="schemaType:Recipe"
>
<form>
<field
name="@type"
type="hidden"
default="Recipe"
/>
<field
name="noteBook"
type="note"
description="PLG_SCHEMAORG_RECIPE_DESCRIPTION_LABEL"
class="alert alert-info w-100"
/>
<field
name="image"
type="media"
label="PLG_SCHEMAORG_RECIPE_FIELD_IMAGE_LABEL"
/>
<field
name="name"
type="text"
label="PLG_SCHEMAORG_RECIPE_FIELD_NAME_LABEL"
filter="string"
size="30"
/>
<field
name="author"
type="text"
label="PLG_SCHEMAORG_RECIPE_FIELD_AUTHOR_LABEL"
filter="string"
size="30"
/>
<field
name="cookTime"
type="subform"
formsource="plugins\schemaorg\recipe\forms\duration.xml"
label="PLG_SCHEMAORG_RECIPE_FIELD_COOK_TIME_LABEL"
/>
<field
name="datePublished"
type="calendar"
label="PLG_SCHEMAORG_RECIPE_FIELD_DATE_PUBLISHED_LABEL"
class="input-small"
filter="user_utc"
showtime="false"
todaybutton="true"
translateformat="true"
/>
<field
name="description"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_DESCRIPTION_LABEL"
/>
<field
name="cookingMethod"
type="text"
filter="string"
size="30"
label="PLG_SCHEMAORG_RECIPE_FIELD_COOKING_METHOD_LABEL"
/>
<field
name="prepTime"
type="subform"
formsource="plugins\schemaorg\recipe\forms\duration.xml"
label="PLG_SCHEMAORG_RECIPE_FIELD_PREPARATION_TIME_LABEL"
/>
<field
name="recipeCategory"
type="text"
filter="string"
size="30"
label="PLG_SCHEMAORG_RECIPE_FIELD_CATEGORY_LABEL"
/>
<field
name="recipeCuisine"
type="text"
filter="string"
size="30"
label="PLG_SCHEMAORG_RECIPE_FIELD_CUISINE_LABEL"
/>
<field
name="recipeInstructions"
type="text"
filter="string"
size="30"
label="PLG_SCHEMAORG_RECIPE_FIELD_INSTRUCTIONS_LABEL"
/>
<field
name="recipeYield"
type="text"
filter="string"
size="30"
label="PLG_SCHEMAORG_RECIPE_FIELD_YIELD_LABEL"
/>
<field
name="suitableForDiet"
type="text"
filter="string"
size="30"
label="PLG_SCHEMAORG_RECIPE_FIELD_SUITABLE_FOR_DIET_LABEL"
/>
<field
name="recipeIngredient"
type="subform"
label="PLG_SCHEMAORG_RECIPE_FIELD_INGREDIENTS_LABEL"
multiple="true"
min="1"
>
<form>
<field
name="ingredient"
type="text"
hiddenLabel="true"
/>
</form>
</field>
<field
name="nutrition"
type="subform"
label="PLG_SCHEMAORG_RECIPE_FIELD_NUTRITION_LABEL"
>
<form>
<field
name="@type"
type="hidden"
default="NutritionInformation"
/>
<field
name="calories"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_CALORIES_LABEL"
/>
<field
name="carbohydrateContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_CARBOHYDRATE_LABEL"
/>
<field
name="cholesterolContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_CHOLESTEROL_CONTENT_LABEL"
/>
<field
name="fatContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_FAT_LABEL"
/>
<field
name="fiberContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_FIBER_LABEL"
/>
<field
name="proteinContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_PROTEIN_LABEL"
/>
<field
name="saturatedFatContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_SATURATED_FAT_LABEL"
/>
<field
name="sodiumContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_SODIUM_LABEL"
/>
<field
name="sugarContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_SUGAR_LABEL"
/>
<field
name="transFatContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_TRANS_FAT_LABEL"
/>
<field
name="unsaturatedFatContent"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_UNSATURATED_FAT_LABEL"
/>
<field
name="servingSize"
type="text"
filter="string"
label="PLG_SCHEMAORG_RECIPE_FIELD_SERVING_SIZE_LABEL"
/>
</form>
</field>
<field
name="genericField"
type="subform"
label="PLG_SCHEMAORG_RECIPE_FIELD_GENERIC_FIELD_LABEL"
multiple="true"
>
<form>
<field
name="genericTitle"
type="text"
filter="string"
size="30"
label="PLG_SCHEMAORG_RECIPE_FIELD_GENERIC_TITLE_LABEL"
/>
<field
name="genericValue"
type="text"
filter="string"
size="30"
label="PLG_SCHEMAORG_RECIPE_FIELD_GENERIC_VALUE_LABEL"
/>
</form>
</field>
</form>
</field>
</fieldset>
</fields>
</form>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<extension type="plugin" group="schemaorg" method="upgrade">
<name>plg_schemaorg_recipe</name>
<author>Joomla! Project</author>
<creationDate>2023-07</creationDate>
<copyright>(C) 2023 Open Source Matters, Inc.</copyright>
<license>GNU General Public License version 2 or later; see LICENSE.txt</license>
<authorEmail>admin@joomla.org</authorEmail>
<authorUrl>www.joomla.org</authorUrl>
<version>5.0.0</version>
<description>PLG_SCHEMAORG_RECIPE_XML_DESCRIPTION</description>
<namespace path="src">Joomla\Plugin\Schemaorg\Recipe</namespace>
<files>
<folder plugin="recipe">services</folder>
<folder>src</folder>
</files>
<languages>
<language tag="en-GB">language/en-GB/plg_schemaorg_recipe.ini</language>
<language tag="en-GB">language/en-GB/plg_schemaorg_recipe.sys.ini</language>
</languages>
<config>
<fields name="params">
<fieldset name="basic">
<field
name="allowedlist"
type="SchemaorgComponentSections"
label="JSCHEMAORG_EXTENSION_ALLOWED_LABEL"
description="JSCHEMAORG_EXTENSION_ALLOWED_DESCRIPTION"
multiple="multiple"
layout="joomla.form.field.list-fancy-select"
/>
<field
name="forbiddenlist"
type="SchemaorgComponentSections"
label="JSCHEMAORG_EXTENSION_FORBIDDEN_LABEL"
description="JSCHEMAORG_EXTENSION_FORBIDDEN_DESCRIPTION"
multiple="multiple"
layout="joomla.form.field.list-fancy-select"
/>
</fieldset>
</fields>
</config>
</extension>

View File

@ -0,0 +1,48 @@
<?php
/**
* @package Joomla.Plugin
* @subpackage Schemaorg.recipe
*
* @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
\defined('_JEXEC') or die;
use Joomla\CMS\Extension\PluginInterface;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
use Joomla\DI\Container;
use Joomla\DI\ServiceProviderInterface;
use Joomla\Event\DispatcherInterface;
use Joomla\Plugin\Schemaorg\Recipe\Extension\Recipe;
return new class () implements ServiceProviderInterface {
/**
* Registers the service provider with a DI container.
*
* @param Container $container The DI container.
*
* @return void
*
* @since 5.0.0
*/
public function register(Container $container)
{
$container->set(
PluginInterface::class,
function (Container $container) {
$dispatcher = $container->get(DispatcherInterface::class);
$plugin = new Recipe(
$dispatcher,
(array) PluginHelper::getPlugin('schemaorg', 'recipe')
);
$plugin->setApplication(Factory::getApplication());
return $plugin;
}
);
}
};

View File

@ -0,0 +1,121 @@
<?php
/**
* @package Joomla.Plugin
* @subpackage Schemaorg.recipe
*
* @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Plugin\Schemaorg\Recipe\Extension;
use Joomla\CMS\Event\Plugin\System\Schemaorg\BeforeCompileHeadEvent;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Schemaorg\SchemaorgPluginTrait;
use Joomla\CMS\Schemaorg\SchemaorgPrepareDateTrait;
use Joomla\CMS\Schemaorg\SchemaorgPrepareDurationTrait;
use Joomla\Event\Priority;
use Joomla\Event\SubscriberInterface;
// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects
/**
* Schemaorg Plugin
*
* @since 5.0.0
*/
final class Recipe extends CMSPlugin implements SubscriberInterface
{
use SchemaorgPluginTrait;
use SchemaorgPrepareDateTrait;
use SchemaorgPrepareDurationTrait;
/**
* Load the language file on instantiation.
*
* @var boolean
* @since 5.0.0
*/
protected $autoloadLanguage = true;
/**
* The name of the schema form
*
* @var string
* @since 5.0.0
*/
protected $pluginName = 'Recipe';
/**
* Returns an array of events this subscriber will listen to.
*
* @return array
*
* @since 5.0.0
*/
public static function getSubscribedEvents(): array
{
return [
'onSchemaPrepareForm' => 'onSchemaPrepareForm',
'onSchemaBeforeCompileHead' => ['onSchemaBeforeCompileHead', Priority::BELOW_NORMAL],
];
}
/**
* Cleanup all Recipe types
*
* @param BeforeCompileHeadEvent $event The given event
*
* @return void
*
* @since 5.0.0
*/
public function onSchemaBeforeCompileHead(BeforeCompileHeadEvent $event)
{
$schema = $event->getSchema();
$graph = $schema->get('@graph');
foreach ($graph as &$entry) {
if (!isset($entry['@type']) || $entry['@type'] !== 'Recipe') {
continue;
}
if (!empty($entry['datePublished'])) {
$entry['datePublished'] = $this->prepareDate($entry['datePublished']);
}
if (!empty($entry['cookTime'])) {
$entry['cookTime'] = $this->prepareDuration($entry['cookTime']);
}
if (!empty($entry['prepTime'])) {
$entry['prepTime'] = $this->prepareDuration($entry['prepTime']);
}
// Clean recipeIngredient
if (isset($entry['recipeIngredient']) && \is_array($entry['recipeIngredient'])) {
$result = [];
foreach ($entry['recipeIngredient'] as $key => $value) {
if (\is_array($value)) {
foreach ($value as $k => $v) {
$result[] = $v;
}
continue;
}
$result[] = $value;
}
$entry['recipeIngredient'] = !empty($result) ? $result : null;
}
}
$schema->set('@graph', $graph);
}
}