From aa14df3a657f8a0d87368b1c96665e2290eff234 Mon Sep 17 00:00:00 2001 From: Andrey Helldar Date: Mon, 1 Sep 2025 02:51:39 +0300 Subject: [PATCH 1/6] Added documentation --- .gitattributes | 2 + .github/images/idea.png | Bin 16143 -> 0 bytes .github/workflows/docs.yml | 172 +++++++++ .github/workflows/test-docs.yml | 38 ++ README.md | 341 +----------------- docs/cfg/analytics.html | 13 + docs/cfg/buildprofiles.xml | 43 +++ docs/docs_libraries.tree | 9 + docs/images/favicon.svg | 40 ++ docs/images/laravel-idea.png | Bin 0 -> 21237 bytes docs/images/laravel-idea_dark.png | Bin 0 -> 16800 bytes docs/images/logo.svg | 40 ++ docs/images/logo_dark.svg | 40 ++ docs/laravel-feeds.tree | 27 ++ docs/redirection-rules.xml | 181 ++++++++++ docs/snippets/advanced-doc-char-result.xml | 3 + docs/snippets/advanced-dog-char.php | 17 + docs/snippets/advanced-head-feed.php | 16 + docs/snippets/advanced-head-info.php | 17 + docs/snippets/advanced-header.php | 15 + docs/snippets/advanced-main-attributes.php | 23 ++ docs/snippets/advanced-nested.php | 42 +++ docs/snippets/advanced-setup-root.php | 17 + docs/snippets/advanced-value-word-result.xml | 2 + docs/snippets/advanced-value-word.php | 26 ++ docs/snippets/config-channels.ini | 2 + docs/snippets/config-pretty-false.xml | 5 + docs/snippets/config-pretty-true.xml | 13 + docs/snippets/feeds-feed-item-result.xml | 8 + docs/snippets/feeds-feed-item.php | 27 ++ docs/snippets/feeds-feed.php | 27 ++ docs/snippets/generation-feed-filename.php | 13 + docs/snippets/generation-feed-storage.php | 10 + docs/snippets/receipt-instagram-config.php | 9 + docs/snippets/receipt-instagram-feed-item.php | 39 ++ docs/snippets/receipt-instagram-feed.php | 50 +++ docs/snippets/receipt-instagram-result.xml | 116 ++++++ docs/snippets/receipt-sitemap-config.php | 9 + docs/snippets/receipt-sitemap-feed-item.php | 29 ++ docs/snippets/receipt-sitemap-feed.php | 49 +++ docs/snippets/receipt-sitemap-links.php | 10 + docs/snippets/receipt-sitemap-result.xml | 32 ++ docs/snippets/receipt-sitemap-root.xml | 9 + docs/snippets/receipt-yandex-config.php | 9 + docs/snippets/receipt-yandex-feed-info.php | 50 +++ docs/snippets/receipt-yandex-feed-item.php | 63 ++++ docs/snippets/receipt-yandex-feed.php | 57 +++ docs/snippets/receipt-yandex-result.xml | 181 ++++++++++ docs/topics/advanced-usage.topic | 91 +++++ docs/topics/configuration.topic | 61 ++++ docs/topics/contributions.topic | 64 ++++ docs/topics/feeds.topic | 96 +++++ docs/topics/generation.topic | 50 +++ docs/topics/instagram.topic | 44 +++ docs/topics/installation.topic | 32 ++ docs/topics/introduction.topic | 32 ++ docs/topics/license.topic | 29 ++ docs/topics/sitemap.topic | 66 ++++ docs/topics/snippet-generate.topic | 19 + docs/topics/yandex.topic | 48 +++ docs/v.list | 27 ++ docs/writerside.cfg | 8 + 62 files changed, 2275 insertions(+), 333 deletions(-) delete mode 100644 .github/images/idea.png create mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/test-docs.yml create mode 100644 docs/cfg/analytics.html create mode 100644 docs/cfg/buildprofiles.xml create mode 100644 docs/docs_libraries.tree create mode 100644 docs/images/favicon.svg create mode 100644 docs/images/laravel-idea.png create mode 100644 docs/images/laravel-idea_dark.png create mode 100644 docs/images/logo.svg create mode 100644 docs/images/logo_dark.svg create mode 100644 docs/laravel-feeds.tree create mode 100644 docs/redirection-rules.xml create mode 100644 docs/snippets/advanced-doc-char-result.xml create mode 100644 docs/snippets/advanced-dog-char.php create mode 100644 docs/snippets/advanced-head-feed.php create mode 100644 docs/snippets/advanced-head-info.php create mode 100644 docs/snippets/advanced-header.php create mode 100644 docs/snippets/advanced-main-attributes.php create mode 100644 docs/snippets/advanced-nested.php create mode 100644 docs/snippets/advanced-setup-root.php create mode 100644 docs/snippets/advanced-value-word-result.xml create mode 100644 docs/snippets/advanced-value-word.php create mode 100644 docs/snippets/config-channels.ini create mode 100644 docs/snippets/config-pretty-false.xml create mode 100644 docs/snippets/config-pretty-true.xml create mode 100644 docs/snippets/feeds-feed-item-result.xml create mode 100644 docs/snippets/feeds-feed-item.php create mode 100644 docs/snippets/feeds-feed.php create mode 100644 docs/snippets/generation-feed-filename.php create mode 100644 docs/snippets/generation-feed-storage.php create mode 100644 docs/snippets/receipt-instagram-config.php create mode 100644 docs/snippets/receipt-instagram-feed-item.php create mode 100644 docs/snippets/receipt-instagram-feed.php create mode 100644 docs/snippets/receipt-instagram-result.xml create mode 100644 docs/snippets/receipt-sitemap-config.php create mode 100644 docs/snippets/receipt-sitemap-feed-item.php create mode 100644 docs/snippets/receipt-sitemap-feed.php create mode 100644 docs/snippets/receipt-sitemap-links.php create mode 100644 docs/snippets/receipt-sitemap-result.xml create mode 100644 docs/snippets/receipt-sitemap-root.xml create mode 100644 docs/snippets/receipt-yandex-config.php create mode 100644 docs/snippets/receipt-yandex-feed-info.php create mode 100644 docs/snippets/receipt-yandex-feed-item.php create mode 100644 docs/snippets/receipt-yandex-feed.php create mode 100644 docs/snippets/receipt-yandex-result.xml create mode 100644 docs/topics/advanced-usage.topic create mode 100644 docs/topics/configuration.topic create mode 100644 docs/topics/contributions.topic create mode 100644 docs/topics/feeds.topic create mode 100644 docs/topics/generation.topic create mode 100644 docs/topics/instagram.topic create mode 100644 docs/topics/installation.topic create mode 100644 docs/topics/introduction.topic create mode 100644 docs/topics/license.topic create mode 100644 docs/topics/sitemap.topic create mode 100644 docs/topics/snippet-generate.topic create mode 100644 docs/topics/yandex.topic create mode 100644 docs/v.list create mode 100644 docs/writerside.cfg diff --git a/.gitattributes b/.gitattributes index 52592d4..2019fed 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,5 +1,7 @@ * text=auto +docs/ export-ignore + .github/ export-ignore tests/ export-ignore workbench/ export-ignore diff --git a/.github/images/idea.png b/.github/images/idea.png deleted file mode 100644 index e207bf67006aa303b5193d6f0771a8c8ee5d8b3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16143 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 svJLuWZne*ANT>kwg3PC diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..1d32642 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,172 @@ +name: Documentation + +on: + push: + branches: + - main + - 1.x + workflow_dispatch: + +permissions: + id-token: write + pages: write + +env: + COMPOSER_TOKEN: ${{ secrets.COMPOSER_TOKEN }} + ALGOLIA_APP_NAME: ${{ secrets.ALGOLIA_APPLICATION_ID }} + ALGOLIA_ARTIFACT: algolia-indexes-LARAVEL-FEEDS.zip + ALGOLIA_INDEX_NAME: laravel-feeds + ALGOLIA_KEY: ${{ secrets.ALGOLIA_KEY }} + ARTIFACT_DOCS: webHelpLARAVEL-FEEDS2-all.zip + ARTIFACT_INDEXES: search-indexes + CONFIG_JSON_PRODUCT: LARAVEL-FEEDS + CONFIG_JSON_VERSION: main + INSTANCE: docs/laravel-feeds + DOMAIN_NAME: feeds.dragon-code.pro + BUILDER_VERSION: 2025.04.8412 + +jobs: + build: + name: Build application + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Build documentation + uses: JetBrains/writerside-github-action@v4 + with: + instance: ${{ env.INSTANCE }} + artifact: ${{ env.ARTIFACT_DOCS }} + docker-version: ${{ env.BUILDER_VERSION }} + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: docs + path: | + artifacts/${{ env.ARTIFACT_DOCS }} + artifacts/report.json + retention-days: 7 + + - name: Upload search indexes + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARTIFACT_INDEXES }} + path: artifacts/${{ env.ALGOLIA_ARTIFACT }} + retention-days: 7 + + test: + needs: build + name: Testing + runs-on: ubuntu-latest + + steps: + - name: Download docs artifact + uses: actions/download-artifact@v5 + with: + name: docs + path: artifacts + + - name: Test documentation + uses: JetBrains/writerside-checker-action@v1 + with: + instance: ${{ env.INSTANCE }} + + robots: + needs: build + name: Generate robots.txt + runs-on: ubuntu-latest + + steps: + - name: Create robots.txt + run: | + touch robots.txt + echo "User-Agent: *" >> robots.txt + echo "Disallow: " >> robots.txt + echo "Host: https://${{ env.DOMAIN_NAME }}" >> robots.txt + echo "Sitemap: https://${{ env.DOMAIN_NAME }}/sitemap.xml" >> robots.txt + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: robots + path: robots.txt + retention-days: 7 + + deploy-pages: + environment: + name: deploy + url: ${{ steps.deployment.outputs.page_url }} + + needs: + - test + - robots + + name: Deploy to pages + runs-on: ubuntu-latest + + steps: + - name: Download docs artifact + uses: actions/download-artifact@v5 + with: + name: docs + + - name: Download robots artifact + uses: actions/download-artifact@v5 + with: + name: robots + + - name: Unzip artifact + run: unzip -O UTF-8 -qq '${{ env.ARTIFACT_DOCS }}' -d dir + + - name: Move robots + run: | + sudo mv robots.txt dir/robots.txt + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: dir + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 + + deploy-indexes: + environment: deploy + + needs: + - test + + name: Deploy to Algolia + runs-on: ubuntu-latest + timeout-minutes: 3 + + container: + image: registry.jetbrains.team/p/writerside/builder/algolia-publisher:2.0.32-3 + + steps: + - name: Download search artifact + uses: actions/download-artifact@v5 + with: + name: ${{ env.ARTIFACT_INDEXES }} + + - name: Unzip artifact + run: unzip -O UTF-8 -qq '${{ env.ALGOLIA_ARTIFACT }}' -d ${{ env.ARTIFACT_INDEXES }} + + - name: Deploy to Algolia + run: | + env algolia-key='${{ env.ALGOLIA_KEY }}' java -jar /opt/builder/help-publication-agent.jar \ + update-index \ + --application-name '${{ env.ALGOLIA_APP_NAME }}' \ + --index-name '${{ env.ALGOLIA_INDEX_NAME }}' \ + --product '${{ env.CONFIG_JSON_PRODUCT }}' \ + --version '${{ env.CONFIG_JSON_VERSION }}' \ + --index-directory ${{ env.ARTIFACT_INDEXES }}/ \ + 2>&1 | tee algolia-update-index-log.txt diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml new file mode 100644 index 0000000..66190da --- /dev/null +++ b/.github/workflows/test-docs.yml @@ -0,0 +1,38 @@ +name: Tests + +on: + push: + branches-ignore: + - main + pull_request: + +permissions: read-all + +env: + COMPOSER_TOKEN: ${{ secrets.COMPOSER_TOKEN }} + INSTANCE: docs/laravel-feeds + ARTIFACT_DOCS: webHelpLARAVEL-FEEDS2-all.zip + BUILDER_VERSION: 2025.04.8412 + +jobs: + test: + name: Build application + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Build documentation + uses: JetBrains/writerside-github-action@v4 + with: + instance: ${{ env.INSTANCE }} + artifact: ${{ env.ARTIFACT_DOCS }} + docker-version: ${{ env.BUILDER_VERSION }} + + + - name: Test documentation + uses: JetBrains/writerside-checker-action@v1 + with: + instance: ${{ env.INSTANCE }} diff --git a/README.md b/README.md index 272a98c..fac2a34 100644 --- a/README.md +++ b/README.md @@ -32,34 +32,17 @@ After that, publish the configuration file by call the console command: php artisan vendor:publish --tag=feeds ``` -## Usage +## Basic Usage -> [!TIP] -> -> You can find examples of implementations in the [Wiki](https://github.com/TheDragonCode/laravel-feeds/wiki). - -### Create Feeds and Feed Items - -#### Use a Laravel Idea plugin for PHP Storm - -You can also easily create the desired classes using the [Laravel Idea](http://laravel-idea.com) plugin -for [PhpStorm](https://www.jetbrains.com/phpstorm/): - -![](.github/images/idea.png) - -#### Use Artisan +### Create Feeds ```bash -# This will create a `app/Feeds/UserFeed.php` file -php artisan make:feed User - -# This will create a `app/Feeds/UserFeed.php` and `app/Feeds/Items/UserFeedItem.php` files -php artisan make:feed User --with-item - -# This will create a `app/Feeds/Items/UserFeedItem.php` file -php artisan make:feed-item User +php artisan make:feed User -t ``` +As a result of executing the console command, the files `app/Feeds/UserFeed.php` and `app/Feeds/Items/UserFeedItem.php` +will be created. + ### Generate Feeds To generate feeds, create the classes of feeds and its element, add links to the file `config/feeds.php`, next call the @@ -69,317 +52,9 @@ console command: php artisan feed:generate ``` -Each feed can be created in a certain folder of a certain storage. - -To indicate the storage, reduce the property of `$storage` in the feed class: - -```php -use DragonCode\LaravelFeed\Feeds\Feed; - -class UserFeed extends Feed -{ - protected string $storage = 'public'; -} -``` - -By default, `public`. - -The path to the file inside the storage is indicated in the `filename` method: - -```php -use DragonCode\LaravelFeed\Feeds\Feed; - -class UserFeed extends Feed -{ - public function filename(): string - { - return 'your/path/may/be/here.xml'; - } -} -``` - -By default, the class name in `kebab-case` is used. For example, `user-feed.xml` for `UserFeed` class. - -### Filling - -#### Feed - -For example, we use this content for the Feed class: - -```php -namespace App\Feeds; - -use App\Feeds\Items\UserFeedItem; -use App\Models\User; -use DragonCode\LaravelFeed\Feeds\Feed; -use DragonCode\LaravelFeed\Feeds\Items\FeedItem; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\Model; - -class UserFeed extends Feed -{ - public function builder(): Builder - { - return User::query() - ->whereNotNull('email_verified_at') - ->where('created_at', '>', now()->subYear()); - } - - public function item(Model $model): FeedItem - { - return new UserFeedItem($model); - } -} -``` - -#### Feed Item - -For example, we use this content for the Feed Item class: - -```php -namespace App\Feeds\Items; - -use DragonCode\LaravelFeed\Feeds\Items\FeedItem; - -/** @property-read \App\Models\User $model */ -class UserFeedItem extends FeedItem -{ - public function toArray(): array - { - return [ - 'name' => $this->model->name, - 'email' => $this->model->email, - - 'header' => [ - '@attributes' => [ - 'my-key-1' => 'my value 1', - 'my-key-2' => 'my value 2', - ], - '@cdata' => '

