core/web/JsonLd.php
<?php
namespace luya\web;
use luya\Exception;
use luya\web\jsonld\AggregateRating;
use luya\web\jsonld\Article;
use luya\web\jsonld\BlogPosting;
use luya\web\jsonld\Comment;
use luya\web\jsonld\ContactPoint;
use luya\web\jsonld\Country;
use luya\web\jsonld\CreativeWork;
use luya\web\jsonld\Event;
use luya\web\jsonld\ImageObject;
use luya\web\jsonld\LiveBlogPosting;
use luya\web\jsonld\Offer;
use luya\web\jsonld\Organization;
use luya\web\jsonld\Person;
use luya\web\jsonld\Place;
use luya\web\jsonld\PostalAddress;
use luya\web\jsonld\PropertyValue;
use luya\web\jsonld\Rating;
use luya\web\jsonld\SocialMediaPosting;
use luya\web\jsonld\Thing;
use Yii;
use yii\base\BaseObject;
use yii\helpers\Json;
/**
* Registerin Microdata as JsonLD.
*
* In order to register a json ld tag just call:
*
* ```php
* JsonLd::person()
* ->setGivenName('Albert')
* ->setFamilyName('Einstein')
* ->setBirthPlace('Ulm, Germany');
* ```
*
* Or any other tags. This will register the json ld output into the layout file of the view.
*
* @see https://schema.org/docs/schemas.html
* @author Basil Suter <basil@nadar.io>
* @since 1.0.0
*/
class JsonLd extends BaseObject
{
/**
* Register new Article.
*
* An article, such as a news article or piece of investigative report.
* Newspapers and magazines have articles of many different types and this is intended to cover them all.
*
* @param array $config Optional config array to provided article data via setter methods.
* @return \luya\web\jsonld\Article
* @since 1.0.1
*/
public static function article(array $config = [])
{
return self::addGraph((new Article($config)));
}
/**
* Register new Blog Posting.
*
* @param array $config Optional config array to provided blog posting data via setter methods.
* @return \luya\web\jsonld\BlogPosting
* @since 1.0.1
*/
public static function blogPosting(array $config = [])
{
return self::addGraph((new BlogPosting($config)));
}
/**
* Register new Thing.
*
* @param array $config Optional config array to provided person data via setter methods.
* @return \luya\web\jsonld\Thing
*/
public static function thing(array $config = [])
{
return self::addGraph((new Thing($config)));
}
/**
* Register new CreativeWork.
*
* The most generic kind of creative work, including books, movies, photographs, software programs, etc.
*
* @param array $config Optional config array to provided creative work data via setter methods.
* @return \luya\web\jsonld\CreativeWork
* @since 1.0.1
*/
public static function creativeWork(array $config = [])
{
return self::addGraph((new CreativeWork($config)));
}
/**
* Register new Event.
*
* An event happening at a certain time and location, such as a concert, lecture, or festival.
*
* @param array $config
* @return \luya\web\jsonld\Event
*/
public static function event(array $config = [])
{
return self::addGraph((new Event($config)));
}
/**
* Register new Live Blog Posting.
*
* A blog post intended to provide a rolling textual coverage of an ongoing event through continuous updates.
*
* @param array $config Optional config array to provided live blog posting data via setter methods.
* @return \luya\web\jsonld\LiveBlogPosting
* @since 1.0.1
*/
public static function liveBlogPosting(array $config = [])
{
return self::addGraph((new LiveBlogPosting($config)));
}
/**
* Register new Organization.
*
* An organization such as a school, NGO, corporation, club, etc.
*
* @param array $config Optional config array to provided organization data via setter methods.
* @return \luya\web\jsonld\Organization
*/
public static function organization(array $config = [])
{
return self::addGraph((new Organization($config)));
}
/**
* Register new Person.
*
* A person (alive, dead, undead, or fictional).
*
* @param array $config Optional config array to provided person data via setter methods.
* @return \luya\web\jsonld\Person
*/
public static function person(array $config = [])
{
return self::addGraph((new Person($config)));
}
/**
* Register new Place
*
* Entities that have a somewhat fixed, physical extension.
*
* @param array $config Optional config array to provided place data via setter methods.
* @return \luya\web\jsonld\Place
*/
public static function place(array $config = [])
{
return self::addGraph((new Place($config)));
}
/**
* Register new Social Media Posting.
*
* A post to a social media platform, including blog posts, tweets, Facebook posts, etc.
*
* @param array $config Optional config array to provided social media posting data via setter methods.
* @return \luya\web\jsonld\SocialMediaPosting
* @since 1.0.1
*/
public static function socialMediaPosting(array $config = [])
{
return self::addGraph((new SocialMediaPosting($config)));
}
/**
* Register new Image Object.
*
* @param array $config
* @return \luya\web\jsonld\ImageObject
* @since 1.0.3
*/
public static function imageObject(array $config = [])
{
return self::addGraph((new ImageObject($config)));
}
/**
* Register new Aggregated Rating.
*
* @param array $config
* @return \luya\web\jsonld\AggregateRating
* @since 1.0.3
*/
public static function aggregateRating(array $config = [])
{
return self::addGraph((new AggregateRating($config)));
}
/**
* Register new Rating.
*
* @param array $config
* @return \luya\web\jsonld\Rating
* @since 1.0.3
*/
public static function rating(array $config = [])
{
return self::addGraph((new Rating($config)));
}
/**
* Register new Comment.
*
* @param array $config
* @return \luya\web\jsonld\Comment
* @since 1.0.3
*/
public static function comment(array $config = [])
{
return self::addGraph((new Comment($config)));
}
/**
* Register new Contact Point.
*
* This is mainly used for addresses or user coordinates like email, telephone etc.
*
* @param array $config
* @return \luya\web\jsonld\ContactPoint
* @since 1.0.3
*/
public static function contactPoint(array $config = [])
{
return self::addGraph((new ContactPoint($config)));
}
/**
* Register new Country.
*
* @param array $config
* @return \luya\web\jsonld\Country
* @since 1.0.3
*/
public static function country(array $config = [])
{
return self::addGraph((new Country($config)));
}
/**
* Register new Offer.
*
* This is used for selling products.
*
* @param array $config
* @return \luya\web\jsonld\Offer
* @since 1.0.3
*/
public static function offer(array $config = [])
{
return self::addGraph((new Offer($config)));
}
/**
* Register new Postal Address.
*
* @param array $config
* @return \luya\web\jsonld\PostalAddress
* @since 1.0.3
*/
public static function postalAddress(array $config = [])
{
return self::addGraph((new PostalAddress()));
}
/**
* Register new Property Value.
*
* @param array $config
* @return \luya\web\jsonld\PropertyValue
* @since 1.0.3
*/
public static function propertyValue(array $config = [])
{
return self::addGraph((new PropertyValue($config)));
}
/**
* Register graph data.
*
* @param \luya\web\jsonld\BaseThing|array $data Can be either an array or an object based on {{luya\web\jsonld\BaseThing}} which contains the Arrayable Inteface.
* @return array|object
*/
public static function addGraph($data)
{
self::registerView();
if (is_scalar($data)) {
throw new Exception("Data must be either an array or an object of type luya\web\jsonld\BaseThing.");
}
Yii::$app->view->params['@context'] = 'https://schema.org';
Yii::$app->view->params['@graph'][] = $data;
return $data;
}
/**
* Reset the JsonLd Data.
*
* This method is mainly usefull when working with unit tests for JsonLd.
*/
public static function reset()
{
self::$_view = null;
Yii::$app->view->params['@graph'] = [];
}
private static $_view;
/**
* Register the view file an observe the event which then reads the data from @graph params key.
*/
protected static function registerView()
{
if (self::$_view === null) {
Yii::$app->view->on(View::EVENT_BEGIN_BODY, function ($event) {
echo '<script type="application/ld+json">' . Json::encode($event->sender->params) . '</script>';
});
self::$_view = true;
}
}
}