Quase todo desenvolvedor que trabalha com uma certa estrutura há muito tempo possui um conjunto de ferramentas próprias, o que permite acelerar o desenvolvimento do site. No entanto, muitas vezes, eles são mal estruturados, não possuem documentação e são finalizados no "processo" de produção.
A idéia do projeto yicms era coletar todos os desenvolvimentos para a estrutura Yii2, que pareciam convenientes em um determinado sistema, na linha de frente dos quais deveria ser colocada a facilidade de uso, a flexibilidade e a capacidade de acelerar significativamente o desenvolvimento de sites padrão com suas ferramentas. Este projeto foi desenvolvido por mim para a "alma", mas no momento já está em beta.
A essência do yicms está em algum lugar no meio entre os recursos da estrutura e os recursos usuais do CMS. Este não é o CMS no sentido usual da palavra, mas apenas um conjunto de módulos que podem acelerar significativamente o desenvolvimento do site usando suas próprias ferramentas, além de ter acesso completo aos recursos da estrutura. Os principais recursos incorporados no yicms são o painel de administração gerado em tempo real e as classes com anotação automática que permitem usar o preenchimento automático do IDE e ter uma interface intuitiva.
Instalação e configuração
Então, vamos começar com o yicms instalando-o. Para namoro, a maneira mais fácil é usar o Open Server ou qualquer outra plataforma de servidor semelhante. Como o yicms tem uma forte dependência do Yii, vamos instalá-lo primeiro. Para simplificar, usaremos o modelo básico:
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
Depois que o compositer instala a estrutura, inclua a seção require do arquivo composer.json nos quatro módulos yicms e execute a atualização do compositor.
"require": { "php": ">=5.4.0", "yiisoft/yii2": "~2.0.14", "yiisoft/yii2-bootstrap": "~2.0.0", "yiisoft/yii2-swiftmailer": "~2.0.0 || ~2.1.0", "iliich246/yii2-yicms-common": "dev-master", "iliich246/yii2-yicms-pages": "dev-master", "iliich246/yii2-yicms-essences": "dev-master", "iliich246/yii2-yicms-feedback": "dev-master" },
Cada módulo representa um conjunto de funcionalidades específicas, que serão consideradas no futuro. Por enquanto, basta instalar todos eles.
Em seguida, você precisa se lembrar de configurar o servidor. No Open Server, usamos o Apache e configuramos .htaccess da seguinte maneira:
Para o arquivo .htaccess raiz:
Options +FollowSymLinks IndexIgnore */* RewriteEngine on RewriteCond %{REQUEST_URI} !^/(web) RewriteRule ^assets/(.*)$ /web/assets/$1 [L] RewriteRule ^css/(.*)$ web/css/$1 [L] RewriteRule ^js/(.*)$ web/js/$1 [L] RewriteRule ^images/(.*)$ web/images/$1 [L] RewriteRule ^files/(.*)$ web/files/$1 [L] RewriteRule (.*) /web/$1 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . web/index.php
Para o arquivo .htaccess no diretório da web
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php
A próxima etapa é rolar a migração de cada módulo yicms no banco de dados. No console, executamos sequencialmente os seguintes comandos:
yii migrate/up --migrationPath=@vendor/iliich246/yii2-yicms-common/Migrations
yii migrate/up --migrationPath=@vendor/iliich246/yii2-yicms-pages/Migrations
yii migrate/up --migrationPath=@vendor/iliich246/yii2-yicms-essences/Migrations
yii migrate/up --migrationPath=@vendor/iliich246/yii2-yicms-feedback/Migrations
Agora vamos começar a configuração no arquivo config / web.php.
A seção de módulos está configurada da seguinte maneira:
'modules' => [ 'common' => [ 'class' => 'Iliich246\YicmsCommon\CommonModule', ], 'pages' => [ 'class' => 'Iliich246\YicmsPages\PagesModule', ], 'essences' => [ 'class' => 'Iliich246\YicmsEssences\EssencesModule', ], 'feedback' => [ 'class' => 'Iliich246\YicmsFeedback\FeedbackModule', ], 'redactor' => 'yii\redactor\RedactorModule', ],
A seção de inicialização é configurada da seguinte maneira:
'bootstrap' => ['log', 'common', 'pages', 'essences', 'feedback'],
A seção do usuário está configurada da seguinte maneira:
'user' => [ 'identityClass' => 'Iliich246\YicmsCommon\Base\CommonUser', 'enableAutoLogin' => true, ],
Remova a seção de comentários urlManager:
'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ],
A estrutura Yii2 e o sistema yicms foram configurados com sucesso.
Após a primeira inicialização, se tudo tiver sido configurado corretamente, o diretório yicms deverá ser criado no diretório raiz do projeto, que conterá os arquivos disponíveis para alterações do usuário e as classes com anotação automática também serão criadas nele.

Descrição dos módulos Common e Pages
O sistema yicms consiste em duas seções. Seção Dev, que deve estar acessível apenas ao desenvolvedor (o código pode estar quebrado nele) e a seção Admin deve estar acessível ao administrador do site (o gerenciamento de conteúdo é realizado nele). Para começar, você precisa ir para a seção Dev, para isso, use o seguinte URL:
http://< >/web/common/dev/login-as-dev?hash=123456&asDev
Depois disso, o painel Dev deve abrir:

Agora vamos começar com a funcionalidade yicms. Primeiro, no módulo Páginas, criaremos uma página chamada índice, que será a página principal do site. Vá para a lista de páginas e crie uma nova página chamada índice. Por padrão, os campos title, meta_description e meta_keywords serão criados para a página. Além disso, criaremos outro campo através do botão Adicionar novo Campo com o nome do texto, deixaremos todos os seus parâmetros por padrão.
Agora, se você seguir o link
http://< >/web/pages/admin
seção admin será aberta. A página de índice estará disponível para preencher com o conteúdo. Preencha todos os campos com texto livre.
No momento da criação da seção de índice na seção dev da página de índice, a classe Index foi criada no diretório yicms / Pages / Models no qual também foram criadas anotações para os campos título, meta_description, meta_keywords, bem como para o campo de texto que criamos em tempo real. Um objeto desta classe que podemos usar para obter o valor dos campos. Considere como isso pode ser feito. No controlador SiteController padrão do modelo básico em actionIndex, escreva o seguinte:
public function actionIndex() { $indexPage = \app\yicms\Pages\Models\Index::getInstance(); return $this->render('index', [ 'indexPage' => $ indexPage ]); }
Como a classe \ app \ yicms \ Pages \ Models \ Index foi gerada automaticamente, o preenchimento automático para isso funcionará no IDE. Agora $ indexPage pode ser usado como um índice. Agora abra a exibição do índice. Nós removemos todos os desnecessários de lá e escrevemos:
<?php $this->title = $indexPage->title; $this->registerMetaTag([ 'name' => 'description', 'content' => $indexPage->meta_description ]); $this->registerMetaTag([ 'name' => 'keywords', 'content' => $indexPage->meta_keywords ]); ?> <div class="site-index"> <div class="jumbotron"> <h1><?= $indexPage->text ?></h1> </div> <div class="body-content"> </div> </div>
A anotação da variável $ indexPage é necessária para o preenchimento automático do IDE. Agora use o objeto $ indexPage. Todos os campos que criamos na seção dev para a página de índice estão disponíveis no objeto da classe Index, que, graças à anotação automática, é complementada pelo IDE após a inserção do operador de seta.
No total, em pouco tempo, criamos uma página de índice para a qual um painel de administrador foi criado automaticamente para editar seu conteúdo. Usamos a programação apenas para criar o objeto de página no controlador padrão da estrutura e na forma em que poderíamos usar rapidamente o objeto de página, graças ao preenchimento automático e uma interface intuitiva.
Examinamos apenas a menor parte dos recursos yicms. Agora vamos complicar a página principal do site usando um yicms um pouco.
O yicms suporta o multilinguismo imediatamente. Para ativar o segundo idioma na seção dev do módulo comum, selecione a lista de idiomas, selecione o idioma russo e ative-o:

Agora, no painel de administração, podemos preencher os campos para vários idiomas. Você pode criar novos idiomas no sistema. No entanto, será necessário traduzir o painel de administração usando ferramentas de estrutura regulares. Portanto, ao criar um novo idioma, você deve aderir à ISO. Para controles de conteúdo, uma nova placa com um novo idioma será simplesmente adicionada.
Blocos de arquivos componentes
Em seguida, considere o elemento de blocos de arquivos. No painel de desenvolvimento da página de índice, crie um bloco de arquivo com o documento com o nome do programa. Outras configurações de bloco serão deixadas por padrão. Agora, no painel do administrador, a edição da página de índice do arquivo de documento ficou disponível. Faça o download de um arquivo arbitrário. Agora, o link para o download pode ser exibido na página de índice do site:
… <div class="body-content"> <div class="row"> <h3>Document</h3> <a href="<?= $indexPage->document->uploadUrl() ?>"> <?= $indexPage->document ?> </a> </div> … </div>
Agora, na página, o link carregará o arquivo que carregamos no painel de administração. Por padrão, o bloco de arquivos opera no modo de arquivo único em todos os idiomas. No entanto, no painel de desenvolvimento, você pode alternar o tipo de idioma para o tipo traduzível e, em seguida, para cada idioma, será necessário fazer upload de seu próprio arquivo. Nesse caso, o arquivo cujo idioma está atualmente ativo no site será baixado através do link. Obviamente, você pode fazer o download para um idioma específico, que será discutido mais adiante.
A próxima etapa no painel de desenvolvimento é criar um bloco de arquivo de receitas para o qual especificaremos o tipo como vários tipos. Nesse modo, você pode fazer upload de muitos arquivos para um bloco de arquivos. Para fazer isso, no painel do administrador, na guia receitas exibida, faça o upload de vários arquivos arbitrários.
Depois disso, na forma de índice, listamos os arquivos:
… <div class="row"> <h3>Recipes</h3> <?php foreach ($indexPage->recipes as $recipe): ?> <a href="<?= $recipe->uploadUrl() ?>"> <?= $recipe ?> </a> <?php endforeach; ?> </div> …
No modo de tipo múltiplo, um bloco de arquivo pode ser ignorado através do foreach ou de um iterador.
Componente de bloco de imagens
Agora considere o elemento de bloco de imagens. Crie um bloco de figuras para a página de índice, deixando todas as configurações padrão. Da mesma forma que os blocos de arquivos no painel de administração, tornou-se possível fazer o upload de uma imagem. Carregar uma imagem arbitrária. Agora, na forma de índice, escrevemos o seguinte:
<div class="row"> <h3>Image</h3> <img src="<?= $indexPage->picture ?>" alt=""> </div>
Da mesma forma que os arquivos de imagem, um é carregado por padrão em todos os idiomas; no entanto, para imagens, esse comportamento pode ser alterado no painel de desenvolvimento e carregar sua imagem para cada idioma. Você também pode enviar muitas imagens em um bloco.
Crie um bloco de galeria de imagens no painel de desenvolvimento, cujo tipo será definido como Várias imagens. Para imagens, você também pode pendurar os campos de texto rapidamente. Portanto, na janela modal para definir o bloco da galeria, vamos para a seção "Exibir campo do bloco de imagem". Nesta seção para imagens, crie campos com os nomes alt e nome. Agora, no painel de administração de cada imagem, é possível definir os campos de texto alt e name. Também em yicms para imagens prontas para uso, está disponível a capacidade de "cortar" e criar miniaturas. Por exemplo, crie um modelo de miniatura para o bloco da galeria. Na janela modal do bloco de imagens, vá para a seção "Configurar miniaturas de imagens". Nele, criaremos um configurador de miniaturas com o nome “x2” e os parâmetros divider = 2 e quality = 80. Por nome, poderemos acessar a miniatura, o divisor determinará quanto reduzir o tamanho da imagem original, a qualidade determina a qualidade de compactação da miniatura. Em seguida, crie outro modelo de miniatura com os parâmetros: nome_do_programa = “x5”, divisor = 5, qualidade = 50. Agora, quando carregarmos a imagem no painel de administração, duas miniaturas serão criadas automaticamente para ela com os parâmetros selecionados.
Agora carregue algumas imagens no painel de administração do grupo de galerias. Depois que a imagem é criada e carregada, você pode preencher os campos alt e name, cujos modelos foram criados no painel de desenvolvimento. Vamos ver como exibir tudo isso no site.
<div class="row"> <?php foreach($indexPage->gallery->getImages() as $image): ?> <div class="col-lg-4"> <img src="<?= $image ?>" width="100%" alt="<?= $image->alt ?>"> <img src="<?= $image->outputThumbnail('x2') ?>" alt="<?= $image->alt ?>"> <img src="<?= $image->outputThumbnail('x5') ?>" alt="<?= $image->alt ?>"> <p><?= $image->name ?></p> </div> <?php endforeach; ?> </div>
Aqui, o método getImages () retorna uma matriz de objetos do aplicativo de classe com anotação automática \ yicms \ Pages \ Models \ Index \ Images \ GalleryImage na qual as anotações foram criadas para os campos alt e name que criamos em tempo real e o preenchimento automático do IDE está disponível para eles. Além disso, chamando o método outputThumbnail (<Nome do modelo em miniatura>) no objeto, alternamos o objeto para o modo de saída em miniatura.
Para blocos de imagens, é possível criar não apenas campos, mas também condições, as quais consideraremos um pouco mais adiante. Campos e condições também podem ser criados para blocos de arquivos. Funciona com um princípio semelhante.
Condições dos componentes
Agora considere o próximo elemento. Estas são condições. As condições são convenientes para a criação nas listas, caixas de seleção do painel do administrador etc. O que determinará determinado comportamento ao trabalhar com páginas. Vejamos um exemplo. Crie uma condição chamada segundo plano no painel de desenvolvimento na página de índice. Digite selecione "selecione o tipo suspenso". Depois de criar a condição, iremos para a seção "Opções da condição de configuração". Crie três valores de condição com os valores transparente, vermelho e verde.
Depois disso, uma condição com uma lista suspensa com os valores TRANSPARENTE, VERMELHO e VERDE aparecerá no painel de administração da página de índice. Eles são convertidos para maiúsculas, porque na classe anotada automaticamente criada eles são representados como constantes.
Agora vamos tentar usar a condição criada. Nós o usamos de uma maneira um pouco diferente para mostrar outras possibilidades. Como a página de índice é a página principal do site, será semanticamente verdadeiro alterar a cor de plano de fundo do site em suas configurações. Portanto, nossa condição será alterar a cor do plano de fundo em todo o site, para inseri-la no layout do controlador. Abra o arquivo de modelo de layout da estrutura básica do Yii2 e crie um objeto Index:
<?php use app\widgets\Alert; use yii\helpers\Html; use yii\bootstrap\Nav; use yii\bootstrap\NavBar; use yii\widgets\Breadcrumbs; use app\assets\AppAsset; AppAsset::register($this); $pagesIndex = \app\yicms\Pages\Models\Index::getInstance(); ?> <?php $this->beginPage() ?> <!DOCTYPE html> <html lang="<?= Yii::$app->language ?>"> <head> <meta charset="<?= Yii::$app->charset ?>"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <?php $this->registerCsrfMetaTags() ?> <title><?= Html::encode($this->title) ?></title> <?php $this->head() ?> </head> <body> <?php $this->beginBody() ?> …
Como o objeto da classe Index é algo como um singleton, podemos chamar o método estático getInstance () o quanto quisermos, sem o risco de fazer consultas duplicadas extras ao banco de dados e outras despesas gerais ao criá-lo. Agora, usando o objeto $ pagesIndex, alteraremos a tag adicionando um estilo embutido:
<body style="background-color: <?php if ($pagesIndex->background->value() == \app\yicms\Pages\Models\Index\Conditions\Background::TRANSPARENT):?> transparent; <?php elseif ($pagesIndex->background->value() == \app\yicms\Pages\Models\Index\Conditions\Background::RED):?> #FFD3D3 <?php else: ?> #BBFFC8 <?php endif; ?> ">
Chamando $ pagesIndex-> background-> value () e comparando com a constante que foi criada na classe anotada automaticamente \ app \ yicms \ Pages \ Models \ Index \ Conditions \ Background, selecionamos a cor de fundo do site.
Em seguida, considere os recursos das classes anotadas automaticamente. Enquanto o yicms está em execução, muitos eventos acontecem que podem ser tratados pela estrutura do Yii. Nós damos um exemplo.
app\yicms\Pages\Models\Index\Fields\Text
Este arquivo foi criado por um anotador automático quando criamos o campo de texto para a página de índice no painel de desenvolvimento. Quando escrevemos <? = $ IndexPage-> text?> No modelo, é criado algo semelhante ao singleton dessa classe específica, que no modelo é convertido em uma string usando a mágica __toString ().
Para alterar o conteúdo, assinamos o evento e o processamos através da função de retorno de chamada:
class Text extends Field { public function init() { $this->on(self::EVENT_BEFORE_OUTPUT, function($event) { }); } }
O evento EVENT_BEFORE_OUTPUT ocorre antes que o conteúdo do campo seja exibido. Vamos tentar mudar isso. Para fazer isso, usamos o objeto de evento \ Iliich246 \ YicmsCommon \ Base \ HookEvent:
$this->on(self::EVENT_BEFORE_OUTPUT, function($event) { $value = $event->getHook(); $value = strrev($value); $event->setHook($value); });
O evento HookEvent obtém o valor do campo antes que o evento seja disparado. No evento, você pode obter esse valor através de $ event-> getHook (), alterá-lo e enviá-lo de volta ao objeto através do evento usando $ event-> setHook ($ value). Assim, no caso, viramos o texto que o campo Texto exibe para trás.
Quase todas as classes alugadas automaticamente têm vários eventos que podem ser conectados de maneira semelhante, mas sua consideração está além do escopo do artigo de apuração de fatos.
No total, neste artigo, examinamos dois módulos yicms, os módulos Comum e Páginas. O módulo Comum inclui componentes como Campos, Blocos de arquivos, Blocos de imagens e Condições. O módulo Páginas é responsável por criar objetos de página que contêm todos os elementos do módulo Comum. I.e. todos os módulos yicms dependem do módulo comum principal.
Módulo Yii2-yicms-essences
Agora vamos nos familiarizar com o módulo Essences. Este módulo foi projetado para criar entidades do tipo categoria-> entidade, por exemplo, a categoria de mercadorias-> mercadorias, tipo de veículo (carros, motocicleta) -> veículo específico etc. Dentro do módulo, esses elementos são chamados de categorias e representações.
Como exemplo, mostramos a criação de um catálogo simples da categoria-> tipo de produto para uma loja online.
Na seção Dev do módulo Essences, vá para a lista de essências e lá vamos para a seção create new essence. Fornecemos o nome do programa produtos e deixamos o restante das configurações por padrão. Por padrão, uma entidade com comportamento é criada: uma visualização pode pertencer a uma categoria. No entanto, você pode especificar outros comportamentos: basta criar visualizações sem categorias ou uma visualização pode pertencer a várias categorias.
As próprias categorias são construídas com base no princípio de uma árvore, quando qualquer categoria tem um pai (exceto o primeiro). I.e. categorias são folhas de uma estrutura de dados do tipo árvore.
Total de produtos da entidade criados. Para ela, as classes anotadas automaticamente foram criadas no diretório app \ yicms \ Essences \ Models. Em seguida, no painel de desenvolvimento, precisamos criar modelos de classe e modelos de apresentação. Tudo isso é semelhante ao modo como os criamos para a página de índice. Os elementos Campos, Blocos de arquivos, Blocos de imagens e Condições estão disponíveis para eles no modo de criação instantânea. Depois de terminar de criar modelos no painel de administração, ele fica disponível para criar categorias e visualizações com os elementos de modelo que definimos no painel de desenvolvimento.
Então, criaremos várias categorias de mercadorias. E para cada categoria de produtos, existem vários produtos. Uma vez feito isso, a coisa toda pode ser exibida no site principal. Considere como isso é feito. No SiteController, crie uma ação actionProcuts:
public function actionProducts() { $productsEssence = Products::getInstance(); return $this->render('products', [ 'productsEssence' => $productsEssence ]); }
Crie uma visualização de produtos para ele
<?php ?> <div class="body-content"> <?php foreach($productsEssence->categories as $category): ?> <h1>: <?= $category->name ?></h1> <?php foreach($category->represents as $product): ?> <h2>: <?= $product->name ?></h2> <?php endforeach; ?> <?php endforeach; ?> </div>
Graças ao mecanismo de anotação automática, o método $ productsEssence-> categories retorna uma matriz de objetos do aplicativo de classe com anotação automática \ yicms \ Essences \ Models \ ProductsCategory. Como nas classes anotadas automaticamente anteriormente nesta classe, há anotações nos campos que criamos em tempo real, o IDE poderá usar o preenchimento automático. Também é importante notar que as classes com anotação automática foram desenvolvidas com a ideia de que o usuário yicms poderá colocar sua própria lógica de negócios nelas, ou seja, você pode escrever seu próprio código neles e o mecanismo de anotação automática altera áreas especialmente marcadas e nenhum código de usuário será afetado.
O método $ category-> representa também retorna uma matriz de objetos app \ yicms \ Essences \ Models \ ProductsRepresents que possuem todas as mesmas vantagens da anotação automática que as categorias. Obviamente, existem métodos mais flexíveis para obter idéias. Por exemplo, $ category-> getRepresentsQuery () retornará um objeto ActiveQuery da estrutura Yii2, que pode ser personalizado ainda mais para refinar a consulta ao banco de dados, usada para criar paginação ou carregamento lento.
No total, o módulo Essenses permite criar rapidamente um esqueleto da funcionalidade da loja, com o painel de administração já funcionando. Lógica comercial adicional pode ser gravada em classes anotadas automaticamente.
Módulo Yii2-yicms-feedback
Este módulo destina-se à construção de formulários de entrada de informações no site pelos visitantes e usuários do site. A ideologia do trabalho permanece a mesma. Primeiro, no painel de desenvolvimento, digitamos os campos necessários para o formulário.
Considere a operação do módulo como um exemplo. Crie um registro com as mensagens de nome do programa no painel de desenvolvimento no módulo de feedback. Na página de configurações de mensagens, podemos ver o botão Modelos de páginas de comentários. Usando esse link, podemos criar elementos do campo de tipo, bloco de arquivos, bloco de imagens, condições que podem ser usadas para estilizar o conteúdo da página de mensagens. Eles não são diferentes daqueles que consideramos para o módulo Páginas. Agora, estamos mais interessados na seção Modelos de entrada de comentários. Nesta seção, podemos criar entidades como campos de entrada, arquivos de entrada, imagens de entrada e condições de entrada. Essas entidades são exatamente o que você precisa para criar formulários de entrada personalizados.
Crie dois campos de entrada com os nomes nome e sobrenome.
Imagem de entrada chamada foto. Condição de entrada chamada contrato. Por enquanto, vamos deixar todas as configurações para essas entidades como padrão. Posteriormente neste exemplo, configuraremos validadores que também estão suspensos nessas entidades em tempo real (os validadores também estão disponíveis para entidades do módulo Common e funcionam de acordo com a mesma lógica do módulo de feedback. Discutiremos um pouco mais adiante).Agora aplique o módulo em nosso site. Primeiro, crie uma nova ação no SiteController: public function actionMessage() { $messages = \app\yicms\Feedback\Models\Messages::getInstance(); return $this->render('message', [ 'messages' => $messages ]); }
Em seguida, crie uma exibição de mensagem e escreva o seguinte: <?php ?> <?php $form = \yii\bootstrap\ActiveForm::begin([ 'id' => 'some-form', 'options' => [ 'data-pjax' => true, ], ]); ?> <div class="row"> <div class="col-xs-12"> <?= \yii\helpers\Html::submitButton('Save', ['class' => 'btn btn-success']) ?> </div> </div> <?php \yii\bootstrap\ActiveForm::end(); ?>
Para criar o formulário, usaremos as ferramentas padrão da estrutura. Para aproveitar o módulo de feedback, escreveremos o seguinte: <?php if ($messages->input_name->isActive): ?> <?= $form->field($messages->input_name, $messages->input_name->key) ?> <?php endif; ?> <?php if ($messages->input_surname->isActive): ?> <?= $form->field($messages->input_surname, $messages->input_surname->key) ?> <?php endif; ?> <?php if ($messages->input_photo->isActive): ?> <?= $form->field($messages->input_photo, $messages->input_photo->key) ->fileInput() ?> <?php endif; ?> <?php if ($messages->input_agreement->isActive): ?> <?= $form->field($messages->input_agreement, $messages->input_agreement->key)->checkbox() ?> <?php endif; ?>
Para entidades do tipo input, você deve usar o prefixo input_, caso contrário, as anotações automáticas funcionam para elas da mesma maneira que para o restante das coisas no yicms.No início, há uma verificação da atividade do campo; se o campo estiver inativo, ele não deve ser renderizado e, mesmo se for renderizado, os dados que foram preenchidos não serão carregados no servidor. A atividade de campo pode ser ativada / desativada no painel de desenvolvimento.A seguir, é a forma padrão da estrutura em que você precisa escrever assim $form->field($messages->input_name, $messages->input_name->key)
$ messages-> input_name retornará um objeto da classe app \ yicms \ Feedback \ Models \ Message \ InputFields \ Name, que é o descendente da estrutura do Modelo Yii2 e pode ser usado nos formulários, a chave $ messages-> input_name-> retornará o valor correto da chave, em ordem para que o formulário possa ser carregado.Agora, quando vamos para a página com o formulário, todos os seus campos são renderizados, mas o carregamento no servidor ainda não funciona. É muito fácil de fazer. Tentei tornar a interface de trabalho de feedback o mais semelhante possível à interface de trabalho do modelo na estrutura. Sim, eu tive que "sacrificar" um pouco de arquitetura, mas como um todo, ficou assim: public function actionMessage() { $messages = \app\yicms\Feedback\Models\Messages::getInstance(); if ($messages->load(Yii::$app->request->post()) && $messages->validate()) { $messages->handle(); } return $this->render('message', [ 'messages' => $messages ]); }
Agora, o formulário será carregado, validado e salvo no servidor. Na seção admin, podemos ver as informações inseridas no formulário.Obviamente, você pode usar uma classe anotada automaticamente:\app\yicms\Feedback\Models\Messages
class Messages extends Feedback { public static function getInstance() { return self::getByName('messages'); } public function init() { $this->on(self::EVENT_AFTER_HANDLE, function($event) { Yii::$app->mailer->compose('message', [ 'message' => $this ]) ->setFrom('from@domain.com') ->setTo('to@domain.com') ->setSubject('Message subject') ->send(); }); } }
Neste exemplo, nos inscrevemos no evento EVENT_AFTER_HANDLE. O evento ocorre depois que os dados do formulário foram salvos no servidor. Nesse caso, enviamos uma carta para o modelo do qual podemos inserir os dados salvos do formulário: <?php ?> <h1>Mail on message</h1> <h1>Name: <?= $message->input_name->value ?></h1> <h2>Surname: <?= $message->input_surname->value ?></h2>
$ message-> input_name-> value simplesmente retorna os dados atuais que foram armazenados no banco de dados.Agora vamos ver como os validadores funcionam. No painel de desenvolvimento na entidade do campo de entrada com o nome name, adicione o validador obrigatório. Este é o validador de estrutura padrão yii \ validators \ RequiredValidator. Quando o adicionamos, ele ainda não está ativo, porque o botão com o nome está branco. Para ativá-lo, você precisa clicar neste botão, a janela de configurações do validador será aberta. Lá você precisa instalar a caixa de seleção e ativá-la. Ao mesmo tempo, você pode configurar todos os outros parâmetros do validador, como mensagens de erro em todos os idiomas do sistema etc. Após salvar, o ícone do validador fica verde, o que significa que ficou ativo e será aplicado na validação de formulários.Na condição de entrada com o contrato de nome, desligamos o validador de comparação. E configure-o para comparar com 1, digite número e o operador ==. Além disso, você pode escrever uma mensagem nos campos de texto de erro, como "Você deve concordar com os termos da oferta". Agora, no formulário, a validação ocorrerá somente quando a caixa de seleção do contrato estiver marcada.No total, neste artigo, examinamos as principais características do sistema yicms.