Merge branch 'master' into master

This commit is contained in:
Dave 2018-12-03 21:31:15 +01:00 committed by GitHub
commit 2d90b91027
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
146 changed files with 2167 additions and 1448 deletions

5
.gitignore vendored
View File

@ -14,3 +14,8 @@ bl-themes/editorial
bl-themes/mediumish
bl-themes/clean-blog
bl-themes/grayscale
bl-themes/massively
bl-themes/hyperspace
bl-themes/striped
bl-themes/log
bl-themes/micro

View File

@ -5,6 +5,8 @@
// ============================================================================
function updateBludit() {
global $site;
global $syslog;
// New installation
if ($site->currentBuild()==0) {
$site->set(array('currentBuild'=>BLUDIT_BUILD));
@ -36,6 +38,12 @@ function updateBludit() {
// Set the current build number
$site->set(array('currentBuild'=>BLUDIT_BUILD));
Log::set('UPDATE SYSTEM - Finished.');
// Add to syslog
$syslog->add(array(
'dictionaryKey'=>'system-updated',
'notes'=>'Bludit v'.BLUDIT_VERSION
));
}
}

View File

@ -19,21 +19,25 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
unset($_POST['role']);
}
if (isset($_POST['deleteUserAndDeleteContent'])) {
if (isset($_POST['deleteUserAndDeleteContent']) && ($login->role()==='admin')) {
$_POST['deleteContent'] = true;
deleteUser($_POST);
} elseif (isset($_POST['deleteUserAndKeepContent'])) {
} elseif (isset($_POST['deleteUserAndKeepContent']) && ($login->role()==='admin')) {
$_POST['deleteContent'] = false;
deleteUser($_POST);
} elseif (isset($_POST['disableUser'])) {
} elseif (isset($_POST['disableUser']) && ($login->role()==='admin')) {
disableUser(array('username'=>$_POST['username']));
} else {
editUser($_POST);
}
Alert::set($L->g('The changes have been saved'));
if ($login->role()==='admin') {
Redirect::page('users');
}
Redirect::page('edit-user/'.$login->username());
}
// ============================================================================
// Main after POST

View File

@ -21,20 +21,10 @@ checkRole(array('admin'));
// ============================================================================
// Main after POST
// ============================================================================
$themeDirname = $layout['parameters'];
$themeDirectory = $layout['parameters'];
if (Sanitize::pathFile(PATH_THEMES.$themeDirname)) {
$site->set(array('theme'=>$themeDirname));
// Add to syslog
$syslog->add(array(
'dictionaryKey'=>'new-theme-configured',
'notes'=>$themeDirname
));
// Create an alert
Alert::set( $L->g('The changes have been saved') );
}
// Activate theme
activateTheme($themeDirectory);
// Redirect
Redirect::page('themes');

View File

@ -19,7 +19,7 @@ checkRole(array('admin'));
// ============================================================================
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (createCategory($_POST['category'])) {
if (createCategory($_POST)) {
Redirect::page('categories');
}
}

View File

@ -20,8 +20,11 @@ if ($_SERVER['REQUEST_METHOD'] == 'POST') {
'newPassword'=>$_POST['newPassword'],
'confirmPassword'=>$_POST['confirmPassword']
))) {
if ($login->role()==='admin') {
Redirect::page('users');
}
Redirect::page('edit-user/'.$login->username());
}
}
// ============================================================================

View File

@ -81,9 +81,22 @@ code {
cursor: pointer;
}
.modal-body {
padding: 2rem;
}
.modal-footer {
background-color: rgb(247, 247, 247);
}
.modal-dialog .btn-link {
color: #000;
}
/*
LOGIN
*/
body.login {
background: rgb(255,255,255);
background: linear-gradient(0deg, rgba(255,255,255,1) 0%, rgba(250,250,250,1) 53%);
@ -140,7 +153,6 @@ body.login {
/* Create a dashed line with a pattern */
}
/* This selector overrides the points style on line charts. Points on line charts are actually just very short strokes. This allows you to customize even the point size in CSS */
.ct-series-a .ct-point {
/* Colour of your points */
stroke: #4a90e2;
@ -151,6 +163,7 @@ body.login {
/*
ALERT
*/
#alert {
display: none;
position: fixed;
@ -165,17 +178,20 @@ body.login {
.alert-success {
background-color: #4586d4;
border-left: 6px solid #abd1ff !important;
color: #ffffff;
}
.alert-danger {
background-color: #d44545;
border-left: 6px solid #ff9c9c !important;
color: #ffffff;
}
/*
SIDEBAR
*/
div.sidebar .nav-item a {
padding-left:0;
padding-right:0;
@ -204,6 +220,7 @@ div.sidebar .nav-item span.oi {
/*
PLUGINS
*/
.plugin-form label {
display: block;
margin-top: 1rem !important;
@ -256,3 +273,70 @@ td.child {
line-height: 1.5em;
}
#jseditorSidebar {
display: none;
height: calc(100% - 45px);
width: 50%;
max-width: 350px;
position: absolute;
z-index: 50;
top: 45px;
right: 15px;
background-color: #fff;
overflow-x: hidden;
transition: 0.5s;
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
border-top: 1px solid #ccc;
}
@media (max-width: 575.98px) {
#jseditorSidebar {
width: 100%;
max-width: 100%;
right: 0;
}
#jseditorToolbarRight button {
font-size: 0px !important;
}
#jseditorToolbarRight button span {
font-size: 16px !important;
}
}
#jseditorSidebar nav {
background: #f3f3f3;
}
#jseditorSidebar nav a {
color: #000;
}
#jseditorSidebar .nav-tabs .nav-link {
border: none;
}
#jseditorSidebar .nav-link.active {
background: none;
border: none;
border-bottom: 3px solid #ccc;
}
#jsshadow {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(255,255,255,0.7);
z-index: 10;
display: none;
}
img.profilePicture {
width: 30px;
border-radius: 30px;
border: 1px solid #ccc;
}

View File

@ -17,10 +17,13 @@
</li>
<?php if (checkRole(array('editor'),false)): ?>
<li class="nav-item">
<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'content' ?>"><span class="oi oi-layers"></span><?php $L->p('Content') ?></a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo HTML_PATH_ADMIN_ROOT.'edit-user/'.$login->username() ?>"><span class="oi oi-person"></span><?php $L->p('Profile') ?></a>
</li>
<?php endif; ?>
<?php if (checkRole(array('admin'),false)): ?>

View File

@ -51,6 +51,9 @@
echo '</script>'.PHP_EOL;
?>
<!-- Overlay background -->
<div id="jsshadow"></div>
<!-- Alert -->
<?php include('html/alert.php'); ?>

View File

@ -24,8 +24,8 @@ return <<<EOF
<p>$modalText</p>
</div>
<div class="modal-footer">
<button type="button" class="$buttonSecondaryClass btn btn-secondary" data-dismiss="modal">$buttonSecondary</button>
<button type="button" class="$buttonPrimaryClass btn btn-primary">$buttonPrimary</button>
<button type="button" class="btn $buttonSecondaryClass" data-dismiss="modal">$buttonSecondary</button>
<button type="button" class="btn $buttonPrimaryClass">$buttonPrimary</button>
</div>
</div>
</div>
@ -96,37 +96,49 @@ EOF;
{
$title = $args['title'];
return <<<EOF
<h4 class="mt-4 mb-3 font-weight-normal">$title</h4>
<h6 class="mt-4 mb-2 pb-2 border-bottom text-uppercase">$title</h6>
EOF;
}
public static function formInputTextBlock($args)
{
$id = 'js'.$args['name'];
$name = $args['name'];
$disabled = empty($args['disabled'])?'':'disabled';
$placeholder = isset($args['placeholder'])?$args['placeholder']:'';
$value = isset($args['value'])?$args['value']:'';
$id = 'js'.$name;
if (isset($args['id'])) {
$id = $args['id'];
}
$tip = '';
if (isset($args['tip'])) {
$tip = '<small class="form-text text-muted">'.$args['tip'].'</small>';
}
$label = '';
if (isset($args['label'])) {
$label = '<label class="mt-4 mb-2 pb-2 border-bottom text-uppercase w-100" for="'.$id.'">'.$args['label'].'</label>';
}
$class = 'form-control';
if (isset($args['class'])) {
$class = $class.' '.$args['class'];
}
$html = '<div class="form-group">';
if (isset($args['label'])) {
$html .= '<label for="'.$id.'">'.$args['label'].'</label>';
$type = 'text';
if (isset($args['type'])) {
$type = $args['type'];
}
$html .= '<input type="text" value="'.$args['value'].'" class="'.$class.'" id="'.$id.'" name="'.$args['name'].'" placeholder="'.$args['placeholder'].'">';
if (isset($args['tip'])) {
$html .= '<small class="form-text text-muted">'.$args['tip'].'</small>';
}
$html .= '</div>';
return $html;
return <<<EOF
<div class="form-group m-0">
$label
<input type="text" value="$value" class="$class" id="$id" name="$name" placeholder="$placeholder" $disabled>
$tip
</div>
EOF;
}
public static function formInputFile($args)
@ -168,7 +180,7 @@ EOF;
}
$html .= '<div class="col-sm-10">';
$html .= '<textarea class="'.$class.'" id="'.$id.'" name="'.$args['name'].'" rows="'.$args['rows'].'" placeholder="'.$args['placeholder'].'"></textarea>';
$html .= '<textarea class="'.$class.'" id="'.$id.'" name="'.$args['name'].'" rows="'.$args['rows'].'" placeholder="'.$args['placeholder'].'">'.$args['value'].'</textarea>';
if (isset($args['tip'])) {
$html .= '<small class="form-text text-muted">'.$args['tip'].'</small>';
}
@ -190,9 +202,9 @@ EOF;
$class = $class.' '.$args['class'];
}
$html = '<div class="form-group">';
$html = '<div class="form-group m-0">';
if (!empty($args['label'])) {
$html .= '<label for="'.$id.'">'.$args['label'].'</label>';
$html .= '<label class="mt-4 mb-2 pb-2 border-bottom text-uppercase w-100" for="'.$id.'">'.$args['label'].'</label>';
}
$html .= '<textarea class="'.$class.'" id="'.$id.'" name="'.$args['name'].'" rows="'.$args['rows'].'" placeholder="'.$args['placeholder'].'">'.$args['value'].'</textarea>';
@ -204,45 +216,27 @@ EOF;
return $html;
}
public static function formInputGroupText($args)
{
$label = $args['label'];
$labelInside = $args['labelInside'];
$tip = $args['tip'];
$value = $args['value'];
$name = $args['name'];
$id = 'js'.$name;
if (isset($args['id'])) {
$id = $args['id'];
}
$disabled = isset($args['disabled'])?'disabled':'';
return <<<EOF
<div class="form-group">
<label for="$id">$label</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text" id="$id">$labelInside</span>
</div>
<input id="$id" name="$name" value="$value" type="text" class="form-control" $disabled>
</div>
<small class="form-text text-muted">$tip</small>
</div>
EOF;
}
public static function formInputText($args)
{
$label = isset($args['label'])?$args['label']:'';
$placeholder = isset($args['placeholder'])?$args['placeholder']:'';
$tip = isset($args['tip'])?$args['tip']:'&nbsp;';
$value = isset($args['value'])?$args['value']:'';
$name = $args['name'];
$disabled = empty($args['disabled'])?'':'disabled';
$placeholder = isset($args['placeholder'])?$args['placeholder']:'';
$value = isset($args['value'])?$args['value']:'';
$id = 'js'.$name;
if (isset($args['id'])) {
$id = $args['id'];
}
$disabled = empty($args['disabled'])?'':'disabled';
$tip = '';
if (isset($args['tip'])) {
$tip = '<small class="form-text text-muted">'.$args['tip'].'</small>';
}
$label = '';
if (isset($args['label'])) {
$label = '<label for="'.$id.'" class="col-sm-2 col-form-label">'.$args['label'].'</label>';
}
$class = 'form-control';
if (isset($args['class'])) {
@ -256,10 +250,10 @@ EOF;
return <<<EOF
<div class="form-group row">
<label for="$id" class="col-sm-2 col-form-label">$label</label>
$label
<div class="col-sm-10">
<input class="$class" id="$id" name="$name" value="$value" placeholder="$placeholder" type="$type" $disabled>
<small class="form-text text-muted">$tip</small>
$tip
</div>
</div>
EOF;
@ -267,7 +261,6 @@ EOF;
public static function formCheckbox($args)
{
$label = isset($args['label'])?$args['label']:'';
$labelForCheckbox = isset($args['labelForCheckbox'])?$args['labelForCheckbox']:'';
$placeholder = isset($args['placeholder'])?$args['placeholder']:'';
$tip = isset($args['tip'])?$args['tip']:'&nbsp;';
@ -279,7 +272,7 @@ EOF;
}
$disabled = isset($args['disabled'])?'disabled':'';
$class = 'form-group row';
$class = 'form-group';
if (isset($args['class'])) {
$class = $class.' '.$args['class'];
}
@ -289,19 +282,22 @@ EOF;
$type = $args['type'];
}
$label = '';
if (!empty($args['label'])) {
$label = '<label class="mt-4 mb-2 pb-2 border-bottom text-uppercase w-100">'.$args['label'].'</label>';
}
$checked = $args['checked']?'checked':'';
return <<<EOF
<div class="$class">
<label for="$id" class="col-sm-2">$label</label>
<div class="col-sm-10">
$label
<div class="form-check">
<input name="$name" class="form-check-input" type="checkbox" id="$id" $checked>
<label class="form-check-label" for="$id">$labelForCheckbox</label>
<small class="form-text text-muted">$tip</small>
</div>
</div>
</div>
EOF;
}
@ -353,7 +349,7 @@ EOF;
$html = '<div class="form-group m-0">';
if (!empty($args['label'])) {
$html .= '<label for="'.$id.'">'.$args['label'].'</label>';
$html .= '<label class="mt-4 mb-2 pb-2 border-bottom text-uppercase w-100" for="'.$id.'">'.$args['label'].'</label>';
}
$html .= '<select id="'.$id.'" name="'.$args['name'].'" class="'.$class.'">';

View File