' . $this->model->name . '

', - ], - ]; - } -} -``` - -According to this example, the XML file with the following contents will be generated as a result: - -```xml - - - - John Doe - john.doe@example.com -
John Doe]]>
-
-
-``` - -### Objects, attributes and more - -#### Setting the root element - -```php -use DragonCode\LaravelFeed\Data\ElementData; -use DragonCode\LaravelFeed\Feeds\Feed; - -class UserFeed extends Feed -{ - public function root(): ElementData - { - return new ElementData( - name: 'users', - attributes: ['foo' => 'some value'] - ); - } -} -``` - -#### Setting the head info - -In some cases, you need to add various information to the beginning of the file. -To do this, use the `info` method: - -```php -use DragonCode\LaravelFeed\Data\ElementData; -use DragonCode\LaravelFeed\Feeds\Feed; -use DragonCode\LaravelFeed\Feeds\Info\FeedInfo; - -class UserFeed extends Feed -{ - public function info(): FeedInfo - { - return new FeedInfo(); - } -} -``` - -```php -use DragonCode\LaravelFeed\Feeds\Info\FeedInfo; - -class UserFeedInfo extends FeedInfo -{ - public function toArray(): array - { - return [ - // ... - ]; - } -} -``` - -#### Adding attributes for the main section - -```php -use DragonCode\LaravelFeed\Feeds\Items\FeedItem; - -class UserFeedItem extends FeedItem -{ - public function attributes(): array - { - return [ - 'id' => $this->model->id, - 'created_at' => $this->model->created_at->format('Y-m-d'), - ]; - } - - public function toArray(): array - { - // ... - } -} -``` - -#### Adding attributes for nested elements - -> [!NOTE] -> -> Reserved names are: -> -> - `@attributes` -> - `@cdata` -> - `@mixed` -> - `@value` - -```php -use DragonCode\LaravelFeed\Feeds\Items\FeedItem; - -class UserFeedItem extends FeedItem -{ - public function toArray(): array - { - return [ - 'name' => $this->model->name, - 'email' => $this->model->email, - - 'header' => [ - '@cdata' => '

' . $this->model->name . '

', - ], - - 'names' => [ - 'Good guy' => [ - '@attributes' => [ - 'my-key-1' => 'my value 1', - 'my-key-2' => 'my value 2', - ], - - 'name' => 'Luke Skywalker', - 'weapon' => 'Lightsaber', - ], - - 'Bad guy' => [ - 'name' => [ - '@cdata' => '

Sauron

', - ], - - 'weapon' => 'Evil Eye', - ], - ], - ]; - } -} -``` - -#### Adding an array of elements +## Documentation -In some cases, you need to place an array of elements with the same names. - -To do this, add a symbol of `@` to the beginning of the key name: - -```php -use DragonCode\LaravelFeed\Feeds\Items\FeedItem; - -class UserFeedItem extends FeedItem -{ - public function toArray(): array - { - return [ - '@picture' => $this->model->images, - ]; - } -} -``` - -Result: - -```xml - -https://via.placeholder.com/640x480.png/009966?text=beatae -https://via.placeholder.com/640x480.png/000011?text=deleniti -https://via.placeholder.com/640x480.png/009999?text=voluptates -``` - -You can also use values for such elements. -To insert them, use the reserved word `@value`. - -For example: - -```php -use DragonCode\LaravelFeed\Feeds\Items\FeedItem; - -class UserFeedItem extends FeedItem -{ - public function toArray(): array - { - return [ - '@param' => [ - [ - '@attributes' => ['name' => 'Article'], - '@value' => $this->model->article, - ], - [ - '@attributes' => ['name' => 'Brand'], - '@value' => $this->model->brand, - ], - ], - ]; - } -} -``` - -Result: - -```xml - -GD-PRDCT-1 -The Best -``` - -#### Header information - -If it is necessary to change the file cap, override the `header` method in the feed class: - -```php -use DragonCode\LaravelFeed\Feeds\Feed; - -class UserFeed extends Feed -{ - public function header(): string - { - return ''; - } -} -``` +[📚 Check out the full documentation to learn everything that Laravel Feeds has to offer.](https://feeds.dragon-code.pro) ## License diff --git a/docs/cfg/analytics.html b/docs/cfg/analytics.html new file mode 100644 index 0000000..440d4bb --- /dev/null +++ b/docs/cfg/analytics.html @@ -0,0 +1,13 @@ + + + + diff --git a/docs/cfg/buildprofiles.xml b/docs/cfg/buildprofiles.xml new file mode 100644 index 0000000..544b94b --- /dev/null +++ b/docs/cfg/buildprofiles.xml @@ -0,0 +1,43 @@ + + + 1830e628456a000ddfeb32941f42a78c + HIITWOZYBN + laravel-feeds + true + logo.svg + en_US + contrast + frozen + https://feeds.dragon-code.pro + true + true + + https://github.com/TheDragonCode/laravel-feeds/edit/main/docs/ + + + favicon.svg,favicon.svg,favicon.svg,favicon.svg + + + analytics.html + + + + + false + https://feeds.dragon-code.pro/ + + + +
+ + GitHub + + + Boosty + + + Issues + +
+
diff --git a/docs/docs_libraries.tree b/docs/docs_libraries.tree new file mode 100644 index 0000000..7b549af --- /dev/null +++ b/docs/docs_libraries.tree @@ -0,0 +1,9 @@ + + + + + + + diff --git a/docs/images/favicon.svg b/docs/images/favicon.svg new file mode 100644 index 0000000..f543e26 --- /dev/null +++ b/docs/images/favicon.svg @@ -0,0 +1,40 @@ + + + + + + + + + + + diff --git a/docs/images/laravel-idea.png b/docs/images/laravel-idea.png new file mode 100644 index 0000000000000000000000000000000000000000..863dd73ed1dbc3be7bf848ef815fb2331eea107d GIT binary patch literal 21237 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 literal 0 HcmV?d00001 diff --git a/docs/images/laravel-idea_dark.png b/docs/images/laravel-idea_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1684ccd3c097ca7de690708550c22db5d181c65e GIT binary patch literal 16800 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 literal 0 HcmV?d00001 diff --git a/docs/images/logo.svg b/docs/images/logo.svg new file mode 100644 index 0000000..cf7cc72 --- /dev/null +++ b/docs/images/logo.svg @@ -0,0 +1,40 @@ + + + diff --git a/docs/images/logo_dark.svg b/docs/images/logo_dark.svg new file mode 100644 index 0000000..cf7cc72 --- /dev/null +++ b/docs/images/logo_dark.svg @@ -0,0 +1,40 @@ + + + diff --git a/docs/laravel-feeds.tree b/docs/laravel-feeds.tree new file mode 100644 index 0000000..9e11a22 --- /dev/null +++ b/docs/laravel-feeds.tree @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/redirection-rules.xml b/docs/redirection-rules.xml new file mode 100644 index 0000000..671fb77 --- /dev/null +++ b/docs/redirection-rules.xml @@ -0,0 +1,181 @@ + + + + + + Created after removal of "Release Notes" from Laravel Feeds + release-notes.html + + + Created after removal of "Common" from Laravel Feeds + upgrade-common.html + + + Created after removal of "To 6 from 5" from Laravel Feeds + upgrade-common-to-6-from-5.html + + + Created after removal of "To 5 from 4" from Laravel Feeds + upgrade-common-to-5-from-4.html + + + Created after removal of "From third-party packages" from Laravel Feeds + upgrade-third-party.html + + + Created after removal of "Publisher" from Laravel Feeds + upgrade-publisher.html + + + Created after removal of "To 16 from 15" from Laravel Feeds + upgrade-publisher-to-16-from-15.html + + + Created after removal of "To 15 from 14" from Laravel Feeds + upgrade-publisher-to-15-from-14.html + + + Created after removal of "JSON Fallback" from Laravel Feeds + upgrade-json-fallback.html + + + Created after removal of "To 2 from 1" from Laravel Feeds + upgrade-json-fallback-to-2-from-1.html + + + Created after removal of "Upgrade Guide" from Laravel Feeds + upgrade-guide.html + + + Created after removal of "Security Policy" from Laravel Feeds + security-policy.html + + + Created after removal of "Our Team" from Laravel Feeds + our-team.html + + + Created after removal of "Install Plugins" from Laravel Feeds + plugins-installation.html + + + Created after removal of "Official Plugins" from Laravel Feeds + plugins-official.html + + + Created after removal of "Community Plugins" from Laravel Feeds + plugins-community.html + + + Created after removal of "Starter Kits" from Laravel Feeds + packages-starter-kits.html + + + Created after removal of "Common" from Laravel Feeds + packages-common.html + + + Created after removal of "Routes" from Laravel Feeds + packages-routes.html + + + Created after removal of "Models" from Laravel Feeds + packages-models.html + + + Created after removal of "Locales" from Laravel Feeds + packages-locales.html + + + Created after removal of "Lang" from Laravel Feeds + packages-lang.html + + + Created after removal of "Actions" from Laravel Feeds + packages-actions.html + + + Created after removal of "Attributes" from Laravel Feeds + packages-attributes.html + + + Created after removal of "HTTP Statuses" from Laravel Feeds + packages-http-statuses.html + + + Created after removal of "Locale Names" from Laravel Feeds + packages-native-locale-names.html + + + Created after removal of "Country Names" from Laravel Feeds + packages-native-country-names.html + + + Created after removal of "Currency Names" from Laravel Feeds + packages-native-currency-names.html + + + Created after removal of "MoonShine" from Laravel Feeds + packages-moonshine.html + + + Created after removal of "Publisher" from Laravel Feeds + packages-publisher.html + + + Created after removal of "Translator" from Laravel Feeds + packages-translator.html + + + Created after removal of "Locale List" from Laravel Feeds + packages-locale-list.html + + + Created after removal of "JSON Fallback" from Laravel Feeds + packages-json-fallback.html + + + Created after removal of "Add Locales" from Laravel Feeds + usage-add-locales.html + + + Created after removal of "Update Locales" from Laravel Feeds + usage-update-locales.html + + + Created after removal of "Reset Locales" from Laravel Feeds + usage-reset-locales.html + + + Created after removal of "Remove Locales" from Laravel Feeds + usage-remove-locales.html + + + Created after removal of "Managing Locales" from Laravel Feeds + manage-locales.html + + + Created after removal of "Available Locales" from Laravel Feeds + available-locales-list.html + + + Created after removal of "Questions and Issues" from Laravel Feeds + questions-and-issues.html + + + Created after removal of "Basic Usage" from Laravel Feeds + basic-usage.html + + + Created after removal of "Instagram" from Laravel Feeds + u.html + + + Created after removal of "Library Starting Page" from Laravel Feeds + library-starting-page.html + + diff --git a/docs/snippets/advanced-doc-char-result.xml b/docs/snippets/advanced-doc-char-result.xml new file mode 100644 index 0000000..c99a817 --- /dev/null +++ b/docs/snippets/advanced-doc-char-result.xml @@ -0,0 +1,3 @@ +https://via.placeholder.com/640x480.png/009966?text=beatae +https://via.placeholder.com/640x480.png/000011?text=deleniti +https://via.placeholder.com/640x480.png/009999?text=voluptates diff --git a/docs/snippets/advanced-dog-char.php b/docs/snippets/advanced-dog-char.php new file mode 100644 index 0000000..365b0d2 --- /dev/null +++ b/docs/snippets/advanced-dog-char.php @@ -0,0 +1,17 @@ + $this->model->images, + ]; + } +} diff --git a/docs/snippets/advanced-head-feed.php b/docs/snippets/advanced-head-feed.php new file mode 100644 index 0000000..ab7e675 --- /dev/null +++ b/docs/snippets/advanced-head-feed.php @@ -0,0 +1,16 @@ +'; + } +} diff --git a/docs/snippets/advanced-main-attributes.php b/docs/snippets/advanced-main-attributes.php new file mode 100644 index 0000000..9977534 --- /dev/null +++ b/docs/snippets/advanced-main-attributes.php @@ -0,0 +1,23 @@ + $this->model->id, + 'created_at' => $this->model->created_at->format('Y-m-d'), + ]; + } + + public function toArray(): array + { + // ... + } +} diff --git a/docs/snippets/advanced-nested.php b/docs/snippets/advanced-nested.php new file mode 100644 index 0000000..02b98a9 --- /dev/null +++ b/docs/snippets/advanced-nested.php @@ -0,0 +1,42 @@ + $this->model->name, + 'email' => $this->model->email, + + 'header' => [ + '@cdata' => '

' . $this->model->name . '

', + ], + + 'names' => [ + 'Good guy' => [ + '@attributes' => [ + 'my-key-1' => 'my value 1', + 'my-key-2' => 'my value 2', + ], + + 'name' => 'Luke Skywalker', + 'weapon' => 'Lightsaber', + ], + + 'Bad guy' => [ + 'name' => [ + '@cdata' => '

Sauron

', + ], + + 'weapon' => 'Evil Eye', + ], + ], + ]; + } +} diff --git a/docs/snippets/advanced-setup-root.php b/docs/snippets/advanced-setup-root.php new file mode 100644 index 0000000..46ef5b7 --- /dev/null +++ b/docs/snippets/advanced-setup-root.php @@ -0,0 +1,17 @@ + 'some value'] + ); + } +} diff --git a/docs/snippets/advanced-value-word-result.xml b/docs/snippets/advanced-value-word-result.xml new file mode 100644 index 0000000..bd5dd64 --- /dev/null +++ b/docs/snippets/advanced-value-word-result.xml @@ -0,0 +1,2 @@ +GD-PRDCT-1 +The Best diff --git a/docs/snippets/advanced-value-word.php b/docs/snippets/advanced-value-word.php new file mode 100644 index 0000000..b58cbd7 --- /dev/null +++ b/docs/snippets/advanced-value-word.php @@ -0,0 +1,26 @@ + [ + [ + '@attributes' => ['name' => 'Article'], + '@value' => $this->model->article, + ], + [ + '@attributes' => ['name' => 'Brand'], + '@value' => $this->model->brand, + ], + ], + ]; + } +} diff --git a/docs/snippets/config-channels.ini b/docs/snippets/config-channels.ini new file mode 100644 index 0000000..1513607 --- /dev/null +++ b/docs/snippets/config-channels.ini @@ -0,0 +1,2 @@ +FEED_FOO_ENABLED = true +FEED_BAR_ENABLED = false diff --git a/docs/snippets/config-pretty-false.xml b/docs/snippets/config-pretty-false.xml new file mode 100644 index 0000000..5d3495e --- /dev/null +++ b/docs/snippets/config-pretty-false.xml @@ -0,0 +1,5 @@ + + + [NEWS]:Some 1Some content 1Some extra data + [NEWS]:Some 2Some content 2Some extra data + diff --git a/docs/snippets/config-pretty-true.xml b/docs/snippets/config-pretty-true.xml new file mode 100644 index 0000000..7a42836 --- /dev/null +++ b/docs/snippets/config-pretty-true.xml @@ -0,0 +1,13 @@ + + + + [NEWS]:Some 1 + Some content 1 + Some extra data + + + [NEWS]:Some 2 + Some content 2 + Some extra data + + diff --git a/docs/snippets/feeds-feed-item-result.xml b/docs/snippets/feeds-feed-item-result.xml new file mode 100644 index 0000000..152f1f9 --- /dev/null +++ b/docs/snippets/feeds-feed-item-result.xml @@ -0,0 +1,8 @@ + + + + John Doe + john.doe@example.com +
John Doe]]>
+
+
diff --git a/docs/snippets/feeds-feed-item.php b/docs/snippets/feeds-feed-item.php new file mode 100644 index 0000000..8fbd93c --- /dev/null +++ b/docs/snippets/feeds-feed-item.php @@ -0,0 +1,27 @@ + $this->model->name, + 'email' => $this->model->email, + + 'header' => [ + '@attributes' => [ + 'my-key-1' => 'my value 1', + 'my-key-2' => 'my value 2', + ], + '@cdata' => '

' . $this->model->name . '

', + ], + ]; + } +} diff --git a/docs/snippets/feeds-feed.php b/docs/snippets/feeds-feed.php new file mode 100644 index 0000000..8b49cc1 --- /dev/null +++ b/docs/snippets/feeds-feed.php @@ -0,0 +1,27 @@ +whereNotNull('email_verified_at') + ->where('created_at', '>', now()->subYear()); + } + + public function item(Model $model): FeedItem + { + return new UserFeedItem($model); + } +} diff --git a/docs/snippets/generation-feed-filename.php b/docs/snippets/generation-feed-filename.php new file mode 100644 index 0000000..cf913c4 --- /dev/null +++ b/docs/snippets/generation-feed-filename.php @@ -0,0 +1,13 @@ + [ + App\Feeds\InstagramFeed::class => (bool) env('FEED_INSTAGRAM_ENABLED', true), + ], +]; diff --git a/docs/snippets/receipt-instagram-feed-item.php b/docs/snippets/receipt-instagram-feed-item.php new file mode 100644 index 0000000..5827ae5 --- /dev/null +++ b/docs/snippets/receipt-instagram-feed-item.php @@ -0,0 +1,39 @@ + $this->model->id, + 'g:title' => $this->model->title, + + 'g:description' => [ + '@cdata' => $this->model->description, + ], + + 'g:brand' => $this->model->brand, + + 'g:link' => route('products.show', $this->model->slug), + 'g:image_link' => $this->model->image, + + 'g:availability' => $this->model->quantity ? 'in stock' : 'out of stock', + 'g:status' => $this->model->quantity ? 'active' : 'inactive', + 'g:price' => $this->model->price, + ]; + } +} diff --git a/docs/snippets/receipt-instagram-feed.php b/docs/snippets/receipt-instagram-feed.php new file mode 100644 index 0000000..f370f22 --- /dev/null +++ b/docs/snippets/receipt-instagram-feed.php @@ -0,0 +1,50 @@ + + + $name + $url + +XML; + } + + public function footer(): string + { + return "\n\n"; + } + + public function filename(): string + { + return 'instagram.xml'; + } + + public function item(Model $model): FeedItem + { + return new Items\InstagramFeedItem($model); + } +} diff --git a/docs/snippets/receipt-instagram-result.xml b/docs/snippets/receipt-instagram-result.xml new file mode 100644 index 0000000..7dabc92 --- /dev/null +++ b/docs/snippets/receipt-instagram-result.xml @@ -0,0 +1,116 @@ + + + Laravel + https://example.com + + 1 + Inventore Vero Commodi + + Rempel PLC + https://example.com/products/ratione-deserunt-eum-qui-quia-eligendi-omnis-praesentium-ipsam + https://via.placeholder.com/640x480.png/007700?text=sed + in stock + active + 427 + + + 2 + Ipsam Beatae Corporis + + Bosco Inc + https://example.com/products/exercitationem-corrupti-a-consectetur-nisi-maiores-odit + https://via.placeholder.com/640x480.png/00ff55?text=molestias + in stock + active + 242 + + + 3 + Dicta Vel Nisi + + Kihn Inc + https://example.com/products/dolorem-dolorem-dolores-repellat-ducimus + https://via.placeholder.com/640x480.png/007733?text=enim + in stock + active + 240 + + + 4 + Qui Expedita Dolores + + Ferry-Lesch + https://example.com/products/sed-commodi-cumque-modi-qui + https://via.placeholder.com/640x480.png/007744?text=veritatis + in stock + active + 378 + + + 5 + Beatae Quas Aut + + Tromp, Ratke and Wyman + https://example.com/products/neque-quia-laborum-eius-ipsum-architecto-unde-nobis + https://via.placeholder.com/640x480.png/004466?text=nam + in stock + active + 166 + + + 6 + Magni Quibusdam Architecto + + Weissnat Group + https://example.com/products/iure-qui-alias-ipsum + https://via.placeholder.com/640x480.png/00cc11?text=sint + in stock + active + 362 + + + 7 + Fugit Qui Vitae + + Kilback Inc + https://example.com/products/rerum-pariatur-quae-dolorem-numquam-est + https://via.placeholder.com/640x480.png/00bb77?text=doloribus + in stock + active + 355 + + + 8 + Tempora Praesentium Vitae + + Bayer-Dach + https://example.com/products/qui-voluptate-et-est-ullam-magnam-et + https://via.placeholder.com/640x480.png/009955?text=expedita + in stock + active + 562 + + + 9 + Alias Cupiditate Ea + + Gorczany LLC + https://example.com/products/dolorem-architecto-voluptas-odio-nulla-et-possimus-temporibus + https://via.placeholder.com/640x480.png/00ddaa?text=necessitatibus + in stock + active + 683 + + + 10 + Quis Excepturi Sit + + Gorczany, Turner and Hansen + https://example.com/products/consectetur-nam-asperiores-nisi-sit-odit + https://via.placeholder.com/640x480.png/00dd55?text=sit + in stock + active + 978 + + + diff --git a/docs/snippets/receipt-sitemap-config.php b/docs/snippets/receipt-sitemap-config.php new file mode 100644 index 0000000..803e0cd --- /dev/null +++ b/docs/snippets/receipt-sitemap-config.php @@ -0,0 +1,9 @@ + [ + App\Feeds\Sitemaps\ProductFeed::class => (bool) env('FEED_SITEMAP_POSTS_ENABLED', true), + ], +]; diff --git a/docs/snippets/receipt-sitemap-feed-item.php b/docs/snippets/receipt-sitemap-feed-item.php new file mode 100644 index 0000000..d8255d8 --- /dev/null +++ b/docs/snippets/receipt-sitemap-feed-item.php @@ -0,0 +1,29 @@ + route('products.show', $this->model->slug), + + 'lastmod' => $this->model->updated_at->toIso8601String(), + + 'priority' => 0.9, + ]; + } +} diff --git a/docs/snippets/receipt-sitemap-feed.php b/docs/snippets/receipt-sitemap-feed.php new file mode 100644 index 0000000..6abc69c --- /dev/null +++ b/docs/snippets/receipt-sitemap-feed.php @@ -0,0 +1,49 @@ + 'http://www.sitemaps.org/schemas/sitemap/0.9', + 'xmlns:xhtml' => 'http://www.w3.org/1999/xhtml', + 'xmlns:image' => 'http://www.google.com/schemas/sitemap-image/1.1', + 'xmlns:video' => 'http://www.google.com/schemas/sitemap-video/1.1', + 'xmlns:news' => 'http://www.google.com/schemas/sitemap-news/0.9', + ]; + + public function builder(): Builder + { + return Product::query(); + } + + public function root(): ElementData + { + return new ElementData( + $this->name, + $this->attributes + ); + } + + public function filename(): string + { + return 'sitemaps/products.xml'; + } + + public function item(Model $model): FeedItem + { + return new ProductFeedItem($model); + } +} diff --git a/docs/snippets/receipt-sitemap-links.php b/docs/snippets/receipt-sitemap-links.php new file mode 100644 index 0000000..4009bb7 --- /dev/null +++ b/docs/snippets/receipt-sitemap-links.php @@ -0,0 +1,10 @@ + [ + public_path('storage') => storage_path('app/public'), + public_path('sitemaps') => storage_path('app/public/sitemaps'), + ], +]; diff --git a/docs/snippets/receipt-sitemap-result.xml b/docs/snippets/receipt-sitemap-result.xml new file mode 100644 index 0000000..d72bd21 --- /dev/null +++ b/docs/snippets/receipt-sitemap-result.xml @@ -0,0 +1,32 @@ + + + + https://example.com/products/deleniti-tempora-iure-et + 2025-08-30T19:57:10+00:00 + 0.9 + + + https://example.com/products/beatae-itaque-sit-odit-enim-id-voluptatum-reiciendis-eos + 2025-08-30T19:57:10+00:00 + 0.9 + + + https://example.com/products/rem-pariatur-tenetur-perferendis-nesciunt + 2025-08-30T19:57:10+00:00 + 0.9 + + + https://example.com/products/minus-porro-aut-quidem-quos-excepturi-totam + 2025-08-30T19:57:10+00:00 + 0.9 + + + https://example.com/products/amet-possimus-temporibus-non-consequatur-doloremque-dolorem-voluptas + 2025-08-30T19:57:10+00:00 + 0.9 + + diff --git a/docs/snippets/receipt-sitemap-root.xml b/docs/snippets/receipt-sitemap-root.xml new file mode 100644 index 0000000..06134ff --- /dev/null +++ b/docs/snippets/receipt-sitemap-root.xml @@ -0,0 +1,9 @@ + + + + https://example.com/sitemaps/products.xml + + + https://example.com/sitemaps/other-sitemaps.xml + + diff --git a/docs/snippets/receipt-yandex-config.php b/docs/snippets/receipt-yandex-config.php new file mode 100644 index 0000000..4e2a66a --- /dev/null +++ b/docs/snippets/receipt-yandex-config.php @@ -0,0 +1,9 @@ + [ + App\Feeds\YandexFeed::class => (bool) env('FEED_YANDEX_ENABLED', true), + ], +]; diff --git a/docs/snippets/receipt-yandex-feed-info.php b/docs/snippets/receipt-yandex-feed-info.php new file mode 100644 index 0000000..154a236 --- /dev/null +++ b/docs/snippets/receipt-yandex-feed-info.php @@ -0,0 +1,50 @@ + config('app.name'), + 'company' => config('app.name'), + 'platform' => config('app.name'), + + 'url' => config('app.url'), + 'email' => config('emails.manager'), + + 'currencies' => [ + '@currency' => [ + [ + '@attributes' => [ + 'id' => 'RUR', + 'rate' => '1', + ], + ], + ], + ], + + 'categories' => [ + '@category' => [ + [ + '@attributes' => ['id' => 41], + '@value' => 'Домашние майки', + ], + [ + '@attributes' => ['id' => 539], + '@value' => 'Велосипедки', + ], + [ + '@attributes' => ['id' => 44], + '@value' => 'Ремни', + ], + ], + ], + ]; + } +} diff --git a/docs/snippets/receipt-yandex-feed-item.php b/docs/snippets/receipt-yandex-feed-item.php new file mode 100644 index 0000000..31b2f18 --- /dev/null +++ b/docs/snippets/receipt-yandex-feed-item.php @@ -0,0 +1,63 @@ + $this->model->id, + + 'available' => ! empty($this->model->quantity) ? 'true' : 'false', + + 'type' => 'vendor.model', + ]; + } + + public function toArray(): array + { + return [ + 'url' => route('products.show', $this->model->slug), + + 'barcode' => $this->model->article, + 'name' => $this->model->title, + 'description' => $this->model->description, + + 'delivery' => 'true', + 'price' => $this->model->price, + + 'currencyId' => 'RUR', + 'vendor' => $this->model->brand, + + '@picture' => $this->model->images, + + '@param' => [ + [ + '@attributes' => ['name' => 'Артикул'], + '@value' => $this->model->article, + ], + [ + '@attributes' => ['name' => 'Код цвета'], + '@value' => fake()->randomDigit(), + ], + [ + '@attributes' => ['name' => 'Пол'], + '@value' => fake()->boolean() ? 'male' : 'female', + ], + ], + ]; + } +} diff --git a/docs/snippets/receipt-yandex-feed.php b/docs/snippets/receipt-yandex-feed.php new file mode 100644 index 0000000..a11db2e --- /dev/null +++ b/docs/snippets/receipt-yandex-feed.php @@ -0,0 +1,57 @@ +toIso8601String(); + + return << + + + XML; + } + + public function footer(): string + { + return "\n"; + } + + public function info(): FeedInfo + { + return new Info\YandexFeedInfo; + } + + public function filename(): string + { + return 'yandex.xml'; + } + + public function item(Model $model): FeedItem + { + return new Items\YandexFeedItem($model); + } +} diff --git a/docs/snippets/receipt-yandex-result.xml b/docs/snippets/receipt-yandex-result.xml new file mode 100644 index 0000000..3f37e82 --- /dev/null +++ b/docs/snippets/receipt-yandex-result.xml @@ -0,0 +1,181 @@ + + + + Laravel + Laravel + Laravel + https://example.com + + + + + + Домашние майки + Велосипедки + Ремни + + + + + https://example.com/products/quia-inventore-explicabo-aut-est-et-deserunt + GD-A + Itaque Beatae At + Cum fugiat eos consequatur libero enim occaecati dolores et. Voluptas illo quia facere provident maxime. + true + 935 + RUR + Ryan-Dach + https://via.placeholder.com/640x480.png/00dd00?text=voluptatem + https://via.placeholder.com/640x480.png/00cc44?text=aspernatur + https://via.placeholder.com/640x480.png/00bbdd?text=numquam + GD-A + 0 + female + + + https://example.com/products/iste-reprehenderit-nihil-earum-quod-autem-tempora + GD-QUI + Porro Est Sed + Velit commodi est qui dolorem quo. Repellendus consequatur qui et aliquam soluta vel. Quis est possimus laudantium rerum sit. + true + 316 + RUR + King-Jones + https://via.placeholder.com/640x480.png/00bbdd?text=magnam + https://via.placeholder.com/640x480.png/0088cc?text=consequatur + https://via.placeholder.com/640x480.png/00dd99?text=excepturi + GD-QUI + 9 + female + + + https://example.com/products/aspernatur-omnis-aut-libero-vitae-officiis-facere-est + GD-PERSPICIATIS + Soluta Possimus Exercitationem + Numquam non vel et. Corporis voluptatem omnis ducimus laudantium sit quis quia. Voluptas ad ex saepe veniam sit voluptate. Voluptatem perspiciatis exercitationem exercitationem tempora. + true + 965 + RUR + Hauck, Koepp and Beatty + https://via.placeholder.com/640x480.png/005599?text=consequatur + https://via.placeholder.com/640x480.png/002288?text=voluptate + https://via.placeholder.com/640x480.png/00cc33?text=in + GD-PERSPICIATIS + 3 + female + + + https://example.com/products/cumque-aut-fugit-quia + GD-NON + Ipsum Consequuntur Nostrum + Quia accusantium minus maiores vero debitis. Id magni commodi id recusandae. Doloremque et animi dolore. + true + 716 + RUR + Steuber PLC + https://via.placeholder.com/640x480.png/0044ee?text=voluptatibus + https://via.placeholder.com/640x480.png/00ffaa?text=est + https://via.placeholder.com/640x480.png/0033bb?text=incidunt + GD-NON + 5 + male + + + https://example.com/products/rerum-vel-excepturi-est-non-est + GD-VOLUPTATEM + Rerum Aut Ut + Rerum velit sit soluta vitae numquam. Dolor at ut repellat ut sit fugiat ea molestias. Atque omnis aut amet ut deserunt et autem. Voluptatem deleniti beatae quia sapiente ipsum incidunt. + true + 877 + RUR + Cruickshank, Jerde and Walker + https://via.placeholder.com/640x480.png/008899?text=fuga + https://via.placeholder.com/640x480.png/00bbaa?text=quia + https://via.placeholder.com/640x480.png/0022aa?text=architecto + GD-VOLUPTATEM + 5 + male + + + https://example.com/products/consequatur-expedita-et-et-laudantium-alias-ipsam + GD-NIHIL + Asperiores Cupiditate Non + Quia nobis voluptas perferendis. Repellendus veritatis labore voluptates mollitia error sunt. Nobis veritatis iure repudiandae accusamus ipsum odit. Rerum minima est adipisci assumenda dolores omnis. + true + 954 + RUR + Howell-Hauck + https://via.placeholder.com/640x480.png/007799?text=adipisci + https://via.placeholder.com/640x480.png/001122?text=dolor + https://via.placeholder.com/640x480.png/0033ee?text=fuga + GD-NIHIL + 9 + female + + + https://example.com/products/voluptatem-eligendi-qui-id-quia-qui + GD-BEATAE + Eos Dolorem Quibusdam + Inventore nulla optio inventore illum alias repellendus a. Et veniam ut earum tempora corporis. A quia ullam laborum. Et qui ut et corporis. + true + 681 + RUR + Becker, Schoen and Ankunding + https://via.placeholder.com/640x480.png/0011aa?text=impedit + https://via.placeholder.com/640x480.png/00aacc?text=nesciunt + https://via.placeholder.com/640x480.png/0011ee?text=veritatis + GD-BEATAE + 6 + female + + + https://example.com/products/et-provident-eaque-odio-ut-esse-ipsa-quisquam + GD-UT + Officia Nihil Maxime + Aut mollitia nostrum cum voluptatum. Accusamus qui voluptatem voluptas delectus iure enim facere. Provident quidem ipsam quis alias. + true + 795 + RUR + Windler Inc + https://via.placeholder.com/640x480.png/008899?text=qui + https://via.placeholder.com/640x480.png/007733?text=molestiae + https://via.placeholder.com/640x480.png/002222?text=dolores + GD-UT + 4 + female + + + https://example.com/products/aut-tempora-et-animi-sit-aliquam + GD-DOLOR + Odio Tempora Iusto + Non qui temporibus sed rerum non nihil. Consequuntur earum velit cupiditate ex. Magnam tenetur illo tempore saepe tenetur sint. Molestiae sint dicta eius ipsam. Tempora consequatur quam ut ut et. + true + 347 + RUR + Rolfson, Kub and Quigley + https://via.placeholder.com/640x480.png/00dd33?text=similique + https://via.placeholder.com/640x480.png/005577?text=quas + https://via.placeholder.com/640x480.png/007744?text=eum + GD-DOLOR + 1 + female + + + https://example.com/products/quam-aut-hic-corporis-ab-rem-rerum-quae + GD-IPSA + Perferendis Commodi Laborum + Expedita officia illum explicabo numquam voluptas ut a earum. Amet ratione fuga non. Et voluptatem velit reprehenderit. + true + 574 + RUR + Konopelski-Dicki + https://via.placeholder.com/640x480.png/003333?text=quis + https://via.placeholder.com/640x480.png/00cc88?text=necessitatibus + https://via.placeholder.com/640x480.png/0099ee?text=unde + GD-IPSA + 3 + female + + + + diff --git a/docs/topics/advanced-usage.topic b/docs/topics/advanced-usage.topic new file mode 100644 index 0000000..64ca631 --- /dev/null +++ b/docs/topics/advanced-usage.topic @@ -0,0 +1,91 @@ + + + + + Information on creating feed classes and their dependencies + Information on creating feed classes and their dependencies + Information on creating feed classes and their dependencies + + + + +

+ Reserved words: +

+ +
  • @attributes
  • +
  • @cdata
  • +
  • @mixed
  • +
  • @value
  • +
    +
    + + + + + + +

    + In some cases, you need to add various information to the beginning of the file. + To do this, use the info method: +

    + + + +
    + + +

    + If it is necessary to change the file cap, override the header method in the feed class: +

    + + +
    + + + + + + + + + + +

    + In some cases, you need to place an array of elements with the same names. +

    + +

    + To do this, add a @ symbol to the beginning of the key name: +

    + + + +

    + Result: +

    + + + +

    + You can also use values for such elements. To insert them, use the reserved word @value. +

    + +

    + For example: +

    + + + +

    + Result: +

    + + + +
    +
    diff --git a/docs/topics/configuration.topic b/docs/topics/configuration.topic new file mode 100644 index 0000000..32446f7 --- /dev/null +++ b/docs/topics/configuration.topic @@ -0,0 +1,61 @@ + + + + + Detailed information on setting up packages + Detailed information on setting up packages + Detailed information on setting up packages + + + + + +

    + You can publish a %config-filename% configuration file using the console command: +

    + + + php artisan vendor:publish --tag="%package-tags%" + +
    + +

    + This is the contents of the published %config-filename% file: +

    + + +
    + + +

    + This setting contains information about the generated feeds. + They can be both turned on and turned off depending on the environment or other conditions. +

    + + +
    + + +

    + This setting indicates in what form the XML records should be exported - using or without formatting. +

    + + + + + + + + +
    +
    diff --git a/docs/topics/contributions.topic b/docs/topics/contributions.topic new file mode 100644 index 0000000..51d0425 --- /dev/null +++ b/docs/topics/contributions.topic @@ -0,0 +1,64 @@ + + + + + Guide to helping developers develop %instance% projects + Guide to helping developers develop %instance% projects + Guide to helping developers develop %instance% projects + + + +

    + Contributions are + welcome + and will be fully + credited + . +

    +

    + We accept contributions through Pull Requests on + all projects + of our organization. +

    + + +

    + %instance% + follows the + PER-3 coding standard and the + PSR-4 autoloading standard. +

    +

    + To apply the formatting of the code style, follow the console command: +

    + + composer style + +
    + + +

    + The Laravel code of conduct is derived from the + Contributor Covenant + code of conduct. + Any violations of the code of conduct may be reported to + + %abuse-helldar-name% + : +

    + + +
  • Participants will be tolerant of opposing views.
  • +
  • Participants must ensure that their language and actions are free of personal attacks and disparaging + personal remarks. +
  • +
  • When interpreting the words and actions of others, participants should always assume good intentions. +
  • +
  • Behavior that can be reasonably considered harassment will not be tolerated.
  • +
    +
    +
    diff --git a/docs/topics/feeds.topic b/docs/topics/feeds.topic new file mode 100644 index 0000000..b362296 --- /dev/null +++ b/docs/topics/feeds.topic @@ -0,0 +1,96 @@ + + + + + Information on creating feed classes and their dependencies + Information on creating feed classes and their dependencies + Information on creating feed classes and their dependencies + + + + + +

    + You can also create the desired classes using the + Laravel Idea plugin for + PhpStorm: +

    + + laravel idea +
    + + +

    + To create a feed class, use the console command: +

    + + + %command-make% + + +

    + As a result of executing the console command, the file app/Feeds/UserFeed.php will be created. +

    + +

    + Also, this console command can create classes of the element and information along with the feed class. + To do this, use --item and --info parameters. +

    + + + # Create a feed class and information class + %command-make% --info + + # Create a feed class and item class + %command-make% --item + + # Create a feed class, item class and information class + %command-make% --item --info + + +

    + Shortcuts are also available: +

    + + + # Create a feed class and item class + %command-make% -%command-shortcut-item% + + # Create a feed class and info class + %command-make% -%command-shortcut-info% + + # Create a feed class, item class and information class + %command-make% -%command-shortcut-info%%command-shortcut-item% + +
    +
    + + + +

    + For example, we use this content for the Feed class: +

    + + +
    + + +

    + For example, we use this content for the Feed Item class: +

    + + + +

    + According to this example, the XML file with the following contents will be generated as a result: +

    + + +
    +
    + +
    diff --git a/docs/topics/generation.topic b/docs/topics/generation.topic new file mode 100644 index 0000000..2c52e55 --- /dev/null +++ b/docs/topics/generation.topic @@ -0,0 +1,50 @@ + + + + + Information on creating feed classes and their dependencies + Information on creating feed classes and their dependencies + Information on creating feed classes and their dependencies + + + + +

    + To generate feeds, create the classes of feeds and its element, add links to the file + %config-filename%, next call the console command: +

    + + + %command-generate% + +
    + +

    + Each feed can be created in a certain folder of a certain storage. +

    + +

    + To indicate the storage, override the property of $storage in the feed class: +

    + + + +

    + By default, storage is public. +

    + +

    + The path to the file inside the storage is indicated in the filename method: +

    + + + +

    + By default, the class name in kebab-case is used. + For example, user-feed.xml for UserFeed class. +

    +
    diff --git a/docs/topics/instagram.topic b/docs/topics/instagram.topic new file mode 100644 index 0000000..f811871 --- /dev/null +++ b/docs/topics/instagram.topic @@ -0,0 +1,44 @@ + + + + + Feed generation recipe for Instagram + Feed generation recipe for Instagram + Feed generation recipe for Instagram + + + + + + %command-make-simple% Instagram -%command-shortcut-item% + + + + + + + + + + + + +

    + Add a link to the feed class in the %config-filename% file: +

    + + +
    + + + + + + + + +
    diff --git a/docs/topics/installation.topic b/docs/topics/installation.topic new file mode 100644 index 0000000..83cbbe5 --- /dev/null +++ b/docs/topics/installation.topic @@ -0,0 +1,32 @@ + + + + + Information on installing the %instance% application + Information on installing the %instance% application + Information on installing the %instance% application + + + +

    + To get the latest version of + %instance% + , simply require the project using + Composer: +

    + + + composer require %package-name% + + + + + + + + +
    diff --git a/docs/topics/introduction.topic b/docs/topics/introduction.topic new file mode 100644 index 0000000..4024fbc --- /dev/null +++ b/docs/topics/introduction.topic @@ -0,0 +1,32 @@ + + + + + Getting Started + + + 📃 %instance% + + + Easy and fast way of exporting a large amount of data to feeds for marketplaces and other consumers. + + + + + + + + + + Getting started + + + + + + + diff --git a/docs/topics/license.topic b/docs/topics/license.topic new file mode 100644 index 0000000..062b582 --- /dev/null +++ b/docs/topics/license.topic @@ -0,0 +1,29 @@ + + + + +

    + Copyright (c) %year% %author-name%, %team-name% +

    +

    + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated + documentation files (the “Software”), to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +

    +

    + The above copyright notice and this permission notice shall be included in all copies or substantial portions + of the Software. +

    +

    + THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED + TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +

    +
    diff --git a/docs/topics/sitemap.topic b/docs/topics/sitemap.topic new file mode 100644 index 0000000..10e093d --- /dev/null +++ b/docs/topics/sitemap.topic @@ -0,0 +1,66 @@ + + + + + Sitemap generation recipe + Sitemap generation recipe + Sitemap generation recipe + + + + + + %command-make-simple% Sitemaps/Product -%command-shortcut-item% + + + + + + + + + + + + +

    + Add a link to the feed class in the %config-filename% file: +

    + + +
    + + +

    + Don't forget to add a link to the folder with site maps in the + config/filesystems.php configuration file: +

    + + + +

    + After that, run the console command: +

    + + + php artisan storage:link + + + + + + + + + + + + + + + + diff --git a/docs/topics/snippet-generate.topic b/docs/topics/snippet-generate.topic new file mode 100644 index 0000000..2ba7ffc --- /dev/null +++ b/docs/topics/snippet-generate.topic @@ -0,0 +1,19 @@ + + + + + +

    + Now you can generate a feed using a console command: +

    + + + %command-generate% + +
    +
    diff --git a/docs/topics/yandex.topic b/docs/topics/yandex.topic new file mode 100644 index 0000000..1a66d02 --- /dev/null +++ b/docs/topics/yandex.topic @@ -0,0 +1,48 @@ + + + + + Feed generation recipe for Yandex + Feed generation recipe for Yandex + Feed generation recipe for Yandex + + + + + + %command-make-simple% Yandex -%command-shortcut-info%%command-shortcut-item% + + + + + + + + + + + + + + + + +

    + Add a link to the feed class in the %config-filename% file: +

    + + +
    + + + + + + + + +
    diff --git a/docs/v.list b/docs/v.list new file mode 100644 index 0000000..e95359b --- /dev/null +++ b/docs/v.list @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/writerside.cfg b/docs/writerside.cfg new file mode 100644 index 0000000..b695b8d --- /dev/null +++ b/docs/writerside.cfg @@ -0,0 +1,8 @@ + + + + + + + From 5a556161d7a8832ce71bf097e5cff6bb4ddd1693 Mon Sep 17 00:00:00 2001 From: Andrey Helldar Date: Mon, 1 Sep 2025 02:53:24 +0300 Subject: [PATCH 2/6] Fixed code-style --- docs/snippets/feeds-feed-item.php | 2 +- docs/snippets/receipt-instagram-feed.php | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/snippets/feeds-feed-item.php b/docs/snippets/feeds-feed-item.php index 8fbd93c..db0176a 100644 --- a/docs/snippets/feeds-feed-item.php +++ b/docs/snippets/feeds-feed-item.php @@ -20,7 +20,7 @@ public function toArray(): array 'my-key-1' => 'my value 1', 'my-key-2' => 'my value 2', ], - '@cdata' => '

    ' . $this->model->name . '

    ', + '@cdata' => '

    ' . $this->model->name . '

    ', ], ]; } diff --git a/docs/snippets/receipt-instagram-feed.php b/docs/snippets/receipt-instagram-feed.php index f370f22..4c45f37 100644 --- a/docs/snippets/receipt-instagram-feed.php +++ b/docs/snippets/receipt-instagram-feed.php @@ -25,12 +25,12 @@ public function header(): string $url = config('app.url'); return << - - $name - $url + + + $name + $url -XML; + XML; } public function footer(): string From 3b23df0e8cbf2a419b18b94cb9710b1cf9e5a0a2 Mon Sep 17 00:00:00 2001 From: Andrey Helldar Date: Mon, 1 Sep 2025 03:10:49 +0300 Subject: [PATCH 3/6] Update Algolia API Key --- docs/cfg/buildprofiles.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cfg/buildprofiles.xml b/docs/cfg/buildprofiles.xml index 544b94b..e8cbadc 100644 --- a/docs/cfg/buildprofiles.xml +++ b/docs/cfg/buildprofiles.xml @@ -1,7 +1,7 @@ - 1830e628456a000ddfeb32941f42a78c + be22e8bf7afc7bcd53f07ce638374654 HIITWOZYBN laravel-feeds true From 241c1a690c71ffc254449acfaa3c7423ccc1eb7a Mon Sep 17 00:00:00 2001 From: Andrey Helldar Date: Mon, 1 Sep 2025 03:19:26 +0300 Subject: [PATCH 4/6] Just a trigger --- tests/Pest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Pest.php b/tests/Pest.php index 2e574ba..c47d69c 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -14,6 +14,7 @@ ->use(RefreshDatabase::class) ->in('Feature'); + pest() ->extend(TestCase::class) ->in('Unit'); From a6a8f91183fa977b3bdf7357837fd1057980526e Mon Sep 17 00:00:00 2001 From: Andrey Helldar Date: Mon, 1 Sep 2025 03:22:33 +0300 Subject: [PATCH 5/6] Prepare for merging docs --- .github/workflows/docs.yml | 1 - tests/Pest.php | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 1d32642..b1dc883 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -4,7 +4,6 @@ on: push: branches: - main - - 1.x workflow_dispatch: permissions: diff --git a/tests/Pest.php b/tests/Pest.php index c47d69c..2e574ba 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -14,7 +14,6 @@ ->use(RefreshDatabase::class) ->in('Feature'); - pest() ->extend(TestCase::class) ->in('Unit'); From 48eab9ce8712941d2f60de23f61d40f51c23cf7c Mon Sep 17 00:00:00 2001 From: Andrey Helldar Date: Mon, 1 Sep 2025 03:24:48 +0300 Subject: [PATCH 6/6] Update test-docs.yml --- .github/workflows/test-docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml index 66190da..a00fd26 100644 --- a/.github/workflows/test-docs.yml +++ b/.github/workflows/test-docs.yml @@ -1,4 +1,4 @@ -name: Tests +name: Documentation on: push: @@ -16,7 +16,7 @@ env: jobs: test: - name: Build application + name: Test runs-on: ubuntu-latest steps: