Usamos Yii2. Estamos escribiendo otro CMS o un intento de acelerar significativamente el desarrollo con una sobrecarga mínima

Casi todos los desarrolladores que han estado trabajando con un determinado marco durante mucho tiempo tienen un conjunto de sus propias herramientas que permiten acelerar el desarrollo del sitio. Sin embargo, a menudo, están mal estructurados, no tienen documentación y se finalizan en el "proceso" de producción.

La idea del proyecto yicms era recopilar todos los desarrollos para el marco de trabajo Yii2, que parecía conveniente en un determinado sistema, a la vanguardia de lo cual debería ponerse la facilidad de uso, la flexibilidad y la capacidad de acelerar significativamente el desarrollo de sitios estándar con sus herramientas. Este proyecto fue desarrollado por mí para el "alma", pero por el momento ya está en beta.

La esencia de yicms está en algún punto intermedio entre las capacidades del marco y las capacidades habituales de CMS. Esto no es CMS en el sentido habitual de la palabra, sino solo un conjunto de módulos que pueden acelerar significativamente el desarrollo del sitio utilizando sus propias herramientas, mientras que tienen pleno "acceso" a las capacidades del marco. Las características principales que están incrustadas en yicms son el panel de administración generado sobre la marcha y las clases con anotaciones automáticas que le permiten utilizar el autocompletado IDE y tener una interfaz intuitiva.

Instalación y configuración


Entonces, comencemos con yicms instalándolo. Para las citas, la forma más fácil es usar Open Server o cualquier otra plataforma de servidor similar. Como yicms tiene una fuerte dependencia de Yii, primero lo instalaremos. Para simplificar, usaremos la plantilla básica:

composer create-project --prefer-dist yiisoft/yii2-app-basic basic

Después de que el compositor instale el marco, agregue la sección requerida del archivo composer.json con los cuatro módulos yicms y ejecute la actualización del 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 un conjunto de funcionalidades específicas, que serán consideradas en el futuro. Por ahora, solo instálalos todos.

A continuación, debe recordar configurar el servidor. En Open Server usamos Apache y configuramos .htaccess de la siguiente manera:

Para el archivo raíz .htaccess:
 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 el archivo .htaccess en el directorio web

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php 

El siguiente paso es llevar la migración de cada módulo yicms a la base de datos. En la consola, ejecutamos secuencialmente los siguientes 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

Ahora comencemos la configuración en el archivo config / web.php.

La sección de módulos se configura de la siguiente manera:

 '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', ], 

La sección de arranque se configura de la siguiente manera:

 'bootstrap' => ['log', 'common', 'pages', 'essences', 'feedback'], 

La sección de usuario se configura de la siguiente manera:

 'user' => [ 'identityClass' => 'Iliich246\YicmsCommon\Base\CommonUser', 'enableAutoLogin' => true, ], 

Elimine la sección de comentarios urlManager:

 'urlManager' => [ 'enablePrettyUrl' => true, 'showScriptName' => false, 'rules' => [ ], ], 

El marco Yii2 y el sistema yicms se han configurado correctamente.

Después del primer inicio, si todo se configuró correctamente, el directorio yicms debe crearse en el directorio raíz del proyecto que contendrá los archivos disponibles para los cambios del usuario y también se crearán clases con anotaciones automáticas.



Descripción de los módulos comunes y de páginas


El sistema yicms consta de dos secciones. La sección de desarrollo, que debe ser accesible solo para el desarrollador (el código puede estar roto en ella) y la sección de administración debe ser accesible para el administrador del sitio (la gestión de contenido se lleva a cabo en él). Para comenzar, debe ir a la sección Desarrollo, para esto debe usar la siguiente URL:

http://< >/web/common/dev/login-as-dev?hash=123456&asDev

Después de eso, el panel Dev debería abrir:



Ahora comencemos con la funcionalidad yicms. Primero, en el módulo Páginas, crearemos una página llamada índice, que será la página principal del sitio. Vaya a la Lista de páginas y cree una nueva página llamada índice. De manera predeterminada, se crearán los campos título, meta_descripción y meta_palabras clave para la página. Además, crearemos otro campo a través del botón Agregar nuevo campo con el texto del nombre, dejaremos todos sus parámetros por defecto.

Ahora si sigues el enlace

http://< >/web/pages/admin

Se abrirá la sección de administración. La página de índice estará disponible para llenar de contenido. Rellene todos los campos con texto libre.

En el momento de crear la sección de índice en la sección de desarrollo de la página de índice, la clase Index se creó en el directorio yicms / Pages / Models en el que también se crearon anotaciones para los campos título, meta_description, meta_keywords, así como para el campo de texto que creamos sobre la marcha. Un objeto de esta clase que podemos usar para obtener el valor de los campos. Considere cómo se puede hacer esto. En el controlador estándar SiteController de la plantilla básica en actionIndex, escriba lo siguiente:

 /** * Displays homepage. * * @return string * @throws \Iliich246\YicmsPages\Base\PagesException */ public function actionIndex() { $indexPage = \app\yicms\Pages\Models\Index::getInstance(); return $this->render('index', [ 'indexPage' => $ indexPage ]); } 

Dado que la clase \ app \ yicms \ Pages \ Models \ Index se generó automáticamente, la finalización automática para ella funcionará en el IDE. Ahora $ indexPage se puede usar como índice. Ahora abra la vista de índice. Eliminamos todo lo innecesario de allí y escribimos:

 <?php /** @var $this yii\web\View */ /** @var $indexPage \app\yicms\Pages\Models\Index */ $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> 

La anotación de la variable $ indexPage es necesaria para la finalización automática de IDE. Ahora use el objeto $ indexPage. Todos los campos que creamos en la sección de desarrollo para la página de índice están disponibles en el objeto de la clase Índice, que, gracias a la anotación automática, se complementa con el IDE después de ingresar el operador de flecha.

En total, en poco tiempo creamos una página de índice para la cual se creó automáticamente un panel de administración para editar su contenido. Utilizamos la programación solo para crear el objeto de página en el controlador estándar del marco, y en la forma en que podíamos usar rápidamente el objeto de página gracias al autocompletado y una interfaz intuitiva.

Examinamos solo la parte más pequeña de las capacidades de yicms. Ahora complicaremos un poco la página principal del sitio usando yicms.

yicms admite el multilingüismo fuera de la caja. Para activar el segundo idioma en la sección de desarrollo del módulo común, seleccione la lista de idiomas, luego seleccione el idioma ruso y actívelo en él:



Ahora en el panel de administración podemos completar los campos para varios idiomas. Puede crear nuevos idiomas en el sistema. Sin embargo, será necesario traducir el panel de administración utilizando herramientas de marco regulares. Por lo tanto, al crear un nuevo idioma, debe cumplir con ISO. Para los controles de contenido, simplemente se agregará una nueva placa con un nuevo idioma.

Bloques de archivos componentes


A continuación, considere el elemento de bloques de archivo. En el panel de desarrollo de la página de índice, cree un bloque de archivo con el documento del nombre del programa. Otras configuraciones de bloque se dejarán por defecto. Ahora en el panel de administración para la página de índice, la edición del archivo del documento está disponible. Descargue un archivo arbitrario. Ahora el enlace para descargarlo se puede mostrar en la página de índice del sitio:

 … <div class="body-content"> <div class="row"> <h3>Document</h3> <a href="<?= $indexPage->document->uploadUrl() ?>"> <?= $indexPage->document ?> </a> </div> … </div> 

Ahora, en la página, el enlace cargará el archivo que subimos al panel de administración. De manera predeterminada, el bloque de archivos funciona en modo de archivo único en todos los idiomas. Sin embargo, en el panel de desarrollo, puede cambiar el tipo de idioma al tipo traducible y luego, para cada idioma, deberá cargar su propio archivo. En este caso, el archivo cuyo idioma está actualmente activo en el sitio se descargará a través del enlace. Por supuesto, puede descargar para un idioma específico, que se discutirá más adelante.

El siguiente paso en el panel de desarrollo es crear un bloque de archivo de recetas para el que especificaremos el tipo como tipo múltiple. En este modo, puede cargar muchos archivos para un bloque de archivos. Para hacer esto, en el panel de administración, en la pestaña de recetas que aparece, cargue varios archivos arbitrarios.
Después de eso, en forma de índice, enumeramos los archivos:

 … <div class="row"> <h3>Recipes</h3> <?php foreach ($indexPage->recipes as $recipe): ?> <a href="<?= $recipe->uploadUrl() ?>"> <?= $recipe ?> </a> <?php endforeach; ?> </div> … 

