JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
/admin_pages: listing sorts, missing image doesn't bork ckeditor
authorJason Woofenden <jason@jasonwoof.com>
Thu, 13 Aug 2015 16:24:26 +0000 (12:24 -0400)
committerJason Woofenden <jason@jasonwoof.com>
Thu, 13 Aug 2015 16:24:26 +0000 (12:24 -0400)
admin_pages.html
admin_pages.php

index 80c7c2d..9e80c36 100644 (file)
@@ -2,7 +2,7 @@
 
 <html>
 <head>
 
 <html>
 <head>
-       <title><!--~$title show {~-->~$host~ Admin: <!--~listings once_if {~-->Manage pages<!--~}~--><!--~form {~--><!--~id {~-->Add a new page<!--~}~--><!--~id unset {~-->Edit page "~title html~"<!--~}~--><!--~}~--><!--~}~--></title>
+       <title><!--~$title show {~-->~$host~ Admin: <!--~listing {~-->Manage Pages<!--~}~--><!--~form {~--><!--~id unset {~-->Add a new page<!--~}~--><!--~id {~-->Edit page "~title html~"<!--~}~--><!--~}~--><!--~}~--></title>
        <!--~$head {~-->
        <script src="inc/ckeditor/ckeditor.js?t=F0RD"></script>
        <style>
        <!--~$head {~-->
        <script src="inc/ckeditor/ckeditor.js?t=F0RD"></script>
        <style>
        </style>
        <script>
                window.cke_wfpl_images = {
        </style>
        <script>
                window.cke_wfpl_images = {
-                       images: [~wfpl_images {~
-                               {
-                                       thumb: "~image thumb_src jsdq~",
-                                       image: "~image image_src jsdq~",
-                                       image_width: ~image image_width~,
-                                       image_height: ~image image_height~,
-                                       sizes: "~sizes jsdq~",
-                                       caption: "~caption jsdq~"
-                               }~ sep {~,~}~~}~
-                       ],
+                       images: ~wfpl_images_json~,
                        next_id: 0,
                        selected: [],
                        editors: []
                };
                        next_id: 0,
                        selected: [],
                        editors: []
                };
+               var enc_html = function(str) {
+                       return str.replace(/[<>&]/g, function(i) { return '&#' + i.charCodeAt(0) + ';'; });
+               };
                function cke_wfpl_images_thumb_click(plugin_id, element, image_id) {
                        var thumbs = element.parentNode.children;
                        var i, thumb;
                function cke_wfpl_images_thumb_click(plugin_id, element, image_id) {
                        var thumbs = element.parentNode.children;
                        var i, thumb;
                        width = image.image_width;
                        height = image.image_height;
                        src = image.image;
                        width = image.image_width;
                        height = image.image_height;
                        src = image.image;
-                       caption = image.caption;
-                       if (caption == '') {
+                       if (image.caption == '') {
                                caption = '&nbsp;';
                                caption = '&nbsp;';
+                       } else {
+                               caption = enc_html(image.caption);
                        }
                        if (align != 'full') {
                                var wh = size.split('x');
                        }
                        if (align != 'full') {
                                var wh = size.split('x');
                                size = '' + wh[0] + '-' + wh[1]; // dash instead of x
                                src = src.substr(0, src.length - 4) + '-' + size + src.substr(src.length - 4);
                        }
                                size = '' + wh[0] + '-' + wh[1]; // dash instead of x
                                src = src.substr(0, src.length - 4) + '-' + size + src.substr(src.length - 4);
                        }
+                       height += 4;
                        code += ' style="background-image: url(/' + src + ');';
                        code += ' width: ' + width + 'px;';
                        code += ' padding-top: ' + height + 'px;';
                        code += ' style="background-image: url(/' + src + ');';
                        code += ' width: ' + width + 'px;';
                        code += ' padding-top: ' + height + 'px;';
                                        toolbar: 'insert'
                                });
                                CKEDITOR.dialog.add('wfpl_images_dialog', function (api) {
                                        toolbar: 'insert'
                                });
                                CKEDITOR.dialog.add('wfpl_images_dialog', function (api) {
+                                       var i, im, selected, thumbs;
+                                       selected = 'selected ';
+                                       thumbs = '<div class="cke_wfpl_thumbs">'
+                                       for (i in window.cke_wfpl_images.images) {
+                                               im = window.cke_wfpl_images.images[i];
+                                               thumbs += '<div class="'+selected+'cke_wfpl_thumb" onclick="return window.cke_wfpl_images_thumb_click('+plugin_id+', this, '+im.id+')" style="background-image: url('+im.thumb+')">'+ enc_html(im.name.length > 0 ? im.name : im.caption) + '</div>';
+                                               selected = '';
+                                       }
+                                       thumbs += '</div>'
                                        return {
                                                title: 'Insert Image',
                                                minWidth: 700,
                                        return {
                                                title: 'Insert Image',
                                                minWidth: 700,
                                                                                type: 'html',
                                                                                html: '<div class="cke_wfpl_images_dialog">'
                                                                                        + '<h3>Step 1: Choose an image to insert:</h3>'
                                                                                type: 'html',
                                                                                html: '<div class="cke_wfpl_images_dialog">'
                                                                                        + '<h3>Step 1: Choose an image to insert:</h3>'
-                                                                                       + "<div class=\"cke_wfpl_thumbs\">~wfpl_images {~ <div class=\"~ first {~selected ~}~cke_wfpl_thumb\" onclick=\"return window.cke_wfpl_images_thumb_click("+plugin_id+", this, ~id~)\" style=\"background-image: url(~image thumb_src attr jsdq~)\">~caption empty {~~name html jsdq~~}~~caption nonempty {~~caption html jsdq~~}~</div>~}~</div>"
+                                                                                       + thumbs
                                                                                + '<p>If you\'d like to insert an image not shown above, you can <a href="admin_images?new=1" target="_blank">upload it here</a>. Sorry, it won\'t appear here until you reload this editor page (hit Save below, then "edit this page" again.)</p>'
                                                                                + '</div>'
                                                                        }
                                                                                + '<p>If you\'d like to insert an image not shown above, you can <a href="admin_images?new=1" target="_blank">upload it here</a>. Sorry, it won\'t appear here until you reload this editor page (hit Save below, then "edit this page" again.)</p>'
                                                                                + '</div>'
                                                                        }
                        <div class="field_notes">(<!--~editing {~-->Careful: if you change this, be sure to update all links to this page<!--~}~--><!--~editing unset {~-->Please use only a-z, 0-9 and _ (underscore) in your filename. Please, no capitals, punctuation or spaces.<!--~}~-->)</div>
                        <div class="field"><input type="text" name="filename" value="~filename attr~"></div>
 
                        <div class="field_notes">(<!--~editing {~-->Careful: if you change this, be sure to update all links to this page<!--~}~--><!--~editing unset {~-->Please use only a-z, 0-9 and _ (underscore) in your filename. Please, no capitals, punctuation or spaces.<!--~}~-->)</div>
                        <div class="field"><input type="text" name="filename" value="~filename attr~"></div>
 
-                       <div class="caption">Show in navigation links</div>
-                       <div class="field_notes">(On the left of every page.)</div>
+                       <div class="caption">Show in site-wide navigation links (optional)</div>
                        <div class="field"><select name="navbar"><!--~navbar options~--></select></div>
 
                        <div class="caption">Navigation Link Text</div>
                        <div class="field"><select name="navbar"><!--~navbar options~--></select></div>
 
                        <div class="caption">Navigation Link Text</div>
                        </div>
                        <div class="field"><textarea class="html_editor" rows="20" cols="50" id="content" name="content">~content html~</textarea><script>make_wysiwyg('content');</script></div>
 
                        </div>
                        <div class="field"><textarea class="html_editor" rows="20" cols="50" id="content" name="content">~content html~</textarea><script>make_wysiwyg('content');</script></div>
 
+                       <!--
                        <div class="caption">Description</div>
                        <div class="field_notes">(Hidden description of this page, primarily for search engines.)</div>
                        <div class="field"><textarea rows="9" cols="22" name="description">~description html~</textarea></div>
                        <div class="caption">Description</div>
                        <div class="field_notes">(Hidden description of this page, primarily for search engines.)</div>
                        <div class="field"><textarea rows="9" cols="22" name="description">~description html~</textarea></div>
                        <div class="caption">Keywords</div>
                        <div class="field_notes">(Hidden words (up to 30) with commas between them for search engines)</div>
                        <div class="field"><textarea rows="9" cols="22" name="keywords">~keywords html~</textarea></div>
                        <div class="caption">Keywords</div>
                        <div class="field_notes">(Hidden words (up to 30) with commas between them for search engines)</div>
                        <div class="field"><textarea rows="9" cols="22" name="keywords">~keywords html~</textarea></div>
+                       -->
 
                        <div class="caption">&nbsp;</div>
                        <div class="field"><input type="submit" name="save" value="Save"></div>
 
                        <div class="caption">&nbsp;</div>
                        <div class="field"><input type="submit" name="save" value="Save"></div>
                <div class="field"><a href="~filename nonempty {~~filename attr~~}~~filename empty {~admin_pages~id {~?id=~id~~}~~}~">Cancel</a></div>
        <!--~}~-->
 
                <div class="field"><a href="~filename nonempty {~~filename attr~~}~~filename empty {~admin_pages~id {~?id=~id~~}~~}~">Cancel</a></div>
        <!--~}~-->
 
-       <!--~listings once {~-->
+       <!--~listing {~-->
                <h1>~$host~ Admin Control Panel</h1>
                <h2>Manage Pages</h2>
 
                <h1>~$host~ Admin Control Panel</h1>
                <h2>Manage Pages</h2>
 
-               <!--~listings once_if {~-->
+               <!--~rows once_if {~-->
                        <p><a href="admin_pages?new=1">[Add a new page]</a></p>
 
                        <table cellspacing="0" cellpadding="4" border="0" summary="" class="evenodd">
                        <p><a href="admin_pages?new=1">[Add a new page]</a></p>
 
                        <table cellspacing="0" cellpadding="4" border="0" summary="" class="evenodd">
-                               <tr><th>Title</th><th>Filename</th><th>&nbsp;</th></tr>
-                               <!--~listings {~-->
                                <tr>
                                <tr>
-                                       <td class="listing"><a href="admin_pages?edit_id=~id~">~title html~<!--~title empty {~--><em>(untitled)</em><!--~}~--></a></td>
+                                       <th><a href="?sort=~sorting-by-filename~filename">Filename</a></th>
+                                       <th><a href="?sort=~sorting-by-title~title">Title</a></th>
+                                       <th>&nbsp;</th>
+                               </tr><!--~rows {~-->
+                               <tr>
                                        <td class="listing"><a href="admin_pages?edit_id=~id~">~filename html~<!--~filename empty {~--><em>(offline)</em><!--~}~--></a></td>
                                        <td class="listing"><a href="admin_pages?edit_id=~id~">~filename html~<!--~filename empty {~--><em>(offline)</em><!--~}~--></a></td>
-                                       <td><a href="admin_pages?admin_pages_delete_id=~id~" onclick="return confirm('Permanently delete?')">[delete this page]</a></td>
-                               </tr>
-                               <!--~}~-->
+                                       <td class="listing"><a href="admin_pages?edit_id=~id~">~title html~<!--~title empty {~--><em>(untitled)</em><!--~}~--></a></td>
+                                       <td><a href="admin_pages?admin_pages_delete_id=~id~" onclick="return confirm('Permanently delete?')">[delete]</a></td>
+                               </tr><!--~}~-->
 
                        </table>
                <!--~}~-->
 
                        </table>
                <!--~}~-->
-               <!--~listings once_else {~-->
+               <!--~rows once_else {~-->
                        <p>No pages in database.</p>
                <!--~}~-->
 
                        <p>No pages in database.</p>
                <!--~}~-->
 
index 1a9b2cb..9c7f56a 100644 (file)
@@ -5,9 +5,6 @@
 define('ADMIN_PAGES_DB_FIELDS', 'title,filename,navbar,nav_title,content,description,keywords');
 
 
 define('ADMIN_PAGES_DB_FIELDS', 'title,filename,navbar,nav_title,content,description,keywords');
 
 
-require_once(DOCROOT . 'inc/wfpl/format.php');
-require_once(DOCROOT . 'inc/wfpl/email.php');
-
 function format_cms_filename($str) {
        $str = format_filename($str);
        $str = str_replace('.', '_', $str);
 function format_cms_filename($str) {
        $str = format_filename($str);
        $str = str_replace('.', '_', $str);
@@ -75,22 +72,47 @@ function admin_pages_main_delete($id) {
        return './admin_pages';
 }
 
        return './admin_pages';
 }
 
+# get all images from admin_images (for cms)
 function admin_pages_get_images() {
 function admin_pages_get_images() {
-       $images = db_get_assocs('cms_images', 'image,name,caption,sizes', 'order by name, caption, image');
-       if ($images) {
+       $out = [];
+       $rows = db_get_assocs('cms_images', 'image,name,caption,sizes', 'order by name, caption, image');
+       if ($rows) {
                $id = 0;
                $id = 0;
-               foreach($images as &$image) {
-                       $image['id'] = '' . $id;
+               foreach($rows as &$row) {
+                       $parts = explode(' ', $row['image'] . '      ', 7);
+                       $out[] = [
+                               'id' => '' . $id,
+                               'thumb' => $parts[3],
+                               'image' => $parts[0],
+                               'image_width' => (int)$parts[1],
+                               'image_height' => (int)$parts[2],
+                               'sizes' => $row['sizes'],
+                               'name' => $row['name'],
+                               'caption' => $row['caption']
+                       ];
                        $id += 1;
                        $id += 1;
-               }
-               return $images;
+               } unset($row);
        }
        }
-       return null;
+       return $out;
 }
 
 function admin_pages_main_listing() {
 }
 
 function admin_pages_main_listing() {
-       $listing_rows = db_get_assocs('cms_pages', 'id,filename,coalesce(nullif(nav_title,\'\'), title) as title', 'order by concat(nav_title,title)');
-       tem_set('listings', $listing_rows);
+       $data = array();
+       $desc = '';
+       $sort = _REQUEST_cut('sort');
+       if ($sort && substr($sort, 0, 1) === '-') {
+               $sort = substr($sort, 1);
+               $desc = ' DESC ';
+       } else {
+               $data["sorting-by-$sort"] = '-';
+       }
+       $legal_sorts = explode(',', ADMIN_PAGES_DB_FIELDS);
+       if (!$sort || !in_array($sort, $legal_sorts)) {
+               $sort = 'filename';
+       }
+
+       $data['rows'] = db_get_assocs('cms_pages', 'id,coalesce(nullif(nav_title,\'\'), title) as title,filename', "order by $sort $desc limit 1000");
+       tem_set('listing', $data);
 }
 
 function admin_pages_main_form($id = false) {
 }
 
 function admin_pages_main_form($id = false) {
@@ -149,7 +171,7 @@ function admin_pages_main_form($id = false) {
                $data = array('filename' => format_cms_filename($_REQUEST['new_filename']));
        }
 
                $data = array('filename' => format_cms_filename($_REQUEST['new_filename']));
        }
 
-       tem_set('wfpl_images', admin_pages_get_images());
+       tem_set('wfpl_images_json', json_encode(admin_pages_get_images()));
        tem_set('form', $data);
        tem_set('$head'); # wysiwyg init goes in <head>
 }
        tem_set('form', $data);
        tem_set('$head'); # wysiwyg init goes in <head>
 }