@ -1,9 +1,19 @@
<?php defined('BLUDIT') or die('Bludit CMS.');
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
echo Bootstrap::pageTitle(array('title'=>$plugin->name(), 'icon'=>'wrench'));
<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'plugin-form')); ?>
echo Bootstrap::formOpen(array('class'=>'plugin-form'));
<div class="align-middle">
<?php if ($plugin->formButtons()): ?>
<div class="float-right mt-1">
<button type="submit" class="btn btn-primary btn-sm" name="save"><?php $L->p('Save') ?></button>
<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'plugins' ?>" role="button"><?php $L->p('Cancel') ?></a>
</div>
<?php endif; ?>
<?php echo Bootstrap::pageTitle(array('title'=>$plugin->name(), 'icon'=>'cog')); ?>
</div>
<?php
// Token CSRF
echo Bootstrap::formInputHidden(array(
'name'=>'tokenCSRF',
'value'=>$security->getTokenCSRF()
@ -11,14 +21,6 @@ echo Bootstrap::formOpen(array('class'=>'plugin-form'));
// Print the plugin form
echo $plugin->form();
?>
if ($plugin->formButtons()) {
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'plugins" role="button">'.$L->g('Cancel').'</a>
</div>
';
}
echo Bootstrap::formClose();
<?php echo Bootstrap::formClose(); ?>

View File

@ -85,9 +85,9 @@ function table($type) {
$friendlyURL = Text::isEmpty($url->filters('page')) ? '/'.$page->key() : '/'.$url->filters('page').'/'.$page->key();
echo '<td class="d-none d-lg-table-cell"><a target="_blank" href="'.$page->permalink().'">'.$friendlyURL.'</a></td>';
echo '<td class="pt-3 text-center d-none d-sm-table-cell">'.PHP_EOL;
echo '<a class="btn btn-secondary btn-sm mb-1" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$page->key().'"><span class="oi oi-pencil"></span> '.$L->g('Edit').'</a>'.PHP_EOL;
echo '<button type="button" class="btn btn-danger btn-sm deletePageButton mb-1" data-toggle="modal" data-target="#jsdeletePageModal" data-key="'.$page->key().'"><span class="oi oi-trash"></span> '.$L->g('Delete').'</button>'.PHP_EOL;
echo '<td class="pt-3 text-center d-none d-sm-table-cell w-25">'.PHP_EOL;
echo '<a class="btn btn-outline-secondary btn-sm mb-1" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$page->key().'"><span class="oi oi-pencil"></span> '.$L->g('Edit').'</a>'.PHP_EOL;
echo '<button type="button" class="btn btn-outline-danger btn-sm deletePageButton mb-1" data-toggle="modal" data-target="#jsdeletePageModal" data-key="'.$page->key().'"><span class="oi oi-trash"></span> '.$L->g('Delete').'</button>'.PHP_EOL;
echo '</td>';
echo '</tr>';
@ -109,9 +109,9 @@ function table($type) {
$friendlyURL = Text::isEmpty($url->filters('page')) ? '/'.$child->key() : '/'.$url->filters('page').'/'.$child->key();
echo '<td><a target="_blank" href="'.$child->permalink().'">'.$friendlyURL.'</a></td>';
echo '<td class="pt-3 text-center d-none d-sm-table-cell">'.PHP_EOL;
echo '<a class="btn btn-secondary btn-sm mb-1" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$child->key().'"><span class="oi oi-pencil"></span> '.$L->g('Edit').'</a>'.PHP_EOL;
echo '<button type="button" class="btn btn-danger btn-sm deletePageButton mb-1" data-toggle="modal" data-target="#jsdeletePageModal" data-key="'.$child->key().'"><span class="oi oi-trash"></span> '.$L->g('Delete').'</button>'.PHP_EOL;
echo '<td class="pt-3 text-center d-none d-sm-table-cell w-25">'.PHP_EOL;
echo '<a class="btn btn-outline-secondary btn-sm mb-1" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$child->key().'"><span class="oi oi-pencil"></span> '.$L->g('Edit').'</a>'.PHP_EOL;
echo '<button type="button" class="btn btn-outline-danger btn-sm deletePageButton mb-1" data-toggle="modal" data-target="#jsdeletePageModal" data-key="'.$child->key().'"><span class="oi oi-trash"></span> '.$L->g('Delete').'</button>'.PHP_EOL;
echo '</td>';
echo '</tr>';
@ -141,9 +141,9 @@ function table($type) {
$friendlyURL = Text::isEmpty($url->filters('page')) ? '/'.$page->key() : '/'.$url->filters('page').'/'.$page->key();
echo '<td class="pt-3 d-none d-lg-table-cell"><a target="_blank" href="'.$page->permalink().'">'.$friendlyURL.'</a></td>';
echo '<td class="pt-3 text-center d-none d-sm-table-cell">'.PHP_EOL;
echo '<a class="btn btn-secondary btn-sm mb-1" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$page->key().'"><span class="oi oi-pencil"></span> '.$L->g('Edit').'</a>'.PHP_EOL;
echo '<button type="button" class="btn btn-danger btn-sm deletePageButton mb-1" data-toggle="modal" data-target="#jsdeletePageModal" data-key="'.$page->key().'"><span class="oi oi-trash"></span> '.$L->g('Delete').'</button>'.PHP_EOL;
echo '<td class="pt-3 text-center d-none d-sm-table-cell w-25">'.PHP_EOL;
echo '<a class="btn btn-outline-secondary btn-sm mb-1" href="'.HTML_PATH_ADMIN_ROOT.'edit-content/'.$page->key().'"><span class="oi oi-pencil"></span> '.$L->g('Edit').'</a>'.PHP_EOL;
echo '<button type="button" class="btn btn-outline-danger btn-sm deletePageButton mb-1" data-toggle="modal" data-target="#jsdeletePageModal" data-key="'.$page->key().'"><span class="oi oi-trash"></span> '.$L->g('Delete').'</button>'.PHP_EOL;
echo '</td>';
echo '</tr>';
@ -236,14 +236,15 @@ function table($type) {
</div>
<!-- Modal for delete page -->
<?php echo Bootstrap::modal(array(
'modalId'=>'jsdeletePageModal',
<?php
echo Bootstrap::modal(array(
'buttonPrimary'=>$L->g('Delete'),
'buttonPrimaryClass'=>'btn-danger deletePageModalAcceptButton',
'buttonSecondary'=>$L->g('Cancel'),
'buttonSecondaryClass'=>'btn-link',
'modalTitle'=>$L->g('Delete content'),
'modalText'=>$L->g('Are you sure you want to delete this page'),
'buttonPrimary'=>$L->g('Delete'),
'buttonPrimaryClass'=>'deletePageModalAcceptButton',
'buttonSecondary'=>$L->g('Cancel'),
'buttonSecondaryClass'=>''
'modalId'=>'jsdeletePageModal'
));
?>
<script>

View File

@ -1,9 +1,18 @@
<?php defined('BLUDIT') or die('Bludit CMS.');
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
echo Bootstrap::pageTitle(array('title'=>$L->g('Edit Category'), 'icon'=>'tags'));
<?php echo Bootstrap::formOpen(array('id'=>'jsform')); ?>
echo Bootstrap::formOpen(array('id'=>'jsform'));
<div class="align-middle">
<div class="float-right mt-1">
<button type="submit" class="btn btn-primary btn-sm" name="save"><?php $L->p('Save') ?></button>
<button type="button" class="btn btn-danger btn-sm" data-toggle="modal" data-target="#jsdeleteModal"><?php $L->p('Delete') ?></button>
<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'dashboard' ?>" role="button"><?php $L->p('Cancel') ?></a>
</div>
<?php echo Bootstrap::pageTitle(array('title'=>$L->g('Edit Category'), 'icon'=>'cog')); ?>
</div>
<?php
// Token CSRF
echo Bootstrap::formInputHidden(array(
'name'=>'tokenCSRF',
'value'=>$security->getTokenCSRF()
@ -19,7 +28,7 @@ echo Bootstrap::formOpen(array('id'=>'jsform'));
'value'=>$categoryMap['key']
));
echo Bootstrap::formInputTextBlock(array(
echo Bootstrap::formInputText(array(
'name'=>'name',
'label'=>$L->g('Name'),
'value'=>$categoryMap['name'],
@ -28,7 +37,7 @@ echo Bootstrap::formOpen(array('id'=>'jsform'));
'tip'=>''
));
echo Bootstrap::formTextareaBlock(array(
echo Bootstrap::formTextarea(array(
'name'=>'description',
'label'=>$L->g('Description'),
'value'=>isset($categoryMap['description'])?$categoryMap['description']:'',
@ -38,7 +47,7 @@ echo Bootstrap::formOpen(array('id'=>'jsform'));
'rows'=>3
));
echo Bootstrap::formInputTextBlock(array(
echo Bootstrap::formInputText(array(
'name'=>'template',
'label'=>$L->g('Template'),
'value'=>isset($categoryMap['template'])?$categoryMap['template']:'',
@ -47,24 +56,15 @@ echo Bootstrap::formOpen(array('id'=>'jsform'));
'tip'=>''
));
echo Bootstrap::formInputGroupText(array(
echo Bootstrap::formInputText(array(
'name'=>'newKey',
'label'=>$L->g('Friendly URL'),
'labelInside'=>DOMAIN_CATEGORIES,
'value'=>$categoryMap['key'],
'class'=>'',
'placeholder'=>'',
'tip'=>''
'tip'=>DOMAIN_CATEGORIES.$categoryMap['key']
));
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'categories" role="button">'.$L->g('Cancel').'</a>
<button type="button" class="btn btn-secondary" data-toggle="modal" data-target="#jsdeleteModal">'.$L->g('Delete').'</button>
</div>
';
echo Bootstrap::formClose();
?>
@ -73,9 +73,9 @@ echo Bootstrap::formClose();
<?php
echo Bootstrap::modal(array(
'buttonPrimary'=>$L->g('Delete'),
'buttonPrimaryClass'=>'jsbuttonDeleteAccept',
'buttonPrimaryClass'=>'btn-danger jsbuttonDeleteAccept',
'buttonSecondary'=>$L->g('Cancel'),
'buttonSecondaryClass'=>'',
'buttonSecondaryClass'=>'btn-link',
'modalTitle'=>$L->g('Delete category'),
'modalText'=>$L->g('Are you sure you want to delete this category?'),
'modalId'=>'jsdeleteModal'

View File

@ -53,43 +53,79 @@ echo Bootstrap::formOpen(array(
?>
<!-- TOOLBAR -->
<div>
<div class="btn-group btn-group-sm" role="group" aria-label="Basic example">
<button type="button" class="btn btn-light" id="jsmediaManagerOpenModal" data-toggle="modal" data-target="#jsmediaManagerModal"><?php $L->p('Images') ?></button>
<button type="button" class="btn btn-light" id="jscoverImageOpenModal" data-toggle="modal" data-target="#jscoverImageModal"><?php $L->p('Cover image') ?></button>
<button type="button" class="btn btn-light" id="jscategoryOpenModal" data-toggle="modal" data-target="#jscategoryModal"><?php $L->p('Category') ?><span class="option"></span></button>
<button type="button" class="btn btn-light" id="jsdescriptionOpenModal" data-toggle="modal" data-target="#jsdescriptionModal"><?php $L->p('Description') ?><span class="option"></span></button>
<button type="button" class="btn btn-light" id="jsoptionsOpenModal" data-toggle="modal" data-target="#jsoptionsModal"><?php $L->p('More options') ?></button>
<div id="jseditorToolbar">
<div id="jseditorToolbarRight" class="btn-group btn-group-sm float-right" role="group" aria-label="Toolbar right">
<button type="button" class="btn btn-light" id="jsmediaManagerOpenModal" data-toggle="modal" data-target="#jsmediaManagerModal"><span class="oi oi-image"></span> <?php $L->p('Images') ?></button>
<button type="button" class="btn btn-light" id="jsoptionsSidebar" style="z-index:30"><span class="oi oi-cog"></span> <?php $L->p('Options') ?></button>
</div>
<div class="btn-group btn-group-sm float-right" role="group" aria-label="Basic example">
<button type="button" class="btn btn-primary" id="jsbuttonSave"><?php echo ($page->draft()?$L->g('Publish'):$L->g('Save')) ?></button>
<?php if(!$page->draft()): ?>
<button type="button" class="btn btn-secondary" id="jsbuttonDraft"><?php $L->p('Save as draft') ?></button>
<div id="jseditorToolbarLeft">
<button type="button" class="btn btn-sm btn-primary" id="jsbuttonSave"><?php echo ($page->draft()?$L->g('Publish'):$L->g('Save')) ?></button>
<?php if($page->draft()): ?>
<button type="button" class="btn btn-sm btn-secondary" id="jsbuttonDraft"><?php $L->p('Save as draft') ?></button>
<?php endif; ?>
<?php if (count($page->children())===0): ?>
<button type="button" class="btn btn-danger" id="jsbuttonDelete" data-toggle="modal" data-target="#jsdeletePageModal"><?php $L->p('Delete') ?></button>
<?php if (count($page->children())==0): ?>
<button type="button" class="btn btn-sm btn-danger" id="jsbuttonDelete" data-toggle="modal" data-target="#jsdeletePageModal"><?php $L->p('Delete') ?></button>
<?php endif; ?>
<a href="<?php echo HTML_PATH_ADMIN_ROOT ?>dashboard" class="btn btn-secondary"><?php $L->p('Cancel') ?></a>
</div>
</div>
<!-- Title -->
<div class="form-group mt-1 mb-1">
<input id="jstitle" name="title" type="text" class="form-control form-control-lg rounded-0" value="<?php echo $page->title() ?>" placeholder="<?php $L->p('Enter title') ?>">
<a href="<?php echo HTML_PATH_ADMIN_ROOT ?>dashboard" class="btn btn-sm btn-secondary"><?php $L->p('Cancel') ?></a>
</div>
<!-- Editor -->
<div id="jseditor" class="editable h-100" style=""><?php echo $page->contentRaw(false) ?></div>
<!-- Modal for Cover Image -->
<div id="jscoverImageModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?php $L->p('Cover Image') ?></h5>
<?php if($page->draft()): ?>
<div class="alert alert-warning p-1 mt-1 mb-0"><?php $L->p('the-content-is-saved-as-a-draft-to-publish-it') ?></div>
<?php endif; ?>
</div>
<div class="modal-body">
<script>
$(document).ready(function() {
$("#jsoptionsSidebar").on("click", function() {
$("#jseditorSidebar").toggle();
$("#jsshadow").toggle();
});
$("#jsshadow").on("click", function() {
$("#jseditorSidebar").toggle();
$("#jsshadow").toggle();
});
});
</script>
<!-- SIDEBAR OPTIONS -->
<div id="jseditorSidebar">
<nav>
<div class="nav nav-tabs" id="nav-tab" role="tablist">
<a class="nav-link active show" id="nav-general-tab" data-toggle="tab" href="#nav-general" role="tab" aria-controls="general"><?php $L->p('General') ?></a>
<a class="nav-link" id="nav-advanced-tab" data-toggle="tab" href="#nav-advanced" role="tab" aria-controls="advanced"><?php $L->p('Advanced') ?></a>
<a class="nav-link" id="nav-seo-tab" data-toggle="tab" href="#nav-seo" role="tab" aria-controls="seo"><?php $L->p('SEO') ?></a>
</div>
</nav>
<div class="tab-content pr-3 pl-3 pb-3">
<div id="nav-general" class="tab-pane fade show active" role="tabpanel" aria-labelledby="general-tab">
<?php
// Category
echo Bootstrap::formSelectBlock(array(
'name'=>'category',
'label'=>$L->g('Category'),
'selected'=>$page->categoryKey(),
'class'=>'',
'emptyOption'=>'- '.$L->g('Uncategorized').' -',
'options'=>$categories->getKeyNameArray()
));
// Description
echo Bootstrap::formTextareaBlock(array(
'name'=>'description',
'label'=>$L->g('Description'),
'selected'=>'',
'class'=>'',
'value'=>$page->description(),
'rows'=>3,
'placeholder'=>$L->get('this-field-can-help-describe-the-content')
));
?>
<!-- Cover Image -->
<?php
$coverImage = $page->coverImage(false);
$externalCoverImage = '';
@ -98,39 +134,16 @@ echo Bootstrap::formOpen(array(
$externalCoverImage = $page->coverImage(false);
}
?>
<label class="mt-4 mb-2 pb-2 border-bottom text-uppercase w-100"><?php $L->p('Cover Image') ?></label>
<div>
<img id="jscoverImagePreview" style="width: 350px; height: 200px;" class="mx-auto d-block" alt="Cover image preview" src="<?php echo (empty($coverImage) ? HTML_PATH_ADMIN_THEME_IMG.'default.svg' : $page->coverImage() ) ?>" />
<img id="jscoverImagePreview" class="mx-auto d-block w-100" alt="Cover image preview" src="<?php echo (empty($coverImage) ? HTML_PATH_ADMIN_THEME_IMG.'default.svg' : $page->coverImage() ) ?>" />
</div>
<div class="mt-2 text-center">
<button type="button" id="jsbuttonSelectCoverImage" class="btn btn-primary btn-sm"><?php echo $L->g('Select cover image') ?></button>
<button type="button" id="jsbuttonRemoveCoverImage" class="btn btn-secondary btn-sm"><?php echo $L->g('Remove cover image') ?></button>
</div>
<hr>
<?php
echo Bootstrap::formTitle(array('title'=>$L->g('External Cover Image')));
echo Bootstrap::formInputTextBlock(array(
'name'=>'externalCoverImage',
'placeholder'=>"https://",
'value'=>$externalCoverImage,
'tip'=>$L->g('Set a cover image from external URL, such as a CDN or some server dedicated for images.')
));
?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal"><?php $L->p('Done') ?></button>
</div>
</div>
</div>
<script>
$(document).ready(function() {
$("#jsexternalCoverImage").change(function() {
$("#jscoverImage").val( $(this).val() );
});
$("#jscoverImagePreview").on("click", function() {
openMediaManager();
});
@ -146,121 +159,10 @@ echo Bootstrap::formOpen(array(
});
</script>
</div>
<!-- Modal for Categories -->
<div id="jscategoryModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?php $L->p('Category') ?></h5>
</div>
<div class="modal-body">
<div id="nav-advanced" class="tab-pane fade" role="tabpanel" aria-labelledby="advanced-tab">
<?php
echo Bootstrap::formSelectBlock(array(
'name'=>'category',
'label'=>'',
'selected'=>$page->categoryKey(),
'class'=>'',
'emptyOption'=>'- '.$L->g('Uncategorized').' -',
'options'=>$categories->getKeyNameArray()
));
?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal"><?php $L->p('Done') ?></button>
</div>
</div>
</div>
<script>
$(document).ready(function() {
function setCategoryBox(value) {
var selected = $("#jscategory option:selected");
var value = selected.val().trim();
if (value) {
$("#jscategoryOpenModal").find("span.option").html(": "+selected.text());
} else {
$("#jscategoryOpenModal").find("span.option").html("");
}
}
// Set the current category selected
setCategoryBox();
// When the user select the category update the category button
$("#jscategory").on("change", function() {
setCategoryBox();
});
});
</script>
</div>
<!-- Modal for Description -->
<div id="jsdescriptionModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?php $L->p('Description') ?></h5>
</div>
<div class="modal-body">
<?php
echo Bootstrap::formTextareaBlock(array(
'name'=>'description',
'label'=>'',
'selected'=>'',
'class'=>'',
'value'=>$page->description(),
'rows'=>3,
'placeholder'=>$L->get('this-field-can-help-describe-the-content')
));
?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal"><?php $L->p('Done') ?></button>
</div>
</div>
</div>
<script>
$(document).ready(function() {
function setDescriptionBox(value) {
var value = $("#jsdescription").val();
if (value) {
value = ": "+$.trim(value).substring(0, 30).split(" ").slice(0, -1).join(" ") + "...";
}
$("#jsdescriptionOpenModal").find("span.option").html(value);
}
// Set the current description
setDescriptionBox();
// When the user write the description update the description button
$("#jsdescription").on("change", function() {
setDescriptionBox();
});
});
</script>
</div>
<!-- Modal for More options -->
<div id="jsoptionsModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?php $L->p('More options') ?></h5>
</div>
<div class="modal-body">
<?php
// Username
echo Bootstrap::formInputText(array(
'name'=>'',
'label'=>$L->g('Author'),
'placeholder'=>'',
'value'=>$page->username(),
'tip'=>'',
'disabled'=>true
));
// Date
echo Bootstrap::formInputText(array(
echo Bootstrap::formInputTextBlock(array(
'name'=>'date',
'label'=>$L->g('Date'),
'placeholder'=>'',
@ -269,7 +171,7 @@ echo Bootstrap::formOpen(array(
));
// Type
echo Bootstrap::formSelect(array(
echo Bootstrap::formSelectBlock(array(
'name'=>'typeTMP',
'label'=>$L->g('Type'),
'selected'=>$page->type(),
@ -281,6 +183,23 @@ echo Bootstrap::formOpen(array(
'tip'=>''
));
// Position
echo Bootstrap::formInputTextBlock(array(
'name'=>'position',
'label'=>$L->g('Position'),
'tip'=>$L->g('Field used when ordering content by position'),
'value'=>$page->position()
));
// Tags
echo Bootstrap::formInputTextBlock(array(
'name'=>'tags',
'label'=>$L->g('Tags'),
'placeholder'=>'',
'tip'=>$L->g('Write the tags separated by comma'),
'value'=>$page->tags()
));
// Parent
try {
$parentKey = $page->parent();
@ -289,7 +208,7 @@ echo Bootstrap::formOpen(array(
} catch (Exception $e) {
$parentValue = '';
}
echo Bootstrap::formInputText(array(
echo Bootstrap::formInputTextBlock(array(
'name'=>'parentTMP',
'label'=>$L->g('Parent'),
'placeholder'=>'',
@ -297,87 +216,46 @@ echo Bootstrap::formOpen(array(
'value'=>$parentValue
));
// Position
echo Bootstrap::formInputText(array(
'name'=>'position',
'label'=>$L->g('Position'),
'tip'=>$L->g('Field used when ordering content by position'),
'value'=>$page->position()
));
// Template
echo Bootstrap::formInputText(array(
echo Bootstrap::formInputTextBlock(array(
'name'=>'template',
'label'=>$L->g('Template'),
'placeholder'=>'',
'tip'=>$L->g('Write a template name to filter the page in the theme and change the style of the page.'),
'value'=>$page->template()
'value'=>$page->template(),
'tip'=>$L->g('Write a template name to filter the page in the theme and change the style of the page.')
));
// Tags
echo Bootstrap::formInputText(array(
'name'=>'tags',
'label'=>$L->g('Tags'),
echo Bootstrap::formInputTextBlock(array(
'name'=>'externalCoverImage',
'label'=>$L->g('External cover image'),
'placeholder'=>"https://",
'value'=>$externalCoverImage,
'tip'=>$L->g('Set a cover image from external URL, such as a CDN or some server dedicated for images.')
));
// Username
echo Bootstrap::formInputTextBlock(array(
'name'=>'',
'label'=>$L->g('Author'),
'placeholder'=>'',
'tip'=>$L->g('Write the tags separated by comma'),
'value'=>$page->tags()
));
echo Bootstrap::formTitle(array('title'=>$L->g('SEO')));
// Friendly URL
echo Bootstrap::formInputText(array(
'name'=>'slug',
'tip'=>$L->g('URL associated with the content'),
'label'=>$L->g('Friendly URL'),
'placeholder'=>$L->g('Leave empty for autocomplete by Bludit.'),
'value'=>$page->slug()
));
echo Bootstrap::formCheckbox(array(
'name'=>'noindex',
'label'=>'Robots',
'labelForCheckbox'=>$L->g('apply-code-noindex-code-to-this-page'),
'placeholder'=>'',
'class'=>'mt-4',
'checked'=>$page->noindex(),
'tip'=>$L->g('This tells search engines not to show this page in their search results.')
));
echo Bootstrap::formCheckbox(array(
'name'=>'nofollow',
'label'=>'',
'labelForCheckbox'=>$L->g('apply-code-nofollow-code-to-this-page'),
'placeholder'=>'',
'checked'=>$page->nofollow(),
'tip'=>$L->g('This tells search engines not to follow links on this page.')
));
echo Bootstrap::formCheckbox(array(
'name'=>'noarchive',
'label'=>'',
'labelForCheckbox'=>$L->g('apply-code-noarchive-code-to-this-page'),
'placeholder'=>'',
'checked'=>$page->noarchive(),
'tip'=>$L->g('This tells search engines not to save a cached copy of this page.')
'value'=>$page->username(),
'tip'=>'',
'disabled'=>true
));
?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal"><?php $L->p('Done') ?></button>
</div>
</div>
</div>
<script>
$(document).ready(function() {
// Generate slug when the user type the title
$("#jstitle").keyup(function() {
var text = $(this).val();
var parent = $("#jsparent").val();
var currentKey = "";
var ajax = new bluditAjax();
var callBack = $("#jsslug");
ajax.generateSlug(text, parent, currentKey, callBack);
// Changes in External cover image input
$("#jsexternalCoverImage").change(function() {
$("#jscoverImage").val( $(this).val() );
});
// Parent
$("#jsparentTMP").change(function() {
var parent = $("#jsparentTMP").val();
if (parent.length===0) {
$("#jsparent").val("");
}
});
// Datepicker
@ -413,6 +291,58 @@ echo Bootstrap::formOpen(array(
});
</script>
</div>
<div id="nav-seo" class="tab-pane fade" role="tabpanel" aria-labelledby="seo-tab">
<?php
// Friendly URL
echo Bootstrap::formInputTextBlock(array(
'name'=>'slug',
'tip'=>$L->g('URL associated with the content'),
'label'=>$L->g('Friendly URL'),
'placeholder'=>$L->g('Leave empty for autocomplete by Bludit.'),
'value'=>$page->slug()
));
// Robots
echo Bootstrap::formCheckbox(array(
'name'=>'noindex',
'label'=>'Robots',
'labelForCheckbox'=>$L->g('apply-code-noindex-code-to-this-page'),
'placeholder'=>'',
'checked'=>$page->noindex(),
'tip'=>$L->g('This tells search engines not to show this page in their search results.')
));
// Robots
echo Bootstrap::formCheckbox(array(
'name'=>'nofollow',
'label'=>'',
'labelForCheckbox'=>$L->g('apply-code-nofollow-code-to-this-page'),
'placeholder'=>'',
'checked'=>$page->nofollow(),
'tip'=>$L->g('This tells search engines not to follow links on this page.')
));
// Robots
echo Bootstrap::formCheckbox(array(
'name'=>'noarchive',
'label'=>'',
'labelForCheckbox'=>$L->g('apply-code-noarchive-code-to-this-page'),
'placeholder'=>'',
'checked'=>$page->noarchive(),
'tip'=>$L->g('This tells search engines not to save a cached copy of this page.')
));
?>
</div>
</div>
</div>
<!-- Title -->
<div class="form-group mt-1 mb-1">
<input id="jstitle" name="title" type="text" class="form-control form-control-lg rounded-0" value="<?php echo $page->title() ?>" placeholder="<?php $L->p('Enter title') ?>">
</div>
<!-- Editor -->
<div id="jseditor" class="editable h-100" style=""><?php echo $page->contentRaw(false) ?></div>
</form>
@ -420,14 +350,12 @@ echo Bootstrap::formOpen(array(
<div id="jsdeletePageModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?php $L->p('Delete content') ?></h5>
</div>
<div class="modal-body">
<?php $L->p('Are you sure you want to delete this page') ?>
<h3><?php $L->p('Delete content') ?></h3>
<p><?php $L->p('Are you sure you want to delete this page') ?></p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal"><?php $L->p('Cancel') ?></button>
<button type="button" class="btn btn-link" data-dismiss="modal"><?php $L->p('Cancel') ?></button>
<button type="button" class="btn btn-danger" data-dismiss="modal" id="jsbuttonDeleteAccept"><?php $L->p('Delete') ?></button>
</div>
</div>
@ -481,10 +409,10 @@ $(document).ready(function() {
var uuid = $("#jsuuid").val();
var title = $("#jstitle").val();
var content = editorGetContent();
var ajax = new bluditAjax();
// Call autosave only when the user change the content
if (currentContent!=content) {
currentContent = content;
var ajax = new bluditAjax();
// showAlert is the function to display an alert defined in alert.php
ajax.autosave(uuid, title, content, showAlert);
}

View File

@ -1,29 +1,44 @@
<?php defined('BLUDIT') or die('Bludit CMS.');
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
echo Bootstrap::formOpen(array());
<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-content')); ?>
echo '
<div>
<div class="float-right">
<button type="submit" class="btn btn-primary btn-sm" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary btn-sm" href="'.HTML_PATH_ADMIN_ROOT.'users" role="button">'.$L->g('Cancel').'</a>
<div class="align-middle">
<div class="float-right mt-1">
<button type="submit" class="btn btn-primary btn-sm" name="save"><?php $L->p('Save') ?></button>
<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'users' ?>" role="button"><?php $L->p('Cancel') ?></a>
</div>
<h2 class="mt-0 mb-3">
<span class="oi oi-person" style="font-size: 0.7em;"></span> '.$L->g('Edit user').'
</h2>
<?php echo Bootstrap::pageTitle(array('title'=>$L->g('Edit user'), 'icon'=>'person')); ?>
</div>
';
<!-- TABS -->
<nav class="mb-3">
<div class="nav nav-tabs" id="nav-tab" role="tablist">
<a class="nav-item nav-link active" id="nav-profile-tab" data-toggle="tab" href="#profile" role="tab" aria-controls="nav-profile" aria-selected="false"><?php $L->p('Profile') ?></a>
<a class="nav-item nav-link" id="nav-picture-tab" data-toggle="tab" href="#picture" role="tab" aria-controls="nav-picture" aria-selected="false"><?php $L->p('Profile picture') ?></a>
<a class="nav-item nav-link" id="nav-security-tab" data-toggle="tab" href="#security" role="tab" aria-controls="nav-security" aria-selected="false"><?php $L->p('Security') ?></a>
<a class="nav-item nav-link" id="nav-social-tab" data-toggle="tab" href="#social" role="tab" aria-controls="nav-social" aria-selected="false"><?php $L->p('Social Networks') ?></a>
</div>
</nav>
<?php
// Token CSRF
echo Bootstrap::formInputHidden(array(
'name'=>'tokenCSRF',
'value'=>$security->getTokenCSRF()
));
// Username
echo Bootstrap::formInputHidden(array(
'name'=>'username',
'value'=>$user->username()
));
?>
<div class="tab-content" id="nav-tabContent">
<!-- Profile tab -->
<div class="tab-pane fade show active" id="profile" role="tabpanel" aria-labelledby="nav-profile-tab">
<?php
// Display username but disable the field
echo Bootstrap::formInputText(array(
'name'=>'usernameDisabled',
'label'=>$L->g('Username'),
@ -38,7 +53,7 @@ echo Bootstrap::formOpen(array());
echo Bootstrap::formSelect(array(
'name'=>'role',
'label'=>$L->g('Role'),
'options'=>array('editor'=>$L->g('Editor'), 'admin'=>$L->g('Administrator')),
'options'=>array('writer'=>$L->g('Writer'), 'editor'=>$L->g('Editor'), 'admin'=>$L->g('Administrator')),
'selected'=>$user->role(),
'class'=>'',
'tip'=>''
@ -54,8 +69,6 @@ echo Bootstrap::formOpen(array());
'tip'=>''
));
echo Bootstrap::formTitle(array('title'=>$L->g('Profile')));
echo Bootstrap::formInputText(array(
'name'=>'nickname',
'label'=>$L->g('Nickname'),
@ -82,16 +95,48 @@ echo Bootstrap::formOpen(array());
'placeholder'=>'',
'tip'=>''
));
?>
</div>
<!-- Profile picture tab -->
<div class="tab-pane fade" id="picture" role="tabpanel" aria-labelledby="nav-picture-tab">
<div class="custom-file mb-2">
<input type="file" class="custom-file-input" id="jsprofilePictureInputFile" name="profilePictureInputFile">
<label class="custom-file-label" for="jsprofilePictureInputFile"><?php $L->p('Choose images to upload'); ?></label>
</div>
<div>
<img id="jsprofilePicturePreview" class="img-fluid img-thumbnail" alt="Profile picture preview" src="<?php echo (Sanitize::pathFile(PATH_UPLOADS_PROFILES.$user->username().'.png')?DOMAIN_UPLOADS_PROFILES.$user->username().'.png?version='.time():HTML_PATH_ADMIN_THEME_IMG.'default.svg') ?>" />
</div>
<script>
$("#jsprofilePictureInputFile").on("change", function() {
var formData = new FormData();
formData.append('tokenCSRF', tokenCSRF);
formData.append('profilePictureInputFile', $(this)[0].files[0]);
formData.append('username', $("#jsusername").val());
$.ajax({
url: HTML_PATH_ADMIN_ROOT+"ajax/profile-picture",
type: "POST",
data: formData,
cache: false,
contentType: false,
processData: false
}).done(function(json) {
console.log(json);
$("#jsprofilePicturePreview").attr('src',json.absoluteURL+"?time="+Math.random());
});
});
</script>
</div>
<!-- Security tab -->
<div class="tab-pane fade" id="security" role="tabpanel" aria-labelledby="nav-security-tab">
<?php
echo Bootstrap::formTitle(array('title'=>$L->g('Password')));
echo '
<div class="form-group row">
<div class="col-sm-2"></div>
<div class="col-sm-10">
<div class="form-group">
<a href="'.HTML_PATH_ADMIN_ROOT.'user-password/'.$user->username().'" class="btn btn-primary mr-2">'.$L->g('Change password').'</a>
</div>
</div>
';
echo Bootstrap::formTitle(array('title'=>$L->g('Authentication Token')));
@ -104,6 +149,7 @@ echo Bootstrap::formOpen(array());
'tip'=>$L->g('this-token-is-similar-to-a-password-it-should-not-be-shared')
));
if (checkRole(array('admin'),false)) {
echo Bootstrap::formTitle(array('title'=>$L->g('Status')));
echo Bootstrap::formInputText(array(
@ -120,21 +166,26 @@ echo Bootstrap::formOpen(array());
<div class="form-group row">
<div class="col-sm-2"></div>
<div class="col-sm-10">
<button type="submit" class="btn btn-primary mr-2" id="jsdisableUser" name="disableUser">'.$L->g('Disable user').'</button>
<button type="submit" class="btn btn-warning mr-2" id="jsdisableUser" name="disableUser">'.$L->g('Disable user').'</button>
<button type="submit" class="btn btn-danger mr-2" id="jsdeleteUserAndKeepContent" name="deleteUserAndKeepContent">'.$L->g('Delete user and keep content').'</button>
<button type="submit" class="btn btn-danger mr-2" id="jsdeleteUserAndDeleteContent" name="deleteUserAndDeleteContent">'.$L->g('Delete user and delete content').'</button>
</div>
</div>
';
}
}
?>
</div>
echo Bootstrap::formTitle(array('title'=>$L->g('Social Networks')));
<!-- Social Networks tab -->
<div class="tab-pane fade" id="social" role="tabpanel" aria-labelledby="nav-social-tab">
<?php
echo Bootstrap::formInputText(array(
'name'=>'twitter',
'label'=>'Twitter',
'value'=>$user->twitter(),
'class'=>'',
'placeholder'=>'',
'tip'=>''
));
@ -143,14 +194,16 @@ echo Bootstrap::formOpen(array());
'label'=>'Facebook',
'value'=>$user->facebook(),
'class'=>'',
'placeholder'=>'',
'tip'=>''
));
echo Bootstrap::formInputText(array(
'name'=>'googlePlus',
'label'=>'Google+',
'value'=>$user->googlePlus(),
'name'=>'codepen',
'label'=>'CodePen',
'value'=>$user->codepen(),
'class'=>'',
'placeholder'=>'',
'tip'=>''
));
@ -159,113 +212,47 @@ echo Bootstrap::formOpen(array());
'label'=>'Instagram',
'value'=>$user->instagram(),
'class'=>'',
'tip'=>''
));
echo Bootstrap::formInputText(array(
'name'=>'codepen',
'label'=>'Codepen',
'value'=>$user->codepen(),
'class'=>'',
'tip'=>''
));
echo Bootstrap::formInputText(array(
'name'=>'linkedin',
'label'=>'Linkedin',
'value'=>$user->linkedin(),
'class'=>'',
'tip'=>''
));
echo Bootstrap::formInputText(array(
'name'=>'github',
'label'=>'Github',
'value'=>$user->github(),
'class'=>'',
'placeholder'=>'',
'tip'=>''
));
echo Bootstrap::formInputText(array(
'name'=>'gitlab',
'label'=>'Gitlab',
'label'=>'GitLab',
'value'=>$user->gitlab(),
'class'=>'',
'placeholder'=>'',
'tip'=>''
));
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'users" role="button">'.$L->g('Cancel').'</a>
</div>
';
echo Bootstrap::formInputText(array(
'name'=>'github',
'label'=>'GitHub',
'value'=>$user->github(),
'class'=>'',
'placeholder'=>'',
'tip'=>''
));
echo Bootstrap::formClose();
echo Bootstrap::formTitle(array('title'=>$L->g('Profile picture')));
$src = (Sanitize::pathFile(PATH_UPLOADS_PROFILES.$user->username().'.png')?DOMAIN_UPLOADS_PROFILES.$user->username().'.png':HTML_PATH_ADMIN_THEME_IMG.'default.svg');
echo '
<div class="form-group row">
<div class="col-sm-2"></div>
<div class="col-sm-10">
<img id="jsprofilePictureImg" style="width: 350px; height: 200px;" class="img-thumbnail mb-2" alt="Profile Picture" src="'.$src.'" />
<form id="jsprofilePictureForm" name="profilePictureForm" enctype="multipart/form-data">
<input type="hidden" name="tokenCSRF" value="'.$security->getTokenCSRF().'">
<div class="custom-file">
<input type="file" class="custom-file-input" id="jsprofilePictureInputFile" name="profilePictureInputFile">
<label class="custom-file-label" for="jsprofilePictureInputFile"></label>
</div>
</form>
</div>
</div>
';
echo Bootstrap::formInputText(array(
'name'=>'linkedin',
'label'=>'LinkedIn',
'value'=>$user->linkedin(),
'class'=>'',
'placeholder'=>'',
'tip'=>''
));
echo Bootstrap::formInputText(array(
'name'=>'mastodon',
'label'=>'Mastodon',
'value'=>$user->mastodon(),
'class'=>'',
'placeholder'=>'',
'tip'=>''
));
?>
</div>
</div>
<script>
$(document).ready(function() {
$("#jsdeleteUserAndDeleteContent").click(function() {
if(confirm("<?php $L->p('Confirm delete this action cannot be undone') ?>")==false) {
return false;
}
});
$("#jsdeleteUserAndKeepContent").click(function() {
if(confirm("<?php $L->p('Confirm delete this action cannot be undone') ?>")==false) {
return false;
}
});
$("#jsprofilePictureInputFile").on("change", function() {
$.ajax({
url: "<?php echo HTML_PATH_ADMIN_ROOT ?>ajax/profile-picture",
type: "POST",
data: new FormData($("#jsprofilePictureForm")[0]),
cache: false,
contentType: false,
processData: false,
xhr: function() {
var xhr = $.ajaxSettings.xhr();
if (xhr.upload) {
xhr.upload.addEventListener("progress", function(e) {
if (e.lengthComputable) {
var percentComplete = (e.loaded / e.total)*100;
console.log("Uploading profile picture: "+percentComplete);
}
}, false);
}
return xhr;
}
}).done(function(e) {
$("#jsprofilePictureImg").attr('src',e.absoluteURL+"?time="+Math.random());
});
});
});
</script>
<?php echo Bootstrap::formClose(); ?>

View File

@ -1,16 +1,23 @@
<?php defined('BLUDIT') or die('Bludit CMS.');
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
echo Bootstrap::pageTitle(array('title'=>$L->g('New Category'), 'icon'=>'grid-three-up'));
<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-content')); ?>
echo Bootstrap::formOpen(array());
<div class="align-middle">
<div class="float-right mt-1">
<button type="submit" class="btn btn-primary btn-sm" name="save"><?php $L->p('Save') ?></button>
<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'categories' ?>" role="button"><?php $L->p('Cancel') ?></a>
</div>
<?php echo Bootstrap::pageTitle(array('title'=>$L->g('New category'), 'icon'=>'tag')); ?>
</div>
<?php
echo Bootstrap::formInputHidden(array(
'name'=>'tokenCSRF',
'value'=>$security->getTokenCSRF()
));
echo Bootstrap::formInputTextBlock(array(
'name'=>'category',
echo Bootstrap::formInputText(array(
'name'=>'name',
'label'=>$L->g('Name'),
'value'=>isset($_POST['category'])?$_POST['category']:'',
'class'=>'',
@ -18,11 +25,15 @@ echo Bootstrap::formOpen(array());
'tip'=>''
));
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'categories" role="button">'.$L->g('Cancel').'</a>
</div>
';
echo Bootstrap::formTextarea(array(
'name'=>'description',
'label'=>$L->g('Description'),
'value'=>isset($_POST['description'])?$_POST['description']:'',
'class'=>'',
'placeholder'=>'',
'tip'=>'',
'rows'=>3
));
?>
echo Bootstrap::formClose();
<?php echo Bootstrap::formClose(); ?>

View File

@ -2,7 +2,7 @@
<?php
// FORM START
// Start form
echo Bootstrap::formOpen(array(
'id'=>'jsform',
'class'=>'d-flex flex-column h-100'
@ -47,70 +47,78 @@ echo Bootstrap::formOpen(array(
?>
<!-- TOOLBAR -->
<div id="jseditorToolbar">
<div id="jseditorToolbarRight" class="btn-group btn-group-sm float-right" role="group" aria-label="Toolbar right">
<button type="button" class="btn btn-light" id="jsmediaManagerOpenModal" data-toggle="modal" data-target="#jsmediaManagerModal"><span class="oi oi-image"></span> <?php $L->p('Images') ?></button>
<button type="button" class="btn btn-light" id="jsoptionsSidebar" style="z-index:30"><span class="oi oi-cog"></span> <?php $L->p('Options') ?></button>
</div>
<div id="jseditorToolbarLeft">
<button type="button" class="btn btn-sm btn-primary" id="jsbuttonSave"><?php $L->p('Publish') ?></button>
<button type="button" class="btn btn-sm btn-secondary" id="jsbuttonDraft"><?php $L->p('Save as draft') ?></button>
<a href="<?php echo HTML_PATH_ADMIN_ROOT ?>dashboard" class="btn btn-sm btn-secondary"><?php $L->p('Cancel') ?></a>
</div>
</div>
<script>
$(document).ready(function() {
$("#jsoptionsSidebar").on("click", function() {
$("#jseditorSidebar").toggle();
$("#jsshadow").toggle();
});
$("#jsshadow").on("click", function() {
$("#jseditorSidebar").toggle();
$("#jsshadow").toggle();
});
});
</script>
<!-- SIDEBAR OPTIONS -->
<div id="jseditorSidebar">
<nav>
<div class="nav nav-tabs" id="nav-tab" role="tablist">
<a class="nav-link active show" id="nav-general-tab" data-toggle="tab" href="#nav-general" role="tab" aria-controls="general"><?php $L->p('General') ?></a>
<a class="nav-link" id="nav-advanced-tab" data-toggle="tab" href="#nav-advanced" role="tab" aria-controls="advanced"><?php $L->p('Advanced') ?></a>
<a class="nav-link" id="nav-seo-tab" data-toggle="tab" href="#nav-seo" role="tab" aria-controls="seo"><?php $L->p('SEO') ?></a>
</div>
</nav>
<div class="tab-content pr-3 pl-3 pb-3">
<div id="nav-general" class="tab-pane fade show active" role="tabpanel" aria-labelledby="general-tab">
<?php
// Category
echo Bootstrap::formSelectBlock(array(
'name'=>'category',
'label'=>$L->g('Category'),
'selected'=>'',
'class'=>'',
'emptyOption'=>'- '.$L->g('Uncategorized').' -',
'options'=>$categories->getKeyNameArray()
));
// Description
echo Bootstrap::formTextareaBlock(array(
'name'=>'description',
'label'=>$L->g('Description'),
'selected'=>'',
'class'=>'',
'value'=>'',
'rows'=>3,
'placeholder'=>$L->get('this-field-can-help-describe-the-content')
));
?>
<!-- Cover Image -->
<label class="mt-4 mb-2 pb-2 border-bottom text-uppercase w-100"><?php $L->p('Cover Image') ?></label>
<div>
<div class="btn-group btn-group-sm" role="group" aria-label="Basic example">
<button type="button" class="btn btn-light" id="jsmediaManagerOpenModal" data-toggle="modal" data-target="#jsmediaManagerModal"><?php $L->p('Images') ?></button>
<button type="button" class="btn btn-light" id="jscoverImageOpenModal" data-toggle="modal" data-target="#jscoverImageModal"><?php $L->p('Cover image') ?></button>
<button type="button" class="btn btn-light" id="jscategoryOpenModal" data-toggle="modal" data-target="#jscategoryModal"><?php $L->p('Category') ?><span class="option"></span></button>
<button type="button" class="btn btn-light" id="jsdescriptionOpenModal" data-toggle="modal" data-target="#jsdescriptionModal"><?php $L->p('Description') ?><span class="option"></span></button>
<button type="button" class="btn btn-light" id="jsoptionsOpenModal" data-toggle="modal" data-target="#jsoptionsModal"><?php $L->p('More options') ?></button>
</div>
<div class="btn-group btn-group-sm float-right" role="group" aria-label="Basic example">
<button type="button" class="btn btn-primary" id="jsbuttonSave"><?php $L->p('Publish') ?></button>
<button type="button" class="btn btn-secondary" id="jsbuttonDraft"><?php $L->p('Save as draft') ?></button>
<a href="<?php echo HTML_PATH_ADMIN_ROOT ?>dashboard" class="btn btn-secondary"><?php $L->p('Cancel') ?></a>
</div>
</div>
<!-- Title -->
<div class="form-group mt-1 mb-1">
<input id="jstitle" name="title" type="text" class="form-control form-control-lg rounded-0" value="" placeholder="<?php $L->p('Enter title') ?>">
</div>
<!-- Editor -->
<div id="jseditor" class="editable h-100 mb-1"></div>
<!-- Modal for Cover Image -->
<div id="jscoverImageModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?php $L->p('Cover Image') ?></h5>
</div>
<div class="modal-body">
<div>
<img id="jscoverImagePreview" style="width: 350px; height: 200px;" class="mx-auto d-block" alt="Cover image preview" src="<?php echo HTML_PATH_ADMIN_THEME_IMG ?>default.svg" />
<img id="jscoverImagePreview" class="mx-auto d-block w-100" alt="Cover image preview" src="<?php echo HTML_PATH_ADMIN_THEME_IMG ?>default.svg" />
</div>
<div class="mt-2 text-center">
<button type="button" id="jsbuttonSelectCoverImage" class="btn btn-primary btn-sm"><?php echo $L->g('Select cover image') ?></button>
<button type="button" id="jsbuttonRemoveCoverImage" class="btn btn-secondary btn-sm"><?php echo $L->g('Remove cover image') ?></button>
</div>
<hr>
<?php
echo Bootstrap::formTitle(array('title'=>$L->g('External Cover Image')));
echo Bootstrap::formInputTextBlock(array(
'name'=>'externalCoverImage',
'placeholder'=>"https://",
'value'=>'',
'tip'=>$L->g('Set a cover image from external URL, such as a CDN or some server dedicated for images.')
));
?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal"><?php $L->p('Done') ?></button>
</div>
</div>
</div>
<script>
$(document).ready(function() {
$("#jsexternalCoverImage").change(function() {
$("#jscoverImage").val( $(this).val() );
});
$("#jscoverImagePreview").on("click", function() {
openMediaManager();
});
@ -126,121 +134,10 @@ echo Bootstrap::formOpen(array(
});
</script>
</div>
<!-- Modal for Categories -->
<div id="jscategoryModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?php $L->p('Category') ?></h5>
</div>
<div class="modal-body">
<div id="nav-advanced" class="tab-pane fade" role="tabpanel" aria-labelledby="advanced-tab">
<?php
echo Bootstrap::formSelectBlock(array(
'name'=>'category',
'label'=>'',
'selected'=>'',
'class'=>'',
'emptyOption'=>'- '.$L->g('Uncategorized').' -',
'options'=>$categories->getKeyNameArray()
));
?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal"><?php $L->p('Done') ?></button>
</div>
</div>
</div>
<script>
$(document).ready(function() {
function setCategoryBox(value) {
var selected = $("#jscategory option:selected");
var value = selected.val().trim();
if (value) {
$("#jscategoryOpenModal").find("span.option").html(": "+selected.text());
} else {
$("#jscategoryOpenModal").find("span.option").html("");
}
}
// Set the current category selected
setCategoryBox();
// When the user select the category update the category button
$("#jscategory").on("change", function() {
setCategoryBox();
});
});
</script>
</div>
<!-- Modal for Description -->
<div id="jsdescriptionModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?php $L->p('Description') ?></h5>
</div>
<div class="modal-body">
<?php
echo Bootstrap::formTextareaBlock(array(
'name'=>'description',
'label'=>'',
'selected'=>'',
'class'=>'',
'value'=>'',
'rows'=>3,
'placeholder'=>$L->get('this-field-can-help-describe-the-content')
));
?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal"><?php $L->p('Done') ?></button>
</div>
</div>
</div>
<script>
$(document).ready(function() {
function setDescriptionBox(value) {
var value = $("#jsdescription").val();
if (value) {
value = ": "+$.trim(value).substring(0, 30).split(" ").slice(0, -1).join(" ") + "...";
}
$("#jsdescriptionOpenModal").find("span.option").html(value);
}
// Set the current description
setDescriptionBox();
// When the user write the description update the description button
$("#jsdescription").on("change", function() {
setDescriptionBox();
});
});
</script>
</div>
<!-- Modal for More options -->
<div id="jsoptionsModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><?php $L->p('More options') ?></h5>
</div>
<div class="modal-body">
<?php
// Username
echo Bootstrap::formInputText(array(
'name'=>'',
'label'=>$L->g('Author'),
'placeholder'=>'',
'value'=>$login->username(),
'tip'=>'',
'disabled'=>true
));
// Date
echo Bootstrap::formInputText(array(
echo Bootstrap::formInputTextBlock(array(
'name'=>'date',
'label'=>$L->g('Date'),
'placeholder'=>'',
@ -249,7 +146,7 @@ echo Bootstrap::formOpen(array(
));
// Type
echo Bootstrap::formSelect(array(
echo Bootstrap::formSelectBlock(array(
'name'=>'typeTMP',
'label'=>$L->g('Type'),
'selected'=>'',
@ -261,8 +158,24 @@ echo Bootstrap::formOpen(array(
'tip'=>''
));
// Position
echo Bootstrap::formInputTextBlock(array(
'name'=>'position',
'label'=>$L->g('Position'),
'tip'=>$L->g('Field used when ordering content by position'),
'value'=>$pages->nextPositionNumber()
));
// Tags
echo Bootstrap::formInputTextBlock(array(
'name'=>'tags',
'label'=>$L->g('Tags'),
'placeholder'=>'',
'tip'=>$L->g('Write the tags separated by comma')
));
// Parent
echo Bootstrap::formInputText(array(
echo Bootstrap::formInputTextBlock(array(
'name'=>'parentTMP',
'label'=>$L->g('Parent'),
'placeholder'=>'',
@ -270,16 +183,8 @@ echo Bootstrap::formOpen(array(
'value'=>''
));
// Position
echo Bootstrap::formInputText(array(
'name'=>'position',
'label'=>$L->g('Position'),
'tip'=>$L->g('Field used when ordering content by position'),
'value'=>$pages->nextPositionNumber()
));
// Template
echo Bootstrap::formInputText(array(
echo Bootstrap::formInputTextBlock(array(
'name'=>'template',
'label'=>$L->g('Template'),
'placeholder'=>'',
@ -287,60 +192,31 @@ echo Bootstrap::formOpen(array(
'tip'=>$L->g('Write a template name to filter the page in the theme and change the style of the page.')
));
// Tags
echo Bootstrap::formInputText(array(
'name'=>'tags',
'label'=>$L->g('Tags'),
'placeholder'=>'',
'tip'=>$L->g('Write the tags separated by comma')
echo Bootstrap::formInputTextBlock(array(
'name'=>'externalCoverImage',
'label'=>$L->g('External cover image'),
'placeholder'=>"https://",
'value'=>'',
'tip'=>$L->g('Set a cover image from external URL, such as a CDN or some server dedicated for images.')
));
echo Bootstrap::formTitle(array('title'=>$L->g('SEO')));
// Friendly URL
echo Bootstrap::formInputText(array(
'name'=>'slug',
'tip'=>$L->g('URL associated with the content'),
'label'=>$L->g('Friendly URL'),
'placeholder'=>$L->g('Leave empty for autocomplete by Bludit.')
));
echo Bootstrap::formCheckbox(array(
'name'=>'noindex',
'label'=>'Robots',
'labelForCheckbox'=>$L->g('apply-code-noindex-code-to-this-page'),
// Username
echo Bootstrap::formInputTextBlock(array(
'name'=>'',
'label'=>$L->g('Author'),
'placeholder'=>'',
'class'=>'mt-4',
'checked'=>false,
'tip'=>$L->g('This tells search engines not to show this page in their search results.')
));
echo Bootstrap::formCheckbox(array(
'name'=>'nofollow',
'label'=>'',
'labelForCheckbox'=>$L->g('apply-code-nofollow-code-to-this-page'),
'placeholder'=>'',
'checked'=>false,
'tip'=>$L->g('This tells search engines not to follow links on this page.')
));
echo Bootstrap::formCheckbox(array(
'name'=>'noarchive',
'label'=>'',
'labelForCheckbox'=>$L->g('apply-code-noarchive-code-to-this-page'),
'placeholder'=>'',
'checked'=>false,
'tip'=>$L->g('This tells search engines not to save a cached copy of this page.')
'value'=>$login->username(),
'tip'=>'',
'disabled'=>true
));
?>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal"><?php $L->p('Done') ?></button>
</div>
</div>
</div>
<script>
$(document).ready(function() {
// Changes in External cover image input
$("#jsexternalCoverImage").change(function() {
$("#jscoverImage").val( $(this).val() );
});
// Generate slug when the user type the title
$("#jstitle").keyup(function() {
var text = $(this).val();
@ -384,6 +260,57 @@ echo Bootstrap::formOpen(array(
});
</script>
</div>
<div id="nav-seo" class="tab-pane fade" role="tabpanel" aria-labelledby="seo-tab">
<?php
// Friendly URL
echo Bootstrap::formInputTextBlock(array(
'name'=>'slug',
'tip'=>$L->g('URL associated with the content'),
'label'=>$L->g('Friendly URL'),
'placeholder'=>$L->g('Leave empty for autocomplete by Bludit.')
));
// Robots
echo Bootstrap::formCheckbox(array(
'name'=>'noindex',
'label'=>'Robots',
'labelForCheckbox'=>$L->g('apply-code-noindex-code-to-this-page'),
'placeholder'=>'',
'checked'=>false,
'tip'=>$L->g('This tells search engines not to show this page in their search results.')
));
// Robots
echo Bootstrap::formCheckbox(array(
'name'=>'nofollow',
'label'=>'',
'labelForCheckbox'=>$L->g('apply-code-nofollow-code-to-this-page'),
'placeholder'=>'',
'checked'=>false,
'tip'=>$L->g('This tells search engines not to follow links on this page.')
));
// Robots
echo Bootstrap::formCheckbox(array(
'name'=>'noarchive',
'label'=>'',
'labelForCheckbox'=>$L->g('apply-code-noarchive-code-to-this-page'),
'placeholder'=>'',
'checked'=>false,
'tip'=>$L->g('This tells search engines not to save a cached copy of this page.')
));
?>
</div>
</div>
</div>
<!-- Title -->
<div id="jseditorTitle" class="form-group mt-1 mb-1">
<input id="jstitle" name="title" type="text" class="form-control form-control-lg rounded-0" value="" placeholder="<?php $L->p('Enter title') ?>">
</div>
<!-- Editor -->
<div id="jseditor" class="editable h-100 mb-1"></div>
</form>

View File

@ -1,9 +1,16 @@
<?php defined('BLUDIT') or die('Bludit CMS.');
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
echo Bootstrap::pageTitle(array('title'=>$L->g('Add a new user'), 'icon'=>'person'));
<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-content')); ?>
echo Bootstrap::formOpen(array());
<div class="align-middle">
<div class="float-right mt-1">
<button type="submit" class="btn btn-primary btn-sm" name="save"><?php $L->p('Save') ?></button>
<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'users' ?>" role="button"><?php $L->p('Cancel') ?></a>
</div>
<?php echo Bootstrap::pageTitle(array('title'=>$L->g('Add a new user'), 'icon'=>'person')); ?>
</div>
<?php
echo Bootstrap::formInputHidden(array(
'name'=>'tokenCSRF',
'value'=>$security->getTokenCSRF()
@ -55,12 +62,6 @@ echo Bootstrap::formOpen(array());
'placeholder'=>'',
'tip'=>''
));
?>
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'users" role="button">'.$L->g('Cancel').'</a>
</div>
';
echo Bootstrap::formClose();
<?php echo Bootstrap::formClose(); ?>

View File

@ -1,11 +1,18 @@
<?php defined('BLUDIT') or die('Bludit CMS.');
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
echo Bootstrap::pageTitle(array('title'=>$L->g('Plugins position'), 'icon'=>'tags'));
<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-content')); ?>
echo Bootstrap::alert(array('class'=>'alert-primary', 'text'=>$L->g('Drag and Drop to sort the plugins')));
<div class="align-middle">
<div class="float-right mt-1">
<button type="button" class="btn btn-primary btn-sm jsbuttonSave" name="save"><?php $L->p('Save') ?></button>
<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'plugins' ?>" role="button"><?php $L->p('Cancel') ?></a>
</div>
<?php echo Bootstrap::pageTitle(array('title'=>$L->g('Plugins position'), 'icon'=>'tags')); ?>
</div>
echo Bootstrap::formOpen(array('id'=>'jsform'));
<div class="alert alert-primary"><?php $L->p('Drag and Drop to sort the plugins') ?></div>
<?php
// Token CSRF
echo Bootstrap::formInputHidden(array(
'name'=>'tokenCSRF',
@ -22,21 +29,12 @@ echo Bootstrap::formOpen(array('id'=>'jsform'));
echo '<li class="list-group-item" data-plugin="'.$Plugin->className().'"><span class="oi oi-move"></span> '.$Plugin->name().'</li>';
}
echo '</ul>';
echo '
<div class="form-group mt-3">
<button type="button" class="jsbuttonSave btn btn-primary">'.$L->g('Save').'</button>
<a href="'.HTML_PATH_ADMIN_ROOT.'plugins" class="btn btn-secondary">'.$L->g('Cancel').'</a>
</div>
';
echo Bootstrap::formClose();
?>
<?php echo Bootstrap::formClose(); ?>
<script>
$(document).ready(function() {
$('.list-group-sortable').sortable({
placeholderClass: 'list-group-item'
});

View File

@ -1,33 +1,28 @@
<?php
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
echo Bootstrap::pageTitle(array('title'=>$L->g('Settings'), 'icon'=>'cog'));
<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-content')); ?>
?>
<div class="align-middle">
<div class="float-right mt-1">
<button type="submit" class="btn btn-primary btn-sm" name="save"><?php $L->p('Save') ?></button>
<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'dashboard' ?>" role="button"><?php $L->p('Cancel') ?></a>
</div>
<?php echo Bootstrap::pageTitle(array('title'=>$L->g('Settings'), 'icon'=>'cog')); ?>
</div>
<!-- TABS -->
<ul class="nav nav-tabs" id="dynamicTab" role="tablist">
<li class="nav-item">
<a class="nav-link active" id="general-tab" data-toggle="tab" href="#general" role="tab" aria-controls="general" aria-selected="true"><?php $L->p('Site') ?></a>
</li>
<li class="nav-item">
<a class="nav-link " id="advanced-tab" data-toggle="tab" href="#advanced" role="tab" aria-controls="advanced" aria-selected="false"><?php $L->p('Advanced') ?></a>
</li>
<li class="nav-item">
<a class="nav-link " id="seo-tab" data-toggle="tab" href="#seo" role="tab" aria-controls="seo" aria-selected="false"><?php $L->p('SEO') ?></a>
</li>
<li class="nav-item">
<a class="nav-link " id="social-tab" data-toggle="tab" href="#social" role="tab" aria-controls="social" aria-selected="false"><?php $L->p('Social Networks') ?></a>
</li>
<li class="nav-item">
<a class="nav-link" id="language-tab" data-toggle="tab" href="#language" role="tab" aria-controls="language" aria-selected="false"><?php $L->p('Language') ?></a>
</li>
</ul>
<?php
echo Bootstrap::formOpen(array(
'id'=>'dynamicTabContent',
'class'=>'tab-content mt-4'
));
<nav class="mb-3">
<div class="nav nav-tabs" id="nav-tab" role="tablist">
<a class="nav-item nav-link active" id="nav-general-tab" data-toggle="tab" href="#general" role="tab" aria-controls="nav-general" aria-selected="false"><?php $L->p('General') ?></a>
<a class="nav-item nav-link" id="nav-advanced-tab" data-toggle="tab" href="#advanced" role="tab" aria-controls="nav-advanced" aria-selected="false"><?php $L->p('Advanced') ?></a>
<a class="nav-item nav-link" id="nav-seo-tab" data-toggle="tab" href="#seo" role="tab" aria-controls="nav-seo" aria-selected="false"><?php $L->p('SEO') ?></a>
<a class="nav-item nav-link" id="nav-social-tab" data-toggle="tab" href="#social" role="tab" aria-controls="nav-social" aria-selected="false"><?php $L->p('Social Networks') ?></a>
<a class="nav-item nav-link" id="nav-images-tab" data-toggle="tab" href="#images" role="tab" aria-controls="nav-images" aria-selected="false"><?php $L->p('Images') ?></a>
<a class="nav-item nav-link" id="nav-language-tab" data-toggle="tab" href="#language" role="tab" aria-controls="nav-language" aria-selected="false"><?php $L->p('Language') ?></a>
</div>
</nav>
<?php
// Token CSRF
echo Bootstrap::formInputHidden(array(
'name'=>'tokenCSRF',
@ -41,9 +36,11 @@ echo Bootstrap::pageTitle(array('title'=>$L->g('Settings'), 'icon'=>'cog'));
));
?>
<!-- TABS GENERAL -->
<!-- General tab -->
<div class="tab-pane show active" id="general" role="tabpanel" aria-labelledby="general-tab">
<?php
echo Bootstrap::formTitle(array('title'=>$L->g('Site')));
echo Bootstrap::formInputText(array(
'name'=>'title',
'label'=>$L->g('Site title'),
@ -79,17 +76,10 @@ echo Bootstrap::pageTitle(array('title'=>$L->g('Settings'), 'icon'=>'cog'));
'placeholder'=>'',
'tip'=>$L->g('you-can-add-a-small-text-on-the-bottom')
));
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'dashboard" role="button">'.$L->g('Cancel').'</a>
</div>
';
?>
</div>
<!-- TABS ADVANCED -->
<!-- Advanced tab -->
<div class="tab-pane" id="advanced" role="tabpanel" aria-labelledby="advanced-tab">
<?php
echo Bootstrap::formTitle(array('title'=>$L->g('Content')));
@ -214,18 +204,10 @@ echo Bootstrap::pageTitle(array('title'=>$L->g('Settings'), 'icon'=>'cog'));
'tip'=>DOMAIN.$site->uriFilters('blog'),
'disabled'=>Text::isEmpty($site->uriFilters('blog'))
));
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'dashboard" role="button">'.$L->g('Cancel').'</a>
</div>
';
?>
</div>
<!-- TABS SEO -->
<!-- SEO tab -->
<div class="tab-pane" id="seo" role="tabpanel" aria-labelledby="seo-tab">
<?php
echo Bootstrap::formTitle(array('title'=>$L->g('Extreme friendly URL')));
@ -280,17 +262,53 @@ echo Bootstrap::pageTitle(array('title'=>$L->g('Settings'), 'icon'=>'cog'));
'tip'=>$L->g('Variables allowed').' <code>{{tag-name}}</code> <code>{{site-title}}</code> <code>{{site-slogan}}</code> <code>{{site-description}}</code>',
'placeholder'=>''
));
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'dashboard" role="button">'.$L->g('Cancel').'</a>
</div>
';
?>
</div>
<script>
$(document).ready(function() {
<!-- TABS SOCIAL NETWORKS -->
// Parent autocomplete
var homepageXHR;
var homepageList; // Keep the parent list returned to get the key by the title page
$("#jshomepageTMP").autoComplete({
minChars: 1,
source: function(term, response) {
// Prevent call inmediatly another ajax request
try { homepageXHR.abort(); } catch(e){}
homepageXHR = $.getJSON(HTML_PATH_ADMIN_ROOT+"ajax/get-published", {query: term},
function(data) {
homepageList = data;
term = term.toLowerCase();
var matches = [];
for (var title in data) {
if (~title.toLowerCase().indexOf(term))
matches.push(title);
}
response(matches);
});
},
onSelect: function(e, term, item) {
// homepageList = array( pageTitle => pageKey )
var key = homepageList[term];
$("#jshomepage").attr("value", key);
}
});
$("#jshomepageTMP").change(function() {
if ($(this).val()) {
$("#jsuriBlog").removeAttr('disabled');
$("#jsuriBlog").attr('value', '/blog/');
} else {
$("#jsuriBlog").attr('value', '');
$("#jsuriBlog").attr('disabled', 'disabled');
$("#jshomepage").attr("value", '');
}
});
});
</script>
<!-- Social Network tab -->
<div class="tab-pane" id="social" role="tabpanel" aria-labelledby="social-tab">
<?php
echo Bootstrap::formInputText(array(
@ -320,15 +338,6 @@ echo Bootstrap::pageTitle(array('title'=>$L->g('Settings'), 'icon'=>'cog'));
'tip'=>''
));
echo Bootstrap::formInputText(array(
'name'=>'googlePlus',
'label'=>'Google+',
'value'=>$site->googlePlus(),
'class'=>'',
'placeholder'=>'',
'tip'=>''
));
echo Bootstrap::formInputText(array(
'name'=>'instagram',
'label'=>'Instagram',
@ -373,19 +382,47 @@ echo Bootstrap::pageTitle(array('title'=>$L->g('Settings'), 'icon'=>'cog'));
'placeholder'=>'',
'tip'=>''
));
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'dashboard" role="button">'.$L->g('Cancel').'</a>
</div>
';
?>
</div>
<!-- TABS TIMEZONE AND LANGUAGES -->
<!-- Images tab -->
<div class="tab-pane" id="images" role="tabpanel" aria-labelledby="images-tab">
<?php
echo Bootstrap::formTitle(array('title'=>$L->g('Thumbnails')));
echo Bootstrap::formInputText(array(
'name'=>'thumbnailWidth',
'label'=>$L->g('Width'),
'value'=>$site->thumbnailWidth(),
'class'=>'',
'placeholder'=>'',
'tip'=>$L->g('Thumbnail width in pixels')
));
echo Bootstrap::formInputText(array(
'name'=>'thumbnailHeight',
'label'=>$L->g('Height'),
'value'=>$site->thumbnailHeight(),
'class'=>'',
'placeholder'=>'',
'tip'=>$L->g('Thumbnail height in pixels')
));
echo Bootstrap::formInputText(array(
'name'=>'thumbnailQuality',
'label'=>$L->g('Quality'),
'value'=>$site->thumbnailQuality(),
'class'=>'',
'placeholder'=>'',
'tip'=>$L->g('Thumbnail quality in percentage')
));
?>
</div>
<!-- Timezone and language tab -->
<div class="tab-pane" id="language" role="tabpanel" aria-labelledby="language-tab">
<?php
echo Bootstrap::formTitle(array('title'=>$L->g('Language and timezone')));
echo Bootstrap::formSelect(array(
'name'=>'language',
@ -424,59 +461,7 @@ echo Bootstrap::pageTitle(array('title'=>$L->g('Settings'), 'icon'=>'cog'));
'placeholder'=>'',
'tip'=>$L->g('Current format').': '.Date::current($site->dateFormat())
));
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'dashboard" role="button">'.$L->g('Cancel').'</a>
</div>
';
?>
</div>
<?php
echo Bootstrap::formClose();
?>
<script>
$(document).ready(function() {
// Parent autocomplete
var homepageXHR;
var homepageList; // Keep the parent list returned to get the key by the title page
$("#jshomepageTMP").autoComplete({
minChars: 1,
source: function(term, response) {
// Prevent call inmediatly another ajax request
try { homepageXHR.abort(); } catch(e){}
homepageXHR = $.getJSON(HTML_PATH_ADMIN_ROOT+"ajax/get-published", {query: term},
function(data) {
homepageList = data;
term = term.toLowerCase();
var matches = [];
for (var title in data) {
if (~title.toLowerCase().indexOf(term))
matches.push(title);
}
response(matches);
});
},
onSelect: function(e, term, item) {
// homepageList = array( pageTitle => pageKey )
var key = homepageList[term];
$("#jshomepage").attr("value", key);
}
});
$("#jshomepageTMP").change(function() {
if ($(this).val()) {
$("#jsuriBlog").removeAttr('disabled');
$("#jsuriBlog").attr('value', '/blog/');
} else {
$("#jsuriBlog").attr('value', '');
$("#jsuriBlog").attr('disabled', 'disabled');
$("#jshomepage").attr("value", '');
}
});
});
</script>
<?php echo Bootstrap::formClose(); ?>

View File

@ -1,19 +1,29 @@
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
<?php echo Bootstrap::formOpen(array('id'=>'jsform', 'class'=>'tab-content')); ?>
<div class="align-middle">
<div class="float-right mt-1">
<button type="submit" class="btn btn-primary btn-sm" name="save"><?php $L->p('Save') ?></button>
<a class="btn btn-secondary btn-sm" href="<?php echo HTML_PATH_ADMIN_ROOT.'edit-user/'.$user->username() ?>" role="button"><?php $L->p('Cancel') ?></a>
</div>
<?php echo Bootstrap::pageTitle(array('title'=>$L->g('Change password'), 'icon'=>'person')); ?>
</div>
<?php
echo Bootstrap::pageTitle(array('title'=>$L->g('Change password'), 'icon'=>'person'));
echo Bootstrap::formOpen(array());
// Token CSRF
echo Bootstrap::formInputHidden(array(
'name'=>'tokenCSRF',
'value'=>$security->getTokenCSRF()
));
// Username
echo Bootstrap::formInputHidden(array(
'name'=>'username',
'value'=>$user->username()
));
// Username disabled
echo Bootstrap::formInputText(array(
'name'=>'usernameDisabled',
'label'=>$L->g('Username'),
@ -24,6 +34,7 @@ echo Bootstrap::formOpen(array());
'tip'=>''
));
// New password
echo Bootstrap::formInputText(array(
'name'=>'newPassword',
'label'=>$L->g('New password'),
@ -34,6 +45,7 @@ echo Bootstrap::formOpen(array());
'tip'=>''
));
// Confirm password
echo Bootstrap::formInputText(array(
'name'=>'confirmPassword',
'label'=>$L->g('Confirm new password'),
@ -43,14 +55,6 @@ echo Bootstrap::formOpen(array());
'placeholder'=>'',
'tip'=>''
));
echo '
<div class="form-group mt-4">
<button type="submit" class="btn btn-primary mr-2" name="save">'.$L->g('Save').'</button>
<a class="btn btn-secondary" href="'.HTML_PATH_ADMIN_ROOT.'edit-user/'.$user->username().'" role="button">'.$L->g('Cancel').'</a>
</div>
';
echo Bootstrap::formClose();
?>
<?php echo Bootstrap::formClose(); ?>

View File

@ -1,3 +1,5 @@
<?php defined('BLUDIT') or die('Bludit CMS.'); ?>
<?php
echo Bootstrap::pageTitle(array('title'=>$L->g('Users'), 'icon'=>'people'));
@ -13,8 +15,7 @@ echo '
<thead>
<tr>
<th class="border-bottom-0" scope="col">'.$L->g('Username').'</th>
<th class="border-bottom-0 d-none d-lg-table-cell" scope="col">'.$L->g('First name').'</th>
<th class="border-bottom-0 d-none d-lg-table-cell" scope="col">'.$L->g('Last name').'</th>
<th class="border-bottom-0 d-none d-lg-table-cell" scope="col">'.$L->g('Nickname').'</th>
<th class="border-bottom-0" scope="col">'.$L->g('Email').'</th>
<th class="border-bottom-0" scope="col">'.$L->g('Status').'</th>
<th class="border-bottom-0" scope="col">'.$L->g('Role').'</th>
@ -29,9 +30,8 @@ foreach ($list as $username) {
try {
$user = new User($username);
echo '<tr>';
echo '<td><a href="'.HTML_PATH_ADMIN_ROOT.'edit-user/'.$username.'">'.$username.'</a></td>';
echo '<td class="d-none d-lg-table-cell">'.$user->firstName().'</td>';
echo '<td class="d-none d-lg-table-cell">'.$user->lastName().'</td>';
echo '<td><img class="profilePicture mr-1" alt="" src="'.(Sanitize::pathFile(PATH_UPLOADS_PROFILES.$user->username().'.png')?DOMAIN_UPLOADS_PROFILES.$user->username().'.png':HTML_PATH_ADMIN_THEME_IMG.'default.svg').'" /><a href="'.HTML_PATH_ADMIN_ROOT.'edit-user/'.$username.'">'.$username.'</a></td>';
echo '<td class="d-none d-lg-table-cell">'.$user->nickname().'</td>';
echo '<td>'.$user->email().'</td>';
echo '<td>'.($user->enabled()?'<b>'.$L->g('Enabled').'</b>':$L->g('Disabled')).'</td>';
if ($user->role()=='admin') {

View File

@ -1,6 +1,19 @@
<?php defined('BLUDIT') or die('Bludit CMS.');
header('Content-Type: application/json');
// $_POST
// ----------------------------------------------------------------------------
// (string) $_POST['username']
$username = empty($_POST['username']) ? false : $_POST['username'];
// ----------------------------------------------------------------------------
if ($username===false) {
exit (json_encode(array(
'status'=>1,
'message'=>'Error in username.'
)));
}
if (!isset($_FILES['profilePictureInputFile'])) {
exit (json_encode(array(
'status'=>1,
@ -10,8 +23,6 @@ if (!isset($_FILES['profilePictureInputFile'])) {
// File extension
$fileExtension = pathinfo($_FILES['profilePictureInputFile']['name'], PATHINFO_EXTENSION);
// Username who is uploading the image
$username = $login->username();
// Tmp filename
$tmpFilename = $username.'.'.$fileExtension;
// Final filename

View File

@ -44,6 +44,7 @@ foreach ($_FILES['bluditInputFiles']['name'] as $key=>$filename) {
// Check file extension
$fileExtension = pathinfo($filename, PATHINFO_EXTENSION);
$fileExtension = Text::lowercase($fileExtension);
if (!in_array($fileExtension, $allowedExtensions) ) {
$message = 'Extension file not supported.';
Log::set($message, LOG_TYPE_ERROR);
@ -53,7 +54,7 @@ foreach ($_FILES['bluditInputFiles']['name'] as $key=>$filename) {
)));
}
// Get the next filename to not overwrite the original file
// Generate the next filename to not overwrite the original file
$nextFilename = Filesystem::nextFilename($uploadDirectory, $filename);
// Move from temporary directory to uploads folder
@ -66,8 +67,8 @@ foreach ($_FILES['bluditInputFiles']['name'] as $key=>$filename) {
symlink($uploadDirectory.$nextFilename, $thumbnailDirectory.$nextFilename);
} else {
$Image = new Image();
$Image->setImage($uploadDirectory.$nextFilename, $GLOBALS['THUMBNAILS_WIDTH'], $GLOBALS['THUMBNAILS_HEIGHT'], 'crop');
$Image->saveImage($thumbnailDirectory.$nextFilename, $GLOBALS['THUMBNAILS_QUALITY'], true);
$Image->setImage($uploadDirectory.$nextFilename, $site->thumbnailWidth(), $site->thumbnailHeight(), 'crop');
$Image->saveImage($thumbnailDirectory.$nextFilename, $site->thumbnailQuality(), true);
}
}

View File

@ -1,10 +1,10 @@
<?php defined('BLUDIT') or die('Bludit CMS.');
// Bludit version
define('BLUDIT_VERSION', '3.2');
define('BLUDIT_CODENAME', 'Yeast');
define('BLUDIT_RELEASE_DATE', '2018-10-20');
define('BLUDIT_BUILD', '20181020');
define('BLUDIT_VERSION', '3.5');
define('BLUDIT_CODENAME', 'IPA');
define('BLUDIT_RELEASE_DATE', '2018-12-01');
define('BLUDIT_BUILD', '201811201');
// Debug mode
// Change to FALSE, for prevent warning or errors on browser

View File

@ -101,8 +101,3 @@ $GLOBALS['MEDIA_MANAGER_NUMBER_OF_FILES'] = 5;
// Sort the image by date
$GLOBALS['MEDIA_MANAGER_SORT_BY_DATE'] = true;
// Thubmnails size
$GLOBALS['THUMBNAILS_WIDTH'] = 400;
$GLOBALS['THUMBNAILS_HEIGHT'] = 400;
$GLOBALS['THUMBNAILS_QUALITY'] = 100;

View File

@ -668,21 +668,21 @@ function checkRole($allowRoles, $redirect=true) {
// Add a new category to the system
// Returns TRUE is successfully added, FALSE otherwise
function createCategory($category) {
function createCategory($args) {
global $categories;
global $L;
global $syslog;
if (Text::isEmpty($category)) {
if (Text::isEmpty($args['name'])) {
Alert::set($L->g('Category name is empty'), ALERT_STATUS_FAIL);
return false;
}
if ($categories->add(array('name'=>$category))) {
if ($categories->add(array('name'=>$args['name'], 'description'=>$args['description']))) {
// Add to syslog
$syslog->add(array(
'dictionaryKey'=>'new-category-created',
'notes'=>$category
'notes'=>$args['name']
));
Alert::set($L->g('Category added'), ALERT_STATUS_OK);
@ -790,16 +790,18 @@ function getTag($key) {
}
}
// Activate a theme
function activateTheme($themeDirectory) {
global $site;
global $syslog;
global $L;
if (Sanitize::pathFile(PATH_THEMES.$themeDirectory)) {
$site->set(array('theme'=>$themeDirname));
$site->set(array('theme'=>$themeDirectory));
$syslog->add(array(
'dictionaryKey'=>'new-theme-configured',
'notes'=>$themeDirname
'notes'=>$themeDirectory
));
Alert::set( $L->g('The changes have been saved') );

View File

@ -206,8 +206,8 @@ class Filesystem {
// Returns the next filename if the filename already exist
public static function nextFilename($path=PATH_UPLOADS, $filename) {
// Clean filename and get extension
$filename = Text::lowercase($filename);
$fileExtension = pathinfo($filename, PATHINFO_EXTENSION);
$fileExtension = Text::lowercase($fileExtension);
$filename = pathinfo($filename, PATHINFO_FILENAME);
$filename = Text::replace(' ', '', $filename);
$filename = Text::replace('_', '', $filename);

View File

@ -30,13 +30,11 @@ class Image {
if ($forcePNG) {
$extension = 'png';
}
elseif($forceJPG) {
} elseif ($forceJPG) {
$extension = 'jpg';
}
switch($extension)
{
switch ($extension) {
case 'jpg':
case 'jpeg':
// Checking for JPG support

View File

@ -2,6 +2,26 @@
class Theme {
public static function socialNetworks()
{
global $site;
$socialNetworks = array(
'github'=>'Github',
'twitter'=>'Twitter',
'facebook'=>'Facebook',
'instagram'=>'Instagram',
'codepen'=>'Codepen',
'linkedin'=>'Linkedin'
);
foreach ($socialNetworks as $key=>$label) {
if (!$site->{$key}()) {
unset($socialNetworks[$key]);
}
}
return $socialNetworks;
}
public static function title()
{
global $site;

View File

@ -111,18 +111,6 @@ class Language extends dbJSON {
$this->db = array_merge($array, $this->db);
}
/*
// Returns the item from language-data
public function getData($key)
{
if (isset($this->data[$key])) {
return $this->data[$key];
}
return false;
}
*/
// Returns an array with all dictionaries
public function getLanguageList()
{

View File

@ -280,6 +280,9 @@ class Pages extends dbJSON {
Log::set(__METHOD__.LOG_SEP.'Error occurred when trying to delete the directory '.PATH_PAGES.$key);
}
// Delete page images directory; The function already check if exists the directory
Filesystem::deleteRecursive(PATH_UPLOADS_PAGES.$this->db[$key]['uuid']);
// Remove from database
unset($this->db[$key]);

View File

@ -304,20 +304,20 @@ class Page {
// Returns the endpoint of the thumbnail cover image, FALSE if the page doesn't have a cover image
public function thumbCoverImage()
{
$coverImageFilename = $this->coverImage(false);
if ($coverImageFilename==false) {
$filename = $this->coverImage(false);
if ($filename==false) {
return false;
}
// Check is external cover image
if (filter_var($coverImageFilename, FILTER_VALIDATE_URL)) {
return $coverImageFilename;
if (filter_var($filename, FILTER_VALIDATE_URL)) {
return $filename;
}
if (IMAGE_RESTRICT) {
return DOMAIN_UPLOADS_PAGES.$this->uuid().'/thumbnails/'.$filename;
}
return DOMAIN_UPLOADS_THUMBNAILS.$coverImageFilename;
return DOMAIN_UPLOADS_THUMBNAILS.$filename;
}
// Returns TRUE if the content has the text splited

View File

@ -10,8 +10,8 @@ class Site extends dbJSON {
'language'=> 'en',
'locale'=> 'en, en_US, en_AU, en_CA, en_GB, en_IE, en_NZ',
'timezone'=> 'America/Argentina/Buenos_Aires',
'theme'=> 'pure',
'adminTheme'=> 'default',
'theme'=> 'alternative',
'adminTheme'=> 'booty',
'homepage'=> '',
'pageNotFound'=> '',
'uriPage'=> '/',
@ -26,7 +26,6 @@ class Site extends dbJSON {
'twitter'=> '',
'facebook'=> '',
'codepen'=> '',
'googlePlus'=> '',
'instagram'=> '',
'github'=> '',
'gitlab'=> '',
@ -40,7 +39,10 @@ class Site extends dbJSON {
'titleFormatCategory'=> '{{category-name}} | {{site-title}}',
'titleFormatTag'=> '{{tag-name}} | {{site-title}}',
'imageRestrict'=> true,
'imageRelativeToAbsolute'=> false
'imageRelativeToAbsolute'=> false,
'thumbnailWidth' => 400, // px
'thumbnailHeight' => 400, // px
'thumbnailQuality' => 100
);
function __construct()
@ -110,6 +112,21 @@ class Site extends dbJSON {
return DOMAIN_BASE.'sitemap.xml';
}
public function thumbnailWidth()
{
return $this->getField('thumbnailWidth');
}
public function thumbnailHeight()
{
return $this->getField('thumbnailHeight');
}
public function thumbnailQuality()
{
return $this->getField('thumbnailQuality');
}
public function autosaveInterval()
{
return $this->getField('autosaveInterval');

View File

@ -13,7 +13,7 @@ class User {
$row = $users->getDefaultFields();
} else {
if (Text::isEmpty($username) || !$users->exists($username)) {
$errorMessage = 'User not found in database by username ['.$username.']';
$errorMessage = 'User not found in the database by username ['.$username.']';
Log::set(__METHOD__.LOG_SEP.$errorMessage);
throw new Exception($errorMessage);
}
@ -140,6 +140,11 @@ class User {
return $this->getValue('linkedin');
}
public function mastodon()
{
return $this->getValue('mastodon');
}
public function profilePicture()
{
$filename = $this->getValue('username').'.png';

View File

@ -6,7 +6,7 @@ class Users extends dbJSON {
'firstName'=>'',
'lastName'=>'',
'nickname'=>'',
'role'=>'editor', // admin, editor
'role'=>'editor', // admin, editor, writer
'password'=>'',
'salt'=>'!Pink Floyd!Welcome to the machine!',
'email'=>'',

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -365,5 +365,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -3,7 +3,7 @@
"native": "Deutsch (Schweiz)",
"english-name": "German",
"locale": "de, de_CH",
"last-update": "2018-10-08",
"last-update": "2018-11-28",
"authors": [
"Clickwork https:\/\/clickwork.ch",
"blog2read https:\/\/github.com\/blog2read",
@ -360,10 +360,21 @@
"good-morning": "Guten Morgen",
"good-afternoon": "Guten Nachmittag",
"good-evening": "Guten Abend",
"good-night": "Good night",
"good-night": "Gute Nacht",
"hello": "Hallo",
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"there-are-no-images-for-the-page": "Für diesen Inhalt sind keine Bilder vorhanden.",
"select-cover-image": "Wähle ein Hauptbild",
"this-plugin-depends-on-the-following-plugins": "Um dieses Plugin zu verwenden, braucht es auch folgendes Plugin:",
"no-pages-found": "Es wurden keine Seiten gefunden",
"system-updated": "Das System wurde aufdatiert",
"security": "Sicherheit",
"remove-cover-image": "Hauptbild entfernen",
"width": "Breite",
"height": "Höhe",
"quality": "Qualität",
"thumbnails": "Vorschaubilder",
"thumbnail": "Vorschaubild",
"thumbnail-width-in-pixels": "Breite der Vorschaubilder in Pixel (px).",
"thumbnail-height-in-pixels": "Höhe der Vorschaubilder in Pixel (px).",
"thumbnail-quality-in-percentage": "Qualität der Vorschaubilder in Prozent (%)."
}

View File

@ -3,7 +3,7 @@
"native": "Deutsch (Deutschland)",
"english-name": "German",
"locale": "de, de_DE",
"last-update": "2018-10-08",
"last-update": "2018-11-28",
"authors": [
"Clickwork https:\/\/clickwork.ch",
"blog2read https:\/\/github.com\/blog2read",
@ -362,8 +362,19 @@
"good-evening": "Guten Abend",
"good-night": "Gute Nacht",
"hello": "Hallo",
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"there-are-no-images-for-the-page": "Für diesen Inhalt sind keine Bilder vorhanden.",
"select-cover-image": "Wähle ein Hauptbild",
"this-plugin-depends-on-the-following-plugins": "Um dieses Plugin zu verwenden, braucht es auch folgendes Plugin:",
"no-pages-found": "Es wurden keine Seiten gefunden",
"system-updated": "Das System wurde aufdatiert",
"security": "Sicherheit",
"remove-cover-image": "Hauptbild entfernen",
"width": "Breite",
"height": "Höhe",
"quality": "Qualität",
"thumbnails": "Vorschaubilder",
"thumbnail": "Vorschaubild",
"thumbnail-width-in-pixels": "Breite der Vorschaubilder in Pixel (px).",
"thumbnail-height-in-pixels": "Höhe der Vorschaubilder in Pixel (px).",
"thumbnail-quality-in-percentage": "Qualität der Vorschaubilder in Prozent (%)."
}

View File

@ -318,7 +318,7 @@
"user": "User",
"date-format-format": "Date format: <code>YYYY-MM-DD Hours:Minutes:Seconds<\/code>",
"start-typing-a-page-title-to-see-a-list-of-suggestions": "Start typing a page title to see a list of suggestions.",
"field-used-when-ordering-content-by-position": "Field used when ordering content by position",
"field-used-when-ordering-content-by-position": "Field used when ordering content by position.",
"write-a-template-name-to-filter-the-page-in-the-theme-and-change-the-style-of-the-page": "Write a template name to filter the page in the theme and change the style of the page.",
"write-the-tags-separated-by-comma": "Write the tags separated by comma.",
"apply-code-noindex-code-to-this-page": "Apply <code>noindex<\/code> to this page.",
@ -365,5 +365,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found.",
"system-updated": "System updated.",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -313,18 +313,18 @@
"options": "Opciones",
"enter-title": "Ingrese el título",
"media-manager": "Administrar imagenes",
"set-a-cover-image-from-external-url,-such-as-a-cdn-or-some-server-dedicated-for-images": "Defina una imagen de portada desde una dirección URL externa, como una CDN o algún servidor dedicado a las imágenes.",
"set-a-cover-image-from-external-url,-such-as-a-cdn-or-some-server-dedicated-for-images": "Defina una imagen de portada desde una dirección URL externa, como una CDN o algún servidor dedicado a imágenes.",
"user": "Usuario",
"date-format-format": "Date format: <code>YYYY-MM-DD Hours:Minutes:Seconds<\/code>",
"start-typing-a-page-title-to-see-a-list-of-suggestions": "Empiece a escribir un título de página para ver una lista de sugerencias.",
"date-format-format": "Formato: <code>YYYY-MM-DD Horas:Minutos:Segundos<\/code>",
"start-typing-a-page-title-to-see-a-list-of-suggestions": "Escriba un título de página para ver una lista de sugerencias.",
"field-used-when-ordering-content-by-position": "Este campo es utilizado al ordenar el contenido por posición.",
"write-a-template-name-to-filter-the-page-in-the-theme-and-change-the-style-of-the-page": "Escriba un nombre de plantilla para cambiar el estilo de la página.",
"write-the-tags-separated-by-comma": "Escribe las etiquetas separadas por coma.",
"apply-code-noindex-code-to-this-page": "Apply <code>noindex<\/code> to this page.",
"apply-code-noindex-code-to-this-page": "Aplicar <code>noindex<\/code> a esta pagina.",
"this-tells-search-engines-not-to-show-this-page-in-their-search-results": "Indica a los motores de búsqueda que no muestren esta página en sus resultados de búsqueda.",
"apply-code-nofollow-code-to-this-page": "Apply <code>nofollow<\/code> to this page.",
"apply-code-nofollow-code-to-this-page": "Aplicar <code>nofollow<\/code> a esta pagina.",
"this-tells-search-engines-not-to-follow-links-on-this-page": "Indica a los motores de búsqueda que no sigan los enlaces de esta página.",
"apply-code-noarchive-code-to-this-page": "Apply <code>noarchive<\/code> to this page.",
"apply-code-noarchive-code-to-this-page": "Aplicar <code>noarchive<\/code> a esta pagina.",
"this-tells-search-engines-not-to-save-a-cached-copy-of-this-page": "Indica a los motores de búsqueda que no guarden una copia almacenada en caché de esta página.",
"uncategorized": "Sin categoría",
"done": "Hecho",
@ -345,7 +345,7 @@
"leave-empty-for-autocomplete-by-bludit": "Deje vacío para ser autocompletado por Bludit.",
"choose-a-password-for-the-user-admin": "Elija una contraseña para el usuario <code>admin<\/code>",
"access-denied": "Acceso denegado",
"choose-images-to-upload": "Elige imágenes para subir",
"choose-images-to-upload": "Seleccione una image para subir",
"insert": "Insertar",
"upload": "Subir",
"autosave": "Autoguardado",
@ -362,7 +362,18 @@
"good-night": "Buenas noches",
"hello": "Hola",
"there-are-no-images-for-the-page": "No hay imágenes para la página.",
"select-cover-image": "Seleccionar imagen de portada",
"select-cover-image": "Seleccionar portada",
"this-plugin-depends-on-the-following-plugins": "Este plugin depende de los siguientes plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No se han encontrado páginas.",
"system-updated": "Sistema actualizado.",
"security": "Seguridad",
"remove-cover-image": "Eliminar portada",
"width": "Ancho",
"height": "Alto",
"quality": "Calidad",
"thumbnails": "Miniaturas",
"thumbnail": "Miniatura",
"thumbnail-width-in-pixels": "Ancho de miniatura en píxeles (px).",
"thumbnail-height-in-pixels": "Altura de miniaturas en píxeles (px).",
"thumbnail-quality-in-percentage": "Calidad de la miniatura en porcentaje (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -365,5 +365,16 @@
"there-are-no-images-for-the-page": "Il ny a aucune images pour cette page.",
"select-cover-image": "Sélectionnez une image daccroche.",
"this-plugin-depends-on-the-following-plugins": "Ce plugin dépend des plugins suivants.",
"no-pages-found": "Aucune page trouvée"
"no-pages-found": "Aucune page trouvée",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -365,5 +365,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -365,5 +365,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -365,5 +365,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -365,5 +365,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -365,5 +365,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -361,5 +361,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -5,9 +5,9 @@
"locale": "ru, ru_RU",
"last-update": "2018-08-27",
"authors": [
"Сергей Ворон http:\/\/voron.pw",
"Сергей Ворон https:\/\/voron.pw",
"Макс Костиков https:\/\/kostikov.co",
"",
"Paul https:\/\/r-e-d.red",
""
]
},
@ -60,7 +60,7 @@
"language": "Язык",
"plugin": "Плагин",
"plugins": "Плагины",
"developers": "Разработчики",
"developers": "Информация для разработчиков",
"themes": "Темы",
"about": "О системе",
"url": "URL",
@ -76,13 +76,13 @@
"settings": "Настройки",
"general": "Основные",
"advanced": "Расширенные",
"new-content": "Новый контент",
"manage-content": "Управление контентом",
"add-new-content": "Добавить новый контент",
"new-content": "Новая запись",
"manage-content": "Управление записями",
"add-new-content": "Добавить новую запись",
"new-category": "Новая категория",
"you-do-not-have-sufficient-permissions": "У вас недостаточно прав для доступа к этой странице, обратитесь к администратору.",
"add-a-new-user": "Добавить пользователя",
"url-associated-with-the-content": "Связанный с контентом URL",
"url-associated-with-the-content": "URL данной записи",
"language-and-timezone": "Язык и часовой пояс",
"change-your-language-and-region-settings": "Изменить настройки языка и региона",
"notifications": "Оповещения",
@ -132,7 +132,7 @@
"username": "Логин",
"first-name": "Имя",
"last-name": "Фамилия",
"to-schedule-the-content-select-the-date-and-time": "Укажите дату и время когда этот контент будет \"Опубликован\".",
"to-schedule-the-content-select-the-date-and-time": "Укажите дату и время когда эта запись будет \"Опубликована\".",
"email": "Email",
"role": "Роль",
"registered": "Зарегистрирован",
@ -169,14 +169,14 @@
"editor": "Редактор",
"administrator": "Администратор",
"edit-user": "Редактирование пользователя",
"edit-content": "Редактировать контент",
"edit-content": "Редактировать запись",
"profile": "Профиль",
"change-password": "Изменить пароль",
"enabled": "Включен",
"disable-the-user": "Отключить пользователя",
"profile-picture": "Изображение профиля",
"edit-or-delete-your-categories": "Редактировать или удалить Ваши категории",
"create-a-new-category-to-organize-your-content": "Создать новую категорию для упорядочивания Вашего контента",
"create-a-new-category-to-organize-your-content": "Создать новую категорию для упорядочивания Ваших записей",
"confirm-delete-this-action-cannot-be-undone": "Подтвердите удаление, это действие не обратимо.",
"do-you-want-to-disable-the-user": "Вы хотите отключить пользователя?",
"new-password": "Новый пароль",
@ -185,9 +185,9 @@
"invite-a-friend-to-collaborate-on-your-site": "Пригласить друга для совместной работы на сайте",
"number-of-items-to-show-per-page": "Количество элементов, отображаемых на странице.",
"website-or-blog": "«Веб-сайт» или «Блог»",
"order-content-by": "Сортировать контент по",
"edit-or-delete-content-from-your-site": "Редактировать или удалить контент на Вашем сайте",
"order-the-content-by-date-to-build-a-blog": "Сортировать контент по дате для режима «Блог» или по содержимому для режима «Веб-сайт».",
"order-content-by": "Сортировать записи по",
"edit-or-delete-content-from-your-site": "Редактировать или удалить запись на Вашем сайте",
"order-the-content-by-date-to-build-a-blog": "Сортировать записи по дате для режима «Блог» или по содержимому для режима «Веб-сайт».",
"page-not-found-content": "Привет! Похоже, что страница не существует",
"page-not-found": "Страница не найдена",
"predefined-pages": "Предопределенные страницы",
@ -228,26 +228,26 @@
"password-must-be-at-least-6-characters-long": "Пароль должен содержать как минимум 6 символов",
"ip-address-has-been-blocked": "IP адрес заблокирован.",
"try-again-in-a-few-minutes": "Попробуйте еще раз через несколько минут.",
"content-published-from-scheduler": "Запланированный контент опубликован",
"content-published-from-scheduler": "Запланированная запись опубликована",
"blog": "Блог",
"complete-all-fields": "Заполните все поля",
"static": "Статические",
"static": "Статическая",
"about-your-site-or-yourself": "О Вас или Вашем сайте",
"homepage": "Домашняя страница",
"disabled": "Отключен",
"to-enable-the-user-you-must-set-a-new-password": "Для активации пользователя Вы должны задать новый пароль.",
"delete-the-user-and-associate-his-content-to-admin-user": "Удалить пользователя и связать его контент с учётной записью администратора",
"delete-the-user-and-all-his-content": "Удалить пользователя и весь его контент",
"delete-the-user-and-associate-his-content-to-admin-user": "Удалить пользователя и связать его записи с учётной записью администратора",
"delete-the-user-and-all-his-content": "Удалить пользователя и все его записи",
"user-disabled": "Пользователь отключен",
"user-password-changed": "Пароль пользователя изменен",
"the-password-and-confirmation-password-do-not-match": "Пароль и его подтверждение не совпадают",
"scheduled-content": "Запланированный контент",
"there-are-no-scheduled-content": "Нет запланированного контента",
"new-content-created": "Новый контент создан",
"content-edited": "Контент отредактирован",
"content-deleted": "Контент удалён",
"scheduled-content": "Запланированная запись",
"there-are-no-scheduled-content": "Нет запланированных записей",
"new-content-created": "Новая запись создана",
"content-edited": "Запись отредактирована",
"content-deleted": "Запись удалена",
"undefined": "Неопределено",
"create-new-content-for-your-site": "Создать новый контент для сайта",
"create-new-content-for-your-site": "Создать новую запись для сайта",
"there-are-no-draft-content": "Черновиков нет",
"order-items-by": "Упорядочить по",
"all-content": "Всё содержимое",
@ -256,7 +256,7 @@
"draft-content": "Содержимое черновика",
"post": "Опубликовать",
"default": "По умолчанию",
"latest-content": "Последний контент",
"latest-content": "Последняя запись",
"default-message": "Сообщение по умолчанию",
"no-parent": "Нет родителя",
"have-you-seen-my-ball": "Ты мой мячик видел?",
@ -280,9 +280,9 @@
"reading-time": "Время чтения",
"minutes": "минуты",
"minute": "минут",
"example-page-1-slug": "создайте-свой-собственный-контент",
"example-page-1-title": "Создайте свой собственный контент",
"example-page-1-content": "Начните писать свой собственный контент или отредактируйте текущий, чтобы он соответствовал вашим потребностям. Для создания, редактирования или удаления контента вам необходимо войти в [панель управления](.\/admin) с именем пользователя `admin` и паролем, который вы установили в процессе установки.",
"example-page-1-slug": "создайте-свою-собственную-запись",
"example-page-1-title": "Создайте свою собственную запись",
"example-page-1-content": "Начните писать свой собственный контент или отредактируйте текущий, чтобы он соответствовал вашим потребностям. Для создания, редактирования или удаления записей вам необходимо войти в [панель управления](.\/admin) с именем пользователя `admin` и паролем, который вы установили в процессе установки.",
"example-page-2-slug": "настройте-свой-новый-сайт",
"example-page-2-title": "Настройте свой новый сайт",
"example-page-2-content": "Обновите настройки своего сайта в [панели управления](.\/admin), вы можете изменить название, описание и социальные сети в [Настройки > Общие](.\/admin\/settings-general).",
@ -335,7 +335,7 @@
"the-nickname-is-almost-used-in-the-themes-to-display-the-author-of-the-content": "Псевдоним, в основном, используется в темах для отображения авторства содержимого",
"allow-unicode": "Разрешить Unicode",
"allow-unicode-characters-in-the-url-and-some-part-of-the-system": "Разрешить символы Unicode в URL и других частях системы.",
"variables-allowed": "Разрешённые переменные",
"variables-allowed": "Переменные разрешены",
"tag": "Тег",
"drag-and-drop-to-sort-the-plugins": "Отсортируйте плагин перетаскиванием.",
"seo": "SEO",
@ -354,16 +354,27 @@
"site": "Сайт",
"first": "Первый",
"last": "Последний",
"there-are-no-pages-at-this-moment": "В настоящее время страниц нет.",
"there-are-no-static-pages-at-this-moment": "В настоящее время статических страниц нет.",
"there-are-no-draft-pages-at-this-moment": "В настоящее время черновиков нет.",
"there-are-no-pages-at-this-moment": "На данный момент записей нет.",
"there-are-no-static-pages-at-this-moment": "На данный момент статических записей нет.",
"there-are-no-draft-pages-at-this-moment": "На данный момент черновиков нет.",
"good-morning": "Доброе утро",
"good-afternoon": "Добрый день",
"good-evening": "Добрый вечер",
"good-night": "Доброй ночи",
"hello": "Привет",
"there-are-no-images-for-the-page": "На вашей странице нет изображений.",
"select-cover-image": "Выбрать изображение обложки",
"there-are-no-images-for-the-page": "Для этой страницы нет изображений.",
"select-cover-image": "Выберите обложку записи",
"this-plugin-depends-on-the-following-plugins": "Этот плагин зависит от следующих плагинов.",
"no-pages-found": "Страниц не найдено"
"no-pages-found": "Страниц не найдено",
"system-updated": "Система обновлена",
"security": "Безопасность",
"remove-cover-image": "Удалить изображение обложки",
"width": "Ширина",
"height": "Высота",
"quality": "Качество",
"thumbnails": "Миниатюры",
"thumbnail": "Миниатюра изображения",
"thumbnail-width-in-pixels": "Ширина миниатюры изображения в пикселях (px).",
"thumbnail-height-in-pixels": "Высота миниатюры изображения в пикселях (px).",
"thumbnail-quality-in-percentage": "Качество миниатюры изображения в процентах (%)."
}

View File

@ -3,7 +3,7 @@
"native": "Türkçe",
"english-name": "Turkish",
"locale": "tr, tr_TR",
"last-update": "2018-09-18",
"last-update": "2018-11-24",
"authors": [
"Ali Demirtas",
"guleyc",
@ -366,5 +366,16 @@
"there-are-no-images-for-the-page": "Sayfa için resim yok.",
"select-cover-image": "Kapak resmini seç",
"this-plugin-depends-on-the-following-plugins": "Bu eklenti aşağıdaki eklentilere bağlıdır.",
"no-pages-found": "No pages found"
"no-pages-found": "Sayfa bulunamadı",
"system-updated": "Sistem güncellendi",
"security": "Güvenlik",
"remove-cover-image": "Kapak resmini kaldır",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -3,11 +3,11 @@
"native": "Українська (Україна)",
"english-name": "Ukrainian",
"locale": "uk_UA",
"last-update": "2018-09-09",
"last-update": "2018-11-30",
"authors": [
"Aleksei86 https:\/\/aleksei86.info\/",
"Alek Belta https:\/\/alekbelta.com\/",
"",
"Paul https:\/\/r-e-d.red\/",
""
]
},
@ -354,16 +354,27 @@
"site": "Сайт",
"first": "Перший",
"last": "Останній",
"there-are-no-pages-at-this-moment": "There are no pages at this moment.",
"there-are-no-static-pages-at-this-moment": "There are no static pages at this moment.",
"there-are-no-draft-pages-at-this-moment": "There are no draft pages at this moment.",
"there-are-no-pages-at-this-moment": "Наразі немає сторінок.",
"there-are-no-static-pages-at-this-moment": "Наразі статичних сторінок немає.",
"there-are-no-draft-pages-at-this-moment": "Наразі немає чернеток сторінок.",
"good-morning": "Доброго ранку",
"good-afternoon": "Доброго дня",
"good-evening": "Доброго вечора",
"good-night": "Good night",
"good-night": "Надобраніч",
"hello": "Вітаю",
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"there-are-no-images-for-the-page": "Немає сторінок зображення.",
"select-cover-image": "Виберіть обкладинку записи",
"this-plugin-depends-on-the-following-plugins": "Цей плагін залежить від наступних плагінів.",
"no-pages-found": "Сторінок не знайдено",
"system-updated": "Система оновлена",
"security": "Безпека",
"remove-cover-image": "Видалити обкладинку записи",
"width": "Ширина",
"height": "Висота",
"quality": "Якість",
"thumbnails": "Мініатюри",
"thumbnail": "Мініатюра",
"thumbnail-width-in-pixels": "Ширина мініатюри в пікселях (px).",
"thumbnail-height-in-pixels": "Висота мініатюри в пікселях (px).",
"thumbnail-quality-in-percentage": "Якість мініатюри у відсотках (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -364,5 +364,16 @@
"there-are-no-images-for-the-page": "There are no images for the page.",
"select-cover-image": "Select cover image",
"this-plugin-depends-on-the-following-plugins": "This plugin depends on the following plugins.",
"no-pages-found": "No pages found"
"no-pages-found": "No pages found",
"system-updated": "System updated",
"security": "Security",
"remove-cover-image": "Remove cover image",
"width": "Width",
"height": "Height",
"quality": "Quality",
"thumbnails": "Thumbnails",
"thumbnail": "Thumbnail",
"thumbnail-width-in-pixels": "Thumbnail width in pixels (px).",
"thumbnail-height-in-pixels": "Thumbnail height in pixels (px).",
"thumbnail-quality-in-percentage": "Thumbnail quality in percentage (%)."
}

View File

@ -2,6 +2,6 @@
"plugin-data":
{
"name": "О блоге",
"description": "Небольшое описание о вашем сайте или о себя."
"description": "Небольшое описание о вашем сайте или о себе."
}
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -2,10 +2,10 @@
"plugin-data":
{
"name": "API",
"description": "Интерфейс для взаимодействия с Bludit по HTTP-протоколу. <br> Узнать больше про этот плагин <a href=\"https://docs.bludit.com/en/api/introduction\">API Introduction</a>."
"description": "Интерфейс для взаимодействия с Bludit по HTTP-протоколу. <br> Узнайте больше про этот плагин в <a href=\"https://docs.bludit.com/en/api/introduction\">API Introduction</a>."
},
"api-token": "API Tтокен",
"api-token": "API Tокен",
"amount-of-pages": "Количество страниц",
"this-is-the-maximum-of-pages-to-return-when-you-call-to": "Максимальное количество возвращаемых страниц при обращении к /api/pages",
"this-token-is-for-read-only-and-is-regenerated-every-time-you-install-the-plugin": "Данные токен используется только для чтения, он обновляется при каждой переустановке плагина"
"this-token-is-for-read-only-and-is-regenerated-every-time-you-install-the-plugin": "Данный токен используется только для чтения, он обновляется при каждой переустановке плагина"
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -0,0 +1,12 @@
{
"plugin-data":
{
"name": "Резервные копии",
"description": "Самый простой способ создать резервную копию вашего сайта."
},
"create-backup": "Создать резервную копию",
"download": "Загрузить",
"restore-backup": "Восстановление из резервной копии",
"delete-backup": "Удалить резервную копию",
"there-are-no-backups-for-the-moment": "На данный момент резервных копий нет"
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -0,0 +1,8 @@
{
"plugin-data":
{
"name": "Hit Counter",
"description": "Anzeige der Anzahl der Seitenaufrufe oder der Besuche der Website in der Seitenleiste."
},
"show-unique-visitors": "Anzahl der Besuche"
}

View File

@ -0,0 +1,8 @@
{
"plugin-data":
{
"name": "Hit Counter",
"description": "Anzeige der Anzahl der Seitenaufrufe oder der Besuche der Website in der Seitenleiste."
},
"show-unique-visitors": "Anzahl der Besuche"
}

View File

@ -2,6 +2,6 @@
"plugin-data":
{
"name": "Contador de visitas",
"description": "Muestre el número de visitas o visitantes únicos en la barra lateral de su sitio."
"description": "Muestra el número de visitas o visitantes únicos en la barra lateral de su sitio."
}
}

View File

@ -0,0 +1,7 @@
{
"plugin-data":
{
"name": "Счётчик посещений",
"description": "Показывает количество посещений или уникальных посетителей на боковой панели вашего сайта."
}
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -0,0 +1,10 @@
{
"plugin-data":
{
"name": "HTML Код",
"description": "Добавьте код HTML, CSS или Javascript в метаданные заголовка, заголовок или нижний колонтитул вашего сайта."
},
"insert-code-in-the-theme-inside-the-tag-head": "Вставить код в тему внутри тега &#60;head&#62; &#60;/head&#62;",
"insert-code-in-the-theme-at-the-top": "Вставьте код в тему вверху.",
"insert-code-in-the-theme-at-the-bottom": "Вставьте код в тему внизу."
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -6,5 +6,5 @@
},
"enable-maintenance-mode": "Включить режим обслуживания",
"message": "Сообщение"
"message": "Сообщение, которое увидят посетители сайта"
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -0,0 +1,10 @@
{
"plugin-data":
{
"name": "Навигация",
"description": "Меню навигации с родительскими и дочерними страницами/записями для боковой панели."
},
"home-link": "Домашняя ссылка",
"show-the-home-link-on-the-sidebar": "Показать ссылку на домашнюю страницу на боковой панели.",
"amount-of-items": "Количество элементов"
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -3,5 +3,7 @@
{
"name": "Open Graph",
"description": "Open Graph ви позволява да свържете вашето съдържание със социални мрежи."
}
},
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -4,5 +4,6 @@
"name": "Open Graph",
"description": "Plugin zur Verwendung des Open Graph Protocols (beispielsweise für Facebook)."
},
"default-image": "Standardbild"
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -4,5 +4,6 @@
"name": "Open Graph",
"description": "Plugin zur Verwendung des Open Graph Protocols (beispielsweise für Facebook)."
},
"default-image": "Standardbild"
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -4,5 +4,6 @@
"name": "Open Graph",
"description": "The Open Graph protocol enables any web page to become a rich object in a social graph."
},
"default-image": "Default image"
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -4,5 +4,6 @@
"name": "Open Graph",
"description": "Este complemento mejora las publicaciones en las redes sociales con este plugin."
},
"default-image": "Imagen predeterminada"
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -3,5 +3,7 @@
{
"name": "Open Graph",
"description": "Permets à nimporte quelle page web de devenir lobjet enrichi dun graphe social. Par exemple, il est utilisé sur Facebook pour permettre à une page web de bénéficier des mêmes fonctionnalités que nimporte quel autre objet sur Facebook."
}
},
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -4,5 +4,6 @@
"name": "Open Graph",
"description": "Il protocollo Open Graph permette a qualsiasi pagina web di diventare un rich object in un social graph."
},
"default-image": "Immagine predefinita"
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -3,5 +3,7 @@
{
"name": "Open Graph",
"description": "Open Graph protocol(OGP)を有効にすると、Webページがソーシャルグラフ上のリッチなオブジェクトになります。"
}
},
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -3,5 +3,7 @@
{
"name": "Open Graph",
"description": "De Open Graph protocol kan van elke webpagina een rich object in een sociale grafiek maken."
}
},
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -3,5 +3,7 @@
{
"name": "Open Graph",
"description": "Protokół Open Graph zezwala stronie na stosowanie meta tagów używanych w serwisach społecznościowych."
}
},
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -3,5 +3,7 @@
{
"name": "Open Graph",
"description": "Протокол Open Graph дает возможность связывать свой контент с социальными сетями."
}
},
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -4,5 +4,6 @@
"name": "Open Graph",
"description": "Open Graph protokolü sosyal bir grafikte zengin bir nesne halinde herhangi bir web sayfasını sağlar."
},
"default-image": "Varsayılan resim"
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -3,5 +3,7 @@
{
"name": "Open Graph",
"description": "Протокол Open Graph дозволяє ділитися будь-якою веб-сторінкою у соціальних мережах."
}
},
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -3,5 +3,7 @@
{
"name": "開放社交關係圖",
"description": "開放社交關係圖協定可以讓任何網頁變成豐富的物件"
}
},
"set-a-default-image-for-content": "Set a default image for the content without pictures.",
"set-your-facebook-app-id": "Set your Facebook App ID."
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com",
"version": "3.2",
"releaseDate": "2018-10-20",
"version": "3.5",
"releaseDate": "2018-11-25",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

View File

@ -6,7 +6,8 @@ class pluginOpenGraph extends Plugin {
{
// Fields and default values for the database of this plugin
$this->dbFields = array(
'defaultImage'=>''
'defaultImage'=>'',
'fbAppId'=>''
);
}
@ -21,7 +22,13 @@ class pluginOpenGraph extends Plugin {
$html .= '<div>';
$html .= '<label>'.$L->get('Default image').'</label>';
$html .= '<input id="jsdefaultImage" name="defaultImage" type="text" value="'.$this->getValue('defaultImage').'" placeholder="https://">';
$html .= '<span class="tip">Set a default image for the content without pictures.</span>';
$html .= '<span class="tip">'.$L->g('set-a-default-image-for-content').'</span>';
$html .= '</div>';
$html .= '<div>';
$html .= '<label>'.$L->get('Facebook App ID').'</label>';
$html .= '<input name="fbAppId" type="text" value="'.$this->getValue('fbAppId').'" placeholder="App ID">';
$html .= '<span class="tip">'.$L->g('set-your-facebook-app-id').'</span>';
$html .= '</div>';
return $html;
@ -60,8 +67,10 @@ class pluginOpenGraph extends Plugin {
// The user is in the homepage
default:
$pageContent = '';
// The image it's from the first page
if (isset($content[0]) ) {
if (Text::isNotEmpty($this->getValue('defaultImage'))) {
$og['image'] = $this->getValue('defaultImage');
}
elseif (isset($content[0]) ) {
$og['image'] = $content[0]->coverImage($absolute=true);
$pageContent = $content[0]->content();
}
@ -74,7 +83,7 @@ class pluginOpenGraph extends Plugin {
$html .= '<meta property="og:title" content="'.$og['title'].'">'.PHP_EOL;
$html .= '<meta property="og:description" content="'.$og['description'].'">'.PHP_EOL;
$html .= '<meta property="og:url" content="'.$og['url'].'">'.PHP_EOL;
$html .= '<meta property="og:siteName" content="'.$og['siteName'].'">'.PHP_EOL;
$html .= '<meta property="og:site_name" content="'.$og['siteName'].'">'.PHP_EOL;
// If the page doesn't have a coverImage try to get an image from the HTML content
if (empty($og['image'])) {
@ -90,6 +99,9 @@ class pluginOpenGraph extends Plugin {
}
$html .= '<meta property="og:image" content="'.$og['image'].'">'.PHP_EOL;
if (Text::isNotEmpty($this->getValue('fbAppId'))) {
$html .= '<meta property="fb:app_id" content="'. $this->getValue('fbAppId').'">'.PHP_EOL;
}
return $html;
}

View File

@ -0,0 +1,12 @@
{
"plugin-data":
{
"name": "Remote Content",
"description": "Этот плагин обеспечивает простой способ синхронизации вашего сайта и Github или аналогичной платформы."
},
"webhook": "Вебхук",
"source": "Источник",
"keep-content": "Сохранять записи",
"complete-url-of-the-zip-file": "Полный URL-адрес zip-файла.",
"if-you-want-to-keep-the-content-generate-via-the-user-interface-enable-this-field": "Если вы хотите, чтобы записи генерировались через пользовательский интерфейс, включите это поле."
}

View File

@ -2,9 +2,9 @@
"author": "Bludit",
"email": "",
"website": "https://plugins.bludit.com/plugin/remote-content",
"version": "3.2",
"version": "3.5",
"releaseDate": "2018-09-14",
"license": "MIT",
"compatible": "3.2",
"compatible": "3.5",
"notes": ""
}

Some files were not shown because too many files have changed in this diff Show More