En el modo de tipo múltiple, se puede omitir un bloque de archivo a través de foreach o un iterador.

Componente de bloque de imágenes


Ahora considere el elemento de bloque de imágenes. Cree un bloque de imagen para la página de índice, dejando todas las configuraciones predeterminadas. De manera similar a los bloques de archivos en el panel de administración, se hizo posible cargar una imagen. Sube una imagen arbitraria. Ahora en forma de índice escribimos lo siguiente:

 <div class="row"> <h3>Image</h3> <img src="<?= $indexPage->picture ?>" alt=""> </div> 

De manera similar a los archivos de imagen, uno se carga de forma predeterminada en todos los idiomas, sin embargo, para las imágenes, este comportamiento se puede cambiar en el panel de desarrollo y cargar su imagen para cada idioma. También puedes subir muchas imágenes en un bloque.

Cree un bloque de galería de imágenes en el panel de desarrollo, cuyo tipo se establecerá como Múltiples imágenes. Para las imágenes, también puede colgar campos de texto sobre la marcha. Por lo tanto, en la ventana modal para configurar el bloque de la galería, vamos a la sección "Ver campo de bloque de imagen". En esta sección para imágenes, cree campos con los nombres alt y name. Ahora en el panel de administración para cada imagen, es posible establecer los campos de texto alternativo y de nombre. También en yicms para imágenes listas para usar está disponible la capacidad de "recortar" y crear miniaturas. Por ejemplo, cree una plantilla de miniaturas para el bloque de la galería. En la ventana modal del bloque de imágenes, vaya a la sección "Configuración de imágenes en miniatura". En él crearemos un configurador de miniaturas con el nombre "x2" y los parámetros divisor = 2 y calidad = 80. Por nombre podremos acceder a la miniatura, el divisor determinará cuánto reducir el tamaño de la imagen original, la calidad determina la calidad de compresión de la miniatura. Luego, cree otra plantilla de miniaturas con los parámetros: nombre_programa = "x5", divisor = 5, calidad = 50. Ahora, cuando carguemos la imagen desde el panel de administración, se crearán automáticamente dos miniaturas con los parámetros que seleccionamos.

Ahora suba algunas imágenes al panel de administración para el grupo de la galería. Después de crear y cargar la imagen, puede completar los campos alt y name, cuyas plantillas creamos en el panel de desarrollo. Veamos cómo mostrar todo esto en el sitio.

 <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> 

Aquí, el método getImages () devuelve una matriz de objetos de la aplicación de clase anotada automáticamente \ yicms \ Pages \ Models \ Index \ Images \ GalleryImage en la que se crearon anotaciones para los campos alt y name que creamos sobre la marcha y la autocompletación IDE está disponible para ellos. Además, al llamar al método outputThumbnail (<Nombre de plantilla de miniatura>) en el objeto, cambiamos el objeto al modo de salida de miniatura.

Para los bloques de imágenes, es posible crear no solo campos sino también condiciones, que consideraremos un poco más adelante. También se pueden crear campos y condiciones para bloques de archivos. Funciona en un principio similar.

Condiciones de los componentes


Ahora considere el siguiente elemento. Estas son las condiciones. Las condiciones son convenientes para crear en las listas del panel de administración, casillas de verificación, etc. Lo que determinará cierto comportamiento al trabajar páginas. Veamos un ejemplo. Cree una condición llamada fondo en el panel de desarrollo en la página de índice. Escriba select "seleccione el tipo desplegable". Después de crear la condición, iremos a la sección "Opciones de configuración de la condición". Cree tres valores de condición con los valores transparente, rojo y verde.

Después de eso, aparecerá una condición con una lista desplegable con los valores TRANSPARENTE, ROJO y VERDE en el panel de administración de la página de índice. Se convierten en mayúsculas, porque en la clase de anotación automática creada se representan como constantes.

