Postup při změně administrace na novou verzi
- Nakopírovat js soubory a scss soubory (založit složku sass a do ní vložit nové sass soubory pro admin z dema), změnit kompilaci v webpack.mix.js
- Přehrát bootstrap - je potřeba přehrát i JS soubory ve složce resources! staré můžeme přejmenovat na neco_old (pozor na FRONT! kdyžtak udělat duplicitně)
- Doplnit proměnné
- Hromadná změna sloupcových tříd - col-xs-12 na col-12 hidden na d-none, tlačítka apod. - viz. http://upgrade-bootstrap.bootply.com/ (vše ve složce fencee/app/presenters/Admin)
- Úprava layout podle demowebu
- Úprava logo
- Úprava navigace.latte
nahradit: 'btn btn-default selected' : 'btn btn-default' => 'selected' : ' '
přidat do n:class: 'jmeno-ikony ico-before'
odstranit <i> ikony a col-12 z navigace - Úprava pravé menu - viz demo
- Postupný přepis container tříd, změna struktury chybně zanořených row a col.
- Úprava app.js - viz demoweb
- Úprava router + přidání funkcí do presenterů
- $adminRoutes[] = new Route('/admin/menu/labeled[/<checkbox_id [0-9]+>]', 'Menu:labeled') + renderLabeled
- Nahradit tabulky - zde příklad - viz. demo - přes regexy viz. níže, provézt kontrolu jestli se vše opravdu změnilo (rádo to háže stack overflow error), například statelist
<div class="custom-table"> <div class="table-head"> <div class="table-row"> <div class="table-caption">{_admin.table.name}</div> <div class="table-caption">{_admin.table.note}</div> <div class="table-caption"></div> </div> </div> <div class="table-body"> <div class="table-row" n:foreach="$files as $file" > <div class="table-cell "> {$file->name|upper} </div> <div class="table-cell"> {$file->note} </div> <div class="table-cell buttons-on-end no-margins"> <a n:href="rescue! file_id => $file->id" class="btn btn-ghost ">{_admin.button.recovery}</a> </div> </div> </div> </div>
- Přepis checkboxů a radio
- vyhledat toto $form["hidden"]->items,$form["menu_id"]->items, $form["vat"]->items a postupně po kontrole vložit toto
<label class="formLabel radio--fake" n:name="hidden:$key"> <input n:name="hidden:$key"> <div class="fake"></div> <span>{_$label}</span> </label>
- vyhledat toto $form["supplementCheckbox"]->items, <label class="formLabel" n:name="virtual"> a postupně po kontrole vložit toto + form
<label class="formLabel check--fake" n:name="supplementCheckbox:$key"> <input n:name="supplementCheckbox:$key"> <span class="fake"></span> <span>{$label}</span> </label>
- vyhledat toto $form["hidden"]->items,$form["menu_id"]->items, $form["vat"]->items a postupně po kontrole vložit toto
- Nakopírovat bottom bar do potřebných šablon - vyhledat toto btn btn-success saveFormButton
- Postupná změna horní části - menu/item product/item atd.
- Postupně přepsat tree.latte soubory
- Předělat dashboard (většina věcí jde jen nakopírovat, přesto je lepší zkontrolovat, že sedí - app/components/Dashboard - dashboard.latte, php a potom jednotlivé podsložky)
- Doplnění nových věcí (posuvná lišta atd.)
-
fa fa-pencil-square-o, fa fa-pencil-square-o - výběr edit tlačítek - umazat ikonu a změnit na btn btn-edit - viz demo (popřípadě zanechat ajax)
-
fa fa-trash, fa fa-trash-o - výběr trash tlačítek - umazat ikonu a změnit na btn btn-trash - viz demo (popřípadě zanechat ajax)
- btn-trash - odstranit text uvnitř - povětšinou {_admin.button.to_bin}
- class="ajax btn btn-success btn-sm" - kde je hide nebo show funkce,dát pryč ikonu a změnit na class="ajax btn btn-isVisible"
class="ajax btn btn-danger btn-sm" kde je hide nebo show funkce,dát pryč ikonu a změnit na class="ajax btn btn-isVisible notVisible"
class="ajax btn btn-default btn-sm disabled" kde je up funkce,dát pryč ikonu a změnit na class="ajax btn btn-up disabled"
class="ajax btn btn-default btn-sm" kde je up funkce,dát pryč ikonu a změnit na class="ajax btn btn-up"
class="ajax btn btn-default btn-sm disabled" kde je down funkce,dát pryč ikonu a změnit na class="ajax btn btn-down disabled"
class="ajax btn btn-default btn-sm" kde je down funkce,dát pryč ikonu a změnit na class="ajax btn btn-down "
- poté vymazat všude kde je
<i class="fa fa-eye"></i>,
<i class="fa fa-eye-slash"></i>,
<i class="fa fa-arrow-circle-up"></i>,
<i class="fa fa-arrow-circle-down"></i>,
<i class="fa fa-file-image-o"></i>
<i class="fa fa-envelope-o"></i>
<i class="fa fa-level-up"></i>
<i class="fa fa-user"></i> (pozor na jstree) - přepsat třídu controlTd na left-part, dodat třídu left-part kde se vyskytují tlačítka jako btn-up, btn-isVisible atd.
- sortableTable - nahradit za data-table-sortable, odmazat class="sortable" data-sort="string" a <i class="fa fa-sort"></i>
- Přepsat assets/admin - primárně libs a jstree
- Přepsat {first} na {if $iterator->isFirst()} a {/first} na {/if} postupně - vyhledat v projektu
- Přepsat {last} na {if $iterator->isLast()} a {/last} na {/if} postupně - vyhledat v projektu
- Vyhledat form-group a tam kde je pod ním sloupec, doplnit do něj nejdřív <div class="row"> a uzavřít před koncem
Položky menu a produkt
Nejdříve upravíme BasePresenter.php podle dema
Menufactory - zkopírovat od tohoto řádku $form->addCheckbox('c_addToGallery', 'Přidat obrázky do galerie') - cca řádek 239 z dema až po $addToFiles->addUpload('file_input', 'Soubor:')
->addConditionOn($form['c_addToFiles'], $form::EQUAL, true) - cca 326
->setRequired('Přidejte soubor, který chcete nahrát.');
a přidat do projektu.
Poznatky k optimalizaci
Regexy
col-(xs|sm|md|lg)-offset-(\d+) - všechny sloupcové offsety (nahrazení je potom takto offset-$1-$2)
col-xs-(\d+) - všechny xs sloupce (nahrazení je potom takto col-$1) v $1 je potom celý match
( *?<section class=".*?center-panel.*?".*?>) - vybere centerPanel začátek sekce, konec rightPanel sekce bohužel musíme vybrat ručně a vložit tam konec dvou divů (je potřeba zkontrolovat i stránky kde je pouze centerPanel, osvědčilo se mi vyhledání </section> v administraci) </div></div> v $1 je potom celý match, dále je potřeba zanořit {form neco} až do sloupce
- nahrazení <div class="col-12 col-md-12 col-lg-10 right-part-wrapper">
<div class="row">\n $1
^(<div class="row">(?:(\n|\r|\s)*)?<section class="(?:.*)?center-panel(?:.*)?"(?:.*)?>)$ - vybrání centerpanelu a row před
col-(?!(?:12))(\d+) col - výběr tříd kde není responzivita - col-1-11, můžeme replacenout podobně jako v demu, replace "col-12 col"
"col-(?!(?:12))(\d+)" - výběr tříd kde není responzivita a ani jiná třída - col-1-11, můžeme replacenout podobně jako v demu - šikový replace "col-12 col-md-$1"
col-12 col-md-2 col-lg-(\d+) right-panel přepsat na col-12 col-md-3 right-panel
( *?<section class=".*?right-panel.*?".*?>) - vybere rightPanel začátek sekce a vložíme <div class="right-panel-content">, konec rightPanel sekce bohužel musíme vybrat ručně a vložit tam konec divu
Tabulkové regexy
<table([^>]*?)class="table table-striped((?:.|\s)*?)">((?:.|\s)*?)<\/table> - vybere všechny tabulky - nahradit za <div$1class="custom-table $2">$3</div>
(<div(?:[^>]*?)class="custom-table(?:.|\s)*?">(?:.|\s)*?)<thead>((?:.|\s)*?)<\/thead>((?:.|\s)*?<\/div>) - thead změna $1<div class="table-head">$2</div>$3
(<div(?:[^>]*?)class="custom-table(?:.|\s)*?">(?:.|\s)*?)<tbody>((?:.|\s)*?)<\/tbody>((?:.|\s)*?<\/div>) - tbody změna $1<div class="table-body">$2</div>$3
(<div class="table-body(?:.|\s)*?">(?:.|\s)*?)<tr((?:.|\s)*?)>((?:.|\s)*?)<\/tr> - table-row změna $1<div class="table-row" $2>$3</div> - zkusit vícekrát
(<div class="table-head(?:.|\s)*?">(?:.|\s)*?)<tr((?:.|\s)*?)>((?:.|\s)*?)<\/tr> - table-row změna $1<div class="table-row" $2>$3</div> - zkusit vícekrát
(<div class="table-body(?:.|\s)*?">(?:.|\s)*?)<td((?:.|\s)*?)>((?:.|\s)*?)<\/td> - table-cell změna $1<div class="table-cell" $2>$3</div> - zkusit vícekrát
(<div class="table-head(?:.|\s)*?">(?:.|\s)*?)<th((?:.|\s)*?)>((?:.|\s)*?)<\/th> - table-caption změna $1<div class="table-caption" $2>$3</div> - zkusit vícekrát
class="table-cell" class="lastTd" - změna na class="table-cell lastTd"
class="table-cell" class="controlTd" + vyhledat controlTd - změna na class="table-cell left-part"
Vyhledání
<(?:[^>]*?)class="(?:[^>]*?)"(?:[^>]*?)n:class="(?:[^>]*?)"(?:[^>]*?)> - class a n:class - duplicitně
Chyby
class="partialForm" {if $galleries || $files}style='display:block;'{/if}" - zde je pravděpodobně navíc uvozovka, rozbije to formátování a layout
Replace bootstrap třídy (mimo regex - pouze latte zatím!)
.hidden .d-none (pouze latte! a postupně! - chceme pouze třídy, jiné třídy jsem nenalezl)
.hidden-xs .d-none
.hidden-sm .d-sm-none
.hidden-md .d-md-none
.hidden-lg .d-lg-none
.visible-xs .d-block.d-sm-none
.visible-sm .d-none.d-sm-block.d-md-none
.visible-md .d-none.d-md-block.d-lg-none
.visible-lg .d-none.d-lg-block.d-xl-none
Doplnění translation - podle dema
Přehrát a zkontrolovat zda nedošlo ke smazání nějaké translation v git, lepší postupně a pak popřípadě doházet pokud omylem dojde ke smazání
SQL
nové konfigy
INSERT INTO settings_config (id, name, value, hidden, type, note, visible)
VALUES ('ADMIN_ACTIONS_PER_PAGE', 'Počet akcí na stránku', '20', 0, 'input', '', 0),
('ENABLE_MENU_STRUCTURE_DUPLICATION', 'Zapnout možnost duplikace struktury ', '0', 0, 'input', '', 0),
('ADMIN_INSTAGRAM', 'Přidat tlačítko instagramu do adminu pro přihlášení', '0', 0, 'input',
'Přidá tlačítko přihlásit se přes instagram do nastavení webu, po přihlášení se zobrazí instagram příspěvky na webu.', 0),
('ADMIN_LOGO_SRC', 'Admin - cesta k logu', '/assets/logo.png', 0, 'input', '', 0),
('ADMIN_MODULE_ORDER_DISTRIBUTOR', 'ADMIN_MODULE_ORDER_DISTRIBUTOR', 'ADMIN_MODULE_ORDER_DISTRIBUTOR ', 0, 'input', '', 0),
('ADMIN_SUPPLIERS', 'Aktivovat funkcionalitu dodavatelů', '1', 0, 'input',
'Zobrazí v treemenu moznosti s dodavatelem (vytvorení, editace, seznam) a přidá položku do tvorby a úpravy produktu.', 0),
('ADMIN_TAB_ACTIONS', 'ADMIN_TAB_ACTIONS', 'ADMIN_TAB_ACTIONS ', 0, 'input', '', 0),
('ADMIN_TAB_CRM', 'ADMIN_TAB_CRM', 'ADMIN_TAB_CRM ', 1, 'input', '', 0),
('ADMIN_TAB_DEALER', 'ADMIN_TAB_DEALER', 'ADMIN_TAB_DEALER ', 0, 'input', '', 0),
('ADMIN_TAB_ESHOP', 'ADMIN_TAB_ESHOP', 'ADMIN_TAB_ESHOP ', 0, 'input', '', 0),
('ADMIN_TAB_FILES', 'ADMIN_TAB_FILES', 'ADMIN_TAB_FILES ', 0, 'input', '', 0),
('ADMIN_TAB_GALLERY', 'ADMIN_TAB_GALLERY', 'ADMIN_TAB_GALLERY ', 0, 'input', '', 0),
('ADMIN_TAB_NEWSLETTER', 'ADMIN_TAB_NEWSLETTER', 'ADMIN_TAB_NEWSLETTER ', 0, 'input', '', 0),
('ADMIN_TAB_SETTINGS', 'ADMIN_TAB_SETTINGS', 'ADMIN_TAB_SETTINGS ', 0, 'input', '', 0),
('ADMIN_TAB_STATISTIC', 'Statistiky', '1', 0, 'input', '', 0),
('ADMIN_TAB_USERS', 'ADMIN_TAB_USERS', 'ADMIN_TAB_USERS ', 0, 'input', '', 0),
('BANNED_DOMAINS', 'Vyřazené e-mailové domény', 'verizon.net\nssemarketing.net\ncomcast.net\npobox.com\ncharter.net\nfrontier.com\ncox.net', 0,
'textarea', '', 0),
('BANNED_PHONES', 'Zakázané telefony', '+1 213 425 1453\n12134251453', 0, 'textarea', '', 0),
('CURRENCY_SYMBOLS', 'Symboly měn', 'CZK::Kč\nEUR::€', 0, 'textarea', 'CURRENCY::SYMBOL\nCURRENCY::SYMBOL\nCURRENCY::SYMBOL', 0),
('IS_ESHOP', 'IS_ESHOP', 'IS_ESHOP', 0, 'input', '', 0),
('SUPPLIER_MENU_ID', 'ID menu dodavatelů', '4', 0, 'input', '', 0);
Nové tabulky
CREATE TABLE admin_overwatch
(
id INT(11) NOT NULL AUTO_INCREMENT,
lang INT(2) NOT NULL,
work_id VARCHAR(255) COLLATE utf8_czech_ci NOT NULL,
`desc` VARCHAR(255) COLLATE utf8_czech_ci NOT NULL,
date DATETIME NOT NULL,
user INT(11) DEFAULT NULL,
target_item VARCHAR(255) COLLATE utf8_czech_ci DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8
COLLATE = utf8_czech_ci;
CREATE TABLE `settings_video` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`module_id` int(10) unsigned NOT NULL,
`menus` varchar(100) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`folder` varchar(255) NOT NULL,
`mask` varchar(255) NOT NULL,
`format` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;
CREATE TABLE `video_detail` (
`id` varchar(20) NOT NULL,
`lang` tinyint(4) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`alt` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_czech_ci;
CREATE TABLE `image_detail` (
`id` varchar(20) NOT NULL,
`lang` tinyint(4) unsigned NOT NULL,
`name` varchar(255) NOT NULL,
`alt` varchar(255) NOT NULL,
PRIMARY KEY (`id`,`lang`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
CREATE TABLE `comment` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`lang` int(10) unsigned NOT NULL,
`module_id` int(10) unsigned NOT NULL,
`item_id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned DEFAULT NULL,
`name` varchar(100) DEFAULT NULL,
`email` varchar(100) NOT NULL,
`text` text NOT NULL,
`date_inserted` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`hidden` tinyint(2) NOT NULL,
`parent_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `module_id` (`module_id`),
KEY `user_id` (`user_id`),
CONSTRAINT `comment_ibfk_1` FOREIGN KEY (`module_id`) REFERENCES `module` (`id`) ON DELETE NO ACTION,
CONSTRAINT `comment_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
CREATE TABLE `help` (
`id` varchar(30) NOT NULL,
`modul` varchar(100) NOT NULL,
`value` varchar(100) DEFAULT NULL,
`lang` int(10) NOT NULL,
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE `menu_item_x_user` (
`menu_item_id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`lang` tinyint(2) NOT NULL,
PRIMARY KEY (`menu_item_id`,`user_id`,`lang`),
KEY `user_id` (`user_id`),
CONSTRAINT `menu_item_x_user_ibfk_1` FOREIGN KEY (`menu_item_id`) REFERENCES `menu_item` (`id`),
CONSTRAINT `menu_item_x_user_ibfk_2` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `user_x_supplement` (
`user_id` int(10) unsigned NOT NULL,
`supplement_id` int(10) unsigned NOT NULL,
`lang` tinyint(4) unsigned NOT NULL,
`value` text NOT NULL,
`date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`user_id`,`supplement_id`,`lang`),
KEY `supplement_id` (`supplement_id`),
CONSTRAINT `user_x_supplement_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
CONSTRAINT `user_x_supplement_ibfk_2` FOREIGN KEY (`supplement_id`) REFERENCES `supplement` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
CREATE TABLE `orders` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`lang` tinyint(2) NOT NULL,
`lang_second` tinyint(4) DEFAULT NULL,
`user_id` int(10) unsigned DEFAULT NULL,
`second_address_id` int(10) unsigned DEFAULT NULL,
`transport_id` int(10) unsigned NOT NULL,
`payment_id` int(10) unsigned NOT NULL,
`state_id` int(10) unsigned NOT NULL,
`vo` tinyint(2) NOT NULL,
`discount` int(11) NOT NULL,
`user_name` varchar(255) NOT NULL,
`user_address` varchar(255) NOT NULL,
`user_city` varchar(255) NOT NULL,
`user_zip` varchar(255) NOT NULL,
`user_country` tinyint(2) NOT NULL DEFAULT 1,
`user_email` varchar(255) NOT NULL,
`user_phone` varchar(255) NOT NULL,
`firm_name` varchar(255) DEFAULT NULL,
`firm_id_number` varchar(255) DEFAULT NULL,
`firm_vat_number` varchar(255) DEFAULT NULL,
`newsletter` tinyint(4) DEFAULT NULL,
`gateway_id` float DEFAULT NULL,
`gateway_status` varchar(20) DEFAULT NULL,
`note` text DEFAULT NULL,
`time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`pohoda_exported` tinyint(2) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `prefix_order_user_id_foreign` (`user_id`),
KEY `prefix_order_second_address_id_foreign` (`second_address_id`),
KEY `prefix_order_transport_id_foreign` (`transport_id`),
KEY `prefix_order_payment_id_foreign` (`payment_id`),
KEY `prefix_order_state_id_foreign` (`state_id`),
KEY `prefix_order_user_name_index` (`user_name`),
KEY `prefix_order_user_city_index` (`user_city`),
KEY `prefix_order_user_zip_index` (`user_zip`),
KEY `prefix_order_user_email_index` (`user_email`),
CONSTRAINT `prefix_order_payment_id_foreign` FOREIGN KEY (`payment_id`) REFERENCES `settings_payment` (`id`),
CONSTRAINT `prefix_order_second_address_id_foreign` FOREIGN KEY (`second_address_id`) REFERENCES `order_second_address` (`id`),
CONSTRAINT `prefix_order_state_id_foreign` FOREIGN KEY (`state_id`) REFERENCES `order_state` (`id`),
CONSTRAINT `prefix_order_transport_id_foreign` FOREIGN KEY (`transport_id`) REFERENCES `settings_transport` (`id`),
CONSTRAINT `prefix_order_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
CREATE TABLE product_supplier(
id INT(10) UNSIGNED NOT NULL,
lang TINYINT(2) NOT NULL,
hidden TINYINT(2) NOT NULL,
name VARCHAR(255) COLLATE utf8_czech_ci NOT NULL,
position INT(11) NOT NULL,
note TEXT COLLATE utf8_czech_ci NOT NULL,
menu_item_id INT(11) DEFAULT NULL,
PRIMARY KEY (id, lang),
KEY prefix_product_supplier_name_index (name)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8
COLLATE = utf8_czech_ci;
CREATE TABLE product_supplier_x_supplement(
supplier_id INT(10) UNSIGNED NOT NULL,
supplement_id INT(10) UNSIGNED NOT NULL,
lang TINYINT(2) NOT NULL,
value TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
date TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (supplier_id, supplement_id, lang),
KEY prefix_supplier_x_supply_supply_id_foreign (supplement_id),
CONSTRAINT prefix_supplier_x_supply_supplier_id_foreign FOREIGN KEY (supplier_id) REFERENCES product_supplier (id),
CONSTRAINT prefix_supplier_x_supply_supply_id_foreign FOREIGN KEY (supplement_id) REFERENCES supplement (id)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8
COLLATE = utf8_czech_ci;
Pročištění
DELETE FROM menu_item_x_supplement WHERE value = '';