
Aplicativo de prova de conceito para sobrescrever fontes no iOS usando CVE-2022-46689.

Um Campo Flexível fácil e completo para Laravel Nova, perfeito para grupos de campos repetidos e flexíveis.

Aqui está um guia bem resumido para você começar o quanto antes. Veja a documentação completa em https://whitecube.github.io/nova-flexible-content
composer require whitecube/nova-flexible-content
Um campo flexível permite o gerenciamento fácil de grupos repetíveis e ordenáveis de campos. Ao contrário das poucas soluções existentes para Laravel Nova, este não tem restrições sobre quais campos você pode usar dentro desses grupos. Isso significa que você pode usar todos os tipos de campos do Laravel Nova, assim como campos feitos pela comunidade.
Um layout representa um grupo de campos que pode ser repetido dentro do campo Flexível. Você pode adicionar quantos layouts quiser. Se apenas um layout for definido, o campo se comportará como um Repetidor simples e, ao adicionar mais layouts, você obterá um Conteúdo Flexível. Ambos os conceitos são semelhantes aos seus primos no Plugin ACF do Wordpress.
Os layouts podem ser adicionados usando o seguinte método nos seus campos Flexíveis:
addLayout(string $title, string $name, array $fields)
O parâmetro $name é usado para armazenar o layout escolhido no valor do campo. Escolha-o com sabedoria; você provavelmente o usará para identificar os layouts na sua aplicação.
use Whitecube\NovaFlexibleContent\Flexible;
/**
* Get the fields displayed by the resource.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function fields(Request $request)
{
return [
// ...
Flexible::make('Content')
->addLayout('Simple content section', 'wysiwyg', [
Text::make('Title'),
Markdown::make('Content')
])
->addLayout('Video section', 'video', [
Text::make('Title'),
Image::make('Video Thumbnail', 'thumbnail'),
Text::make('Video ID (YouTube)', 'video'),
Text::make('Video Caption', 'caption')
])
];
}

Você pode alterar o texto padrão do botão "Adicionar layout" assim:
Flexible::make('Content')
->button('Add something amazing!');

Se você estiver usando Laravel 6 ou anterior, ou não quiser usar casts, por favor use um accessor no seu model com a trait HasFlexible.
O Laravel 7 traz casts personalizados para a mesa, e os campos de conteúdo flexível são o caso de uso perfeito para eles. O campo armazena seus valores como uma única string JSON, o que significa que essa string precisa ser analisada antes de poder ser usada na sua aplicação. Isso pode ser feito facilmente usando a classe FlexibleCast deste pacote:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Whitecube\NovaFlexibleContent\Value\FlexibleCast;
class MyModel extends Model
{
protected $casts = [
'flexible-content' => FlexibleCast::class
];
}
Por padrão, a classe FlexibleCast coletará instâncias básicas de Layout. Se você quiser mapear os layouts para instâncias de Layout personalizadas, isso também é possível. Primeiro, crie um cast flexível personalizado executando php artisan flexible:cast MyFlexibleCast. Isso criará o arquivo no diretório App\Casts.
Então, mapeie facilmente suas classes de layout personalizadas para as chaves adequadas:
namespace App\Casts;
class MyFlexibleCast extends FlexibleCast
{
protected $layouts = [
'wysiwyg' => \App\Nova\Flexible\Layouts\WysiwygLayout::class,
'video' => \App\Nova\Flexible\Layouts\VideoLayout::class,
]
}
Se você precisar de mais controle, pode sobrescrever o método getLayoutMappings.
As coleções retornadas pelo cast FlexibleCast e pela trait HasFlexible estendem a Illuminate\Support\Collection original. Essas coleções de layout personalizadas expõem um método find(string $name) que retorna o primeiro layout que tenha o $name de layout fornecido.
Os layouts são uma espécie de falsos models. Eles usam o trait HasAttributes do Laravel, o que significa que você pode definir accessors & mutators para os atributos do layout. Além disso, também é possível acessar as propriedades do Layout usando os seguintes métodos:
name()Retorna o nome do layout.
title()Retorna o título do layout (como mostrado no Nova).
key()Retorna a chave única do layout (o identificador exclusivo do layout).
Ao usar o campo de Conteúdo Flexível, você logo encontrará alguns casos de uso em que o básico descrito acima não é suficiente. Por isso, desenvolvemos o pacote de forma extensível, tornando possível adicionar facilmente comportamentos e/ou capacidades personalizadas ao Campo e à sua saída.
Às vezes, as definições de addLayout podem ficar bastante longas, ou talvez você queira que elas sejam compartilhadas com outros campos Flexible. A resposta para isso é extrair seu Layout para uma classe própria. Veja a documentação para mais informações sobre isso.
Além de classes de Layout reutilizáveis, você pode ir um passo além e criar classes Preset para seus campos Flexíveis. Elas permitem reutilizar todo o seu campo Flexível em qualquer lugar que desejar. Também facilitam a criação de campos Flexíveis dinâmicos, por exemplo, se você quiser adicionar Layouts condicionalmente. E, por último, mas não menos importante, elas também têm o benefício adicional de limpar suas classes de Recurso do Nova, se o seu campo Flexível tiver muitas definições de addLayout. Veja a documentação para mais informações sobre isso.
Por padrão, o campo aproveita uma coluna JSON na tabela do seu model. Em alguns casos, você realmente gostaria de usar este campo, mas por algum motivo um atributo JSON não é o caminho a seguir. Por exemplo, você pode querer armazenar os valores em outra tabela (o que significa que você usará o campo de Conteúdo Flexível em vez de um campo tradicional BelongsToMany ou HasMany). Não se preocupe, nós temos você coberto!
Diga ao campo como armazenar e recuperar seu conteúdo criando sua própria classe Resolver, que basicamente contém apenas dois métodos simples: get e set. Veja a documentação para mais informações sobre isso.
Talvez você tenha ouvido falar de um dos nossos outros pacotes, o nova-page, que é uma Ferramenta do Nova que permite editar páginas estáticas como uma página "Sobre" (ou similar) sem precisar declarar um model para ela individualmente. Na maioria das vezes, o Campo de Conteúdo Flexível é muito útil. Não se preocupe, ambos os pacotes funcionam bem juntos! Primeiro, crie um template de página do nova e adicione um conteúdo flexível aos campos do template.
Como explicado na documentação, você pode acessar o conteúdo estático do nova-page em suas views blade usando {{ Page::get('attribute') }}. Ao solicitar o conteúdo flexível dessa forma, ele retorna uma string JSON bruta descrevendo o conteúdo flexível, o que, é claro, não é muito útil. Em vez disso, você pode simplesmente implementar a trait Whitecube\NovaFlexibleContent\Concerns\HasFlexible nos seus Templates de página, o que exporá o método de fachada Page::flexible('attribute') e cuidará da transformação do conteúdo flexível.
namespace App\Nova\Templates;
// ...
use Whitecube\NovaFlexibleContent\Concerns\HasFlexible;
class Home extends Template
{
use HasFlexible;
// ...
}
Se você depende deste pacote em suas aplicações de produção, considere nos patrocinar! É a melhor maneira de nos ajudar a continuar fazendo o que amamos: criar ótimos softwares de código aberto.
Sinta-se à vontade para sugerir mudanças, pedir novos recursos ou corrigir bugs você mesmo. Temos certeza de que ainda há muitas melhorias a serem feitas, e ficaríamos muito felizes em mesclar pull requests úteis.
Obrigado!
Ao adicionar um novo recurso ou corrigir um bug, adicione os testes unitários correspondentes. O conjunto atual de testes é limitado, mas cada teste unitário adicionado melhorará a qualidade do pacote.
Execute o PHPUnit chamando composer test.
Na Whitecube, usamos muito software de código aberto como parte do nosso trabalho diário. Então, quando temos a oportunidade de retribuir algo, ficamos super animados!
Esperamos que você goste desta pequena contribuição nossa e adoraríamos ouvir de você se achá-la útil em seus projetos. Siga-nos no Twitter para mais atualizações!