Ahora intentemos usar la condición creada. Lo usamos de una manera ligeramente diferente para mostrar otras posibilidades. Dado que la página de índice es la página principal del sitio, será semánticamente verdadero cambiar el color de fondo del sitio desde su configuración. Por lo tanto, nuestra condición será cambiar el color de fondo en todo el sitio, por lo que lo insertaremos en el diseño del controlador. Abra el archivo de plantilla de diseño del marco básico Yii2 y cree un objeto Index:

 <?php /* @var $this \yii\web\View */ /* @var $content string */ 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() ?> 

Dado que el objeto de la clase Index es algo así como un singleton, podemos llamar al método estático getInstance () todo lo que queramos sin el riesgo de realizar consultas duplicadas adicionales de la base de datos y otros gastos generales al crearlo. Ahora, usando el objeto $ pagesIndex, cambiaremos la etiqueta agregándole un estilo en línea:

 <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; ?> "> 

Al llamar a $ pagesIndex-> ​​background-> value () y comparar con la constante que se creó en la clase anotada automáticamente \ app \ yicms \ Pages \ Models \ Index \ Condiciones \ Background, seleccionamos el color de fondo del sitio.

A continuación, considere las capacidades de las clases con anotaciones automáticas. Mientras se ejecuta yicms, suceden muchos eventos que pueden ser manejados por el marco de Yii. Damos un ejemplo.

 app\yicms\Pages\Models\Index\Fields\Text 

Este archivo fue creado por un anotador automático cuando creamos el campo de texto para la página de índice en el panel de desarrollo. Cuando escribimos <? = $ IndexPage-> text?> En la plantilla, se crea algo similar al singleton de esta clase en particular, que en la plantilla se convierte en una cadena usando la magia __toString ().

Para cambiar el contenido, nos suscribimos al evento y lo procesamos a través de la función de devolución de llamada:

 class Text extends Field { public function init() { $this->on(self::EVENT_BEFORE_OUTPUT, function($event) { /** @var $event \Iliich246\YicmsCommon\Base\HookEvent */ }); } } 

El evento EVENT_BEFORE_OUTPUT ocurre antes de que se muestren los contenidos del campo. Intentemos cambiarlo. Para hacer esto, usamos el objeto de evento \ Iliich246 \ YicmsCommon \ Base \ HookEvent:

 $this->on(self::EVENT_BEFORE_OUTPUT, function($event) { /** @var $event \Iliich246\YicmsCommon\Base\HookEvent */ $value = $event->getHook(); $value = strrev($value); $event->setHook($value); }); 

El evento HookEvent obtiene el valor del campo antes de que se active el evento. En el caso, puede obtener este valor a través de $ event-> getHook (), cambiarlo y enviarlo de vuelta al objeto a través del evento usando $ event-> setHook ($ value). Por lo tanto, en el caso, giramos el texto que el campo Texto muestra al revés.

Casi todas las clases de alquiler automático tienen una serie de eventos que pueden conectarse de manera similar, pero su consideración está más allá del alcance del artículo de investigación.

En total, en este artículo, examinamos dos módulos yicms, a saber, los módulos Common y Pages. El módulo común incluye componentes como campos, bloques de archivos, bloques de imágenes y condiciones. El módulo Páginas es responsable de crear objetos de página que contengan todos los elementos del módulo Común. Es decir Todos los módulos yicms dependen del módulo común principal.

Módulo Yii2-yicms-esencias


Ahora vamos a familiarizarnos con el módulo Essences. Este módulo está diseñado para crear entidades del tipo categoría-> entidad, por ejemplo, la categoría de bienes-> bienes, tipo de vehículo (automóviles, motocicletas) -> vehículo específico, etc. Dentro del módulo, estos elementos se denominan categorías y representaciones.

Como ejemplo, mostramos la creación de un catálogo simple de la categoría-> tipo de producto para una tienda en línea.

En la sección de Desarrollo del módulo de Esencias, ve a la lista de esencias y allí vamos a la sección de crear nueva esencia. Le damos los productos con el nombre del programa y dejamos el resto de la configuración de forma predeterminada. Por defecto, se crea una entidad con comportamiento: una vista puede pertenecer a una categoría. Sin embargo, puede especificar otros comportamientos: solo crear vistas sin categorías, o una vista puede pertenecer a varias categorías.

