Remove Rules dependency

Created on 27 March 2024, 9 months ago

Problem/Motivation

Rules module is not required to use this module.

Feature request
Status

RTBC

Version

1.0

Component

Code

Created by

🇪🇸Spain interdruper

Live updates comments and jobs are added and updated live.
Sign in to follow issues

Comments & Activities

  • Issue created by @interdruper
  • 🇬🇧United Kingdom 2dareis2do

    Hi interdruper,

    Although not strictly required, Rules (or similar) is the recommended way to use this module.

    e.g. If I want to post content on publish, I can set up a rule for this.

    In fact, I have also created a rules plugin that helps prevent submission on no prod environments.

    https://www.drupal.org/project/rules_condition_environment

    If you are using this differently please can you elaborate how?

    Thanks.

  • 🇬🇧United Kingdom 2dareis2do

    Still interested to know how you are using this but I have removed rules Drupal dependency for now as it does seem reasonable that it can be used in other contexts.

  • 🇪🇸Spain interdruper

    Hi 2dareis2do

    thanks for your fast response.

    We use XPostManager encapsulated in a custom service, so it can contains logic for any specific context.

    E.g.: for scheduling the post of tweets, with the help of modules like Scheduler or our preferred Scheduler Field .

    I attached a code sample (skeleton) of a custom service using XPostManager, in case it is useful to someone with the same requirement:

    <?php
    
    namespace Drupal\custom_module\Service;
    
    use Drupal\Core\Entity\EntityTypeManagerInterface;
    use Drupal\Core\Logger\LoggerChannelFactoryInterface;
    use Drupal\Core\Messenger\MessengerInterface;
    use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
    use Drupal\Core\Routing\RouteMatchInterface;
    use Drupal\Core\Session\AccountInterface;
    use Drupal\Core\StringTranslation\StringTranslationTrait;
    use Drupal\Core\StringTranslation\TranslatableMarkup;
    use Drupal\Core\StringTranslation\TranslationInterface;
    use Drupal\Core\Url;
    use Drupal\node\Entity\Node;
    use Drupal\social_api\Plugin\NetworkManager;
    use Drupal\social_api\User\UserManagerInterface;
    use Drupal\social_post_x\Plugin\Network\XPostInterface;
    use Drupal\social_post_x\XPostManagerInterface;
    use Drupal\taxonomy\Entity\Term;
    use Drupal\user\Entity\User;
    use Symfony\Component\DependencyInjection\ContainerInterface;
    
    /**
     * Post a tweet
     */
    class PostTweet {
    
      use StringTranslationTrait;
    
      /**
       * The X post network plugin.
       *
       * @var \Drupal\social_post_x\Plugin\Network\XPostInterface
       */
      protected $xPoster;
    
      /**
       * The network manager.
       *
       * @var \Drupal\social_api\Plugin\NetworkManager
       */
      private NetworkManager $networkManager;
    
      /**
       * The social api user manager.
       *
       * @var \Drupal\social_post\User\UserManager
       */
      protected $userManager;
    
      /**
       * The X post network plugin.
       *
       * @var \Drupal\social_post_x\XPostManager
       */
      protected $postManager;
    
      /**
       * The entity type manager.
       *
       * @var \Drupal\Core\Entity\EntityTypeManagerInterface
       */
      protected $entityTypeManager;
    
      /**
       * The messenger.
       *
       * @var \Drupal\Core\Messenger\MessengerInterface
       */
      protected $messenger;
    
      /**
       * The logger factory.
       *
       * @var \Drupal\Core\Logger\LoggerChannelFactoryInterface
       */
      private $logger;
    
      /**
       * The current user.
       *
       * @var \Drupal\Core\Session\AccountInterface
       */
      protected $currentUser;
    
      /**
       * The current route match.
       *
       * @var \Drupal\Core\Routing\RouteMatchInterface
       */
      protected $routeMatch;
    
      /**
       * The constructor.
       *
       * @param \Drupal\social_api\Plugin\NetworkManager $networkManager
       *   The network manager.
       * @param \Drupal\social_api\User\UserManagerInterface $user_manager
       *   The social user manager.
       * @param \Drupal\social_post_x\XPostManagerInterface $post_manager
       *   The X post manager.
       * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
       *   The entity type manager.
       * @param \Drupal\Core\Messenger\MessengerInterface $messenger
       *   The messenger.
       * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $loggerFactory
       *   The logger factory object.
       * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
       *   The string translation.
       * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
       *   The current route match
       */
      public function __construct(NetworkManager $networkManager,
                                  UserManagerInterface $user_manager,
                                  XPostManagerInterface $post_manager,
                                  EntityTypeManagerInterface $entity_type_manager,
                                  MessengerInterface $messenger,
                                  LoggerChannelFactoryInterface $loggerFactory,
                                  TranslationInterface $string_translation,
                                  AccountInterface $current_user,
                                  RouteMatchInterface $route_match) {
    
        $this->networkManager = $networkManager;
        $this->userManager = $user_manager;
        $this->postManager = $post_manager;
        $this->entityTypeManager = $entity_type_manager;
        $this->messenger = $messenger;
        $this->logger = $loggerFactory->get('custom_module');
        $this->stringTranslation = $string_translation;
        $this->currentUser = $current_user;
        $this->routeMatch = $route_match;
    
        $this->xPoster = $this->networkManager->createInstance('social_post_x');
    
        $client = $this->xPoster->getSdk();
        $this->postManager->setClient($client);
      }
    
      /**
       * {@inheritdoc}
       */
      public static function create(ContainerInterface $container) {
    
        return new static(
          $container->get('plugin.network.manager'),
          $container->get('social_post.user_manager'),
          $container->get('x_post.manager'),
          $container->get('entity_type.manager'),
          $container->get('messenger'),
          $container->get('logger.factory'),
          $container->get('string_translation'),
          $container->get('current_user'),
          $container->get('current_route_match')
        );
      }
    
      /**
       * Post twweet.
       *
       * @param string $content
       *   Tweet content.
       *
       *  @param array $image_path
       *   Array of full realpaths or URLs to image files.
       *
       * @call \Drupal::service('custom_module.post_tweet')->postTweet($content, $image_paths);
       */
    
      public function postTweet(string $content, array $image_paths = []) : void {
    
        if (empty($content)) {
          return;
        }
    
        // Include your custom logic here, using the available injected services...
    
        $tweet['text'] = $content;
        foreach ($image_paths as $image_path) {
          $tweet['media_paths'][] = $image_path;
        }
    
        $this->postManager->doPost($tweet);
      }
    
    }
    
    

    module_custom.service.yml

    services:
      custom_module.post_tweet:
        class: '\Drupal\custom_module\Service\PostTweet'
        arguments:
          - '@plugin.network.manager'
          - '@social_post.user_manager'
          - '@x_post.manager'
          - '@entity_type.manager'
          - '@messenger'
          - '@logger.factory'
          - '@string_translation'
          - '@current_user'
          - '@current_route_match'
    
  • Status changed to RTBC 9 months ago
Production build 0.71.5 2024