Обучающие материалы | Nwicode CMS

Модуль может быть одной главной страницей с новыми функциями или настройками или полной функцией, которая будет использоваться в ваших мобильных приложениях и управляться в вашем редакторе приложений.

Модули установлены в app/local/modulesпапке

Состав

Структура папок

ModuleName
├─ Controller
│  └─ Default.php   /** If you need to override the default controller Classes */
├─ controllers
│  ├─ Backoffice
│  │  └─ ModuleNameController.php
│  └─ Mobile
│     └─ ModuleNameController.php
├─ features
│  └─ [...] // Core feature related files
├─ Form
├─ Model
├─ View
├─ resources
│  ├─ db
│  │  ├─ data
│  │  └─ schema
│  ├─ media 
│  │  └─ library
│  ├─ translations
│  │  ├─ default
│  │  │  └─ mymodule.po
│  │  ├─ en
│  │  └─ [...]
│  └─ design
└─ package.json

основы

package.json

package.jsonИспользуется установщиком для запуска в процессе установки / обновления

{
  "name": "ModuleName",
  "description": "Module description",
  "type": "module",
  "version": "1.0",
  "dependencies": {
    "system": {
      "type": "SAE",
      "version": "1.0.0"
    },
    "modules": {
      "OtherModule": "1.1.0"
    }
  }
}

resources/db/schema

Мы используем resources/db/schema/table_name.phpдля описания схемы таблицы; ниже пример базовой таблицы.

Этот файл (ы) отражает вашу базу данных в ее последней версии, каждый раз, когда вы обновляете свой модуль, локальная схема сравнивается с этим файлом и обновлением

Примечание: схема добавляет поля только в том случае, если они новые или отсутствуют, поля никогда не удаляются.

<?php
/**
 * Schema definition for "table_name"
 */
$schemas = (!isset($schemas)) ? [] : $schemas;
$schemas["table_name"] = [
    "mytable_id" => [
        "type" => "int(11) unsigned",
        "auto_increment" => true,
        "primary" => true,
    ],
    "admin_id" => [
        "type" => "int(11) unsigned",
        "is_null" => true,
        "foreign_key" => [
            "table" => "admin",
            "column" => "admin_id",
            "name" => "FK_MY_MODULE_ADMIN_ID_ADMIN_AMIN_ID", // Must be unique!
            "on_update" => "CASCADE",
            "on_delete" => "CASCADE",
        ],   
    ],
    "name" => [
        "type" => "varchar(50)",
        "default" => "default_value",
        "index" => true,
    ],
    "created_at" => [
        "type" => "datetime",
    ],
    "updated_at" => [
        "type" => "datetime",
    ],
];

Список доступных опций

ключ Тип Использование, значения, комментарий
type
строка int (11) без знака, varchar (50), datetime и т.д ...
auto_increment
логический
primary
логический
is_null
логический
default
смешанный
foreign_key
Array ()
foreign_key
Array ()

Параметры внешнего ключа

ключ Тип Использование, значения, комментарий
table
строка Ссылочный стол
column
строка Ссылочный столбец в таблице
name
строка Имя внешнего ключа (например, FK_TABLENAME_KEYNAME_REFTABLENAME_REFKEYNAME)
on_update строка НЕТ ДЕЙСТВИЯ, УСТАНОВИТЬ НУЛЬ, КАСКАД, ОГРАНИЧЕНИЕ
on_delete строка НЕТ ДЕЙСТВИЯ, УСТАНОВИТЬ НУЛЬ, КАСКАД, ОГРАНИЧЕНИЕ

Параметры индекса

ключ Тип Использование, значения, комментарий
key_name строка Имя индекса, используйте то же самое в нескольких столбцах для составных индексов
index_type строка ДЕРЕВО, ХЭШ
is_null
логический
is_unique логический

resources/db/data

Эта папка используется для вставки значений по умолчанию при установке или обновлении модуля.

Каждый файл php в этой папке будет выполняться при установке и / или обновлении модуля, они должны отражать необходимые данные в качестве последней версии.