Las categorías en sí mismas se basan en un principio similar a un árbol, cuando cualquier categoría tiene un elemento primario (excepto el superior). Es decir Las categorías son hojas de una estructura de datos de tipo árbol.

Total de productos de entidad creados. Para ella, se crearon clases con anotaciones automáticas en el directorio app \ yicms \ Essences \ Models. A continuación, en el panel de desarrollo, necesitamos crear plantillas de clase y plantillas de presentación. Todo esto es similar a la forma en que los creamos para la página de índice. Los elementos Campos, Bloques de archivos, Bloques de imágenes y Condiciones están disponibles para ellos en el modo de creación sobre la marcha. Una vez que hayamos terminado de crear plantillas en el panel de administración, estará disponible para crear categorías y vistas con los elementos de plantilla que configuramos en el panel de desarrollo.

Entonces, crearemos varias categorías de productos. Y para cada categoría de productos hay varios productos. Una vez hecho esto, todo se puede mostrar en el sitio principal. Considera cómo se hace esto. En SiteController, cree una acción actionProcuts:

 /** * * @return string */ public function actionProducts() { $productsEssence = Products::getInstance(); return $this->render('products', [ 'productsEssence' => $productsEssence ]); } 

Crear una vista de productos para ello

 <?php /** @var $this yii\web\View */ /** @var $productsEssence \app\yicms\Essences\Models\Products */ ?> <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> 

Gracias al mecanismo de anotación automática, el método $ productsEssence-> categories devuelve una matriz de objetos de la aplicación de clase anotada automáticamente \ yicms \ Essences \ Models \ ProductsCategory. Al igual que en las clases anteriores con anotaciones automáticas en esta clase, hay anotaciones en los campos que creamos sobre la marcha, el IDE podrá usar la finalización automática. También vale la pena señalar que las clases con anotación automática se desarrollaron con la idea de que el usuario yicms podrá colocar su propia lógica de negocios en ellas, es decir. puede escribir su propio código en ellos, y el mecanismo de anotación automática cambia las áreas especialmente marcadas y ningún código de usuario se verá afectado.

El método $ category-> represent también devuelve una matriz de aplicaciones \ yicms \ Essences \ Models \ ProductsRepresents objetos que tienen las mismas ventajas de anotación automática que para las categorías. Por supuesto, hay métodos más flexibles para obtener ideas. Por ejemplo, $ category-> getRepresentsQuery () devolverá un objeto ActiveQuery del marco Yii2, que puede personalizarse aún más para refinar la consulta de la base de datos, utilizada para crear paginación o carga diferida.

En total, el módulo Essenses le permite crear rápidamente un esqueleto de la funcionalidad de la tienda, con el panel de administración ya funcionando. Se puede escribir lógica empresarial adicional en clases con anotaciones automáticas.

Módulo de retroalimentación Yii2-yicms


Este módulo está diseñado para que los visitantes y usuarios del sitio creen formularios de entrada de información en el sitio. La ideología del trabajo sigue siendo la misma, primero en el panel de desarrollo escribimos los campos requeridos para el formulario.

Considere la operación del módulo por ejemplo. Cree un registro con los mensajes de nombre del programa en el panel de desarrollo en el módulo de comentarios. En la página de configuración de mensajes, podemos ver el botón de plantillas de páginas de Comentarios. Usando este enlace, podemos crear elementos del campo de tipo, bloque de archivos, bloque de imágenes, condiciones que pueden usarse para formatear el contenido de la página de mensajes. No son diferentes de los que consideramos para el módulo Páginas. Ahora estamos más interesados ​​en la sección Plantillas de entrada de comentarios. En esta sección, podemos crear entidades como campos de entrada, archivos de entrada, imágenes de entrada y condiciones de entrada. Estas entidades son justo lo que necesita para crear formularios de entrada personalizados.

Cree dos campos de entrada con los nombres nombre y apellido.Imagen de entrada llamada foto. Condición de entrada denominada acuerdo. Por ahora, dejemos todas las configuraciones para estas entidades como predeterminadas. Más adelante en este ejemplo, configuraremos validadores que también están colgados en estas entidades sobre la marcha (los validadores también están disponibles para entidades del módulo común y funcionan de acuerdo con la misma lógica que para el módulo de comentarios. Lo discutiremos un poco más adelante).

