From 61939f68e18b10670bf4131eaf795a08f7badbc2 Mon Sep 17 00:00:00 2001 From: Jean-Christian Denis Date: Mon, 5 Dec 2022 22:39:13 +0100 Subject: [PATCH] first commit from templator 1.3.3 --- LICENSE | 339 ++++++++++++++++++++++++++++++ _admin.php | 152 ++++++++++++++ _define.php | 22 ++ _install.php | 32 +++ _prepend.php | 48 +++++ _public.php | 46 ++++ advanced.php | 79 +++++++ edit.php | 99 +++++++++ icon.png | Bin 0 -> 614 bytes img/copy.png | Bin 0 -> 549 bytes img/delete.png | Bin 0 -> 1031 bytes img/template-alt.png | Bin 0 -> 2753 bytes img/template-widget.png | Bin 0 -> 3056 bytes img/template.png | Bin 0 -> 3328 bytes inc/admin.pager.templator.php | 120 +++++++++++ inc/class.templator.php | 380 ++++++++++++++++++++++++++++++++++ index.php | 315 ++++++++++++++++++++++++++++ js/form.js | 14 ++ js/script.js | 15 ++ locales/fr/main.lang.php | 150 ++++++++++++++ locales/fr/main.po | 204 ++++++++++++++++++ style/style.css | 7 + template_posts.php | 135 ++++++++++++ 23 files changed, 2157 insertions(+) create mode 100644 LICENSE create mode 100644 _admin.php create mode 100644 _define.php create mode 100644 _install.php create mode 100644 _prepend.php create mode 100644 _public.php create mode 100644 advanced.php create mode 100644 edit.php create mode 100644 icon.png create mode 100644 img/copy.png create mode 100644 img/delete.png create mode 100644 img/template-alt.png create mode 100644 img/template-widget.png create mode 100644 img/template.png create mode 100644 inc/admin.pager.templator.php create mode 100644 inc/class.templator.php create mode 100644 index.php create mode 100644 js/form.js create mode 100644 js/script.js create mode 100644 locales/fr/main.lang.php create mode 100644 locales/fr/main.po create mode 100644 style/style.css create mode 100644 template_posts.php diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/_admin.php b/_admin.php new file mode 100644 index 0000000..10bf59e --- /dev/null +++ b/_admin.php @@ -0,0 +1,152 @@ +addItem(__('Templates'), + 'plugin.php?p=templator','index.php?pf=templator/icon.png', + preg_match('/plugin.php\?p=templator(&.*)?$/',$_SERVER['REQUEST_URI']), + $core->auth->check('contentadmin,templator',$core->blog->id)); + +$core->auth->setPermissionType('templator',__('manage templates')); + +if ($core->auth->check('templator,contentadmin',$core->blog->id)) { + $core->addBehavior('adminPostFormSidebar',array('templatorBehaviors','adminPostFormSidebar')); + $core->addBehavior('adminPageFormSidebar',array('templatorBehaviors','adminPostFormSidebar')); + + $core->addBehavior('adminAfterPostCreate',array('templatorBehaviors','adminBeforePostUpdate')); + $core->addBehavior('adminBeforePostUpdate',array('templatorBehaviors','adminBeforePostUpdate')); + $core->addBehavior('adminAfterPageCreate',array('templatorBehaviors','adminBeforePostUpdate')); + $core->addBehavior('adminBeforePageUpdate',array('templatorBehaviors','adminBeforePostUpdate')); + + $core->addBehavior('adminPostsActionsCombo',array('templatorBehaviors','adminPostsActionsCombo')); + $core->addBehavior('adminPostsActions',array('templatorBehaviors','adminPostsActions')); + $core->addBehavior('adminPostsActionsContent',array('templatorBehaviors','adminPostsActionsContent')); + $core->addBehavior('adminPagesActionsCombo',array('templatorBehaviors','adminPostsActionsCombo')); + $core->addBehavior('adminPagesActions',array('templatorBehaviors','adminPostsActions')); + $core->addBehavior('adminPagesActionsContent',array('templatorBehaviors','adminPostsActionsContent')); +} + +class templatorBehaviors +{ + public static function adminPostFormSidebar($post) + { + global $core; + + $tpl = array(' ' => ''); + $tpl_post = array(); + $selected = ''; + + foreach ($core->templator->tpl as $k => $v) { + if (!preg_match('/^category-(.+)$/',$k)) + { + $tpl_post= array_merge($tpl_post, array($k => $k)); + } + } + + $tpl = array_merge($tpl,$tpl_post); + if ($post) + { + $params['meta_type'] = 'template'; + $params['post_id'] = $post->post_id; + $post_meta = $core->meta->getMetadata($params); + $selected = $post_meta->isEmpty()? '' : $post_meta->meta_id ; + } + + echo + '
'.form::combo('post_tpl',$tpl,$selected).'
'; + + } + + public static function adminBeforePostUpdate($cur,$post_id) + { + global $core; + + $post_id = (integer) $post_id; + + if (isset($_POST['post_tpl'])) { + $tpl = $_POST['post_tpl']; + + $core->meta->delPostMeta($post_id,'template'); + if (!empty($_POST['post_tpl'])) + { + $core->meta->setPostMeta($post_id,'template',$tpl); + } + } + } + + public static function adminPostsActionsCombo($args) + { + $args[0][__('Appearance')] = array(__('Select the template') => 'tpl'); + } + + public static function adminPostsActions($core,$posts,$action,$redir) + { + if ($action == 'tpl' && isset($_POST['post_tpl'])) + { + try + { + $tpl = $_POST['post_tpl']; + + while ($posts->fetch()) + { + $core->meta->delPostMeta($posts->post_id,'template'); + if (!empty($_POST['post_tpl'])) + { + $core->meta->setPostMeta($posts->post_id,'template',$tpl); + } + } + + http::redirect($redir); + } + catch (Exception $e) + { + $core->error->add($e->getMessage()); + } + } + } + + public static function adminPostsActionsContent($core,$action,$hidden_fields) + { + if ($action == 'tpl') + { + $tpl = array(' ' => ''); + $tpl_post = array(); + $selected = ''; + + foreach ($core->templator->tpl as $k => $v) { + if (!preg_match('/^category-(.+)$/',$k) && !preg_match('/^list-(.+)$/',$k)) + { + $tpl_post= array_merge($tpl_post, array($k => $k)); + } + } + + $tpl = array_merge($tpl,$tpl_post); + + echo + '

'.__('Select template for these entries').'

'. + '
'. + '

'. + + $hidden_fields. + $core->formNonce(). + form::hidden(array('action'),'tpl'). + '

'. + '
'; + + } + } +} +?> \ No newline at end of file diff --git a/_define.php b/_define.php new file mode 100644 index 0000000..50a89c0 --- /dev/null +++ b/_define.php @@ -0,0 +1,22 @@ +registerModule( + /* Name */ 'Templator', + /* Description*/ 'Create and select more templates for your posts', + /* Author */ 'Osku and contributors', + /* Version */ '1.3.3', + /* Permissions */ 'contentadmin,templator' +); +?> \ No newline at end of file diff --git a/_install.php b/_install.php new file mode 100644 index 0000000..0a0fa54 --- /dev/null +++ b/_install.php @@ -0,0 +1,32 @@ +error->add(__('Version 2.3.1 of Dotclear at least is required for this version of Templator.')); + $core->plugins->deactivateModule('templator'); + return false; +} + +$new_version = $core->plugins->moduleInfo('templator','version'); + +$current_version = $core->getVersion('templator'); + +if (version_compare($current_version,$new_version,'>=')) { + return; +} + +$core->setVersion('templator',$new_version); +return true; +?> \ No newline at end of file diff --git a/_prepend.php b/_prepend.php new file mode 100644 index 0000000..c460627 --- /dev/null +++ b/_prepend.php @@ -0,0 +1,48 @@ +templator = new dcTemplator($core); + +$core->addBehavior('initWidgets',array('templatorWidgets','initWidgets')); + +class templatorWidgets +{ + public static function initWidgets($w) + { + $w->create('templatorWidget',__('Templator › Rendering'),array('widgetTemplator','getDataTpl')); + $tpl = array('      .html' => ''); + foreach ($GLOBALS['core']->templator->tpl as $k => $v) { + if (preg_match('/^widget-(.+)$/',$k)) + { + $tpl = array_merge($tpl, array($k => $k)); + } + } + $w->templatorWidget->setting('template',__('Template:'),'','combo',$tpl); + } +} + +class widgetTemplator +{ + public static function getDataTpl($w) + { + if (($GLOBALS['core']->tpl->getFilePath($w->template))) + { + echo $GLOBALS['core']->tpl->getData($w->template); + } + } +} +?> \ No newline at end of file diff --git a/_public.php b/_public.php new file mode 100644 index 0000000..f2aceb0 --- /dev/null +++ b/_public.php @@ -0,0 +1,46 @@ +tpl->setPath($core->tpl->getPath(), $core->templator->path); +$core->addBehavior('urlHandlerBeforeGetData',array('publicTemplatorBehaviors','BeforeGetData')); + + +class publicTemplatorBehaviors +{ + public static function BeforeGetData ($_ctx) + { + global $core; + + if (array_key_exists($core->url->type,$core->getPostTypes()) || ($core->url->type == 'pages')) + { + $params = array(); + $params['meta_type'] = 'template'; + $params['post_id'] = $_ctx->posts->post_id; + $post_meta = $core->meta->getMetadata($params); + + if (!$post_meta->isEmpty() && ($core->tpl->getFilePath($post_meta->meta_id))) + { + $_ctx->current_tpl = $post_meta->meta_id; + } + } + + if (($_ctx->current_tpl == "category.html") && preg_match('/^[0-9]{1,}/',$_ctx->categories->cat_id,$cat_id)) + { + $tpl = 'category-'.$cat_id[0].'.html'; + if (($core->tpl->getFilePath($tpl))) { + $_ctx->current_tpl = $tpl; + } + } + } +} +?> \ No newline at end of file diff --git a/advanced.php b/advanced.php new file mode 100644 index 0000000..8da2431 --- /dev/null +++ b/advanced.php @@ -0,0 +1,79 @@ + + + + <?php echo __('Templator'); ?> + + + + +'.html::escapeHTML($core->blog->name).' › '.__('Supplementary templates').''.__('Database informations').''; + +$tags = $core->meta->getMetadata(array('meta_type' => 'template')); +$tags = $core->meta->computeMetaStats($tags); +$tags->sort('meta_id_lower','asc'); + +$last_letter = null; +$cols = array('',''); +$col = 0; +while ($tags->fetch()) +{ + $letter = mb_strtoupper(mb_substr($tags->meta_id,0,1)); + + if ($last_letter != $letter) { + if ($tags->index() >= round($tags->count()/2)) { + $col = 1; + } + $cols[$col] .= ''.$letter.''; + } + + $img = '%1$s'; + if (array_key_exists($tags->meta_id,$core->templator->tpl)) { + $img_status = sprintf($img,__('available template'),'check-on.png'); + } else { + $img_status = sprintf($img,__('missing template'),'check-off.png'); + } + + $cols[$col] .= + ''. + ''.$tags->meta_id.' '.$img_status.''. + ''.$tags->count.' '. + (($tags->count==1) ? __('entry') : __('entries')).''. + ''; + + $last_letter = $letter; +} + +$table = '
%s
'; + +if ($cols[0]) +{ + echo '
'; + printf($table,$cols[0]); + if ($cols[1]) { + printf($table,$cols[1]); + } + echo '
'; +} +else +{ + echo '

'.__('No specific templates on this blog.').'

'; +} +?> + + + \ No newline at end of file diff --git a/edit.php b/edit.php new file mode 100644 index 0000000..87735bd --- /dev/null +++ b/edit.php @@ -0,0 +1,99 @@ +templator->getSourceContent($name); + $name = $file['f']; + } + + if (preg_match('/^category-(.+).html$/',$name,$cat_id)) { + $category = $core->blog->getCategory($cat_id[1]); + $full_name = ''; + $cat_parents = $core->blog->getCategoryParents($cat_id[1]); + while ($cat_parents->fetch()) {$full_name = $cat_parents->cat_title.' › ';}; + $full_name = $full_name.$core->blog->getCategory($cat_id)->cat_title; + $name .= ' ('.$full_name.$category->cat_title.')'; + } + } + catch (Exception $e) + { + $file = $file_default; + throw $e; + } + # Write file + if (!empty($_POST['write'])) + { + $file['c'] = $_POST['file_content']; + $core->templator->writeTpl($file['f'],$file['c']); + } +} +catch (Exception $e) +{ + $core->error->add($e->getMessage()); +} +?> + + + <?php echo __('Templator'); ?> + + + + + + +'.html::escapeHTML($core->blog->name).' › '.__('Supplementary templates').''.__('Edit the template').''; + +if (($file['c'] !== null)) +{ + echo + '
'. + '
'. + '
'.__('File editor').''. + '

'.sprintf(__('Editing file %s'),''.$name).'

'. + '

'.form::textarea('file_content',72,30,html::escapeHTML($file['c']),'maximal','',!$file['w']).'

'; + + if ($file['w']) + { + echo + '

'. + $core->formNonce(). + form::hidden(array('file_id'),html::escapeHTML($file['f'])). + '

'; + + + } + else + { + echo '

'.__('This file is not writable. Please check your files permissions.').'

'; + } + + echo + '
'; +} + +?> + + \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..e75fa5160e92eed4ccf651f100e1bfe9ced356f3 GIT binary patch literal 614 zcmV-s0-61ZP)az|A54f59pd7C>xe+Dz60`~+ewmuqFz(T6Iy88zdqdv z!vwdgC2Z`)pt@r8dOdh)`XHaS&AMbY1DPhMJ27fbg4;F1c@|5sNEi$T__V&hMs*K~ zcf|;Z<+YBb5s&V z|2XIlW89@mVrREMi#{MV3!Eh{x27i-X}Gv8=^FeOl#0 zDdGtSG%+wo5PuzMe#XY$ailklfWd@=;;lK6-^?xL3*|dWbS#e0aZg+Hb*iGCxvKm68D<{8fbA|IOj3O9 zM>u0keDFr*H_?%Cvu5LS9|(LOqwYr>y?GAqY=x5Qpx=j55|xUA7eYtJDN)S8xi=Ch zl_a>9Im}i3AXNR`?bhn*G5%}(XtkI_h<*z&0Nl(dJJs`$+W-In07*qoM6N<$f??$j Avj6}9 literal 0 HcmV?d00001 diff --git a/img/copy.png b/img/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..a454881bf56f5dff9f20fc1e37cbb86ca3df5947 GIT binary patch literal 549 zcmV+=0^0qFP)5 zlFMooK@^6+s;+UR?nGQFzKYJ69^WDabSFrIWF;uVfPxnkyx>B71uv5cK8>g$JB?;? zPS@|Ed&V){i%CI2Q54@f|5qoxd;j*n)m|wpNkS6JnZ-FvNO&rW$=2qLZH}*3Z(f+z zSdX7Rv}J*noyq%d#Ujg%~Ect6NoF*Xf_2rt)G~Vhmim zc$uA@Sx0PVvLtcu!CgtxuY;fZ{pUdQ`Jv2?4h9c_2`7WoBh^Wo~0-b1m?* zJpcdz7IZ~ebU}4=Xm4@=L2hJnWnpt5PHAj&b8l`d@8qKZ0013yMObuGZ*_8GWdLY& zbZ|N^FL!r$E@5tDa%Ew2ZZ30Wq3e3h0009HNkl~t@GQ$uZ zkP-zYV_-@^Om{UT{tex9(=_eEv{*y0EDUO; zNEBrpC`pI8Q)XZ~_kA80U?uU{KEHD|=NzM|9KNkwuGh8pq*WcYVK^)zsK}BH!v(AQ zW$)J3Z-;qv*x+$4H|EBoAKRC@x7eGTL%O@z{^r}dT07`jk(2TEOw?3&a9-{qc43^En=^!= z<-$AThzQp|xkg(i!`S&Tnm^pbY;F)c@?v!7_qEfWh>Vhmd$v*`cIgs0hR5YHYiob- z;gt^%Rf@$T`FtJ>#Lu3gIys5ww|Ky)W5aOR#9~mZ;|vU-s!U#-q9fbEU+e1>i$%J+ zx;Xdt7^;es&%;g)*H0qW4tmyF#0rR@Du@W6IIi<7UdI?fk$)LgGz|BDYVA@O1Q3nT zTqz(T-2U_yrBaE`&Q3bAS=Nh1Zrr?qh|pYFL8B3xK@|f9r`c>SJgo#)lL>aexQo~j z*YoJ<>EZI!H1AGL)7RIBpG+WP+5P+u#!u3$1XfiS%p&w@B(l^#Jd`x$GLciKh@U?P z#^E4E_PeI+eKt#Db{1`Kr+k00Cf1G^Rb|nbi*Bm*N;*H_%jP58{(jZ* zW%tfq!sR8r&JHRM9@d&c_3DV~wf!m^W9}RCbtIKK*3$o)ZyF6WsG_y{ewF zG|JA;zt(IJEDfu^iK_fJCS%NxFkxKxBmYQO)J>;6FP#D)tOVHYimm@$+EZ(Mw`+e*mJOn#vfLu1f#_002ovPDHLkV1hqq B+PVM$ literal 0 HcmV?d00001 diff --git a/img/template-alt.png b/img/template-alt.png new file mode 100644 index 0000000000000000000000000000000000000000..95081a5156cd009cf98f6f7b5d585d4c85e04ab8 GIT binary patch literal 2753 zcmV;y3O@CTP)fFDZ*Bm0X>@2HVIW9V zM@1lLWo&RDW^!+BAWC6tbz+882eSYG3Cc-CK~!ko)mmAP6xS6#_g3|E^)lTv5CaAW z!SoDZ82k|VA$bal5-E{*@QWX!{DAzCNRg8FJfO&eC{c(k*-~uBQDVn9k5(j0m_%Z* zVuP818D{H!spa~dyVb3tXGr%9irmtr_Nudd=R3>5gb?se{&Dz*|NOl!+`9Fb6EXO| z5F+^*dMTiDd2j7^tae5ITI_jzH4*UdIFA1ck@wrHSFiRCq5#_qLLYqe{%>Ac{?5;j zy>R@{ycER|j7CG~v|F&c{%G)c?NOLO`0Gk>?w41tT!{`eGXi1X(1lDr>^5Uyc0Uz0h~E~N_~iK0D6|m`{-TmP7A*L>Wjgn zwY5)s{^%#K|M2zZp~XOwBmsRiiXuRF<1*U>;v}Z)2#dsS$qtF!3fu|^iY15=QiEk6 zMc3*1D2kyrI|t_)7lMVejaP%P@Yy@>ym|J}6d<7tc1a*5fDwmDc&FY|9$?P4SS-NB za}CfBWa5GL6A?qRxeKMB4BtL=x^RB!{HcWVPv3s~&F>wO2h<12s#1EhK+7a0Wmcdx zXq6KEejhprkq|v-6qT>gig=zUJ=(%}D3_~n;@FG)(#x0Y%;z7x_12%hdw3p5)JNrq znX@lMYFuDOD=;GZz9+Xy99ai2;{~C-#8HV>t0hlWt2H=s^e9}sc&W@h{@%?$-#mFR z1rp&{H+4TVR%a=M1Zb=?Gw>rR;^wA{U2}qbgE2DRCnVd0FVNqX+mxkcy=x^Q9ftbAV>j-0r`$2sK@E`zz#=|H>PhI^migG!}>v2YR2 zEG(3_n>)Y4TW{uQ?0@w@$~+{juxtbtM&K|~6h^SKyNwLggZ`io&GwEIy4l)=Zm(^< zX&@;d;|fNU9LXcJeX{WcKECxaR7+K;RcGtJ`@cP!TEy3g#F*7!E@+x#DK6cyXqPSv%0> z2(v6k?;Z|^u-n{*J9ln>e`*haW*WO|sZcmhVNjyXyVyY4VtGTkQj{?O+7RV(AdmAO z6uIRxRS*Pl^ymvjvoBq{cC9e62i({3lsm1JTmf2`b&>J4VoVl*1B8?bdWwnupa(N( zaar^UfJ{W^stu!rhe1yJGcz+(0frNJKxa$`^X7}(ctuyHy?!XOs(X)&fvsJeq)o=4 zoG_A5f<1hZ6ObxbF-=Ei6Pd=l4!=|x^(&Xl6pe`WVn!IkJjHJy0jiEUIpq@EiL`P=kCC1b45 z)z+{%9(NE9B)kKE9Rot<0n;DY>*Td0f`{uHsl}aA9mcWJK9iF@6^N||c%~9{;ZrWn z5>LqFm1btHq{Lcih?&_#+{^ZpQ_e8gJj~WZ5U%x^3z{q|DKy`o&;xN|8OI7B96;dt zpyKddjQ>}JPV9yw}gmNFIi~*MCP0jsX;{Jl4i4E@TQzl>E z*w)89jUQ*NZ*F0r51lNLBZ`B>fbjrls^pbR3W3H_nhH5#fBg+LaJ7^+HOki3jVmi*S?w1WnTUycN2GEE+E zO9?Z;<+4i}K);a3emYV#-I|=4(mNP)cs^%dJzFADP??%NQwck*!Xhaj&BU$T<*U zTYxk4%>^=d`rzGW2b%3}u8_`-cqXUO%pWIWc)774tr13}r)u{6e!Xt6o!H5CO3S*& z*RxdmSN6}w+AJMGGB#x`q&y%pyx!|~xj(=h-#2IL(ms9?@;7&4P> zA!4~Drpxy<6VoUP%o1nxVd{SQa%UbSoN2AdUXh&|@w-S8XTGZU6ESw?Izl7ef4Dj} zh+C}|d!_$GK@2pElPY>c#Q*6%C~OQGoNL|s9^~;7Ib=5p?UiW zI84bllg-$;A&{ir2xauRuj(hJVuqw$Sy`!Q1*m$Aj1qp1K1cy-aI3q`)`y?nxqbEW z@+-_>|NrrO@ZdhQo6XxhJ3Dhmc=EztEM&(7@4oxq_2Hm@Z2rjns~B`%=5GZeJ3Y%B z=bH1qj-Po=C+b$S^`DRa@y{D+vz<-X_V2_@)y$suK$)l<*F1RxSD=;k^mbg?e$bzh zJJA*n^%~IR64w?k8Z!0uc?ls`0Rtf;&UxlA7kdtfaVILVRwmJ~37wTFE^!nX z!$hvj^6Pp2#2$ldql_@ZkNvL(4$rcEYlY{pz&M3K(P)fFDZ*Bm0X>@2HVIW9V zM@1lLWo&RDW^!+BAWC6tbz+882eSYG3i(MyK~!ko)mnLQRn-~)oqO+FlJ~L#Ng+`n zfXEU=3Q|Nzr0S?cJ8E^5Iu3Smkg@I1?XND5)fuPNar#GfMno0|3k)g(K|oQM)`E5c zD+(ci5=h8G7V`4Q@|Ju0opYCW?tL%BBrqLcIPcu;-TV8#@Aoa|yD-iaJv#o17LZL8pT}M0~!|AhM_BEY5ceuw$ z-1We14|H8NA23Zb%or211%^8_x54vl@UEB+Z%9L`wgiXB3Kx62aq(gt(MSQNR80+6 zO`J40oD3Y~Pmq!E>I`s%<@&@1EJVj^Y&Dk%B(`iC#3fG$9xap<-NR zVCs~q6{e;g-nw(PGj;0ir_7VylfG8EwMgLMOmWCER?9Ym=-j2T^~&6rkQ z#0+ikTW@Xt*5$K+>D9ccQpi2-^9fbsj*m$?apl2G`axS;D-4=LWQoF}LQJ1NBcJKo z&Q04ljT@N&rt7v|3)r;EXy1nH2%&=Z-&2@DIi+cuG)*#@M1TYc1xSd3LQI-8xiDa| z_tvdj7al%^6d%ZPUSDK^O(T`-ek*XFPl#Cr38pb}>@)&K0D(Y|gwjz~R&Iz58I6N~Vf5rlgkGFw{Z9M8IlIbtyH4TJ>*jgsWd@pv5Fv2Ho%<>g`KtZGcC zs><)^>iiR3x@n+C4`KnwQQ@TvM}|fo$|y|A`bHLsEDC8-2#smdB4WS2y&d~M*pC23 zs={bN(QB`-xn~#_@Ip}il6g`VQ_!m*8FKrxV-FF94CLqMK{s@o^HE$yQMHnKu)M?1T2hnFEA*5ON>Lxx^UW;@Pf@EF-qG zKrk4T1CfZwm!{Js@&r%It8W>0B2(Dn;YTL=XgEu}zc2VKq zX70D+=prhO8Z{cJRH|~-s#Sp@TR?@zeAHk$fIHWGcCZ$EHtfSspIwe%IDl18ThZ{= z`xhz?V4{??e`A01Osca9h#(0ej**pgnvz4X0DLu#7d+1bZ(Sk4?^?fCf{%Ay#225R z#)_wYi29=q*!RXi(s$PBo(MVn1pRoxqQOw+sy@ny~N94}Bmr{v^XHvu4%Irptz5)Izvq2H>vJju7~o zweRAW&lC7~FB(rbBOJ*?IGQIzh`F*u8%6T?$=5;{% z5N?6rDZsz*GYP)Az7=`-VHg1eRG6WOggH~!fZD^S@X!^&twt&0J<eKdwM;ypO=Q zQ=P9PC04rqDH)0d;Ik*sq3o(MlvR!)G#VOc|NiCo;$QE5g8gqDkQ5U|o#O+RA86Ka z-LZa%7D$_!h+|WSxrvt%_@k&|~Dv7Hm zSD>%AAN6(T(0ry1-&uAywy&*`H(h-HO-ilAm9mKq&jKdTu49~dcjnj`YUx-8_be(}nQG~ARqtQzdD=Z5-w^ZR@EeZ{40Vf)$Lr~#Izke93pI(dRv*%G- zUL--M1!c%_TN>L)xGoB%t>|j+CSj8n6-XzQWQnm8%P@Q4bh^)29Qykq+`D`UX5Un8 z-(Pcc0dpL<2%$gA!K@+L|t)t&v7^7fQ#J zVCwZ%7&ER^I`rtVqfkD+3}Yvh$tTymwhQy`n1cm(%=0Np^M=vkBr^FUC&}2r;oQ`o zr&L$r@n;^z=9jkMTzv~FCykXMGe|igQkahr(IS)=lGG9oT~Jzpk}<{PFB*2gz6Uql zJ{t?}oG0n0+0=7@YxcIP%;7C5nYVVy%+}4PkR={}Y8l>My%p^(ZA6c90v|=BAcAmS z7zq+cIJiM2bF?T5GnGco`kk03!QbFgnRxQ7iFoYE zN3iYHx6#qkf%1w{5+Z^~aTKGa3;6li>nU-CJ2{W$74}QCpgdj__cA%gn3PUun`jS$s$wU%cNx+#4uf^(FYeMF=29ifEBaC2{rCN-X`=J=pT%Mwxw? zrlY6F#Mv)f@bZ(dVA}jCsJ>|$0Z+(b32(X$1ovTFvG{;x%~uSgP63x`hcHimu$sRF zf|8YJ+>XDt5)Z8WF8Rb}G=ABDcxM;hc=4~8fA<_*ck^^-Aqrj7+^&SCY-hBuENg~S zjat0(t}y&Uh-f0V(=2T-Gj;i}$<-625L^EIrUbS4!J9Gfw(H~~K0ry&kQv*`+Txgu zLd>d%B$sI0TK02Ki)V=CbnYKH;9c{IWue^`5z!`{)}?b!`{p%x^fwR5EIV!PR0&v= z62dRUwyJqY+fHEcH91CNf!sf2%ELsxFZD%Wbm1GqFYE_Sn{$oivL&1*yKtIad1m6g z)v{rB`M|-mdND%|qjY2D{)lIF`ZFO^$qO>p%R(-IP$-BH#r;q?jBqF<+a?xublJSJ zY94Qq=(H`f`>B=_$6_%ys0CQYLp5%CyJ?Iw_d(Lka(224j<0JLZ<&%iyz9oS7k{~W zsZKxEIhiIfZEbB7VXbP9E1WWX;F)a|!|hJX7ircPw{w6hgu7s1+|#_xUQe@3dotH~ zjsXP_<@oXA$HR78B`pbJ-^j>8DbYa6BOD1Tzzh)>B&WI1YKE^~VeI`J4KD6v53as2 z^Ihrhr*bF`Enlkey1KfEEkM6`;pqrr_?9a|fFO$*k(@7-Q`J_9FXu zT`ju1x<2jf>@0S`3o8s1g&Z2Onwp*K`ulpzN=i%SQbf`{joTa=gVNXZD0YDTLC@K~ z9qWo6-S@%Y*4xVUx4$y)iERhbZ42bnD56m!tU)7e3#;2R8+64#^pAtvv^AWxM<0zC zjdmJw8ol;$Ng-7Lhe8g>pgkMPai)acE5R$SjI=F`Y11aD4AY55o;UTrNTiy~Kd$75 y=MaV~!f-W|X8l(K#bXEShhJ#{atQ?P1N=XU*FquwPTFDs0000fFDZ*Bm0X>@2HVIW9V zM@1lLWo&RDW^!+BAWC6tbz+882eSYG3<*g@K~!ko)tP&cROOk*f8RN$yXV?-V|rki z8HO1^9EO_^!7H<(Npuki%Bpb#t`W>`Wm6`#n?(O`O|6?`-BhYJWhzw$6WmQUSd^lP zND@&raZ#3l2y;OOfze@x>0xetoj$j3|LD`*=L`cf!8-c8h_!N2f&+ezB=7Pds0gKeko-hz*vSZb)G(yWA9mtB6^UtnYO(LQ{A>^&6>og z0>G5w@kPyx|1MNnrA*ZWOv_YtJyjcvMrwQddRuyXd!O9>yO;i>Fi`rvmX;QCN&(n5 zU#grIQgkDQw51bEnU16ciOfbh9o_VK?l}FM^!Ibes-jXHETyTeBCoEdF7M38ryuL> z>A8L9-krB^ymjNq6aujGgb>)aogJ_{O}u+&@L8CdyaC}l7l37%#1m0eMWd*&n7IvC z<>d$Rm!CX!^4M>Fvvbv*cWyjAB><$fvjgHC}akOgp{5n8jVm@ zHG`SeH9l2UXLfwh{@$)#J8%EO7dE~#1q`GgZOb$R=X(1{CX-X97*a}9P2l$rQdU+@ z<+PBZC~8S-+p)bbzWDs=4IA!xcWM}LfK*KnSO{Cda2d)MCEGkE~E^b9QA7bck;ol@OSCX>WsF=p3~ z;tvD}m`|dLobK(0x8m-b=TN<@U*B zf`Vus06xu!&*vwl>x4p8T09YNJS)4O1MZn*3T1Nxi6ne3Oe&>MDFeE$6OYF^A3j7; zum}MZ6ctcfQo^jdS%K(CWX&&r_1t}bd*9|?O-4pNG8w9>^h%@`Egl|n*t6#nZ$L5t zV$m3pXoP5VglHs6EEXd_KcD7B3#o5tC>R_WdJ5Qau}6Ob1L;ZVU-zw{p=c#HRDB6m zOr2%2EQ@$NPAnE9kw_3v#8DK%z`y`+zVRljSN|2kqT-VO`sL5oZ@T}%U6YehB%S?# zqPVbxpR|9Ghd%S4%&A!B%6j3cgPaZtk4k0va4D6vC5EAs(slGy3SCbh$D&cf{r&9U z|1Jxfn~Dbq2i60-CM=^8u%!XOUCSS#Gkln*-+736!5jEo-6I6lf+?*D1&zWyKeaVA zG&MD$8#>aGfLJxDiA+j~CDI(;HtB&>u5fMJc&I%Uw@P^eE7DAImWiRhXUZkdADO*>6 zmxHH%&yQR0Wy6AR(bBky%%jQ7*yEFOAp==An{$Ce3N+1k8TvEciY&{3qZqbSVo8 zE?yR@s(5@&k|Elnd#K94ihHjAIv<=n#Ir}Xa!cc8)?WPxn&S6H+%ru`#*mSVd?tb1 zmR(HPN=VOxP0PeI%yG<{PFL!E&P6_?F?bzYTE5S|_8ok4_x0S>_#Ntl*Iah~S5{3! zQAGA!2$7pq)rm4-k7d9{)l^qhT#i%$lQ<{hZ&Bf|<+jCNhz4BARPUeS;g0|`Nk(W z@Zqcc^X?U_o&6}y6}NsO3p1*#5JDiG=Zb7Oc1@50%Xa=C6N&VCR=T`Sxxa>#9V4y} zrPs(vkOG?&A0-YlWPHT(xwp_%vw}VEZ=*H3hc7SxA>{?t zF8nG&D4rnYmYgCBA|ohWTxksm8&%bCnHvIH9)CLi7S$EASvvPdN&_}SscuYZX7gKM z(UWRt*gDIcnJbt#V=1q<{SOC!{}K7#Pk7<4ZKDuzmYqZKFH~C8{gfxo|f77 zbJwD8<5%;tH7DH7fDC}H3C{yw0G2epO$RB_NCRk@cP~vdSMs}~+vy6QWX1g3s4bd7 zZ=w_3OgOWwg)MD*;~y}TI!j$}37c+soc*1@=AT|!!NV(`rg{3!F5!?DtPUr>pb*jNRh1P_Bmgrz5fsFJ+y;)Gndg^yOP0FH+}IBT}xCL9ZeF6@1xXT z&9eH>GP`0CKiU5e)DIlw6<5oF(-5BM%!BLl)te)!baOiBrXgdE?kl zW=)&VwT*W$qMzf;$PrB2$cceWay+r0Lf;28hL%%X*2GI~KVaX7|IJsfdzxAKS6>+e zB9lYHM$^(NJ&%cd@j-n{o(!|E1JJ!xXvYYzyC2Xwt2K!IGz}bS26*E7z z6#nI%iJQ4B0}@s9h{E&@} zEp=knARPmLq$015RrBwrEpV8_J-hd=-xhdQN*;ZAODcYuow?kgbR&gf=pGf4QlO(} zCmr_!KGy?wSdez^x~JRiMeXzXu(7aBn{fOTBcovgBE(-W-g4^jN3U-dRuLIF|gkV7_5{M>72o{v5uO~(b7L*~RAd(y=m|unvf|2+zrG@4AG#|sU z^OP2cu%$)!;OUacXn(k_v^lw?_7-g@(f65-o_9OfZ3}$k<%d$wdH@I^#P^kD#ynd|p=$eJi3q^5J z36?!8*X)|u%cLuK4+WhkPmlnG%Q5#aa{h_;91)I;MB4Yg@rUP};0i9$V9^|24It6c+Htg_wc{UwA|TJXueyN3 zWp!&NOqK0K*l<3hKm-_Y7_crzs~bSv*$=x?OLZ0bR1e+_BJ;7F@z_qbasename; + $count = ''; + $params = array(); + $link = 'media_item.php?id='.$f->media_id; + $link_edit = $p_url.'&edit='.$fname; + $icon = 'index.php?pf=templator/img/template.png'; + $class = 'media-item media-col-'.($i%2); + $details = $special = ''; + $widget_icon = ''; + $copy_url = '&copy='; + + if (preg_match('/^category-(.+)$/',$f->basename)) { + // That is ugly. + $cat_id = str_replace('category-', '', $f->basename); + $cat_id = str_replace('.html', '', $cat_id); + $cat_parents = $core->blog->getCategoryParents($cat_id); + $full_name = ''; + while ($cat_parents->fetch()) {$full_name = $cat_parents->cat_title.' › ';}; + $fname = ''.__('Category').' : '.$full_name.$core->blog->getCategory($cat_id)->cat_title; + $params['cat_id'] = $cat_id; + $params['post_type'] = ''; + $icon = 'index.php?pf=templator/img/template-alt.png'; + $copy_url = '&copycat='; + try { + $counter = $core->blog->getPosts($params,true); + } catch (Exception $e) { + $core->error->add($e->getMessage()); + } + + if ($counter->f(0) == 0) { + $count = __('No entry'); + } elseif ($counter->f(0) == 1) { + $count = ''.$counter->f(0).' '.__('entry').''; + } else { + $count = ''.$counter->f(0).' '.__('entries').''; + } + } + elseif (preg_match('/^widget-(.+)$/',$f->basename)) { + $count = ' '; + $icon = 'index.php?pf=templator/img/template-widget.png'; + $special = $widget_icon; + } + else { + $params['meta_id'] = $f->basename; + $params['meta_type'] = 'template'; + $params['post_type'] = ''; + try { + $counter = $core->meta->getPostsByMeta($params,true); + } catch (Exception $e) { + $core->error->add($e->getMessage()); + } + if ($counter->f(0) == 0) { + $count = ' '; + } elseif ($counter->f(0) == 1) { + $count = ''.$counter->f(0).' '.__('entry').''; + } else { + $count = ''.$counter->f(0).' '.__('entries').''; + } + } + + $res = + '
'. + ''. + '
    '. + '
  • '.$fname.' '.$special.'
  • '; + + if($core->auth->check('contentadmin,media',$core->blog->id)) { + $details = ' - '.__('details').''; + } + + if (!$f->d) { + $res .= + '
  • '.$count.'
  • '. + '
  • '. + $f->media_dtstr.' - '. + files::size($f->size). + $details. + '
  • '; + } + + $res .= '
  •  '; + + $res .= ''. + ''.__('copy').' '; + + + if ($f->del) { + $res .= ''. + ''.__('delete').''; + } + + $res .= '
  • '; + + $res .= '
'; + + return $res; + } +} +?> \ No newline at end of file diff --git a/inc/class.templator.php b/inc/class.templator.php new file mode 100644 index 0000000..8f16b7a --- /dev/null +++ b/inc/class.templator.php @@ -0,0 +1,380 @@ +core =& $core; + + $this->path = $this->core->blog->public_path.'/'.$this->template_dir_name; + + // Initial templates + $this->post_tpl = DC_ROOT.'/inc/public/default-templates/'.$this->post_default_name; + $this->category_tpl = DC_ROOT.'/inc/public/default-templates/'.$this->category_default_name; + + if ($this->core->plugins->moduleExists('pages')) { + $plugin_page = $this->core->plugins->getModules('pages'); + $this->page_tpl = path::real($plugin_page['root'].'/default-templates/'.$this->page_default_name); + } + + $this->user_theme = $this->core->blog->themes_path.'/'.$this->core->blog->settings->system->theme; + $this->user_post_tpl = path::real($this->user_theme.'/tpl/'.$this->post_default_name); + $this->user_category_tpl = path::real($this->user_theme.'/tpl/'.$this->category_default_name); + $this->user_page_tpl = path::real($this->user_theme.'/tpl/'.$this->page_default_name); + + $this->findTemplates(); + } + + /** + * + */ + public function canUseRessources($create=false) + { + if (!is_dir($this->path)) { + if ($create) { + files::makeDir($this->path); + } + return true; + } + + if (!is_writable($this->path)) { + return false; + } + + if (!is_file($this->path.'/.htaccess')) { + try { + file_put_contents($this->path.'/.htaccess',"Deny from all\n"); + } + catch (Exception $e) {return false;} + } + return true; + } + + /** + * + */ + public function getSourceContent($f) + { + $source = $this->tpl; + + if (!isset($source[$f])) { + throw new Exception(__('File does not exist.')); + } + + $F = $source[$f]; + if (!is_readable($F)) { + throw new Exception(sprintf(__('File %s is not readable'),$f)); + } + + return array( + 'c' => file_get_contents($source[$f]), + 'w' => $this->getDestinationFile($f) !== false, + 'f' => $f + ); + } + + /** + * + */ + public function filesList($item='%1$s') + { + $files = $this->tpl; + + if (empty($files)) { + return '

'.__('No file').'

'; + } + + $list = ''; + foreach ($files as $k => $v) + { + $li = sprintf('
  • %s
  • ',$item); + + $list .= sprintf($li,$k,html::escapeHTML($k)); + } + + return sprintf('
      %s
    ',$list); + } + + /** + * + */ + public function initializeTpl($name,$type) + { + if ($type == 'category') + { + if ($this->user_category_tpl) { + $base = $this->user_category_tpl; + } else { + $base = $this->category_tpl; + } + } + elseif ($type == 'page') + { + if ($this->user_page_tpl) { + $base = $this->user_page_tpl; + } else { + $base = $this->page_tpl; + } + } + else { + if ($this->user_post_tpl) { + $base = $this->user_post_tpl; + } else { + $base = $this->post_tpl; + } + } + + $source = array( + 'c' => file_get_contents($base), + 'w' => $this->getDestinationFile($name) !== false, + 'f' => $f); + + if (!$source['w']) + { + throw new Exception(sprintf(__('File %s is not readable'),$source)); + } + + if ($type == 'empty') + { + $source['c'] = ''; + } + + try + { + $dest = $this->getDestinationFile($name); + + if ($dest == false) { + throw new Exception(); + } + + $content = $source['c']; + + if (!is_dir(dirname($dest))) { + files::makeDir(dirname($dest)); + } + + $fp = @fopen($dest,'wb'); + if (!$fp) { + throw new Exception('tocatch'); + } + + $content = preg_replace('/(\r?\n)/m',"\n",$content); + $content = preg_replace('/\r/m',"\n",$content); + + fwrite($fp,$content); + fclose($fp); + } + catch (Exception $e) + { + throw $e; + } + + } + + /** + * + */ + public function copypasteTpl($name,$source) + { + if ($name == $source) {throw new Exception(__('Why copy file content in the same file?'));} + + $file = $this->getSourceContent($source); + + $source = array( + 'c' => $file['c'], + 'w' => $this->getDestinationFile($name) !== false, + 'f' => $f); + + if (!$source['w']) + { + throw new Exception(sprintf(__('File %s is not readable'),$source)); + } + + if ($type == 'empty') + { + $source['c'] = ''; + } + + try + { + $dest = $this->getDestinationFile($name); + + if ($dest == false) { + throw new Exception(); + } + + $content = $source['c']; + + if (!is_dir(dirname($dest))) { + files::makeDir(dirname($dest)); + } + + $fp = @fopen($dest,'wb'); + if (!$fp) { + throw new Exception('tocatch'); + } + + $content = preg_replace('/(\r?\n)/m',"\n",$content); + $content = preg_replace('/\r/m',"\n",$content); + + fwrite($fp,$content); + fclose($fp); + } + catch (Exception $e) + { + throw $e; + } + } + + /** + * + */ + public function writeTpl($name,$content) + { + try + { + $dest = $this->getDestinationFile($name); + + if ($dest == false) { + throw new Exception(); + } + + if (!is_dir(dirname($dest))) { + files::makeDir(dirname($dest)); + } + + $fp = @fopen($dest,'wb'); + if (!$fp) { + //throw new Exception('tocatch'); + } + + $content = preg_replace('/(\r?\n)/m',"\n",$content); + $content = preg_replace('/\r/m',"\n",$content); + + fwrite($fp,$content); + fclose($fp); + } + catch (Exception $e) + { + throw $e; + } + } + + /** + * + */ + public function copyTpl($name) + { + try + { + $file = $this->getSourceContent($name); + $dest = $this->getDestinationFile($name,true); + + if ($dest == false) { + throw new Exception(); + } + + if (!is_dir(dirname($dest))) { + files::makeDir(dirname($dest)); + } + + $fp = @fopen($dest,'wb'); + if (!$fp) { + throw new Exception('tocatch'); + } + + $content = preg_replace('/(\r?\n)/m',"\n",$file['c']); + $content = preg_replace('/\r/m',"\n",$file['c']); + + fwrite($fp,$file['c']); + fclose($fp); + } + catch (Exception $e) + { + throw $e; + } + } + + protected function getDestinationFile($f,$totheme=false) + { + $dest = $this->path.'/'.$f; + if ($totheme) { + $dest = $this->user_theme.'/tpl/'.$f; + } + + if (file_exists($dest) && is_writable($dest)) { + return $dest; + } + + if (is_writable(dirname($dest))) { + return $dest; + } + + return false; + } + + protected function findTemplates() + { + $this->tpl = $this->getFilesInDir($this->path); + //$this->theme_tpl = $this->getFilesInDir(path::real($this->user_theme).'/tpl'); + + uksort($this->tpl,array($this,'sortFilesHelper')); + //uksort($this->theme_tpl,array($this,'sortFilesHelper')); + } + + protected function getFilesInDir($dir) + { + $dir = path::real($dir); + if (!$dir || !is_dir($dir) || !is_readable($dir)) { + return array(); + } + + $d = dir($dir); + $res = array(); + while (($f = $d->read()) !== false) + { + if (is_file($dir.'/'.$f) && !preg_match('/^\./',$f)) { + $res[$f] = $dir.'/'.$f; + } + } + + return $res; + } + + protected function sortFilesHelper($a,$b) + { + if ($a == $b) { + return 0; + } + + $ext_a = files::getExtension($a); + $ext_b = files::getExtension($b); + + return strcmp($ext_a.'.'.$a,$ext_b.'.'.$b); + } +} +?> \ No newline at end of file diff --git a/index.php b/index.php new file mode 100644 index 0000000..2e2381c --- /dev/null +++ b/index.php @@ -0,0 +1,315 @@ +null, 'w'=>false, 'type'=>null, 'f'=>null, 'default_file'=>false); +$page = !empty($_GET['page']) ? $_GET['page'] : 1; +$nb_per_page = 20; +$msg = ''; +$remove_confirm = false; + +// Load infos. +$ressources = $core->templator->canUseRessources(true); +$files= $core->templator->tpl; + +// Media +$media = new dcMedia($core); +$media->chdir($core->templator->template_dir_name); +// For users with only templator permission, we use sudo. +$core->auth->sudo(array($media,'getDir')); +$dir =& $media->dir; +$items = array_values($dir['files']); + +// Categories +try { + $categories = $core->blog->getCategories(array('post_type'=>'post')); + + $categories_combo = array(); + $l = $categories->level; + $full_name = array($categories->cat_title); + + while ($categories->fetch()) { + + if ($categories->level < $l) { + $full_name = array(); + } elseif ($categories->level == $l) { + array_pop($full_name); + } + $full_name[] = html::escapeHTML($categories->cat_title); + + $categories_combo[implode(' › ',$full_name)] = $categories->cat_id; + + $l = $categories->level; + + } +} catch (Exception $e) { } + + +$hasCategories = ($categories->isEmpty()) ? false : true; + +$combo_source = array( + 'post.html' => 'post' +); + +if ($core->auth->check('pages',$core->blog->id) && $core->plugins->moduleExists('pages')) { + $combo_source['page.html'] = 'page'; +} + +if (!$categories->isEmpty()) { + $combo_source['category.html'] = 'category'; +} + +$combo_source[' — '] = 'empty'; + +$add_template = $copy_confirm = $copycat_confirm = false; + +if (!$ressources) +{ + $core->error->add(__('The plugin is unusable with your configuration. You have to change file permissions.')); +} + +if (!empty($_POST['filesource'])) +{ + try + { + $source = $_POST['filesource']; + if (empty($_POST['filename']) && $source != 'category') { + throw new Exception(__('Filename is empty.')); + } + $name = files::tidyFileName($_POST['filename']).'.html'; + if ($source == 'category') + { + $name = 'category-'.$_POST['filecat'].'.html'; + } + $core->templator->initializeTpl($name,$source); + } + catch (Exception $e) + { + $core->error->add($e->getMessage()); + } + if (!$core->error->flag()) { + http::redirect($p_url.'&msg=new'); + } +} + +if (!empty($_POST['rmyes']) && !empty($_POST['remove']) ) { + try + { + $file = rawurldecode($_POST['remove']); + $media->removeItem($file); + $core->meta->delMeta($file,'template'); + } + catch (Exception $e) + { + $core->error->add($e->getMessage()); + } + if (!$core->error->flag()) { + http::redirect($p_url.'&msg=del'); + } +} + +if (!empty($_POST['cpyes']) && !empty($_POST['copy']) && !empty($_POST['newfile'])) { + try + { + $file = rawurldecode($_POST['copy']); + $newfile = rawurldecode($_POST['newfile']).'.html'; + $core->templator->copypasteTpl($newfile,$file); + } + catch (Exception $e) + { + $core->error->add($e->getMessage()); + } + if (!$core->error->flag()) { + http::redirect($p_url.'&msg=cpy'); + } +} + +if (!empty($_POST['cpyes']) && !empty($_POST['copycat']) && !empty($_POST['copcat'])) { + try + { + $file = rawurldecode($_POST['copycat']); + $newfile = 'category-'.rawurldecode($_POST['copcat']).'.html'; + $core->templator->copypasteTpl($newfile,$file); + } + catch (Exception $e) + { + $core->error->add($e->getMessage()); + } + if (!$core->error->flag()) { + http::redirect($p_url.'&msg=cpy'); + } +} + +if (!empty($_GET['remove'])) +{ + $remove_confirm = true; +} +if (!empty($_GET['copy'])) +{ + $copy_confirm = true; +} +if (!empty($_GET['copycat'])) +{ + $copycat_confirm = true; +} + +$msg = isset($_REQUEST['msg']) ? $_REQUEST['msg'] : ''; +$msg_list = array( + 'new' => __('The new template has been successfully created.'), + 'del' => __('The template has been successfully removed.'), + 'cpy' => __('The template has been successfully copied.') +); +if (isset($msg_list[$msg])) { + $msg = sprintf('

    %s

    ',$msg_list[$msg]); +} + +?> + + + <?php echo __('Templator'); ?> + + + + + + +'.html::escapeHTML($core->blog->name).' › '.__('Supplementary templates').''; + +if ($remove_confirm) { + echo + '
    '. + '

    '.sprintf(__('Are you sure you want to remove the template "%s"?'), + html::escapeHTML($_GET['remove'])).'

    '. + '

    '. + '   '. + $core->formNonce(). + form::hidden('remove',html::escapeHTML($_GET['remove'])).'

    '. + '
    '; +} + +if ($copy_confirm) { + echo + '
    '. + '

    '.sprintf(__('To copy the template %s, you need to fill a new filename.'), + html::escapeHTML($_GET['copy'])).'

    '. + '

    '.html::escapeHTML('.html').'  '. + '  '. + $core->formNonce(). + form::hidden('copy',html::escapeHTML($_GET['copy'])).'

    '. + '
    '; +} + +if ($copycat_confirm) { + $category_id = str_replace('category-', '', $_GET['copycat']); + $category_id = str_replace('.html', '', $category_id); + $cat_parents = $core->blog->getCategoryParents($category_id); + $full_name = ''; + while ($cat_parents->fetch()) {$full_name = $cat_parents->cat_title.' › ';}; + $name = $full_name.$core->blog->getCategory($category_id)->cat_title; + echo + '
    '. + '

    '.sprintf(__('To copy the template %s (%s), you need to choose a category.'), + html::escapeHTML($_GET['copycat']),$name).'

    '. + '

    '. + '  '. + $core->formNonce(). + form::hidden('copycat',html::escapeHTML($_GET['copycat'])). + '
    '; +} + +if (!$add_template) { + echo '

    '. + __('New template').'

    '; +} + +echo +'
    '. +'

    '.__('New template').'

    '. +'

    '. +'


    +

    '.__('Extension .html is automatically added to filename').'

    +'; + +if ($hasCategories) { + echo '

    '; +} + +echo +'

    '.form::hidden(array('p'),'templator'). +$core->formNonce(). +'

    '. +'
    '; + +if (count($items) == 0) +{ + echo '

    '.__('No template.').'

    '; +} +else +{ + $pager = new pager($page,count($items),$nb_per_page,10); + $pager->html_prev = __('«prev.'); + $pager->html_next = __('next»'); + + echo + '
    '. + '
    '. + + '
    '. + '

    '.__('Page(s)').' : '.$pager->getLinks().'

    '; + + for ($i=$pager->index_start, $j=0; $i<=$pager->index_end; $i++, $j++) + { + echo pagerTemplator::templatorItemLine($items[$i],$j); + } + + echo + '

    '.__('Page(s)').' : '.$pager->getLinks().'

    '. + '
    '; +} + +echo + '

    + '. + __('Display templates used for entries in base').' + +

    '; +?> + + \ No newline at end of file diff --git a/js/form.js b/js/form.js new file mode 100644 index 0000000..e8b620b --- /dev/null +++ b/js/form.js @@ -0,0 +1,14 @@ +$(function() { + var t = $('#templator-control'); + t.css('display','inline'); + $('#add-template').hide(); + t.click(function() { + $('#add-template').show(); + $(this).hide(); + return false; + }); + + + + +}); diff --git a/js/script.js b/js/script.js new file mode 100644 index 0000000..70faf2d --- /dev/null +++ b/js/script.js @@ -0,0 +1,15 @@ +$(function(){var msg=false;$('#file-form input[name="write"]').click(function(){var f=this.form;var data={file_content:$(f).find('#file_content').get(0).value,xd_check:$(f).find('input[name="xd_check"]').get(0).value,write:1};if(msg==false){msg=$('

    ');$('#file_content').parent().after(msg);} +msg.text(dotclear.msg.saving_document);$.post(document.location.href,data,function(res,status){var err=$(res).find('div.error li:first');if(err.length>0){msg.text(dotclear.msg.error_occurred+' '+err.text());return;}else{msg.text(dotclear.msg.document_saved);$('#file-chooser').empty();$(res).find('#file-chooser').children().appendTo('#file-chooser');}});return false;}); +$("#filecat").parent().parent().hide(); + $("#filesource").change(function() { + var f = $(this).val(); + if (f == 'category') { + $("#filename, #filetitle").parent().parent().hide(); + $("#filecat").parent().parent().show(); + } + else { + $("#filename, #filetitle").parent().parent().show(); + $("#filecat").parent().parent().hide(); + } + }); +}); diff --git a/locales/fr/main.lang.php b/locales/fr/main.lang.php new file mode 100644 index 0000000..d921b86 --- /dev/null +++ b/locales/fr/main.lang.php @@ -0,0 +1,150 @@ +%s
    , you need to fill a new filename.'] = 'Pour copier le template %s, il est nécessaire de renseigner un nom de fichier.'; + +#index.php:224 +$GLOBALS['__l10n']['New filename:'] = 'Nouveau nom de fichier'; + +#index.php:226 +#index.php:245 +$GLOBALS['__l10n']['Copy'] = 'Copier'; + +#index.php:241 +$GLOBALS['__l10n']['To copy the template %s (%s), you need to choose a category.'] = 'Pour copier le template %s (%s), il est nécessaire de choisir une catégorie.'; + +#index.php:243 +$GLOBALS['__l10n']['Target category:'] = 'Catégorie cible :'; + +#index.php:253 +#index.php:258 +$GLOBALS['__l10n']['New template'] = 'Nouveau template'; + +#index.php:259 +$GLOBALS['__l10n']['Template source:'] = 'Template source :'; + +#index.php:261 +$GLOBALS['__l10n']['Filename:'] = 'Nom de fichier :'; + +#index.php:263 +$GLOBALS['__l10n']['Extension .html is automatically added to filename'] = 'L\'extension .html est automatiquement ajouté au nom du fichier.'; + +#index.php:279 +$GLOBALS['__l10n']['No template.'] = 'Aucun template.'; + +#index.php:308 +#index.php:310 +$GLOBALS['__l10n']['Display templates used for entries in base'] = 'Afficher les templates utilisés pour les billets en base'; + +#template_posts.php:85 +$GLOBALS['__l10n']['Are you sure you want to unselect the template?'] = 'Êtes-vous sûr(e) de vouloir désélectionner le template ?'; + +#template_posts.php:97 +$GLOBALS['__l10n']['Unselect specific template'] = 'Désélectionner le template spécifique'; + +#template_posts.php:101 +$GLOBALS['__l10n']['Back to templates list'] = 'Retour à la liste des templates'; + +#template_posts.php:128 +$GLOBALS['__l10n']['Unselect the template'] = 'Désélectionner le template'; + +?> \ No newline at end of file diff --git a/locales/fr/main.po b/locales/fr/main.po new file mode 100644 index 0000000..96d57ff --- /dev/null +++ b/locales/fr/main.po @@ -0,0 +1,204 @@ +# Language: Français +# Module: templator - 1.3.3 +# Date: 2012-10-02 12:59:08 +# Translated with translater 1.5 + +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: templator 1.3.3\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2012-10-02T12:59:08+00:00\n" +"Last-Translator: osku\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +#: _admin.php:15 +msgid "Templates" +msgstr "Templates" + +#: _admin.php:20 +msgid "manage templates" +msgstr "gérer les templates" + +#: _admin.php:67 +msgid "Entry template:" +msgstr "Template du billet :" + +#: _admin.php:90 +msgid "Appearance" +msgstr "Aspect" + +#: _admin.php:90 +msgid "Select the template" +msgstr "Sélectionner le template" + +#: _admin.php:137 +msgid "Select template for these entries" +msgstr "Sélectionner le template pour ces billets" + +#: _admin.php:139 +msgid "Choose template:" +msgstr "Choisir le template :" + +#: _install.php:17 +msgid "Version 2.3.1 of Dotclear at least is required for this version of Templator." +msgstr "La version 2.3.1 de Dotclear est requise pour version du module Templator." + +#: _prepend.php:26 +msgid "Templator › Rendering" +msgstr "Templator › Rendu" + +#: _prepend.php:34 +msgid "Template:" +msgstr "Template :" + +#: advanced.php:17 +#: edit.php:52 +#: index.php:192 +#: template_posts.php:81 +msgid "Templator" +msgstr "Templator" + +#: advanced.php:23 +#: edit.php:67 +#: index.php:205 +msgid "Supplementary templates" +msgstr "Templates supplémentaires" + +#: advanced.php:23 +msgid "Database informations" +msgstr "Informations base de données" + +#: advanced.php:45 +msgid "available template" +msgstr "template disponible" + +#: advanced.php:47 +msgid "missing template" +msgstr "template manquant" + +#: advanced.php:74 +msgid "No specific templates on this blog." +msgstr "Aucun template spécifique sur ce blog." + +#: edit.php:67 +msgid "Edit the template" +msgstr "Modifier le template" + +#: edit.php:90 +msgid "This file is not writable. Please check your files permissions." +msgstr "Ce fichier ne peut pas être modifié. Veuillez vérifier les permissions des fichiers." + +#: inc/admin.pager.templator.php:28 +msgid "Template widget" +msgstr "Template widget" + +#: inc/admin.pager.templator.php:87 +msgid "details" +msgstr "détails" + +#: inc/admin.pager.templator.php:104 +msgid "copy" +msgstr "copier" + +#: inc/admin.pager.templator.php:104 +msgid "copy the template" +msgstr "copier le template" + +#: inc/admin.pager.templator.php:110 +msgid "delete the template" +msgstr "supprimer le template" + +#: inc/class.templator.php:203 +msgid "Why copy file content in the same file?" +msgstr "Pourquoi copier le contenu du fichier dans le même fichier ?" + +#: index.php:91 +msgid "The plugin is unusable with your configuration. You have to change file permissions." +msgstr "L'extension est inutilisable avec votre configuration. Vous devez modifier les permissions des fichiers." + +#: index.php:100 +msgid "Filename is empty." +msgstr "Le nom de fichier est vide." + +#: index.php:181 +msgid "The new template has been successfully created." +msgstr "Un noueau template a été créé avec succès." + +#: index.php:182 +msgid "The template has been successfully removed." +msgstr "Le template a été supprimé avec succès." + +#: index.php:183 +msgid "The template has been successfully copied." +msgstr "Le template a été copié avec succès." + +#: index.php:210 +msgid "Are you sure you want to remove the template \"%s\"?" +msgstr "Êtes-vous sûr(e) de vouloir supprimer le template \"%s\" ?" + +#: index.php:222 +msgid "To copy the template %s, you need to fill a new filename." +msgstr "Pour copier le template %s, il est nécessaire de renseigner un nom de fichier." + +#: index.php:224 +msgid "New filename:" +msgstr "Nouveau nom de fichier" + +#: index.php:226 +#: index.php:245 +msgid "Copy" +msgstr "Copier" + +#: index.php:241 +msgid "To copy the template %s (%s), you need to choose a category." +msgstr "Pour copier le template %s (%s), il est nécessaire de choisir une catégorie." + +#: index.php:243 +msgid "Target category:" +msgstr "Catégorie cible :" + +#: index.php:253 +#: index.php:258 +msgid "New template" +msgstr "Nouveau template" + +#: index.php:259 +msgid "Template source:" +msgstr "Template source :" + +#: index.php:261 +msgid "Filename:" +msgstr "Nom de fichier :" + +#: index.php:263 +msgid "Extension .html is automatically added to filename" +msgstr "L'extension .html est automatiquement ajouté au nom du fichier." + +#: index.php:279 +msgid "No template." +msgstr "Aucun template." + +#: index.php:308 +#: index.php:310 +msgid "Display templates used for entries in base" +msgstr "Afficher les templates utilisés pour les billets en base" + +#: template_posts.php:85 +msgid "Are you sure you want to unselect the template?" +msgstr "Êtes-vous sûr(e) de vouloir désélectionner le template ?" + +#: template_posts.php:97 +msgid "Unselect specific template" +msgstr "Désélectionner le template spécifique" + +#: template_posts.php:101 +msgid "Back to templates list" +msgstr "Retour à la liste des templates" + +#: template_posts.php:128 +msgid "Unselect the template" +msgstr "Désélectionner le template" + diff --git a/style/style.css b/style/style.css new file mode 100644 index 0000000..a0c680f --- /dev/null +++ b/style/style.css @@ -0,0 +1,7 @@ +textarea { + font: 1em Monaco,"Courier New",Courier,monospace; +} + +span.muppet, a.muppet { + color:#243D50; +} diff --git a/template_posts.php b/template_posts.php new file mode 100644 index 0000000..e32ca67 --- /dev/null +++ b/template_posts.php @@ -0,0 +1,135 @@ +auth->check('publish,contentadmin',$core->blog->id)) +{ + try { + $core->meta->delMeta($template,'template'); + http::redirect($p_url.'&del='.$template); + } catch (Exception $e) { + $core->error->add($e->getMessage()); + } +} + +$params = array(); +$params['limit'] = array((($page-1)*$nb_per_page),$nb_per_page); +$params['no_content'] = true; + +$params['meta_id'] = $template; +$params['meta_type'] = 'template'; +$params['post_type'] = ''; + +# Get posts +try { + $posts = $core->meta->getPostsByMeta($params); + $counter = $core->meta->getPostsByMeta($params,true); + $post_list = new adminPostList($core,$posts,$counter->f(0)); +} catch (Exception $e) { + $core->error->add($e->getMessage()); +} + +# Actions combo box +$combo_action = array(); +if ($core->auth->check('publish,contentadmin',$core->blog->id)) +{ + $combo_action[__('Status')] = array( + __('Publish') => 'publish', + __('Unpublish') => 'unpublish', + __('Schedule') => 'schedule', + __('Mark as pending') => 'pending' + ); +} +$combo_action[__('Mark')] = array( + __('Mark as selected') => 'selected', + __('Mark as unselected') => 'unselected' +); +$combo_action[__('Change')] = array(__('Change category') => 'category'); +if ($core->auth->check('admin',$core->blog->id)) +{ + $combo_action[__('Change')] = array_merge($combo_action[__('Change')], + array(__('Change author') => 'author')); +} +if ($core->auth->check('delete,contentadmin',$core->blog->id)) +{ + $combo_action[__('Delete')] = array(__('Delete') => 'delete'); +} + +# --BEHAVIOR-- adminPostsActionsCombo +$core->callBehavior('adminPostsActionsCombo',array(&$combo_action)); + +?> + + + <?php echo __('Templator'); ?> + + + + + +

    blog->name); ?> › +

    + +'.__('Back to templates list').'

    '; + +if (!$core->error->flag()) +{ + # Show posts + $post_list->display($page,$nb_per_page, + '
    '. + + '%s'. + + '
    '. + '

    '. + + '

    '.__('Selected entries action:').' '. + form::combo('action',$combo_action). + '

    '. + form::hidden('post_type',''). + form::hidden('redir',$p_url.'&m=template_posts&tag='. + str_replace('%','%%',rawurlencode($template)).'&page='.$page). + $core->formNonce(). + '
    '. + '
    '); + + # Remove tag + if (!$posts->isEmpty() && $core->auth->check('contentadmin',$core->blog->id)) { + echo + '
    '. + '

    '. + $core->formNonce().'

    '. + '
    '; + } +} +?> + + \ No newline at end of file