Перейти до основного вмісту
Версія: 1.x

← Попередня · Назад до README · Наступна →

Шаблони

Фіди можна швидко створювати за допомогою готових шаблонів:

  • DragonCode\LaravelFeed\Presets\InstagramFeedPreset
  • DragonCode\LaravelFeed\Presets\YandexFeedPreset
  • DragonCode\LaravelFeed\Presets\SitemapFeedPreset
  • DragonCode\LaravelFeed\Presets\RssFeedPreset

Створіть клас фіду вручну або за допомогою консольної команди php artisan make:feed <name> та успадкуйте потрібний шаблон. Наприклад:

use DragonCode\LaravelFeed\Presets\InstagramFeedPreset;
use DragonCode\LaravelFeed\Presets\RssFeedPreset;
use DragonCode\LaravelFeed\Presets\SitemapFeedPreset;
use DragonCode\LaravelFeed\Presets\YandexFeedPreset;

class ProductFeed extends InstagramFeedPreset {}
class ProductFeed extends YandexFeedPreset {}
class ProductFeed extends SitemapFeedPreset {}
class ProductFeed extends RssFeedPreset {}

Потім реалізуйте два обов’язкові методи: builder і item. Наприклад:

namespace App\Feeds;

use App\Models\Product;
use DragonCode\LaravelFeed\Feeds\Items\FeedItem;
use DragonCode\LaravelFeed\Presets\InstagramFeedPreset;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

class InstagramFeed extends InstagramFeedPreset
{
public function builder(): Builder
{
return Product::query();
}

public function item(Model $model): FeedItem
{
return parent::item($model)
->title($model->title)
->description($model->description)
->brand($model->brand) // By default, null
->url($model->url)
->price(price: $model->price, salePrice: $model->price) // By default, salePrice = price
->image($model->images[0])
->images($model->images) // By default, null
->availability($model->quantity > 0 ? 'in stock' : 'out of stock') // By default, 'in stock'
->status($model->quantity > 0 ? 'active' : 'inactive') // By default, 'active'
->condition('new') // By default, 'new'
->group(12345) // By default, null
->googleCategory(123) // By default, null
->facebookCategory(456) // By default, null
->additional([
'g:foo' => 'Some foo',
'g:bar' => 'Some bar',

'g:baz' => [
'@attributes' => ['qwe' => 'rty'],
'@value' => 'Some baz',
],

'@g:arrayable' => [
'a',
'b',
'c',
],
]);
}
}

Технічно класи шаблонів такі самі, як базовий клас Feed, але містять логіку цільового сервісу, зокрема правила побудови інформаційних блоків та елементів.

Типові реалізації​

Instagram​

class InstagramFeedItem extends FeedItem
namespace DragonCode\LaravelFeed\Presets\Items;

use DragonCode\LaravelFeed\Feeds\Items\FeedItem;

use function blank;
use function collect;

/** @property-read \Illuminate\Database\Eloquent\Model $model */
class InstagramFeedItem extends FeedItem
{
protected string $title;

protected string $description;

protected string $url;

protected string $image;

protected ?array $images = null;

protected ?string $brand = null;

protected string $condition = 'new';

protected string $availability = 'in stock';

protected float $price;

protected float $salePrice;

protected ?string $groupId = null;

protected ?string $status = 'active';

protected ?int $googleCategory = null;

protected ?int $facebookCategory = null;

protected array $additional = [];

public function name(): string
{
return 'item';
}

public function title(string $title): static
{
$this->title = $title;

return $this;
}

public function description(string $description): static
{
$this->description = $description;

return $this;
}

public function brand(string $name): static
{
$this->brand = $name;

return $this;
}

public function url(string $url): static
{
$this->url = $url;

return $this;
}

public function image(string $url): static
{
$this->image = $url;

return $this;
}

public function images(?array $urls): static
{
$this->images = $urls;

return $this;
}

public function condition(string $condition): static
{
$this->condition = $condition;

return $this;
}

public function availability(string $availability): static
{
$this->availability = $availability;

return $this;
}

public function price(float $price, ?float $salePrice = null): static
{
$this->price = $price;
$this->salePrice = $salePrice ?? $price;

return $this;
}

public function group(int|string|null $id): static
{
$this->groupId = (string) $id ?: null;

return $this;
}

public function status(?string $status): static
{
$this->status = $status;

return $this;
}

public function googleCategory(?int $id): static
{
$this->googleCategory = $id;

return $this;
}

public function facebookCategory(?int $id): static
{
$this->facebookCategory = $id;

return $this;
}

public function additional(array $additional): static
{
$this->additional = $additional;

return $this;
}

public function toArray(): array
{
return collect([
'g:id' => $this->model->getKey(),

'g:title' => ['@cdata' => $this->title],
'g:description' => ['@cdata' => $this->description],

'g:link' => $this->url,
'g:image_link' => $this->image,

'@g:additional_image_link' => $this->images,

'g:brand' => $this->brand,
'g:condition' => $this->condition,
'g:availability' => $this->availability,

'g:price' => $this->price,
'g:sale_price' => $this->salePrice,

'g:item_group_id' => $this->groupId,

'g:status' => $this->status,

'g:google_product_category' => $this->googleCategory,
'g:fb_product_category' => $this->facebookCategory,
])
->merge($this->additional)
->reject(static fn (mixed $value) => blank($value))
->all();
}
}

