Skip to content

Latest commit

 

History

History
510 lines (379 loc) · 16.5 KB

README.md

File metadata and controls

510 lines (379 loc) · 16.5 KB


Contents

Instalação

composer require php-school/cli-menu

Modo de Usar

Instalação rápida

Um exemplo básico bem simples de menu onde será apenas exibido o text do item selecionado, apenas para você iniciar.

<?php

use PhpSchool\CliMenu\CliMenu;
use PhpSchool\CliMenu\CliMenuBuilder;

require_once(__DIR__ . '/../vendor/autoload.php');

$itemCallable = function (CliMenu $menu) {
    echo $menu->getSelectedItem()->getText();
};

$menu = (new CliMenuBuilder)
    ->setTitle('Basic CLI Menu')
    ->addItem('First Item', $itemCallable)
    ->addItem('Second Item', $itemCallable)
    ->addItem('Third Item', $itemCallable)
    ->addLineBreak('-')
    ->build();

$menu->open();

Exemplos

Veja mais exemplos na pasta de exemplos e execute-os para ver todas as possibilidades.

Menu Básico

basic

Menu Básico com Separação

basic-seperation

Menu Básico com Separação bem louca

crazy-seperation

Estilos Personalizados

custom-styles

Separação Útil

useful-seperation

Itens adicionais

item-extra

Remover padrão

remove-defaults

Sub-menu

submenu

submenu-options

Desabilitar Itens & Sub-menus

submenu

Mensagem instantânea

submenu

Caixa de confirmação

submenu

API

O objeto CliMenu construído pela classe Builder

$menu = (new CliMenuBuilder)
    /**
     *  Customise
    **/
    ->build();

Assim que você tem o objeto de menu, você pode abri-lo e fecha-lo da seguinte forma:

$menu->open();
$menu->close();

Aparência

Você pode trocar a cor do primeiro plano e do plano de fundo do menu para qualquer uma das seguintes cores

  • black (Preto)
  • red (Vermelho)
  • green (Verde)
  • yellow (Amarelo)
  • blue (Azul)
  • magenta (Magenta)
  • cyan (Ciano)
  • white (Branco)
$menu = (new CliMenuBuilder)
    ->setForegroundColour('green')
    ->setBackgroundColour('black')
    ->build();

A largura (width), o espaçamento (padding) e a margem (margin) também podem ser personalizadas:

$menu = (new CliMenuBuilder)
    ->setWidth(200)
    ->setPadding(10)
    ->setMargin(5)
    ->build();

Modificar o texto do botão de sair:

$menu = (new CliMenuBuilder)
    ->setExitButtonText("Don't you want me baby?")
    ->build();

Você pode remover o botão de sair, caso assim deseje:

$menu = (new CliMenuBuilder)
    ->disableDefaultItems()
    ->build();

Observação: Isto também irá desabilitar o botão Voltar (Go Back) para os sub-menus.

O marcador exibido ao lado do do item ativo pode ser modificado, caracteres UTF-8 são suportados. O marcador for itens não selecionados também pode ser modificado. Se você quiser desabilita-lo, apenas defina-o como um caractere de espaço.

$menu = (new CliMenuBuilder)
    ->setUnselectedMarker('')
    ->setSelectedMarker('')
    
    //disable unselected marker
    ->setUnselectedMarker(' ')
    ->build();

Você pode definir um título para o seu menu e definir um separar personalizado, uma linha que será exibida abaixo do título. Qualquer texto que você passar para setTitleSeparator será repetido pelo tamanho da largura do Menu.

$menu = (new CliMenuBuilder)
    ->setTitle('One Menu to rule them all!')
    ->setTitleSeparator('*-')
    ->build();

Item Extra

Você pode, opcionalmente, exibir algum texto arbitrário do lado direito de item. Você pode personalizar este texto e você pode indicar em quais itens ele será exibido. Nós usamos esta função para exibir o texto [COMPLETED] nos exercícios que foram completados, onde o menu exibe a lista de exercícios para uma aplicação de workshop.

O terceiro parâmetro do método addItem é um boolean que define se será exibido o item extra ou não. O padrão é false.

$menu = (new CliMenuBuilder)
    ->setItemExtra('')
    ->addItem('Exercise 1', function (CliMenu $menu) { echo 'I am complete!'; }, true)
    ->build();

Itens

Existem alguns tipos de itens que você pode adicionar ao seu menu

  • Item Selecionável - Este é o tipo de item que você precisa para qualquer coisa que for selecionável (você pode apertar enter e isso irá invocar o método invocável)
  • Item de Quebra de Linha - Este item é usado para separar áreas, ele pode abranger várias linhas e será da largura do Menu. Qualquer string passada será repetida.
  • Item Estático - Este item irá exibir qualquer texto que for fornecido, muito útil para cabeçalhos.
  • Item Ascii Art - Este item é um tipo especial e permite o uso de Ascii art. Ele automaticamente cuida do espaçamento e do alinhamento.
  • Item de Sub Menu - Item especial para permitir um item abrir outro menu. Muito útil para quando for criar um menu de opções.

