commit 61939f68e18b10670bf4131eaf795a08f7badbc2 Author: Jean-Christian Denis Date: Mon Dec 5 22:39:13 2022 +0100 first commit from templator 1.3.3 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 0000000..e75fa51 Binary files /dev/null and b/icon.png differ diff --git a/img/copy.png b/img/copy.png new file mode 100644 index 0000000..a454881 Binary files /dev/null and b/img/copy.png differ diff --git a/img/delete.png b/img/delete.png new file mode 100644 index 0000000..ec35ed2 Binary files /dev/null and b/img/delete.png differ diff --git a/img/template-alt.png b/img/template-alt.png new file mode 100644 index 0000000..95081a5 Binary files /dev/null and b/img/template-alt.png differ diff --git a/img/template-widget.png b/img/template-widget.png new file mode 100644 index 0000000..e126556 Binary files /dev/null and b/img/template-widget.png differ diff --git a/img/template.png b/img/template.png new file mode 100644 index 0000000..b455f2b Binary files /dev/null and b/img/template.png differ diff --git a/inc/admin.pager.templator.php b/inc/admin.pager.templator.php new file mode 100644 index 0000000..477b0e6 --- /dev/null +++ b/inc/admin.pager.templator.php @@ -0,0 +1,120 @@ +basename; + $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