Yandex​

class YandexFeedItem extends FeedItem
namespace DragonCode\LaravelFeed\Presets\Items;

use DragonCode\LaravelFeed\Feeds\Items\FeedItem;

use function blank;
use function collect;

/** @property-read \Illuminate\Database\Eloquent\Model $model */
class YandexFeedItem extends FeedItem
{
protected int|string|null $attributeId = null;

protected bool $attributeAvailable = true;

protected string $attributeType = 'vendor.model';

protected string $url;

protected ?string $barcode = null;

protected string $title;

protected string $description;

protected string $price;

protected string $currencyId = 'RUB';

protected ?string $vendor = null;

protected array $images;

protected array $additional = [];

public function name(): string
{
return 'offer';
}

public function attributeId(int|string|null $id): static
{
$this->attributeId = $id;

return $this;
}

public function attributeAvailable(bool $available): static
{
$this->attributeAvailable = $available;

return $this;
}

public function attributeType(string $type): static
{
$this->attributeType = $type;

return $this;
}

public function url(string $url): static
{
$this->url = $url;

return $this;
}

public function barcode(string $barcode): static
{
$this->barcode = $barcode;

return $this;
}

public function title(string $title): static
{
$this->title = $title;

return $this;
}

public function description(string $description): static
{
$this->description = $description;

return $this;
}

public function price(float|string $price): static
{
$this->price = (string) $price;

return $this;
}

public function currencyId(string $currencyId): static
{
$this->currencyId = $currencyId;

return $this;
}

public function vendor(?string $vendor): static
{
$this->vendor = $vendor;

return $this;
}

public function images(array $images): static
{
$this->images = $images;

return $this;
}

public function additional(array $additional): static
{
$this->additional = $additional;

return $this;
}

public function attributes(): array
{
return [
'id' => $this->attributeId,
'available' => $this->attributeAvailable,
'type' => $this->attributeType,
];
}

public function toArray(): array
{
return collect([
'url' => $this->url,

'barcode' => $this->barcode,
'name' => $this->title,
'description' => $this->description,

'price' => $this->price,

'currencyId' => $this->currencyId,
'vendor' => $this->vendor,

'@picture' => $this->images,
])
->merge($this->additional)
->reject(static fn (mixed $value) => blank($value))
->all();
}
}

Карта сайту​

class SitemapFeedItem extends FeedItem
namespace DragonCode\LaravelFeed\Presets\Items;

use Carbon\Carbon;
use DragonCode\LaravelFeed\Feeds\Items\FeedItem;

/** @property-read \Illuminate\Database\Eloquent\Model $model */
class SitemapFeedItem extends FeedItem
{
protected string $url;

protected string $modifiedAt;

protected float $priority = 0.9;

public function name(): string
{
return 'url';
}

public function url(string $url): static
{
$this->url = $url;

return $this;
}

public function modifiedAt(Carbon $updatedAt): static
{
$this->modifiedAt = $updatedAt->toIso8601String();

return $this;
}

public function priority(float $priority): static
{
$this->priority = $priority;

return $this;
}

public function toArray(): array
{
return [
'loc' => $this->url,
'lastmod' => $this->modifiedAt,
'priority' => $this->priority,
];
}
}

RSS​

class RssFeedItem extends FeedItem
namespace DragonCode\LaravelFeed\Presets\Items;

use Carbon\Carbon;
use DragonCode\LaravelFeed\Feeds\Items\FeedItem;

use function blank;
use function collect;

/** @property-read \Illuminate\Database\Eloquent\Model $model */
class RssFeedItem extends FeedItem
{
protected ?string $guid = null;

protected string $title;

protected string $url;

protected string $description;

protected ?string $category = null;

protected ?Carbon $publishedAt = null;

public array $additional = [];

public function guid(int|string $guid): static
{
$this->guid = (string) $guid;

return $this;
}

public function title(string $title): static
{
$this->title = $title;

return $this;
}

public function url(string $url): static
{
$this->url = $url;

return $this;
}

public function description(string $description): static
{
$this->description = $description;

return $this;
}

public function category(string $category): static
{
$this->category = $category;

return $this;
}

public function publishedAt(Carbon $publishedAt): static
{
$this->publishedAt = $publishedAt;

return $this;
}

public function additional(array $additional): static
{
$this->additional = $additional;

return $this;
}

public function toArray(): array
{
return collect([
'title' => $this->title,

'link' => $this->url,
'guid' => $this->guid,

'description' => ['@cdata' => $this->description],

'category' => $this->category,

'pubDate' => $this->publishedAt->toRfc1123String(),
])
->merge($this->additional)
->reject(static fn (mixed $value) => blank($value))
->all();
}
}

Дивіться також​