diff --git a/.gitignore b/.gitignore
index f20e5c8..572af99 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,9 +5,12 @@ plugins/demo
plugins/disqus
plugins/download
plugins/finalwords
+plugins/joblistings
+plugins/mail
plugins/textadds
plugins/version
settings/settings.yaml
+settings/formdata.yaml
settings/users
system/vendor
tests
diff --git a/cache/lastCache.txt b/cache/lastCache.txt
index 5b06fad..c3a5066 100644
--- a/cache/lastCache.txt
+++ b/cache/lastCache.txt
@@ -1 +1 @@
-1544479161
\ No newline at end of file
+1546546314
\ No newline at end of file
diff --git a/content/00-Welcome/03-test.txt b/content/00-Welcome/03-test.txt
deleted file mode 100644
index c8698b1..0000000
--- a/content/00-Welcome/03-test.txt
+++ /dev/null
@@ -1 +0,0 @@
-["# Add Title","Add Content"]
\ No newline at end of file
diff --git a/content/01-stellenanzeigen/00-job-einstellen.md b/content/01-stellenanzeigen/00-job-einstellen.md
deleted file mode 100644
index f755b30..0000000
--- a/content/01-stellenanzeigen/00-job-einstellen.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Stellenangebot veröffentlichen
-
-CMSstash erreicht pro Monat mehrere tausend CMS-Experten in ganz Deutschland. Detaillierte Angaben finden sie in den [Mediadaten](/mediadaten). Unternehmen können diese Reichweite nutzen und ihre Stellenanzeigen mit CMS-Bezug auf CMSstash veröffentlichen. Wir bieten folgende Konditionen an:
-
-| Kondition | Anzeige Standard | Anzeige Pro |
-|-----------|-----------|----------|
-| Laufzeit | 8 Wochen | 8 Wochen |
-| Exklusiver Teaser auf allen Seiten | Nein | 4 Wochen |
-| Tweets | 1 Tweet | 3 Tweets |
-| __Preis__ | **59,- Euro** | **159,- Euro** |
-| _(keine Ausweisung der Mwst. nach § 19 UStG)_ | | |
-
-## Stellenanzeige aufgeben
-
-Bei Interesse schreiben Sie uns gerne über [jobs@cmsstash.de](mailto:jobs@cmsstash.de) an oder nutzen Sie das Kontaktformular. Aufgrund der inhaltlichen Ausrichtung können wir nur Stellenangebote mit einem klaren Bezug zum Thema Content Management Systeme veröffentlichen.
-
diff --git a/content/01-stellenanzeigen/index.md b/content/01-stellenanzeigen/index.md
deleted file mode 100644
index 8924756..0000000
--- a/content/01-stellenanzeigen/index.md
+++ /dev/null
@@ -1,4 +0,0 @@
-# Add Title
-
-Add Content
-
diff --git a/plugins/contactform/contactform.php b/plugins/contactform/contactform.php
index 9ef0bbf..d60617a 100644
--- a/plugins/contactform/contactform.php
+++ b/plugins/contactform/contactform.php
@@ -6,70 +6,168 @@ use \Typemill\Plugin;
class ContactForm extends Plugin
{
- protected $item;
- protected $originalHtml;
+ protected $settings;
protected $pluginSettings;
+ protected $originalHtml;
public static function getSubscribedEvents()
{
return array(
'onSessionSegmentsLoaded' => 'onSessionSegmentsLoaded',
- 'onOriginalLoaded' => 'onOriginalLoaded',
'onHtmlLoaded' => 'onHtmlLoaded',
);
}
-
- # add the path for session and csrf-protection
+
+ # add the path stored in user-settings to initiate session and csrf-protection
public function onSessionSegmentsLoaded($segments)
{
$this->pluginSettings = $this->getPluginSettings('contactform');
- if($this->getPath() == $this->pluginSettings['page'])
+ if($this->getPath() == $this->pluginSettings['page_value'])
{
- $data = $segments->getData();
- $data[] = $this->pluginSettings['page'];
+ $data = $segments->getData();
+ $data[] = $this->pluginSettings['page_value'];
+
$segments->setData($data);
}
}
-
- # get the original html without manipulations
- public function onOriginalLoaded($original)
+
+ # create the output
+ public function onHtmlLoaded($html)
{
- if(substr($this->getPath(), 0, strlen($this->pluginSettings['area'])) === $this->pluginSettings['area'])
+ if($this->getPath() == $this->pluginSettings['page_value'])
+ {
+ $content = $html->getData();
+
+ # add css
+ $this->addCSS('/contactform/css/contactform.css');
+
+ # check if form data have been stored
+ $formdata = $this->getFormdata('contactform');
+
+ if($formdata)
+ {
+ # process the form-data
+ $sendmail = $this->sendMail($formdata);
+ if($sendmail)
+ {
+ $mailresult = '
' . $this->markdownToHtml($this->pluginSettings['message_success']) . '
';
+ }
+ else
+ {
+ $mailresult = '' . $this->markdownToHtml($this->pluginSettings['message_error']) . '
';
+ }
+
+ # add thank you to the content
+ $content = $content . $mailresult;
+ }
+ else
+ {
+ # get the public forms for the plugin
+ $contactform = $this->generateForm('contactform');
+
+ # add forms to the content
+ $content = $content . $contactform;
+ }
+ $html->setData($content);
+ }
+ }
+
+ private function sendMail($formdata)
+ {
+ $mailto = $this->pluginSettings['mailto'];
+ $subject = $formdata['subject'];
+ $message = wordwrap($formdata['message'],70);
+ $header = 'From: ' . $formdata['email'] . "\r\n" .
+ 'Reply-To: ' . $formdata['email'] . "\r\n" .
+ 'X-Mailer: PHP/' . phpversion();
+
+ return @mail($mailto, $subject, $message, $header);
+ }
+
+ # check if the mail-plugin is active
+ /*
+ public function onTwigLoaded()
+ {
+ $this->settings = $this->getSettings();
+
+ if(isset($this->settings['plugins']['mail']) OR !$this->settings['plugins']['mail']['active'])
+ {
+ $this->container->flash->addMessage('error', 'You have to activate the mail-plugin to use the contactform.');
+ }
+ }
+ */
+
+ # get the original html without manipulations from other plugins
+ /*
+ public function onOriginalLoaded($original)
+ {
+ if(substr($this->getPath(), 0, strlen($this->pluginSettings['area_value'])) === $this->pluginSettings['area_value'])
{
$this->originalHtml = $original->getHTML($urlrel = false);
}
}
+ */
+ # create the output
+ /*
public function onHtmlLoaded($html)
- {
- if(substr($this->getPath(), 0, strlen($this->pluginSettings['area'])) === $this->pluginSettings['area'])
+ {
+ if(substr($this->getPath(), 0, strlen($this->pluginSettings['area_value'])) === $this->pluginSettings['area_value'])
{
$content = $this->originalHtml;
- if($this->getPath() == $this->pluginSettings['page'])
- {
-
-
- $this->generateForm('contactform');
-
-
+ if($this->getPath() == $this->pluginSettings['page_value'])
+ {
# add css
- # $this->addCSS('/textadds/css/textadds.css');
-
- # get Twig Instance and add the cookieconsent template-folder to the path
- $twig = $this->getTwig();
- $loader = $twig->getLoader();
- $loader->addPath(__DIR__ . '/templates');
-
- # fetch the template and render it with twig
- $contactform = $twig->fetch('/contactform.twig', $this->pluginSettings);
+ $this->addCSS('/contactform/css/contactform.css');
+
+ # check if form data have been stored
+ $formdata = $this->getFormdata('contactform');
- $content = $this->originalHtml . $contactform;
+ if($formdata)
+ {
+ # process the form-data
+ $sendmail = $this->sendMail($formdata);
+ if($sendmail)
+ {
+ $mailresult = 'Thank you!
Your Message has been send.
';
+ }
+ else
+ {
+ $mailresult = 'Error
We could not send your message. Please send the mail manually.
';
+ }
+ /*
+ print_r($formdata);
+ die();
+ $mail = $this->container->mail->send('mail/welcome.twig', ['user' => $user, 'url' => $host], function($message) use ($user){
+ $message->to($user['email']);
+ $message->subject('Dein Account bei der Regierungsmannschaft');
+ });
+
+ if(!$mail)
+ {
+ $this->container->flash->addMessage('error', 'Die Bestätigungsmail konnte nicht verschickt werden.');
+ }
+
+ # create thank you page
+
+ # add thank you to the content
+ $content = $this->originalHtml . $mailresult;
+ }
+ else
+ {
+ # get the public forms for the plugin
+ $contactform = $this->generateForm('contactform');
+
+ # add forms to the content
+ $content = $this->originalHtml . $contactform;
+ }
}
$html->setData($content);
- $html->stopPropagation();
+ $html->stopPropagation();
}
}
+ */
}
\ No newline at end of file
diff --git a/plugins/contactform/contactform.yaml b/plugins/contactform/contactform.yaml
index 34d2444..419fae0 100644
--- a/plugins/contactform/contactform.yaml
+++ b/plugins/contactform/contactform.yaml
@@ -6,91 +6,89 @@ homepage: https://typemill.net
licence: MIT
settings:
- page: ''
- name: 'Name: '
- email: 'E-Mail: '
- subject: 'Subject: '
- message: 'Message: '
- button: 'Send Message'
+ message_success: "## Thank you!\r\n\r\nWe got your message and will answer as soon as possible."
+ message_error: "## Error\r\n\r\nWe could not send your message. Please send your e-mail manually."
forms:
fields:
- page:
+ mailto:
+ type: email
+ label: Your e-mail-address
+ required: true
+
+ page_value:
type: text
- label: Path to the page where to show the form
+ label: Path to page where to include the form
placeholder: 'path/to/page'
required: true
- area:
- type: text
- label: Path to the area with original content
- placeholder: 'path/to/rootpage'
- required: true
-
- name:
+ name_label:
type: text
label: Label for Name Input Field
- placeholder: 'Name: '
required: true
- email:
+ email_label:
type: text
label: Label for E-Mail-Field
- placeholder: 'E-Mail: '
required: true
- subject:
+ subject_label:
type: text
label: Label for Subject-Field
- placeholder: 'Subject: '
required: true
- message:
+ message_label:
type: text
label: Label for Message
- placeholder: 'Message: '
required: true
- button:
+ button_label:
type: text
label: Label for Button
placeholder: 'Send Message'
required: true
- hint:
+ legalnotice:
type: textarea
+ rows: 5;
label: Text below button (use markdown)
placeholder: 'Add your legal text or other hints here'
-frontend:
+ message_success:
+ type: textarea
+ rows: 5;
+ label: Message if mail is send (use markdown)
+ placeholder: 'Add your legal text or other hints here'
+
+ message_error:
+ type: textarea
+ rows: 5;
+ label: Message if mail failed (use markdown)
+ placeholder: 'Add your legal text or other hints here'
+
+public:
fields:
name:
type: text
- label: Label for Name Input Field
- placeholder: 'Name: '
+ label: name_label
required: true
email:
- type: text
- label: Label for E-Mail-Field
- placeholder: 'E-Mail: '
+ type: email
+ label: email_label
required: true
subject:
type: text
- label: Label for Subject-Field
- placeholder: 'Subject: '
+ label: subject_label
required: true
message:
- type: text
- label: Label for Message
- placeholder: 'Message: '
+ type: textarea
+ label: message_label
required: true
- hint:
- type: textarea
- label: Text below button (use markdown)
- placeholder: 'Add your legal text or other hints here'
\ No newline at end of file
+ legalnotice:
+ type: paragraph
\ No newline at end of file
diff --git a/plugins/contactform/css/textadds.css b/plugins/contactform/css/textadds.css
deleted file mode 100644
index 1883149..0000000
--- a/plugins/contactform/css/textadds.css
+++ /dev/null
@@ -1,26 +0,0 @@
-.contentadd{
- display: block;
- position: relative;
- width: 100%;
- border-top: 1px solid #ccc;
- border-bottom: 1px solid #ccc;
-}
-.contentadd span{
- position: absolute;
- right: 10px;
- top: 20px;
- text-transform: uppercase;
- color: #ccc;
- font-size: 0.6em;
-}
-.contentadd h3{
- margin-top: 20px;
- margin-bottom: 0px;
-}
-.contentadd small{
- margin: 0px;
-}
-.contentadd p{
- margin-top: 0px;
- margin-bottom: 20px;
-}
\ No newline at end of file
diff --git a/plugins/contactform/templates/contactform.twig b/plugins/contactform/templates/contactform.twig
deleted file mode 100644
index 752c3b8..0000000
--- a/plugins/contactform/templates/contactform.twig
+++ /dev/null
@@ -1,40 +0,0 @@
-
\ No newline at end of file
diff --git a/system/Controllers/ContentApiController.php b/system/Controllers/ContentApiController.php
index ed5ab46..6f69285 100644
--- a/system/Controllers/ContentApiController.php
+++ b/system/Controllers/ContentApiController.php
@@ -856,7 +856,7 @@ class ContentApiController extends ContentController
$imageProcessor = new ProcessImage();
- if($imageProcessor->createImage($this->params['image'], $this->settings['images'], $name = false))
+ if($imageProcessor->createImage($this->params['image'], $this->settings['images']))
{
return $response->withJson(array('errors' => false));
}
@@ -867,7 +867,7 @@ class ContentApiController extends ContentController
public function publishImage(Request $request, Response $response, $args)
{
$params = $request->getParsedBody();
-
+
$imageProcessor = new ProcessImage();
$imageUrl = $imageProcessor->publishImage($this->settings['images'], $name = false);
@@ -882,4 +882,72 @@ class ContentApiController extends ContentController
return $response->withJson(array('errors' => 'could not store image to temporary folder'));
}
+
+ public function saveVideoImage(Request $request, Response $response, $args)
+ {
+ /* get params from call */
+ $this->params = $request->getParams();
+ $this->uri = $request->getUri();
+ $class = false;
+
+ $imageUrl = $this->params['markdown'];
+
+ if(strpos($imageUrl, 'https://www.youtube.com/watch?v=') !== false)
+ {
+ $videoID = str_replace('https://www.youtube.com/watch?v=', '', $imageUrl);
+ $videoID = strpos($videoID, '&') ? substr($videoID, 0, strpos($videoID, '&')) : $videoID;
+ $class = 'youtube';
+ }
+ if(strpos($imageUrl, 'https://youtu.be/') !== false)
+ {
+ $videoID = str_replace('https://youtu.be/', '', $imageUrl);
+ $videoID = strpos($videoID, '?') ? substr($videoID, 0, strpos($videoID, '?')) : $videoID;
+ $class = 'youtube';
+ }
+
+ if($class == 'youtube')
+ {
+ $videoURLmaxres = 'https://i1.ytimg.com/vi/' . $videoID . '/maxresdefault.jpg';
+ $videoURL0 = 'https://i1.ytimg.com/vi/' . $videoID . '/0.jpg';
+ }
+
+ $ctx = stream_context_create(array(
+ 'https' => array(
+ 'timeout' => 1
+ )
+ )
+ );
+
+ $imageData = @file_get_contents($videoURLmaxres, 0, $ctx);
+ if($imageData === false)
+ {
+ $imageData = @file_get_contents($videoURL0, 0, $ctx);
+ if($imageData === false)
+ {
+ return $response->withJson(array('errors' => 'could not get the video image'));
+ }
+ }
+
+ $imageData64 = 'data:image/jpeg;base64,' . base64_encode($imageData);
+ $desiredSizes = ['live' => ['width' => 560, 'height' => 315]];
+ $imageProcessor = new ProcessImage();
+ $tmpImage = $imageProcessor->createImage($imageData64, $desiredSizes);
+
+ if(!$tmpImage)
+ {
+ return $response->withJson(array('errors' => 'could not create temporary image'));
+ }
+
+ $imageUrl = $imageProcessor->publishImage($desiredSizes, $videoID);
+ if($imageUrl)
+ {
+ $this->params['markdown'] = '![' . $class . '-video](' . $imageUrl . ' "click to load video"){#' . $videoID. ' .' . $class . '}';
+
+ $request = $request->withParsedBody($this->params);
+
+ return $this->updateBlock($request, $response, $args);
+ }
+
+ return $response->withJson(array('errors' => 'could not store the preview image'));
+ }
}
\ No newline at end of file
diff --git a/system/Controllers/FormController.php b/system/Controllers/FormController.php
new file mode 100644
index 0000000..0a48368
--- /dev/null
+++ b/system/Controllers/FormController.php
@@ -0,0 +1,106 @@
+isPost())
+ {
+ $params = $request->getParams();
+ reset($params);
+ $pluginName = key($params);
+ $referer = $request->getHeader('HTTP_REFERER');
+
+ # simple bot check with honeypot
+ if(isset($params[$pluginName]['personal-mail']))
+ {
+ if($params[$pluginName]['personal-mail'] != '')
+ {
+ $this->c->flash->addMessage('publicform', 'bot');
+ return $response->withRedirect($referer[0]);
+ }
+ unset($params[$pluginName]['personal-mail']);
+ }
+
+ if(isset($params[$pluginName]))
+ {
+ # validate the user-input
+ $this->validateInput('plugins', $pluginName, $params[$pluginName]);
+ }
+
+ # check for errors and redirect to path, if errors found
+ if(isset($_SESSION['errors']))
+ {
+ $this->c->flash->addMessage('error', 'Please correct the errors');
+ return $response->withRedirect($referer[0]);
+ }
+
+ # clean up and make sure that only validated data are stored
+ $data = [ $pluginName => $params[$pluginName]];
+
+ # create write object
+ $writeYaml = new WriteYaml();
+
+ # write the form data into yaml file
+ $writeYaml->updateYaml('settings', 'formdata.yaml', $data);
+
+ # add message and return to original site
+ $this->c->flash->addMessage('formdata', $pluginName);
+ return $response->withRedirect($referer[0]);
+ }
+ }
+
+ private function validateInput($objectType, $objectName, $userInput)
+ {
+ # get settings and start validation
+ $originalSettings = \Typemill\Settings::getObjectSettings($objectType, $objectName);
+ $userSettings = \Typemill\Settings::getUserSettings();
+ $validate = new Validation();
+
+ if(isset($originalSettings['public']['fields']))
+ {
+ /* flaten the multi-dimensional array with fieldsets to a one-dimensional array */
+ $originalFields = array();
+ foreach($originalSettings['public']['fields'] as $fieldName => $fieldValue)
+ {
+ if(isset($fieldValue['fields']))
+ {
+ foreach($fieldValue['fields'] as $subFieldName => $subFieldValue)
+ {
+ $originalFields[$subFieldName] = $subFieldValue;
+ }
+ }
+ else
+ {
+ $originalFields[$fieldName] = $fieldValue;
+ }
+ }
+
+ /* take the user input data and iterate over all fields and values */
+ foreach($userInput as $fieldName => $fieldValue)
+ {
+ /* get the corresponding field definition from original plugin settings */
+ $fieldDefinition = isset($originalFields[$fieldName]) ? $originalFields[$fieldName] : false;
+
+ if($fieldDefinition)
+ {
+ /* validate user input for this field */
+ $validate->objectField($fieldName, $fieldValue, $objectName, $fieldDefinition);
+ }
+ if(!$fieldDefinition && $fieldName != 'active')
+ {
+ $_SESSION['errors'][$objectName][$fieldName] = array('This field is not defined!');
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/system/Controllers/PageController.php b/system/Controllers/PageController.php
index 79eb0a2..04d85a8 100644
--- a/system/Controllers/PageController.php
+++ b/system/Controllers/PageController.php
@@ -137,8 +137,10 @@ class PageController extends Controller
/* get the first image from content array */
$firstImage = $this->getFirstImage($contentArray);
+ $itemUrl = isset($item->urlRel) ? $item->urlRel : false;
+
/* parse markdown-content-array to content-string */
- $contentHTML = $parsedown->markup($contentArray, $item->urlRel);
+ $contentHTML = $parsedown->markup($contentArray, $itemUrl);
$contentHTML = $this->c->dispatcher->dispatch('onHtmlLoaded', new OnHtmlLoaded($contentHTML))->getData();
/* extract the h1 headline*/
diff --git a/system/Controllers/SettingsController.php b/system/Controllers/SettingsController.php
index 8ebddc6..293bdd4 100644
--- a/system/Controllers/SettingsController.php
+++ b/system/Controllers/SettingsController.php
@@ -121,7 +121,7 @@ class SettingsController extends Controller
$user = new User();
$users = $user->getUsers();
$route = $request->getAttribute('route');
-
+
$this->render($response, 'settings/themes.twig', array('settings' => $userSettings, 'themes' => $themedata, 'users' => $users, 'route' => $route->getName() ));
}
@@ -241,7 +241,7 @@ class SettingsController extends Controller
$pluginSettings = array();
$userInput = $request->getParams();
$validate = new Validation();
-
+
/* use the stored user settings and iterate over all original plugin settings, so we do not forget any... */
foreach($userSettings['plugins'] as $pluginName => $pluginUserSettings)
{
@@ -323,7 +323,7 @@ class SettingsController extends Controller
if(!$fieldDefinition && $fieldName != 'active')
{
$_SESSION['errors'][$objectName][$fieldName] = array('This field is not defined!');
- }
+ }
}
}
}
diff --git a/system/Extensions/TwigMarkdownExtension.php b/system/Extensions/TwigMarkdownExtension.php
index 884f8f2..efc7345 100644
--- a/system/Extensions/TwigMarkdownExtension.php
+++ b/system/Extensions/TwigMarkdownExtension.php
@@ -19,6 +19,6 @@ class TwigMarkdownExtension extends \Twig_Extension
$markdownArray = $parsedown->text($markdown);
- return $parsedown->markup($markdownArray);
+ return $parsedown->markup($markdownArray, false);
}
}
\ No newline at end of file
diff --git a/system/Models/Field.php b/system/Models/Field.php
index 92284ae..2ddf11a 100644
--- a/system/Models/Field.php
+++ b/system/Models/Field.php
@@ -44,7 +44,8 @@ class Field
'url',
'week',
'textarea',
- 'select'
+ 'select',
+ 'paragraph'
);
/* defines all boolean attributes, that are allowed for fields */
@@ -80,20 +81,17 @@ class Field
{
$this->setName($fieldName);
- if(isset($fieldConfigs['type']))
- {
- $this->setType($fieldConfigs['type']);
- }
+ $type = isset($fieldConfigs['type']) ? $fieldConfigs['type'] : false;
+ $this->setType($type);
+
+ $label = isset($fieldConfigs['label']) ? $fieldConfigs['label'] : false;
+ $this->setLabel($label);
+
+ $checkboxlabel = isset($fieldConfigs['checkboxlabel']) ? $fieldConfigs['checkboxlabel'] : false;
+ $this->setCheckboxLabel($checkboxlabel);
- if(isset($fieldConfigs['label']))
- {
- $this->setLabel($fieldConfigs['label']);
- }
-
- if(isset($fieldConfigs['options']))
- {
- $this->setOptions($fieldConfigs['options']);
- }
+ $options = isset($fieldConfigs['options']) ? $fieldConfigs['options'] : array();
+ $this->setOptions($options);
$this->setAttributes($fieldConfigs);
@@ -125,7 +123,7 @@ class Field
return $this->type;
}
- private function setLabel($label)
+ public function setLabel($label)
{
$this->label = $label;
}
@@ -134,6 +132,16 @@ class Field
{
return $this->label;
}
+
+ public function setCheckboxLabel($label)
+ {
+ $this->checkboxLabel = $label;
+ }
+
+ public function getCheckboxLabel()
+ {
+ return $this->checkboxLabel;
+ }
public function setContent($content)
{
@@ -177,7 +185,7 @@ class Field
public function getAttributes()
{
$string = false;
-
+
foreach($this->attributes as $key => $attribute)
{
$string .= ' ' . $key;
diff --git a/system/Models/Fields.php b/system/Models/Fields.php
index 280c0af..b3ad4d5 100644
--- a/system/Models/Fields.php
+++ b/system/Models/Fields.php
@@ -7,13 +7,13 @@ use Typemill\Models\Field;
class Fields
{
public function getFields($userSettings, $objectType, $objectName, $objectSettings, $formType = false)
- {
+ {
# hold all fields in array
$fields = array();
- # formtype are backendforms or frontendforms, only relevant for plugins for now
+ # formtype are backend forms or public forms, only relevant for plugins for now
$formType = $formType ? $formType : 'forms';
-
+
# iterate through all fields of the objectSetting (theme or plugin)
foreach($objectSettings[$formType]['fields'] as $fieldName => $fieldConfigurations)
{
@@ -56,7 +56,7 @@ class Fields
}
# Now prepopulate the field object with the value */
- if($field->getType() == "textarea")
+ if($field->getType() == "textarea" || $field->getType() == "paragraph")
{
if($userValue)
{
@@ -66,25 +66,26 @@ class Fields
elseif($field->getType() == "checkbox")
{
# checkboxes need a special treatment, because field does not exist in settings if unchecked by user
- if(isset($userSettings[$objectType][$objectName][$fieldName]))
+ if(!isset($userSettings[$objectType][$objectName][$fieldName]))
{
- $field->setAttribute('checked', 'checked');
- }
- else
- {
- $field->unsetAttribute('checked');
+ $field->unsetAttribute('checked');
}
}
else
{
$field->setAttributeValue('value', $userValue);
}
-
+
+ if(isset($fieldConfigurations['label']) && isset($userSettings[$objectType][$objectName][$fieldConfigurations['label']]))
+ {
+ $field->setLabel($userSettings[$objectType][$objectName][$fieldConfigurations['label']]);
+ }
+
# add the field to the field-List
$fields[] = $field;
}
- }
+ }
return $fields;
}
}
\ No newline at end of file
diff --git a/system/Models/ProcessImage.php b/system/Models/ProcessImage.php
index 89431d6..48a6018 100644
--- a/system/Models/ProcessImage.php
+++ b/system/Models/ProcessImage.php
@@ -3,7 +3,7 @@ namespace Typemill\Models;
class ProcessImage
{
- public function createImage(string $image, array $desiredSizes, $name)
+ public function createImage(string $image, array $desiredSizes)
{
# fix error from jpeg-library
ini_set ('gd.jpeg_ignore_warning', 1);
@@ -60,7 +60,7 @@ class ProcessImage
return false;
}
- public function publishImage(array $desiredSizes)
+ public function publishImage(array $desiredSizes, $name = false)
{
/* get images from tmp folder */
$basePath = getcwd() . DIRECTORY_SEPARATOR . 'media';
@@ -71,7 +71,7 @@ class ProcessImage
if(!file_exists($originalFolder)){ mkdir($originalFolder, 0774, true); }
if(!file_exists($liveFolder)){ mkdir($liveFolder, 0774, true); }
- $name = uniqid();
+ $name = $name ? $name : uniqid();
$files = scandir($tmpFolder);
$success = true;
diff --git a/system/Models/Validation.php b/system/Models/Validation.php
index 1162b56..316db14 100644
--- a/system/Models/Validation.php
+++ b/system/Models/Validation.php
@@ -312,7 +312,6 @@ class Validation
{
$v = new Validator(array($fieldName => $fieldValue));
-
if(isset($fieldDefinitions['required']))
{
$v->rule('required', $fieldName);
@@ -364,11 +363,18 @@ class Validation
$v->rule('noHTML', $fieldName);
// $v->rule('regex', $fieldName, '/<[^<]+>/');
break;
+ case "paragraph":
+ $v->rule('lengthMax', $fieldName, 1000);
+ $v->rule('noHTML', $fieldName);
+ break;
+ case "password":
+ $v->rule('lengthMax', $fieldName, 100);
+ break;
default:
$v->rule('lengthMax', $fieldName, 1000);
$v->rule('regex', $fieldName, '/^[\pL0-9_ \-]*$/u');
}
-
+
return $this->validationResult($v, $objectName);
}
diff --git a/system/Plugin.php b/system/Plugin.php
index b9e71ee..6c1c4ed 100644
--- a/system/Plugin.php
+++ b/system/Plugin.php
@@ -4,6 +4,8 @@ namespace Typemill;
use \Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Typemill\Models\Fields;
+use Typemill\Models\WriteYaml;
+use Typemill\Extensions\ParsedownExtension;
abstract class Plugin implements EventSubscriberInterface
{
@@ -65,7 +67,7 @@ abstract class Plugin implements EventSubscriberInterface
$function = new \Twig_SimpleFunction($name, $function);
$this->container->view->getEnvironment()->addFunction($function);
}
-
+
protected function addJS($JS)
{
$this->container->assets->addJS($JS);
@@ -86,19 +88,63 @@ abstract class Plugin implements EventSubscriberInterface
$this->container->assets->addInlineCSS($CSS);
}
+ protected function markdownToHtml($markdown)
+ {
+ $parsedown = new ParsedownExtension();
+
+ $contentArray = $parsedown->text($markdown);
+ $html = $parsedown->markup($contentArray,false);
+
+ return $html;
+ }
+
+ protected function getFormData($pluginName)
+ {
+ $flash = $this->container->flash->getMessages();
+ if(isset($flash['formdata']))
+ {
+ $yaml = new Models\WriteYaml();
+ $formdata = $yaml->getYaml('settings', 'formdata.yaml');
+ $yaml->updateYaml('settings', 'formdata.yaml', '');
+
+ if($flash['formdata'][0] == $pluginName && isset($formdata[$pluginName]))
+ {
+ return $formdata[$pluginName];
+ }
+ }
+ return false;
+ }
+
protected function generateForm($pluginName)
{
$fieldsModel = new Fields();
- $pluginDefinitions = \Typemill\Settings::getObjectSettings('plugins', $pluginName);
-
- if(isset($pluginDefinitions['frontend']['fields']))
+ $pluginDefinitions = \Typemill\Settings::getObjectSettings('plugins', $pluginName);
+ $settings = $this->getSettings();
+ $buttonlabel = isset($settings['plugins'][$pluginName]['button_label']) ? $settings['plugins'][$pluginName]['button_label'] : false;
+
+ if(isset($pluginDefinitions['public']['fields']))
{
+ # add simple honeypot spam protection
+ $pluginDefinitions['public']['fields']['personal-mail'] = ['type' => 'text', 'class' => 'personal-mail'];
+
+ /*
+ # add spam protection questions
+ $spamanswers = ['Albert', 'kalt', 'Gelb'];
+ shuffle($spamanswers);
+ $pluginDefinitions['public']['fields']['spamquestion'] = ['type' => 'checkboxlist', 'label' => 'Der Vorname von Einstein lautet', 'required' => true, 'options' => $spamanswers];
+ */
+
# get all the fields and prefill them with the dafault-data, the user-data or old input data
- $fields = $fieldsModel->getFields($userSettings = false, 'plugins', $pluginName, $pluginDefinitions, 'frontend');
+ $fields = $fieldsModel->getFields($settings, 'plugins', $pluginName, $pluginDefinitions, 'public');
- # use the field-objects to generate the html-fields
-
+ # get Twig Instance
+ $twig = $this->getTwig();
+
+ # render each field and add it to the form
+ $form = $twig->fetch('/partials/form.twig', ['fields' => $fields, 'itemName' => $pluginName, 'object' => 'plugins', 'buttonlabel' => $buttonlabel]);
}
+
+ return $form;
}
}
\ No newline at end of file
diff --git a/system/Routes/Api.php b/system/Routes/Api.php
index 7833085..b4e090e 100644
--- a/system/Routes/Api.php
+++ b/system/Routes/Api.php
@@ -21,4 +21,6 @@ $app->delete('/api/v1/block', ContentApiController::class . ':deleteBlock')->set
$app->put('/api/v1/moveblock', ContentApiController::class . ':moveBlock')->setName('api.block.move')->add(new RestrictApiAccess($container['router']));
$app->post('/api/v1/image', ContentApiController::class . ':createImage')->setName('api.image.create')->add(new RestrictApiAccess($container['router']));
-$app->put('/api/v1/image', ContentApiController::class . ':publishImage')->setName('api.image.publish')->add(new RestrictApiAccess($container['router']));
\ No newline at end of file
+$app->put('/api/v1/image', ContentApiController::class . ':publishImage')->setName('api.image.publish')->add(new RestrictApiAccess($container['router']));
+
+$app->post('/api/v1/video', ContentApiController::class . ':saveVideoImage')->setName('api.video.save')->add(new RestrictApiAccess($container['router']));
\ No newline at end of file
diff --git a/system/Routes/Web.php b/system/Routes/Web.php
index acc4391..a8e0080 100644
--- a/system/Routes/Web.php
+++ b/system/Routes/Web.php
@@ -1,6 +1,7 @@
get('/setup/welcome', AuthController::class . ':redirect')->setName('setup.welcome');
}
+$app->post('/tm/formpost', FormController::class . ':savePublicForm')->setName('form.save');
+
$app->get('/tm', AuthController::class . ':redirect');
$app->get('/tm/login', AuthController::class . ':show')->setName('auth.show')->add(new RedirectIfAuthenticated($container['router']));
$app->post('/tm/login', AuthController::class . ':login')->setName('auth.login')->add(new RedirectIfAuthenticated($container['router']));
diff --git a/system/Settings.php b/system/Settings.php
index 7c30f01..efb1c99 100644
--- a/system/Settings.php
+++ b/system/Settings.php
@@ -88,7 +88,6 @@ class Settings
if($userSettings)
{
-
$yaml = new Models\WriteYaml();
$settings = array_merge($userSettings, $settings);
diff --git a/system/author/css/fontello/LICENSE.txt b/system/author/css/fontello/LICENSE.txt
index 5897837..61ddfd4 100644
--- a/system/author/css/fontello/LICENSE.txt
+++ b/system/author/css/fontello/LICENSE.txt
@@ -1,15 +1,6 @@
Font license info
-## Entypo
-
- Copyright (C) 2012 by Daniel Bruce
-
- Author: Daniel Bruce
- License: SIL (http://scripts.sil.org/OFL)
- Homepage: http://www.entypo.com
-
-
## Font Awesome
Copyright (C) 2016 by Dave Gandy
@@ -19,3 +10,12 @@ Font license info
Homepage: http://fortawesome.github.com/Font-Awesome/
+## Entypo
+
+ Copyright (C) 2012 by Daniel Bruce
+
+ Author: Daniel Bruce
+ License: SIL (http://scripts.sil.org/OFL)
+ Homepage: http://www.entypo.com
+
+
diff --git a/system/author/css/fontello/config.json b/system/author/css/fontello/config.json
index 0e0c091..a70d464 100644
--- a/system/author/css/fontello/config.json
+++ b/system/author/css/fontello/config.json
@@ -7,10 +7,10 @@
"ascent": 850,
"glyphs": [
{
- "uid": "c709da589c923ba3c2ad48d9fc563e93",
- "css": "cancel",
+ "uid": "0f99ab40ab0b4d64a74f2d0deeb03e42",
+ "css": "videocam",
"code": 59392,
- "src": "entypo"
+ "src": "fontawesome"
},
{
"uid": "381da2c2f7fd51f8de877c044d7f439d",
@@ -18,34 +18,46 @@
"code": 59393,
"src": "fontawesome"
},
+ {
+ "uid": "c709da589c923ba3c2ad48d9fc563e93",
+ "css": "cancel",
+ "code": 59394,
+ "src": "entypo"
+ },
{
"uid": "f9cbf7508cd04145ade2800169959eef",
"css": "font",
- "code": 59394,
+ "code": 59395,
"src": "fontawesome"
},
{
"uid": "e99461abfef3923546da8d745372c995",
"css": "cog",
- "code": 59395,
+ "code": 59396,
"src": "fontawesome"
},
{
"uid": "8b9e6a8dd8f67f7c003ed8e7e5ee0857",
"css": "off",
- "code": 59396,
+ "code": 59397,
"src": "fontawesome"
},
{
"uid": "d7271d490b71df4311e32cdacae8b331",
"css": "home",
- "code": 59397,
+ "code": 59398,
"src": "fontawesome"
},
{
"uid": "44e04715aecbca7f266a17d5a7863c68",
"css": "plus",
- "code": 59398,
+ "code": 59399,
+ "src": "fontawesome"
+ },
+ {
+ "uid": "e15f0d620a7897e2035c18c80142f6d9",
+ "css": "link-ext",
+ "code": 61582,
"src": "fontawesome"
},
{
@@ -55,9 +67,9 @@
"src": "fontawesome"
},
{
- "uid": "e15f0d620a7897e2035c18c80142f6d9",
- "css": "link-ext",
- "code": 61582,
+ "uid": "6605ee6441bf499ffa3c63d3c7409471",
+ "css": "move",
+ "code": 61511,
"src": "fontawesome"
},
{
@@ -71,6 +83,12 @@
"css": "folder-empty",
"code": 61716,
"src": "fontawesome"
+ },
+ {
+ "uid": "872d9516df93eb6b776cc4d94bd97dac",
+ "css": "video",
+ "code": 59400,
+ "src": "fontawesome"
}
]
}
\ No newline at end of file
diff --git a/system/author/css/fontello/css/fontello-codes.css b/system/author/css/fontello/css/fontello-codes.css
index 2225ca3..8d7a602 100644
--- a/system/author/css/fontello/css/fontello-codes.css
+++ b/system/author/css/fontello/css/fontello-codes.css
@@ -1,11 +1,14 @@
-.icon-cancel:before { content: '\e800'; } /* '' */
+.icon-videocam:before { content: '\e800'; } /* '' */
.icon-picture:before { content: '\e801'; } /* '' */
-.icon-font:before { content: '\e802'; } /* '' */
-.icon-cog:before { content: '\e803'; } /* '' */
-.icon-off:before { content: '\e804'; } /* '' */
-.icon-home:before { content: '\e805'; } /* '' */
-.icon-plus:before { content: '\e806'; } /* '' */
+.icon-cancel:before { content: '\e802'; } /* '' */
+.icon-font:before { content: '\e803'; } /* '' */
+.icon-cog:before { content: '\e804'; } /* '' */
+.icon-off:before { content: '\e805'; } /* '' */
+.icon-home:before { content: '\e806'; } /* '' */
+.icon-plus:before { content: '\e807'; } /* '' */
+.icon-video:before { content: '\e808'; } /* '' */
+.icon-move:before { content: '\f047'; } /* '' */
.icon-link-ext:before { content: '\f08e'; } /* '' */
.icon-resize-full-alt:before { content: '\f0b2'; } /* '' */
.icon-doc-text:before { content: '\f0f6'; } /* '' */
diff --git a/system/author/css/fontello/css/fontello-embedded.css b/system/author/css/fontello/css/fontello-embedded.css
index 026db0b..b3d5784 100644
--- a/system/author/css/fontello/css/fontello-embedded.css
+++ b/system/author/css/fontello/css/fontello-embedded.css
@@ -1,15 +1,15 @@
@font-face {
font-family: 'fontello';
- src: url('../font/fontello.eot?72138273');
- src: url('../font/fontello.eot?72138273#iefix') format('embedded-opentype'),
- url('../font/fontello.svg?72138273#fontello') format('svg');
+ src: url('../font/fontello.eot?46219802');
+ src: url('../font/fontello.eot?46219802#iefix') format('embedded-opentype'),
+ url('../font/fontello.svg?46219802#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'fontello';
- src: url('data:application/octet-stream;base64,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') format('woff'),
- url('data:application/octet-stream;base64,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') format('truetype');
+ src: url('data:application/octet-stream;base64,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') format('woff'),
+ url('data:application/octet-stream;base64,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RlJYIDxZLrErARQrsARDLrArKy2wQCywABawBCWwBCYgLkcjRyNhsAlDKyMgPCAuIzixKwEUKy2wQSyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAJQysgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbErARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') format('truetype');
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
@@ -17,7 +17,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'fontello';
- src: url('../font/fontello.svg?72138273#fontello') format('svg');
+ src: url('../font/fontello.svg?46219802#fontello') format('svg');
}
}
*/
@@ -52,13 +52,16 @@
/* Uncomment for 3D effect */
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
-.icon-cancel:before { content: '\e800'; } /* '' */
+.icon-videocam:before { content: '\e800'; } /* '' */
.icon-picture:before { content: '\e801'; } /* '' */
-.icon-font:before { content: '\e802'; } /* '' */
-.icon-cog:before { content: '\e803'; } /* '' */
-.icon-off:before { content: '\e804'; } /* '' */
-.icon-home:before { content: '\e805'; } /* '' */
-.icon-plus:before { content: '\e806'; } /* '' */
+.icon-cancel:before { content: '\e802'; } /* '' */
+.icon-font:before { content: '\e803'; } /* '' */
+.icon-cog:before { content: '\e804'; } /* '' */
+.icon-off:before { content: '\e805'; } /* '' */
+.icon-home:before { content: '\e806'; } /* '' */
+.icon-plus:before { content: '\e807'; } /* '' */
+.icon-video:before { content: '\e808'; } /* '' */
+.icon-move:before { content: '\f047'; } /* '' */
.icon-link-ext:before { content: '\f08e'; } /* '' */
.icon-resize-full-alt:before { content: '\f0b2'; } /* '' */
.icon-doc-text:before { content: '\f0f6'; } /* '' */
diff --git a/system/author/css/fontello/css/fontello-ie7-codes.css b/system/author/css/fontello/css/fontello-ie7-codes.css
index 10f7454..2df2fc6 100644
--- a/system/author/css/fontello/css/fontello-ie7-codes.css
+++ b/system/author/css/fontello/css/fontello-ie7-codes.css
@@ -1,11 +1,14 @@
-.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-videocam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-video { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-link-ext { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-resize-full-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-doc-text { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
diff --git a/system/author/css/fontello/css/fontello-ie7.css b/system/author/css/fontello/css/fontello-ie7.css
index aba1d79..31a5a32 100644
--- a/system/author/css/fontello/css/fontello-ie7.css
+++ b/system/author/css/fontello/css/fontello-ie7.css
@@ -10,13 +10,16 @@
/* font-size: 120%; */
}
-.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-videocam { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-picture { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
-.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-font { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-video { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
+.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-link-ext { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-resize-full-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
.icon-doc-text { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); }
diff --git a/system/author/css/fontello/css/fontello.css b/system/author/css/fontello/css/fontello.css
index c10c103..a9f012c 100644
--- a/system/author/css/fontello/css/fontello.css
+++ b/system/author/css/fontello/css/fontello.css
@@ -1,11 +1,11 @@
@font-face {
font-family: 'fontello';
- src: url('../font/fontello.eot?52515879');
- src: url('../font/fontello.eot?52515879#iefix') format('embedded-opentype'),
- url('../font/fontello.woff2?52515879') format('woff2'),
- url('../font/fontello.woff?52515879') format('woff'),
- url('../font/fontello.ttf?52515879') format('truetype'),
- url('../font/fontello.svg?52515879#fontello') format('svg');
+ src: url('../font/fontello.eot?80940798');
+ src: url('../font/fontello.eot?80940798#iefix') format('embedded-opentype'),
+ url('../font/fontello.woff2?80940798') format('woff2'),
+ url('../font/fontello.woff?80940798') format('woff'),
+ url('../font/fontello.ttf?80940798') format('truetype'),
+ url('../font/fontello.svg?80940798#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -15,7 +15,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'fontello';
- src: url('../font/fontello.svg?52515879#fontello') format('svg');
+ src: url('../font/fontello.svg?80940798#fontello') format('svg');
}
}
*/
@@ -55,13 +55,16 @@
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
-.icon-cancel:before { content: '\e800'; } /* '' */
+.icon-videocam:before { content: '\e800'; } /* '' */
.icon-picture:before { content: '\e801'; } /* '' */
-.icon-font:before { content: '\e802'; } /* '' */
-.icon-cog:before { content: '\e803'; } /* '' */
-.icon-off:before { content: '\e804'; } /* '' */
-.icon-home:before { content: '\e805'; } /* '' */
-.icon-plus:before { content: '\e806'; } /* '' */
+.icon-cancel:before { content: '\e802'; } /* '' */
+.icon-font:before { content: '\e803'; } /* '' */
+.icon-cog:before { content: '\e804'; } /* '' */
+.icon-off:before { content: '\e805'; } /* '' */
+.icon-home:before { content: '\e806'; } /* '' */
+.icon-plus:before { content: '\e807'; } /* '' */
+.icon-video:before { content: '\e808'; } /* '' */
+.icon-move:before { content: '\f047'; } /* '' */
.icon-link-ext:before { content: '\f08e'; } /* '' */
.icon-resize-full-alt:before { content: '\f0b2'; } /* '' */
.icon-doc-text:before { content: '\f0f6'; } /* '' */
diff --git a/system/author/css/fontello/demo.html b/system/author/css/fontello/demo.html
index 4750e9a..1cd55b6 100644
--- a/system/author/css/fontello/demo.html
+++ b/system/author/css/fontello/demo.html
@@ -229,11 +229,11 @@ body {
}
@font-face {
font-family: 'fontello';
- src: url('./font/fontello.eot?74591350');
- src: url('./font/fontello.eot?74591350#iefix') format('embedded-opentype'),
- url('./font/fontello.woff?74591350') format('woff'),
- url('./font/fontello.ttf?74591350') format('truetype'),
- url('./font/fontello.svg?74591350#fontello') format('svg');
+ src: url('./font/fontello.eot?44201991');
+ src: url('./font/fontello.eot?44201991#iefix') format('embedded-opentype'),
+ url('./font/fontello.woff?44201991') format('woff'),
+ url('./font/fontello.ttf?44201991') format('truetype'),
+ url('./font/fontello.svg?44201991#fontello') format('svg');
font-weight: normal;
font-style: normal;
}
@@ -298,19 +298,24 @@ body {
-
icon-cancel0xe800
+
icon-videocam0xe800
icon-picture0xe801
-
icon-font0xe802
-
icon-cog0xe803
+
icon-cancel0xe802
+
icon-font0xe803
-
icon-off0xe804
-
icon-home0xe805
-
icon-plus0xe806
+
icon-cog0xe804
+
icon-off0xe805
+
icon-home0xe806
+
icon-plus0xe807
+
+
+
icon-video0xe808
+
icon-move0xf047
icon-link-ext0xf08e
+
icon-resize-full-alt0xf0b2
-
icon-resize-full-alt0xf0b2
icon-doc-text0xf0f6
icon-folder-empty0xf114
diff --git a/system/author/css/fontello/font/fontello.eot b/system/author/css/fontello/font/fontello.eot
index aa233f6..4576ecb 100644
Binary files a/system/author/css/fontello/font/fontello.eot and b/system/author/css/fontello/font/fontello.eot differ
diff --git a/system/author/css/fontello/font/fontello.svg b/system/author/css/fontello/font/fontello.svg
index 176ae04..5727e57 100644
--- a/system/author/css/fontello/font/fontello.svg
+++ b/system/author/css/fontello/font/fontello.svg
@@ -1,24 +1,30 @@
diff --git a/system/author/js/lazy-video.js b/system/author/js/lazy-video.js
new file mode 100644
index 0000000..7c1a8f8
--- /dev/null
+++ b/system/author/js/lazy-video.js
@@ -0,0 +1,34 @@
+( function() {
+
+ var youtube = document.querySelectorAll( ".youtube" );
+
+ for (var i = 0; i < youtube.length; i++)
+ {
+ var thisyoutube = youtube[i];
+ thisyoutube.parentNode.classList.add("video-container");
+
+ var playbutton = document.createElement("button");
+ playbutton.classList.add("play-video");
+ playbutton.value = "Play";
+
+ thisyoutube.parentNode.appendChild(playbutton);
+
+ playbutton.addEventListener( "click", function(event)
+ {
+ event.preventDefault();
+ event.stopPropagation();
+
+ var iframe = document.createElement( "iframe" );
+
+ iframe.setAttribute( "frameborder", "0" );
+ iframe.setAttribute( "allowfullscreen", "" );
+ iframe.setAttribute( "width", "560" );
+ iframe.setAttribute( "height", "315" );
+ iframe.setAttribute( "src", "https://www.youtube.com/embed/" + thisyoutube.id + "?rel=0&showinfo=0&autoplay=1" );
+
+ var videocontainer = thisyoutube.parentNode
+ videocontainer.innerHTML = "";
+ videocontainer.appendChild( iframe );
+ })(thisyoutube);
+ };
+} )();
\ No newline at end of file
diff --git a/system/author/js/vue-blox.js b/system/author/js/vue-blox.js
index 61bff2e..b181aeb 100644
--- a/system/author/js/vue-blox.js
+++ b/system/author/js/vue-blox.js
@@ -22,7 +22,7 @@ const contentComponent = Vue.component('content-block', {
this.compmarkdown = $event;
this.$nextTick(function () {
this.$refs.preview.style.minHeight = this.$refs.component.offsetHeight + 'px';
- });
+ });
},
switchToEditMode: function()
{
@@ -35,9 +35,22 @@ const contentComponent = Vue.component('content-block', {
this.edit = true; /* show the edit-mode */
this.compmarkdown = self.$root.$data.blockMarkdown; /* get markdown data */
this.componentType = self.$root.$data.blockType; /* get block-type of element */
- this.$nextTick(function () {
- this.$refs.preview.style.minHeight = this.$refs.component.offsetHeight + 'px';
- });
+ if(this.componentType == 'image-component')
+ {
+ setTimeout(function(){
+ self.$nextTick(function ()
+ {
+ self.$refs.preview.style.minHeight = self.$refs.component.offsetHeight + 'px';
+ });
+ }, 200);
+ }
+ else
+ {
+ this.$nextTick(function ()
+ {
+ this.$refs.preview.style.minHeight = self.$refs.component.offsetHeight + 'px';
+ });
+ }
},
closeComponents: function()
{
@@ -80,7 +93,7 @@ const contentComponent = Vue.component('content-block', {
if(self.$root.$data.blockType != '')
{
this.switchToEditMode();
- }
+ }
},
submitBlock: function(){
var emptyline = /^\s*$(?:\r\n?|\n)/gm;
@@ -99,8 +112,6 @@ const contentComponent = Vue.component('content-block', {
},
saveBlock: function()
{
- console.log(this.compmarkdown);
-
if(this.compmarkdown == undefined || this.compmarkdown.replace(/(\r\n|\n|\r|\s)/gm,"") == '')
{
this.switchToPreviewMode();
@@ -116,6 +127,11 @@ const contentComponent = Vue.component('content-block', {
var url = self.$root.$data.root + '/api/v1/image';
var method = 'PUT';
}
+ else if(this.componentType == 'video-component')
+ {
+ var url = self.$root.$data.root + '/api/v1/video';
+ var method = 'POST';
+ }
else
{
var url = self.$root.$data.root + '/api/v1/block';
@@ -268,7 +284,20 @@ const titleComponent = Vue.component('title-component', {
const imageComponent = Vue.component('image-component', {
props: ['compmarkdown', 'disabled'],
- template: '',
+ template: '',
data: function(){
return {
maxsize: 5, // megabyte
@@ -279,19 +308,21 @@ const imageComponent = Vue.component('image-component', {
imgtitle: '',
imgcaption: '',
imglink: '',
+ imgclass: 'center',
+ imgid: '',
imgfile: 'imgplchldr',
}
},
mounted: function(){
- // autosize(document.querySelector('textarea'));
- this.$refs.markdown.focus();
+ this.$refs.markdown.focus();
+
if(this.compmarkdown)
- {
+ {
this.imgmeta = true;
var imgmarkdown = this.compmarkdown;
-
+
var imgcaption = imgmarkdown.match(/\*.*?\*/);
if(imgcaption){
this.imgcaption = imgcaption[0].slice(1,-1);
@@ -322,6 +353,25 @@ const imageComponent = Vue.component('image-component', {
{
this.imgalt = imgalt[0].slice(1,-1);
}
+
+ var imgattr = imgmarkdown.match(/\{.*?\}/);
+ if(imgattr)
+ {
+ imgattr = imgattr[0].slice(1,-1);
+ imgattr = imgattr.split(' ');
+ for (var i = 0; i < imgattr.length; i++)
+ {
+ if(imgattr[i].charAt(0) == '.')
+ {
+ this.imgclass = imgattr[i].slice(1);
+ }
+ else if(imgattr[i].charAt(0) == '#')
+ {
+ this.imgid = imgattr[i].slice(1);
+ }
+ }
+ }
+
var imgpreview = imgmarkdown.match(/\(.*?\)/);
if(imgpreview)
{
@@ -331,13 +381,20 @@ const imageComponent = Vue.component('image-component', {
}
},
methods: {
+ isChecked: function(classname)
+ {
+ if(this.imgclass == classname)
+ {
+ return ' checked';
+ }
+ },
updatemarkdown: function(event)
{
this.$emit('updatedMarkdown', event.target.value);
},
createmarkdown: function()
{
- errors = false;
+ var errors = false;
if(this.imgalt.length < 101)
{
@@ -365,6 +422,34 @@ const imageComponent = Vue.component('image-component', {
imgmarkdown = imgmarkdown + '(' + this.imgfile + ')';
}
+ var imgattr = '';
+ if(this.imgid != '')
+ {
+ if(this.imgid.length < 100)
+ {
+ imgattr = imgattr + '#' + this.imgid + ' ';
+ }
+ else
+ {
+ errors = 'Maximum size of image id is 100 characters';
+ }
+ }
+ if(this.imgclass != '')
+ {
+ if(this.imgclass.length < 100)
+ {
+ imgattr = imgattr + '.' + this.imgclass;
+ }
+ else
+ {
+ errors = 'Maximum size of image class is 100 characters';
+ }
+ }
+ if(this.imgid != '' || this.imgclass != '')
+ {
+ imgmarkdown = imgmarkdown + '{' + imgattr + '}';
+ }
+
if(this.imglink != '')
{
if(this.imglink.length < 101)
@@ -376,7 +461,7 @@ const imageComponent = Vue.component('image-component', {
errors = 'Maximum size of image link is 100 characters';
}
}
-
+
if(this.imgcaption != '')
{
if(this.imgcaption.length < 140)
@@ -388,7 +473,7 @@ const imageComponent = Vue.component('image-component', {
errors = 'Maximum size of image caption is 140 characters';
}
}
-
+
if(errors)
{
this.$parent.freezePage();
@@ -472,6 +557,20 @@ const imageComponent = Vue.component('image-component', {
}
})
+const videoComponent = Vue.component('video-component', {
+ props: ['compmarkdown', 'disabled', 'load'],
+ template: '' +
+ '
' +
+ '
' +
+ '
',
+ methods: {
+ updatemarkdown: function(event)
+ {
+ this.$emit('updatedMarkdown', event.target.value);
+ },
+ },
+})
+
const tableComponent = Vue.component('table', {
template: 'table component
',
})
diff --git a/system/author/layouts/layoutBlox.twig b/system/author/layouts/layoutBlox.twig
index 709e2e5..710a246 100644
--- a/system/author/layouts/layoutBlox.twig
+++ b/system/author/layouts/layoutBlox.twig
@@ -19,7 +19,7 @@
-
+
@@ -36,13 +36,14 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+