= Alert::widget() ?>
diff --git a/backend/views/layouts/main-login.php b/backend/views/layouts/main-login.php
index c39c79e..f853f60 100644
--- a/backend/views/layouts/main-login.php
+++ b/backend/views/layouts/main-login.php
@@ -1,5 +1,5 @@
= Html::csrfMetaTags() ?>
+ = \core\widgets\FaviconWidget::widget() ?>
head() ?>
diff --git a/backend/views/layouts/main.php b/backend/views/layouts/main.php
index 550a3b9..8731723 100644
--- a/backend/views/layouts/main.php
+++ b/backend/views/layouts/main.php
@@ -1,21 +1,21 @@
controller->action->id === 'login') {
-/**
- * Do not use this code in your template. Remove it.
- * Instead, use the code $this->layout = '//main-login'; in your controller.
- */
+if (Yii::$app->controller->action->id === 'login') {
+ /**
+ * Do not use this code in your template. Remove it.
+ * Instead, use the code $this->layout = '//main-login'; in your controller.
+ */
echo $this->render(
'main-login',
['content' => $content]
);
} else {
-
if (class_exists('backend\assets\AppAsset')) {
backend\assets\AppAsset::register($this);
} else {
@@ -23,7 +23,7 @@ if (Yii::$app->controller->action->id === 'login') {
}
dmstr\web\AdminLteAsset::register($this);
- \backend\assets\AdminLteSkinAsset::register($this);
+ \backend\assets\AdminLteSkinAsset::register($this);
$directoryAsset = Yii::$app->assetManager->getPublishedUrl('@vendor/almasaeed2010/adminlte/dist');
?>
beginPage() ?>
@@ -34,6 +34,7 @@ if (Yii::$app->controller->action->id === 'login') {
+ = \core\widgets\FaviconWidget::widget() ?>
head() ?>
diff --git a/backend/views/settings/list/create.php b/backend/views/settings/list/create.php
index c53fc7f..6b24b0e 100644
--- a/backend/views/settings/list/create.php
+++ b/backend/views/settings/list/create.php
@@ -7,18 +7,18 @@ use core\forms\SettingsForm;
* @var SettingsForm $model
*/
-$this->title = Yii::t('main','Create Setting');
+$this->title = Yii::t('main', 'Create Setting');
$this->params['breadcrumbs'][] = ['label' => Yii::t('main', 'Settings'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
- =
- $this->render(
- '_form',
- [
- 'model' => $model,
- ]
- ) ?>
+ =
+ $this->render(
+ '_form',
+ [
+ 'model' => $model,
+ ]
+ ) ?>
\ No newline at end of file
diff --git a/backend/views/settings/list/favicon.php b/backend/views/settings/list/favicon.php
new file mode 100644
index 0000000..0bdf836
--- /dev/null
+++ b/backend/views/settings/list/favicon.php
@@ -0,0 +1,34 @@
+title = Yii::t('main', 'Set Favicon');
+$this->params['breadcrumbs'][] = ['label' => Yii::t('main', 'Settings'), 'url' => ['index']];
+$this->params['breadcrumbs'][] = $this->title;
+?>
+
\ No newline at end of file
diff --git a/backend/views/settings/list/index.php b/backend/views/settings/list/index.php
index 386e536..1427eb0 100644
--- a/backend/views/settings/list/index.php
+++ b/backend/views/settings/list/index.php
@@ -26,6 +26,13 @@ $this->params['breadcrumbs'][] = $this->title;
['create'],
['class' => 'btn btn-success']
) ?>
+
+ =
+ Html::a(
+ Yii::t('main', 'Change Favicon'),
+ ['favicon'],
+ ['class' => 'btn btn-default']
+ ) ?>
diff --git a/core/components/TestForm.php b/core/components/TestForm.php
deleted file mode 100644
index 63b04de..0000000
--- a/core/components/TestForm.php
+++ /dev/null
@@ -1,39 +0,0 @@
- 50],
- ['content', 'string'],
- ['number', 'integer'],
- ]
- );
- }
-
- public function attributeLabels() {
- return array_merge(
- parent::attributeLabels(),
- [
- 'name' => \Yii::t('main', 'Name'),
- 'content' => \Yii::t('main', 'Key'),
- 'number' => \Yii::t('main', 'Value'),
- ]
- );
- }
-
-}
\ No newline at end of file
diff --git a/core/components/favicon/FaviconGenerator.php b/core/components/favicon/FaviconGenerator.php
new file mode 100644
index 0000000..89e8c80
--- /dev/null
+++ b/core/components/favicon/FaviconGenerator.php
@@ -0,0 +1,134 @@
+originPath = Yii::getAlias('@staticRoot') . '/images/origin/favicon';
+ $this->cachePath = Yii::getAlias('@staticRoot') . '/images/cache/favicon';
+ }
+
+ public function generateIcons()
+ {
+ if (!file_exists($this->originPath)) {
+ mkdir($this->originPath, 0777, true);
+ }
+
+ if (!file_exists($this->cachePath)) {
+ mkdir($this->cachePath, 0777, true);
+ }
+
+ if (file_exists($this->originPath . '/favicon.png')) {
+ $this->generateFavicons();
+ $this->generateAndroid();
+ $this->generateApple();
+ $this->generateMicrosoft();
+ $this->generateManifestJson();
+ $this->generateBrowserConfigXml();
+ }
+ }
+
+ protected function generateFavicons()
+ {
+ foreach ([16, 32, 96, 194] as $s) {
+ $filename = sprintf('favicon-%sx%s.png', $s, $s);
+
+ Image::thumbnail($this->originPath . '/favicon.png', $s, $s)
+ ->save($this->cachePath . '/' . $filename);
+ }
+ }
+
+ protected function generateAndroid()
+ {
+ foreach ([36, 48, 72, 96, 144, 192] as $s) {
+ $filename = sprintf('android-chrome-%sx%s.png', $s, $s);
+
+ Image::thumbnail($this->originPath . '/favicon.png', $s, $s)
+ ->save($this->cachePath . '/' . $filename);
+ }
+ }
+
+ protected function generateApple()
+ {
+ foreach ([57, 60, 72, 76, 114, 120, 144, 152, 180] as $s) {
+ $filename = sprintf('apple-touch-icon-%sx%s.png', $s, $s);
+
+ Image::thumbnail($this->originPath . '/favicon.png', $s, $s)
+ ->save($this->cachePath . '/' . $filename);
+
+ if ($s == 180) {
+ $filename = sprintf('apple-touch-icon.png', $s, $s);
+
+ Image::thumbnail($this->originPath . '/favicon.png', $s, $s)
+ ->save($this->cachePath . '/' . $filename);
+ }
+ }
+ }
+
+ protected function generateMicrosoft()
+ {
+ foreach ([70, 150, 270, 310] as $s) {
+ $filename = sprintf('mstile-%sx%s.png', $s, $s);
+
+ Image::thumbnail($this->originPath . '/favicon.png', $s, $s)
+ ->save($this->cachePath . '/' . $filename);
+ }
+ }
+
+ protected function generateManifestJson()
+ {
+ $cacheUrl = Yii::getAlias('@static') . '/images/cache';
+
+ // frontend
+ file_put_contents(
+ Yii::getAlias('@frontend/web') . '/' . 'manifest.json',
+ (new View())->render('@core/components/favicon/manifest.php', [
+ 'appName' => isset(Yii::$app->params['settings']['site']['name']) ? Yii::$app->params['settings']['site']['name'] : Yii::$app->name,
+ 'iconPath' => $cacheUrl . '/favicon'
+ ])
+ );
+
+ // backend
+ file_put_contents(
+ Yii::getAlias('@backend/web') . '/' . 'manifest.json',
+ (new View())->render('@core/components/favicon/manifest.php', [
+ 'appName' => isset(Yii::$app->params['settings']['site']['name']) ? Yii::$app->params['settings']['site']['name'] : Yii::$app->name,
+ 'iconPath' => $cacheUrl . '/favicon'
+ ])
+ );
+ }
+
+ protected function generateBrowserConfigXml()
+ {
+ $cacheUrl = Yii::getAlias('@static') . '/images/cache';
+
+ // frontend
+ file_put_contents(
+ Yii::getAlias('@frontend/web') . '/' . 'browserconfig.xml',
+ (new View())->render('@core/components/favicon/browserconfig.php', [
+ 'iconPath' => $cacheUrl . '/favicon'
+ ])
+ );
+
+ // backend
+ file_put_contents(
+ Yii::getAlias('@backend/web') . '/' . 'browserconfig.xml',
+ (new View())->render('@core/components/favicon/browserconfig.php', [
+ 'iconPath' => $cacheUrl . '/favicon'
+ ])
+ );
+ }
+}
diff --git a/core/components/favicon/browserconfig.php b/core/components/favicon/browserconfig.php
new file mode 100644
index 0000000..a0d8d59
--- /dev/null
+++ b/core/components/favicon/browserconfig.php
@@ -0,0 +1,19 @@
+
+= '' ?>
+
+
+
+
+
+
+
+
+ #ffffff
+
+
+
\ No newline at end of file
diff --git a/core/components/favicon/manifest.php b/core/components/favicon/manifest.php
new file mode 100644
index 0000000..e8ca5e3
--- /dev/null
+++ b/core/components/favicon/manifest.php
@@ -0,0 +1,48 @@
+
+{
+ "name": "= $appName ?>",
+ "icons": [
+ {
+ "src": "= $iconPath ?>/android-chrome-36x36.png",
+ "sizes": "36x36",
+ "type": "image\/png",
+ "density": "0.75"
+ },
+ {
+ "src": "= $iconPath ?>/android-chrome-48x48.png",
+ "sizes": "48x48",
+ "type": "image\/png",
+ "density": "1.0"
+ },
+ {
+ "src": "= $iconPath ?>/android-chrome-72x72.png",
+ "sizes": "72x72",
+ "type": "image\/png",
+ "density": "1.5"
+ },
+ {
+ "src": "= $iconPath ?>/android-chrome-96x96.png",
+ "sizes": "96x96",
+ "type": "image\/png",
+ "density": "2.0"
+ },
+ {
+ "src": "= $iconPath ?>/android-chrome-144x144.png",
+ "sizes": "144x144",
+ "type": "image\/png",
+ "density": "3.0"
+ },
+ {
+ "src": "= $iconPath ?>/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image\/png",
+ "density": "4.0"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/core/forms/FaviconForm.php b/core/forms/FaviconForm.php
new file mode 100644
index 0000000..abcd27c
--- /dev/null
+++ b/core/forms/FaviconForm.php
@@ -0,0 +1,37 @@
+ 'png', 'minWidth' => 200, 'minHeight' => 200],
+ ];
+ }
+
+ public function attributeLabels()
+ {
+ return [
+ 'image' => Yii::t('main', 'Image'),
+ ];
+ }
+
+ public function attributeHints()
+ {
+ return [
+ 'image' => Yii::t('main', 'Only png files allowed. Minimum size: 200x200. Form: square'),
+ ];
+ }
+}
diff --git a/core/services/SettingsService.php b/core/services/SettingsService.php
index 9934479..859db80 100644
--- a/core/services/SettingsService.php
+++ b/core/services/SettingsService.php
@@ -2,6 +2,7 @@
namespace core\services;
+use core\components\favicon\FaviconGenerator;
use core\entities\Settings;
use core\forms\SettingsForm;
use core\repositories\SettingsRepository;
@@ -47,4 +48,10 @@ class SettingsService
$settings = $this->_repository->get($section, $key);
$this->_repository->remove($settings);
}
+
+ public function newFavicon(): void
+ {
+ $fg = new FaviconGenerator();
+ $fg->generateIcons();
+ }
}
diff --git a/core/widgets/FaviconWidget.php b/core/widgets/FaviconWidget.php
new file mode 100644
index 0000000..b41a6ed
--- /dev/null
+++ b/core/widgets/FaviconWidget.php
@@ -0,0 +1,77 @@
+get('view');
+
+ $this->iconsPath = Yii::getAlias('@staticRoot') . '/images/cache/favicon';
+ $this->iconsUrl = Yii::getAlias('@static') . '/images/cache/favicon';
+
+ foreach ([16, 32, 96, 194] as $s) {
+ $filename = sprintf('favicon-%sx%s.png', $s, $s);
+ $filepath = $this->iconsPath . '/' . $filename;
+ if (!empty($filepath) && file_exists($filepath)) {
+ $View->registerLinkTag([
+ 'rel' => 'icon',
+ 'type' => 'image/png',
+ 'href' => Url::to(sprintf('%s/%s', $this->iconsUrl, $filename)),
+ 'sizes' => sprintf('%sx%s', $s, $s),
+ ], basename($filepath));
+ }
+ }
+
+ $filepath = $this->iconsPath . '/' . 'android-chrome-192x192.png';
+ if (!empty($filepath) && file_exists($filepath)) {
+ $View->registerLinkTag([
+ 'rel' => 'icon',
+ 'type' => 'image/png',
+ 'href' => Url::to(sprintf('%s/android-chrome-192x192.png', $this->iconsUrl)),
+ 'sizes' => sprintf('%sx%s', 192, 192),
+ ], basename($filepath));
+ }
+
+ foreach ([57, 60, 72, 76, 114, 120, 144, 152, 180] as $s) {
+ $filename = sprintf('apple-touch-icon-%sx%s.png', $s, $s);
+ $filepath = $this->iconsPath . '/' . $filename;
+ if (!empty($filepath) && file_exists($filepath)) {
+ $View->registerLinkTag([
+ 'rel' => 'apple-touch-icon',
+ 'type' => 'image/png',
+ 'href' => Url::to(sprintf('%s/%s', $this->iconsUrl, $filename)),
+ 'sizes' => sprintf('%sx%s', $s, $s),
+ ], basename($filepath));
+ }
+ }
+ $filepath = $this->iconsPath . 'mstile-144x144.png';
+ if (!empty($filepath) && file_exists($filepath)) {
+ $View->registerMetaTag([
+ 'name' => 'msapplication-TileImage',
+ 'content' => Url::to(sprintf('%s/mstile-144x144.png', $this->iconsUrl)),
+ ], basename($filepath));
+ }
+
+ $filepath = Yii::getAlias('@webroot') . '/' . 'manifest.json';
+ if (!empty($filepath) && file_exists($filepath)) {
+ $View->registerLinkTag([
+ 'rel' => 'manifest',
+ 'href' => Url::to(sprintf('%s/manifest.json', Yii::getAlias('@web'))),
+ ], basename($filepath));
+ }
+ }
+}
diff --git a/frontend/web/themes/start/layouts/main.php b/frontend/web/themes/start/layouts/main.php
index 5bbf7de..7a4d746 100644
--- a/frontend/web/themes/start/layouts/main.php
+++ b/frontend/web/themes/start/layouts/main.php
@@ -9,110 +9,113 @@ use yii\helpers\Html;
rmrevin\yii\fontawesome\cdn\AssetBundle::register($this);
?>
beginPage() ?>
-
-
-
-
-
-
-
-
-
-
= Html::encode($this->title) ?>
- = Html::csrfMetaTags() ?>
- head() ?>
-
-
-
-beginBody() ?>
-
-
-
-
-= $content ?>
-
-
-
-
-
-endBody() ?>
-
-
-
+
+
+
+
+
+
+
+
+
+
= Html::encode($this->title) ?>
+ = \core\widgets\FaviconWidget::widget() ?>
+ = Html::csrfMetaTags() ?>
+ head() ?>
+
+
+
+ beginBody() ?>
+
+
+
+
+ = $content ?>
+
+
+
+
+
+ endBody() ?>
+
+
+
endPage() ?>
\ No newline at end of file