Item Selecionável

$menu = (new CliMenuBuilder)
    ->addItem('The Item Text', function (CliMenu $menu) { 
        echo 'I am alive!'; 
    })
    ->build();

Você pode adicionar múltiplos itens de uma única vez, como no exemplo:

$callable = function (CliMenu $menu) {
    echo 'I am alive!';
};

$menu = (new CliMenuBuilder)
    ->addItems([
        ['Item 1', $callable],
        ['Item 2', $callable],
        ['Item 3', $callable],
    ])
    ->build();

Observação: Você pode adicionar quantos itens você quiser e todos eles podem ter diferentes ações. A ação a ser executada é o que for definido como segundo parâmetro e ele deve ser um tipo válido PHP de callable. Preferencialmente, utilize classes do tipo Invokable para manter suas ações isoladas e para que possam ser facilmente testadas.

Item de Quebra de Linha

$menu = (new CliMenuBuilder)
    ->addLineBreak('<3', 2)
    ->build();

O código acima irá repetir uma sequência de caracteres <3 sobre o Menu por 2 linhas.

Item Estático

Itens estáticos são similares aos de QUebra de linha, no entanto, eles não repetem e não são preenchidos. É exibido como ele é. Se o texto for mais longo que a largura do menu, ele será exibido na linha subsequente.

$menu = (new CliMenuBuilder)
    ->addStaticItem('AREA 1')
    //add some items here
    ->addStaticItem('AREA 2')
    //add some boring items here
    ->addStaticItem('AREA 51')
    //add some top secret items here 
    ->build();

Ascii Art Item

O código abaixo irá colocar a arte Ascii no centro do seu menu. Use uma das constantes abaixo para alterar o alinhamento:

  • AsciiArtItem::POSITION_CENTER
  • AsciiArtItem::POSITION_LEFT
  • AsciiArtItem::POSITION_RIGHT
$art = <<<ART
        _ __ _
       / |..| \
       \/ || \/
        |_''_|
      PHP SCHOOL
LEARNING FOR ELEPHANTS
ART;

$menu = (new CliMenuBuilder)
    ->addAsciiArt($art, AsciiArtItem::POSITION_CENTER)
    ->build();

Item de Sub Menu

Sub-menus são muito poderosos. Você pode adicionar Menus aos Menus, MASOQUÊ?? Você pode ter um seu menu principal e também opções para o seu menu. As itens de opções serão iguais itens normais de menu, excepto que quando você pressiona-lo, irá entrar em outro menu, no qual qual pode ter estilos e cores diferenciados.

$callable = function (CliMenu $menu) {
    echo "I'm just a boring selectable item";
};

$menu = (new CliMenuBuilder)
    ->addItem('Normal Item', $callable)
    ->addSubMenu('Super Sub Menu')
        ->setTitle('Behold the awesomeness')
        ->addItem(/** **/)
        ->end()
    ->build();

Neste exemplo, um único sub-menu será criado. Assim que entrarmos no sub-menu, você será capaz de retornar ao menu principal. ou então sair completamente do menu. Um botão Go Back (Voltar) será automaticamente adicionado, e você pode personalizar o texto deles dessa forma:

->addSubMenu('Super Sub Menu')
    ->setTitle('Behold the awesomeness')
    ->setGoBackButtonText('Descend to chaos')

Existem algumas coisas para se prestar atenção na sintaxe e no processo de criação aqui

  1. addSubMenu retorna uma instância de CliMenuBuilder assim você pode personalizar do jeito que precisar no objeto pai
  2. Se você não modificar os estilos do sub-menu (ex, cores) ele irá herdar os estilos do menu pai
  3. Você pode chamar o método end() na instância do sub-menu CliMenuBuilder para recuperar a instância pai CliMenuBuilder novamente. Isto é bem útil quando for fazer encadeamentos.

Se você precisar da instância CliMenu do Sub Menu você pode recupera-lo após o menu principal ser construído.

$mainMenuBuilder = new CliMenuBuilder;
$subMenuBuilder = $mainMenuBuilder->addSubMenu('Super Sub Menu');

$menu = $mainMenuBuilder->build();
$subMenu = $mainMenuBuilder->getSubMenu('Super Sub Menu');

Você apenas pode fazer isso após o menu principal ter sido construído. Isto acontece porque o builder do menu principal toma conta de criar todos os sub menus.

Desabilitando Itens & Sub Menus

Neste exemplo nós estamos desabilitando alguns itens e um sub-menu, porém ainda iremos exibi-los na saída.

$itemCallable = function (CliMenu $menu) {
    echo $menu->getSelectedItem()->getText();
};