Защищенные имена: install.php%VERSION%.phpгде% VERSION% - строка semver, вы НИКОГДА не должны их использовать.

Лучшая практика:

  • Если ваш модуль собирается установить несколько функций, разделите их на несколько файлов,

    • например: feature1.phpfeature2.phpи т.д ...

features/modulename/feature.json


Этот файл является ключом для всех функций приложения

{
    "name": "ModuleName",
    "code": "modulename",
    "version": "1.0.0",
    "category": "contact",
    "model": "ModuleName_Model_MainClass",
    "desktop_uri": "modulename/application/",
    "routes": [
        {
            "root": true,
            "state": "modulename-home",
            "controller": "ModuleNameHome",
            "url": "modulename/mobile_home/index/value_id/:value_id",
            "template": "l1/home.html",
            "cache": false
        },
        {
            "state": "modulename-view",
            "controller": "ModuleNameView",
            "url": "modulename/mobile_view/index/value_id/:value_id/item_id/:item_id",
            "template": "l1/view.html",
            "cache": false
        }
    ],
    "layouts": [
        1
    ],
    "icons": [
        "icons/modulename1-flat.png",
        "icons/modulename2-flat.png",
        "icons/modulename3-flat.png"
    ],
    "files": [
        "js/services/modulename.js",
        "js/factory/modulename.js",
        "js/controllers/modulename.js",
        "scss/modulename.scss"
    ],
    "compile": true,
    "use_account": true,
    "only_once": true,
    "load_on_start": false,
    "on_start_factory": null
}

Список опций

ключ Тип Использование, значения, комментарий
name
строка Ваше имя функции
code
строка Этот код является уникальным для вашей функции, модуля
category
строка socialmediacontactmonetizationcustomizationintegrationevents,misc
version
строка Не используется здесь, см. Package.json для версии
model
строка Класс модели по умолчанию, используемый в редакторе
desktop_uri строка Класс контроллера по умолчанию, используемый в редакторе
compile
логический Оставьте true по умолчанию
use_account логический Если функция требует, чтобы пользователь вошел в систему, установите true
only_once
логический Может ли приложение иметь эту функцию только один раз или более
load_on_start логический Если функция должна быть загружена сразу после запуска приложения
on_start_factory строка Когда для load_on_start задано значение true , будет выполнена функция Factory.onStart, где Factory - имя класса 

Переводы

Использует файлы .po , которые являются исходными файлами Gettext .

Сначала создайте новый файл с именем, mymodule.poзатем поместите этот файл в translations/defaultпапку

Если вы хотите отправить свой модуль с переводами, поместите файлы в каталоги, названные с помощью кода локали, например: english будет в translations/en/mymodule.po

Ниже в качестве примера contact.poфайл.

Обязательно не используйте существующее имя файла, которое находится в NWICODECMS_ROOT/languages/baseдругом месте, иначе ваши переводы не будут работать.

msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"POT-Creation-Date: 2019-03-28T15:24:21+01:00\n"
"PO-Revision-Date: 2019-03-28T15:24:21+01:00\n"
"Language: \n"

msgctxt "contact"
msgid "Cover image"
msgstr "Illustration"

msgctxt "contact"
msgid "Name"
msgstr "Nom"

#, mobile
msgctxt "contact"
msgid "Facebook"
msgstr "Facebook"

#, mobile
msgctxt "contact"
msgid "Twitter"
msgstr "Twitter"

#, mobile
msgctxt "contact"
msgid "Website"
msgstr "Site web"

msgctxt "contact"
msgid "String to translate"
msgstr "Phrase à traduire"

msgctxt "contact"
msgid "Hello, I'm %s"
msgstr "Bonjour je suis %s"

Список опций

ключ Тип Использование, значения, комментарий
#, mobile
строка Добавьте эту строку, если строка переведена внутри мобильного приложения
msgctxt
строка Это ваш контекстный ключ, как правило, это код модуля
msgid
строка Исходная строка, используемая в качестве ключа
msgstr
строка В папке по умолчанию msgstr = msgid , в файлах перевода msgstr - переведенное предложение.

Как перевести

