0

After adding a block file to src/Plugin/Block I can't add the block on the Block Layout admin page. When I filter by block name I can see it, but then when I try to place it I can't get to the configure block screen (pressing the 'Place block' button produces no effect). I do not get any errors.

What could be the reason for such a behaviour?

The block file contents:

    <?php

namespace Drupal\Core\Block\BlockBase;
use Drupal\Core\Link;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\core\Url;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides a block with a link to start the toru.
 * 
 * @Block(
 *    id = "iai_tour_link",
 *    admin_label = @Translation("Link for the IAI Product Guide tour"),
 *    category = @Translation("Links"),
 *    context = {
 *       "node" = @ContextDefinition(
 *         "entity:node",
 *          label = @Translation("Current Node")
 *        )
 *     }
 *   )
 */
class TourLinkBlock extends BlockBase implements ContainerFactoryPluginInterface{
    /**
     * The current user.
     * 
     * @var \Drupal\Core\Session\AccountInterface;
     * 
     */
    protected $currentUser;

    /**
     * Constructs an TourLinkBlock object.
     * 
     * @param array $configuration
     * A configuration array containing information about the plugin instance.
     * @param string $plugin_id
     * The plugin_id for the plugin instance.
     * @param mixed $plugin_definition
     * The plugin implementation definition.
     */
    public function __construct(array $configuration, $plugin_id, $plugin_definition, AccountInterface $current_user){
        parent::__construct($configuration, $plugin_id, $plugin_definition);
        $this->currentUser = $current_user;
    }

    /**
     * {@inheritdoc}
     */
    public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition){
        return new static(
            $configuration,
            $plugin_id,
            $plugin_definition,
            $container->get('current_user')
        );
    }

    public function build(){

        $node = $this->getContextValue('node');
        if ($this->currentUser->hasPermission('access tour') && $node->getType() == 'book'){
            $url = Url::fromRoute('<current>', array(), array('query' => array('tour' => 1)));
            $build['tour_link']= [
                '#type' => 'markup',
                '#markup' => Link::fromTextAndUrl(t('Take the tour!'), $url)->toString(),
            ];
            $build['#attached']['library'][] = 'tour/tour';
            return $build;
        }
    }
}
3
  • 2
    When the code isn't working it probably does produce an error. Check the error log and try to open the place block form in a new tab to see the error on the screen when you have enabled displaying of errors.
    – 4uk4
    Commented Apr 10, 2019 at 13:32
  • It's funny as the error didn't show when I navigated through Reports - Recent log messages. It showed though when I opened the place block button in a new tab. So that part of your comment should be treated as the answer to my question. Thanks :-)
    – Tommy
    Commented Apr 10, 2019 at 14:20
  • Usually you need to look in a javaScript console to see these errors. Or else, you can disable JavaScript, which will force page reloads, and show you the errors (if you have error reporting enabled).
    – Jaypan
    Commented Feb 21, 2021 at 2:43

1 Answer 1

1

Fix the namespaces:

delete: namespace Drupal\Core\Block\BlockBase;

add: namespace Drupal\MY_COOL_MODULE\Plugin\Block; use Drupal\Core\Block\BlockBase;

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.