Ahora aplique el módulo en nuestro sitio web. Primero, cree una nueva acción en SiteController:

 /** * @return string */ public function actionMessage() { $messages = \app\yicms\Feedback\Models\Messages::getInstance(); return $this->render('message', [ 'messages' => $messages ]); } 

A continuación, cree una vista de mensaje y escriba lo siguiente en ella:

 <?php /** @var $this yii\web\View */ /** @var $message \app\yicms\Feedback\Models\Messages */ ?> <?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 crear el formulario, utilizaremos las herramientas estándar del marco. Para aprovechar el módulo de comentarios, escribiremos lo siguiente:

 <?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 las entidades de tipo input, debe usar el prefijo input_; de lo contrario, las anotaciones automáticas funcionan para ellos de la misma manera que para el resto de las cosas en yicms.

Al principio hay una comprobación de actividad de campo, si el campo está inactivo, entonces no debe procesarse, e incluso si se procesa, los datos que se completaron no se cargarán en el servidor. La actividad de campo se puede activar / desactivar en el panel de desarrollo.

Luego está la forma estándar del marco donde necesitas escribir así

 $form->field($messages->input_name, $messages->input_name->key) 

$ messages-> input_name devolverá un objeto de clase app \ yicms \ Feedback \ Models \ Message \ InputFields \ Name que es el descendiente del marco del Modelo Yii2 y puede usarse en formularios, $ messages-> input_name-> key devolverá el valor de clave correcto, en orden para que se pueda cargar el formulario.

Ahora, cuando vamos a la página con el formulario, se representan todos sus campos, pero la carga al servidor aún no funciona. Es muy facil de hacer. Traté de hacer que la interfaz de trabajo de retroalimentación sea lo más similar posible a la interfaz de trabajo modelo en el marco. Sí, tuve que "sacrificar" una pequeña arquitectura, pero en su conjunto resultó así:

 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 ]); } 

Ahora el formulario se cargará, validará y guardará en el servidor. En la sección de administración, podemos ver la información que se ha ingresado en el formulario.

Por supuesto, puede usar una clase anotada automáticamente:

\app\yicms\Feedback\Models\Messages

 class Messages extends Feedback { /** * @return self instance . */ public static function getInstance() { return self::getByName('messages'); } /** * @inheritdoc */ 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(); }); } } 

En este ejemplo, nos registramos para el evento EVENT_AFTER_HANDLE. El evento ocurre después de que los datos del formulario se hayan guardado en el servidor. En este caso, enviamos una carta a la plantilla en la que podemos insertar los datos del formulario guardado:

 <?php /** @var $this \yii\web\View view component instance */ /** @var $message \app\yicms\Feedback\Models\Message */ ?> <h1>Mail on message</h1> <h1>Name: <?= $message->input_name->value ?></h1> <h2>Surname: <?= $message->input_surname->value ?></h2> 

$ message-> input_name-> value simplemente devuelve los datos actuales que estaban almacenados en la base de datos.

Ahora veamos cómo funcionan los validadores. En el panel de desarrollo en la entidad del campo de entrada con el nombre, agregue el validador requerido. Este es el validador estándar yii \ validators \ RequiredValidator. Cuando lo agregamos, aún no está activo, porque el botón con su nombre es blanco. Para activarlo, debe hacer clic en este botón, se abrirá la ventana de configuración del validador. Allí debe instalar la casilla de verificación y activarla. Al mismo tiempo, puede configurar todos los demás parámetros del validador, como mensajes de error en todos los idiomas del sistema, etc. Después de guardar, el icono del validador se vuelve verde, lo que significa que se ha activado y se aplicará al validar los formularios.

En input_condition con el acuerdo de nombre, colgamos el validador de comparación. Y configúrelo para comparar con 1, escriba el número y el operador ==. Además, puede escribir un mensaje en los campos de texto de error, como "Debe aceptar los términos de la oferta". Ahora en el formulario, la validación tendrá lugar solo cuando la casilla de verificación del acuerdo esté seleccionada.

En total, en este artículo examinamos las principales características del sistema yicms.

Source: https://habr.com/ru/post/454914/


All Articles