Внутренний редактор и офис

<?php

// Simple translation
echo p__("context_key", "String to translate");

// Will render [en]"String to translate" , [fr]"Phrase à traduire", as per the .po file below

// sprintf translation
$userName = "John";
echo p__("context_key", "Hello, I'm %s", $userName);

// Will render [en]"Hello, I'm John", [fr]"Bonjour je suis John", as per the .po file below



В мобильных приложениях ключ заметки и контекст поменялись местами по сравнению с функцией php

// From the controllers, include $translate factory
$translate.instant("Hello, I'm %s", "context_key");

// From any template
<div class="item">
    {{ "Hello, I'm %s" | translate:"context_key" }}
</div>

дизайн

Все, что вам нужно находится в design
ModuleName
├─ [...]
├─ resources
│  └─ design
│     ├─ desktop
│     │  └─ flat
│     │     ├─ css
│     │     │  └─ modulename.css
│     │     ├─ js
│     │     │  └─ modulename.js
│     │     ├─ images
│     │     │  └─ customization
│     │     │     └─ layout
│     │     │        └─ modulename
│     │     │           ├─ layout-1.png
│     │     │           └─ layout-2.png
│     │     ├─ layout
│     │     │  └─ modulename.xml
│     │     └─ template
│     │        ├─ company
│     │        │  └─ [...]
│     │        └─ modulename
│     │           ├─ index.phtml
│     │           └─ application
│     │              ├─ edit.css
│     │              ├─ edit.js
│     │              └─ edit.phtml
│     └─ email
│        ├─ layout
│        └─ template
└─ [...]

Пример modulename.xml

Это минимально необходимая информация по умолчанию layout.xml, файл должен называться как сам модуль, так и job.xml в нашем случае в нижнем регистре.
<?xml version="1.0" encoding="UTF-8"?> <layout> <modulename_application_modulename_edit> <views> <content class="application_view_customization_features_edit_tabbareditor" template="application/customization/features/edit/tabbar_editor.phtml" /> <content_editor class="core_view_default" template="job/application/edit.phtml" /> </views> </modulename_application_modulename_edit> </layout>
Раздел content является вкладкой по умолчанию для вкладки редактора функций, вам не нужно менять ее.
Раздел content_editor должен указывать на шаблон редактора объектов
здесь: короткий путь со modulename/application/edit.phtml ссылкой на ModuleName/resources/design/template/modulename/application/edit.phtml
Используйте только короткий путь.
кэш
При разработке модуля вам придется вручную перестраивать то, что мы называем дизайн-кешем
Примечание: при установке и / или обновлении модуля с помощью обычного zip-пакета кэш автоматически очищается для пользователей.
Фоновые изображения
Сторона редактора
В файле edit.phtml, который обрабатывает интерфейс редактора для вашего модуля, вы должны добавить фоновый раздел, как показано ниже.
<div class="background-images-import"> <?php echo $this->importBackground($option_value); ?> </div> <script type="text/javascript"> $(document).ready(function () { // Bind form, only if the current form is not binded from a parent (this could bind it twice) bindForms('.background-images-import'); }); </script>
Это так же просто, как приведенный ниже код, так как все связано с этой функцией и автоматически обрезается / сохраняется для вас.
Применение / Ионные
Затем, чтобы убедиться, что ваши фоновые изображения на страницах приложения, вы должны убедиться, что все просмотры и списки, также использует новую директиву sb-page-background
<ion-view sb-page-background> <ion-content> {{ "My Awesome Content!" |translate:"module_name" }} </ion-content> </ion-view>
пакет
Когда вы закончите с вашим модулем, пришло время упаковать!
Архивируйте все в корне вашего модуля, и все готово!
ModuleName.zip ├─ Controller ├─ controllers │ └─[...] ├─ features ├─ Model ├─ View ├─ resources │ └─[...] └─ package.json



Вернуться

Есть вопросы — спрашивайте!

Наши специалисты помогут Вам и окажут бесплатную консультацию

Документация

Новости 1 - 20 из 51
Начало | Пред. | 1 2 3 | След. | Конец