Come posso controllare la visibilità dei blocchi con il codice?


11

In Drupal 6, ho potuto controllare la visibilità del blocco usando il codice PHP nella configurazione dell'interfaccia utente del blocco come:

<?php return MYMODULE_abc() || MYMODULE_def() ; ?>

Queste funzioni hanno cercato il nodo corrente, la tassonomia, ecc. Per decidere se visualizzare il blocco. Questa opzione PHP è sparita in Drupal 8, ma c'è un $visibilitycampo in BlockBase. Posso usarlo per impostare a livello di programmazione la visibilità in fase di esecuzione?


1
Dovresti invece dichiarare un plug-in di condizioni personalizzato. Cerca nel core @Condition per trovare esempi funzionanti.
Eyal,

Generalmente la scrittura di codice PHP nel database è una cattiva pratica e la spalla deve essere evitata il più possibile.
Eyal,

Il modulo filtro php è stato rimosso da D8. In generale è una cattiva idea usare php inserito nell'interfaccia utente ed eseguito in questo modo. È una cattiva idea perché manca un; potrei paralizzare un intero sito e poi sarò assunto per cercare nel db per trovare i dispersi; Questo è successo,
Frank Robert Anderson il

Concordato! Viene spostato il maggior codice possibile nel modulo e sono felice di poterlo fare con il codice puro in D8!
Nic

Risposte:


15

Uno snippet di codice funzionante su come usare hook_block_access(). Qui recupero la condizione da un campo del nodo corrente:

use Drupal\block\Entity\Block;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
use Drupal\Core\Access\AccessResult;

/**
 * Implements hook_block_access().
 */
function MYMODULE_block_access(Block $block, $operation, AccountInterface $account) {

  $node = \Drupal::routeMatch()->getParameter('node');

  $hero_image_exists = FALSE;

  if ($node instanceof NodeInterface) {
    if ($node->hasField('field_hero_image')) {
      if (!$node->get('field_hero_image')->isEmpty()) {
        $hero_image_exists = TRUE;
      }
    }
  }

  if ($operation == 'view' && $block->getPluginId() == 'MYBLOCK') {
    return AccessResult::forbiddenIf($hero_image_exists == FALSE)->addCacheableDependency($block);
  }

  return AccessResult::neutral();
}

Grazie @Insasse per aver condiviso la seguente gemma nei commenti. Per i blocchi personalizzati creati a livello di programmazione è possibile controllare la visibilità direttamente dall'interno della classe di blocchi tramite blockAccess():

class MyBlock extends BlockBase {
  /**
   * {@inheritdoc}
   */
  public function build() {
    return [
      '#markup' => $this->t('This is a simple block!'),
    ];
  }

  /**
   * {@inheritdoc}
   */
  protected function blockAccess(AccountInterface $account) {
    return AccessResult::allowedIfHasPermission($account, 'access content');
  }

}

Fonte: Come creare a livello di codice un blocco in Drupal 8


1
Puoi persino scrivere il controllo di accesso nella tua classe di blocco -> webwash.net/programmatical-create-block-drupal-8
Insasse

7

Mancando il filtro php in Drupal 8, questo non sarà più possibile dall'IU.

L'unica opzione è utilizzare il blocco API.

hook_block_access è il tuo miglior canidate. Da lì puoi controllare $operatione restituire un AccessResult in base alle tue condizioni.

Proprio come nell'interfaccia utente solo questa volta inserendo il php in un modulo.


4

Ecco la soluzione Drupal 8: Block Exclude Pages .

Questo modulo aggiunge un filtro pagine di esclusione per i blocchi.

Per escludere pagine specifiche dopo il carattere jolly o tra i caratteri jolly, è sufficiente aggiungere un prefisso al percorso con un prefisso "!" nella configurazione di visibilità della pagina di blocco.

Questo funziona con la visibilità impostata su "mostra per le pagine elencate", in questo caso, i percorsi di esclusione nasconderanno il blocco sulle pagine che corrispondono al carattere jolly impostato per mostrare.

O viceversa, se l'elenco delle pagine è impostato su "nascondi per le pagine elencate", i percorsi esclusi mostreranno il blocco sulle pagine in cui il modello corrisponde nonostante il carattere jolly impostato su hide.

Block Exclude Pages screenshot



1

per estendere le possibilità di visibilità dei blocchi puoi provare questa patch:

https://www.drupal.org/project/drupal/issues/923934#comment-12401360

introduce l' operatore di congiunzione AND / OR per le condizioni di visibilità, quindi puoi dire oh voglio che questo blocco sia visibile se è di my_content_type OPPURE l' utente ha un ruolo di amministratore O l'URL inizia con my / path / to / * etc .. anche le condizioni potrebbe essere negato in modo da poter impostare molte condizioni in cui non si desidera che il blocco sia visibile

anche se usi il modulo Drupal Commerce puoi provare quanto sopra installando il modulo https://www.drupal.org/project/commerce_quick_purchase nota che l'installazione del modulo espone questa funzionalità per tutti i blocchi sul sistema anche se non si ' Utilizzare il blocco fornito dal modulo per ulteriori informazioni

https://github.com/drugan/commerce_quick_purchase#block-visibility

inoltre puoi creare il tuo plugin condizione personale vedi esempio dal modulo

https://cgit.drupalcode.org/commerce_quick_purchase/tree/src/Plugin/Condition

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.