$menu = (new CliMenuBuilder)
    ->setTitle('Basic CLI Menu Disabled Items')
    ->addItem('First Item', $itemCallable)
    ->addItem('Second Item', $itemCallable, false, true)
    ->addItem('Third Item', $itemCallable, false, true)
    ->addSubMenu('Submenu')
        ->setTitle('Basic CLI Menu Disabled Items > Submenu')
        ->addItem('You can go in here!', $itemCallable)
        ->end()
    ->addSubMenu('Disabled Submenu')
        ->setTitle('Basic CLI Menu Disabled Items > Disabled Submenu')
        ->addItem('Nope can\'t see this!', $itemCallable)
        ->disableMenu()
        ->end()
    ->addLineBreak('-')
    ->build();

O terceiro parâmetro do método ->addItem é o que realmente desabilita o item enquanto o ->disableMenu() desabilita o menu relevante.

O resultado é um menu completo com algumas linhas escurecidas para denotar que elas estão desabilitadas. Quando um usuário navega, estes itens são "pulados" e o menu o joga para o próximo menu selecionável.

Re-desenhando o menu

Você pode modificar o menu e os seus estilos quando estiver executando uma ação e então você pode redesenha-los. Neste exemplo nós trocaremos a cor de fundo dentro de uma ação.

$itemCallable = function (CliMenu $menu) {
    $menu->getStyle()->setBg($menu->getStyle()->getBg() === 'red' ? 'blue' : 'red');
    $menu->redraw();
};

$menu = (new CliMenuBuilder)
    ->setTitle('Basic CLI Menu')
    ->addItem('First Item', $itemCallable)
    ->addItem('Second Item', $itemCallable)
    ->addItem('Third Item', $itemCallable)
    ->addLineBreak('-')
    ->build();

$menu->open();

Recuperando, Removendo e Adicionando Itens

Você também pode interagir com os itens do menu dentro de uma ação:

use PhpSchool\CliMenu\MenuItem\LineBreakItem;

require_once(__DIR__ . '/../vendor/autoload.php');

$itemCallable = function (CliMenu $menu) {
    foreach ($menu->getItems() as $item) {
        $menu->removeItem($item);
    }
    
    $menu->addItem(new LineBreakItem('-'));

    $menu->redraw();
};

$menu = (new CliMenuBuilder)
    ->setTitle('Basic CLI Menu')
    ->addItem('First Item', $itemCallable)
    ->addItem('Second Item', $itemCallable)
    ->addItem('Third Item', $itemCallable)
    ->addLineBreak('-')
    ->build();

$menu->open();

Diálogos (Caixas de Mensagem)

Instântaneo (Flash)

Exibe uma mensagem de uma linha sobre o menu. Ele possui um objeto de estilização separado e que possui uma cor diferenciada do menu principal por padrão. Pode ser modificado para se encaixar no seu próprio estilo. A caixa de mensagem é fechada assim que qualquer tecla for pressionada. No exemplo abaixo nós trocamos a cor de fundo para verde.

use PhpSchool\CliMenu\CliMenu;
use PhpSchool\CliMenu\CliMenuBuilder;

require_once(__DIR__ . '/../vendor/autoload.php');

$itemCallable = function (CliMenu $menu) {
    $flash = $menu->flash("PHP School FTW!!");
    $flash->getStyle()->setBg('green');
    $flash->display();
};

$menu = (new CliMenuBuilder)
    ->setTitle('Basic CLI Menu')
    ->addItem('First Item', $itemCallable)
    ->addItem('Second Item', $itemCallable)
    ->addItem('Third Item', $itemCallable)
    ->addLineBreak('-')
    ->build();

$menu->open();
Confirmação

Caixas de seleção são muito similares do tipo flash, excepto que neste tipo é mostrado um botão que deve ser selecionado para que a caixa desapareça. O texto do botão também pode ser customizado.

use PhpSchool\CliMenu\CliMenu;
use PhpSchool\CliMenu\CliMenuBuilder;

require_once(__DIR__ . '/../vendor/autoload.php');

$itemCallable = function (CliMenu $menu) {
    $menu->confirm('PHP School FTW!')
        ->display('OK!');
};

$menu = (new CliMenuBuilder)
    ->setTitle('Basic CLI Menu')
    ->addItem('First Item', $itemCallable)
    ->addItem('Second Item', $itemCallable)
    ->addItem('Third Item', $itemCallable)
    ->addLineBreak('-')
    ->build();

$menu->open();

Conforme você for brincando com nossa aplicação você irá fazer coisas semelhantes a isto...

Learn You PHP CLI Menu

Você pode ver o código de construção neste link para mais clareza e em como fazer configurações mais avançadas: PHP School

Traduções

(As traduções podem não estar atualizadas haja visto que são feitas pela comunidade) Ver este documento em Inglês (en_US)

Integrações