Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
13 changes: 10 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ composer require php-di/php-di
In this step, we are adding the WPify Scoper to the plugin, so that the dependencies are not conflicting with other
plugins.

links: [WPify Scoper](https://packagist.org/packages/wpify/scoper)
Links: [WPify Scoper](https://packagist.org/packages/wpify/scoper)

```bash
composer require wpify/scoper
Expand All @@ -47,7 +47,14 @@ composer require wpify/scoper
In this step, we are adding the WPify Custom Fields to the plugin, so that we can easily create custom fields for our
plugin. Custom fields are required in composer-deps.json file.

links: [WPify Custom Fields](https://packagist.org/packages/wpify/custom-fields)
Links: [WPify Custom Fields](https://packagist.org/packages/wpify/custom-fields)

### 04 - WPify Model

[Next step >>>](https://github.com/wpify/plugin-tutorial/tree/04-models)
We have a custom post type, taxonomy, but we have no easy way how to access data. In this step, we are adding
WPify Models, so we can access data easily and use them wherever we need.

Links: [WPify Model](https://packagist.org/packages/wpify/model)


[Next step >>>](https://github.com/wpify/plugin-tutorial/tree/05-templates)
11 changes: 9 additions & 2 deletions bootstrap.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
use WpifyPluginTutorialDeps\DI\DependencyException;
use WpifyPluginTutorialDeps\DI\NotFoundException;
use WpifyPluginTutorial\Plugin;
use WpifyPluginTutorialDeps\Wpify\Model\Manager;

use function WpifyPluginTutorialDeps\DI\create;

require 'deps/scoper-autoload.php';
require 'deps/autoload.php';
Expand All @@ -35,7 +38,9 @@ function wpifypt_container(): Container {

if ( empty( $container ) ) {
$containerBuilder = new ContainerBuilder();
$containerBuilder->addDefinitions( array() );
$containerBuilder->addDefinitions( array(
Manager::class => create()->constructor( array() )
) );
$container = $containerBuilder->build();
}

Expand Down Expand Up @@ -90,8 +95,10 @@ function wpifypt_uninstall(): void {
wpifypt()->uninstall();
}

/**
* Hook basic stuff, so the plugin can work.
*/
add_action( 'plugins_loaded', 'wpifypt' );

register_activation_hook( __FILE__, 'wpifypt_activate' );
register_deactivation_hook( __FILE__, 'wpifypt_deactivate' );
register_uninstall_hook( __FILE__, 'wpifypt_uninstall' );
3 changes: 2 additions & 1 deletion composer-deps.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"require": {
"php": "^8.0",
"php-di/php-di": "^7.0",
"wpify/custom-fields": "^3.9"
"wpify/custom-fields": "^3.9",
"wpify/model": "^4.0"
}
}
18 changes: 15 additions & 3 deletions src/Blocks/BookLinkBlock.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,23 @@
namespace WpifyPluginTutorial\Blocks;

use WpifyPluginTutorial\Managers\BlocksManager;
use WpifyPluginTutorial\Repositories\BookRepository;
use WpifyPluginTutorialDeps\Wpify\CustomFields\CustomFields;

class BookLinkBlock {
const KEY = 'wpify/book-link';

public function __construct( CustomFields $custom_fields ) {
public function __construct(
CustomFields $custom_fields,
private BookRepository $book_repository,
) {
$custom_fields->create_gutenberg_block( array(
'name' => self::KEY,
'title' => __( 'Book link', 'wpifypt' ),
'category' => BlocksManager::BOOKS_KEY,
'icon' => 'book',
'supports' => array( 'anchor' => true ),
'example' => array( 'book_id' => 1 ),
'example' => array( 'book_id' => 1, 'title' => 'Example book' ),
'render_callback' => array( $this, 'render' ),
'items' => array(
array(
Expand All @@ -34,6 +38,14 @@ public function __construct( CustomFields $custom_fields ) {
}

public function render( $block_attributes, $content ) {
return '<h1>Book: ' . $block_attributes['book_id'] . '</h1>';
// Get the book from the repository.
$book = $this->book_repository->get( $block_attributes['book_id'] );

// Set the attributes needed for the render.
$block_attributes['title'] = $book->title;
$block_attributes['isbn'] = $book->isbn;

// return the string with the rendered block.
return '<h1 id="' . $block_attributes['anchor'] . '">Book: ' . $block_attributes['title'] . ' (' . $block_attributes['isbn'] . ')</h1>';
}
}
27 changes: 27 additions & 0 deletions src/Managers/RepositoriesManager.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace WpifyPluginTutorial\Managers;

use WpifyPluginTutorial\Repositories\BookAuthorRepository;
use WpifyPluginTutorial\Repositories\BookRepository;
use WpifyPluginTutorialDeps\DI\Container;
use WpifyPluginTutorialDeps\Wpify\Model\Manager;

class RepositoriesManager {
public function __construct(
Manager $manager,
Container $container,
BookRepository $book_repository,
BookAuthorRepository $book_author_repository,
) {
// This registers all build-in repositories in WPify Models to our DI container,
// so we can use them in our plugin as constructor dependency.
foreach ( $manager->get_repositories() as $repository ) {
$container->set( $repository::class, $repository );
}

// Register all custom repositorues in WPify Models, so it knows how to use them.
$manager->register_repository( $book_repository );
$manager->register_repository( $book_author_repository );
}
}
14 changes: 14 additions & 0 deletions src/Models/BookAuthorModel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace WpifyPluginTutorial\Models;

use WpifyPluginTutorialDeps\Wpify\Model\Attributes\Meta;
use WpifyPluginTutorialDeps\Wpify\Model\Term;

class BookAuthorModel extends Term {
#[Meta]
public string $date_of_birth = '';

#[Meta]
public string $date_of_death = '';
}
14 changes: 14 additions & 0 deletions src/Models/BookModel.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

namespace WpifyPluginTutorial\Models;

use WpifyPluginTutorialDeps\Wpify\Model\Attributes\Meta;
use WpifyPluginTutorialDeps\Wpify\Model\Post;

class BookModel extends Post {
#[Meta]
public string $isbn = '';

#[Meta]
public string $first_published = '';
}
2 changes: 2 additions & 0 deletions src/Plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

use WpifyPluginTutorial\Managers\BlocksManager;
use WpifyPluginTutorial\Managers\PostTypesManager;
use WpifyPluginTutorial\Managers\RepositoriesManager;
use WpifyPluginTutorial\Managers\TaxonomiesManager;

/**
Expand All @@ -18,6 +19,7 @@ public function __construct(
PostTypesManager $post_types_manager,
TaxonomiesManager $taxonomies_manager,
BlocksManager $blocks_manager,
RepositoriesManager $repositories_manager,
) {
// stuff to do on plugin load
}
Expand Down
17 changes: 17 additions & 0 deletions src/Repositories/BookAuthorRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace WpifyPluginTutorial\Repositories;

use WpifyPluginTutorial\Models\BookAuthorModel;
use WpifyPluginTutorial\Taxonomies\BookAuthorTaxonomy;
use WpifyPluginTutorialDeps\Wpify\Model\TermRepository;

class BookAuthorRepository extends TermRepository {
public function model(): string {
return BookAuthorModel::class;
}

public function taxonomy(): string {
return BookAuthorTaxonomy::KEY;
}
}
17 changes: 17 additions & 0 deletions src/Repositories/BookRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace WpifyPluginTutorial\Repositories;

use WpifyPluginTutorial\Models\BookModel;
use WpifyPluginTutorial\PostTypes\BookPostType;
use WpifyPluginTutorialDeps\Wpify\Model\PostRepository;

class BookRepository extends PostRepository {
public function model(): string {
return BookModel::class;
}

public function post_types(): array {
return array( BookPostType::KEY );
}
}