Table of Contents

new page dialog plugin

new_page_dialog plugin by Pierre Spring
Yet another "New Page Dialog", with focus on the way people are used to store files. It aims to resemble a regular "Save As" dialog with "Add Folder" functionality.

Last updated on 2008-07-11. Provides Action.
Compatible with DokuWiki 2008-05-05.

Similar to addnewpage, newpagebutton.

Tagged with button, create, form.

Installation

Install via SVN

go into the /lib/plugins directory and type:

svn co http://svn.bitflux.org/repos/public/misc/dokuwiki/plugins/npd

Download Zip

The zip can be found here

Add Button to Template

Decide where you want to insert the “Create New Page” button in your template and insert the the following code:

if (!plugin_isdisabled('npd') && ($npd =& plugin_load('helper', 'npd'))) { 
    $npd->html_new_page_button();
}

Most likely you want to do that in the /lib/tpl/default/main.php inside the <div id="bar__bottomright"/> as follows:

<div class="bar-right" id="bar__bottomright">
  <?php if (!plugin_isdisabled('npd') && ($npd =& plugin_load('helper', 'npd'))) $npd->html_new_page_button(); ?>
  <?php tpl_button('subscription')?>
  <?php tpl_button('admin')?>
  <?php tpl_button('profile')?>
  <?php tpl_button('login')?>
  <?php tpl_button('index')?>
  <?php tpl_button('top')?>&nbsp;
</div>

Note that the button will only be shown, if the browser is JavaScript enabled.

Changelog

Known Issues

Please report bugs here:

(Possible) SOLUTION (22-02-2008): probably your plugin is not well installed. I got at first the same
result. Just unpack the zip file manually to /lib/plugins/ and then it has to work fine.Remember to
change the main.php in the directory of your current theme which can differ from the default theme.
For example: /lib/tpl/mytheme/main.php.
(When your current theme is another theme than the default theme, this plugin will probably look
different than the one in the example here, because of another stylesheet.)

Added: How to get rid of the default createpage button?

After you have installed this plugin, users still see the default createpage button of DokuWiki
next to the createpagebutton of this plugin. They will also try to use the default createpage button
which leads to pages without namespaces. If you want your users to maintain namespaces in your
DokuWiki when they are creating a page, you must in that case get rid of the default createpage button.
Here's how to do that:
Locate the /inc/template.php file. Locate the following code in the function tpl_button($type) :

    case 'edit':
      #most complicated type - we need to decide on current action
      if($ACT == 'show' || $ACT == 'search'){
        if($INFO['writable']){
          if(!empty($INFO['draft'])){
            echo html_btn('draft',$ID,'e',array('do' => 'draft'),'post');
          }else{
            if($INFO['exists']){
              echo html_btn('edit',$ID,'e',array('do' => 'edit','rev' => $REV),'post');
            }else{
              echo html_btn('create',$ID,'e',array('do' => 'edit','rev' => $REV),'post');
            }
          }
        }else{
          if(!actionOK('source')) return false; //pseudo action
          echo html_btn('source',$ID,'v',array('do' => 'edit','rev' => $REV),'post');
        }
      }else{
          echo html_btn('show',$ID,'v',array('do' => 'show'));
      }
      break;


And then change it to this (ie. comment the create button):

    case 'edit':
      #most complicated type - we need to decide on current action
      if($ACT == 'show' || $ACT == 'search'){
        if($INFO['writable']){
          if(!empty($INFO['draft'])){
            echo html_btn('draft',$ID,'e',array('do' => 'draft'),'post');
          }else{
            if($INFO['exists']){
              echo html_btn('edit',$ID,'e',array('do' => 'edit','rev' => $REV),'post');
/*            }else{
              echo html_btn('create',$ID,'e',array('do' => 'edit','rev' => $REV),'post');*/
            }
          }
        }else{
          if(!actionOK('source')) return false; //pseudo action
          echo html_btn('source',$ID,'v',array('do' => 'edit','rev' => $REV),'post');
        }
      }else{
          echo html_btn('show',$ID,'v',array('do' => 'show'));
      }
      break;


That's all folks!

What about simply not calling tpl_button('edit') in the main.php of the template in case of the “show” action?
if($ACT != 'show') tpl_button('edit');

Michael Klier 2008/04/19 01:29

Demo

A demo of this plugin can be seen at the fckw plugin demo wiki.

screen shots

Localization

For now, localization only exists for English,German and Dutch. Please feel free too add your localizations here, I'll add them into the plugin ASAP.

There are two files for localization.

The lang.php file:

/**
 * English language file for the "New Page Dialog" plugin
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Pierre Spring <pierre.spring[curly thing]liip[full stop]ch>
 */
 
/* buttons */
$lang['btn_create_new_page'] = 'Create New Page';
$lang['btn_create_page'] = 'Create Page';
$lang['btn_new_folder']  = 'New Folder';
$lang['btn_ok'] = 'OK';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = 'Are you sure you want to \ncreate a page called:\n';
$lang['dlg_new_folder'] = 'Enter new folder name:';
 
/* misc */
$lang['msc_page_title'] = 'Page Title';

The dialog_folder_name.txt:

Please enter the folder Name.\\
Note that a folder will **NOT** be created before a page\\
within the folder is **SAVED**.

German translation

lang.php:

/**
 * German language file for the "New Page Dialog" plugin
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Tilman Blumenbach <tilman [AT] tblue [DOT] de>
 */
 
 
/* buttons */
$lang['btn_create_new_page'] = 'Neue Seite anlegen';
$lang['btn_create_page'] = 'Seite anlegen';
$lang['btn_new_folder']  = 'Neuer Ordner';
$lang['btn_ok'] = 'OK';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = 'Sind Sie sicher, dass Sie\neine Seite mit dem folgenden\nTitel anlegen wollen?\n';
$lang['dlg_new_folder'] = 'Namen für neuen Ordner eingeben:';
 
/* misc */
$lang['msc_page_title'] = 'Seitentitel';

dialog_folder_name.txt:

Bitte geben Sie den Ordnernamen ein.\\
Beachten Sie, dass ein Ordner **NICHT** angelegt wird,\\
bevor eine Seite in dem Ordner **GESPEICHERT** ist.

Dutch translation

lang.php:

/**
 * dutch language file for the "New Page Dialog" plugin
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Harro Schuringa 
 */
 
/* buttons */
$lang['btn_create_new_page'] = 'Maak nieuwe pagina aan';
$lang['btn_create_page'] = 'Maak pagina aan';
$lang['btn_new_folder']  = 'Nieuwe map aanmaken';
$lang['btn_ok'] = 'OK';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = 'Weet u zeker dat u een pagina\naan wilt maken met de naam:\n';
$lang['dlg_new_folder'] = 'Geef de naam van de nieuwe map op:';
 
/* misc */
$lang['msc_page_title'] = 'Pagina Titel';

dialog_folder_name.txt:

Geef de naam van de map.\\
NB!: Denk eraan dat een map **NIET** aangemaakt wordt voordat de pagina\\
binnenin die map is **OPGESLAGEN**.\\

Korean translation

lang.php:

<?php
/**
 * Korean language file for the "New Page Dialog" plugin
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Heesu Yoon <cppigX[atSign]gmail[fullStop]com> (where X=3*5*7*19)
 */
 
/* buttons */
$lang['btn_create_new_page'] = '새 페이지 만들기';
$lang['btn_create_page'] = '페이지 만들기';
$lang['btn_new_folder']  = '새 폴더';
$lang['btn_ok'] = '확인';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = '다음 페이지를\n만드시겠습니까?\n';
$lang['dlg_new_folder'] = '새 폴더 이름:';
 
/* misc */
$lang['msc_page_title'] = '페이지 제목';
?>

dialog_folder_name.txt:

폴더 이름을 입력하십시요.\\
참고 - 새 폴더는 폴더 내의 파일이 **저장**될 때까지\\
생성되지 **않습니다.**

Norwegian translation

lang.php

/**
 * norsk språkfil for plugin "New Page Dialog"
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Torkill Bruland
 */
 
/* buttons */
$lang['btn_create_new_page'] = 'Opprett Ny Side';
$lang['btn_create_page'] = 'Lag side';
$lang['btn_new_folder']  = 'Ny mappe';
$lang['btn_ok'] = 'OK';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = 'Er du sikker på at du ønsker å \n opprette en side med navnet:\n';
$lang['dlg_new_folder'] = 'Før inn nytt mappenavn:';
 
/* misc */
$lang['msc_page_title'] = 'Sidetittel';

Fila dialog_folder_name.txt:

Før inn navnet på mappa.\\
Merk at mappe **IKKE** opprettes før det\\
**LAGRES** en side i vedkommende mappe.

Italian translation

lang.php

/**
 * italian language file for the "New Page Dialog" plugin
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Andrea Papotti <genome[snail shell]cheerful[youknowwhat]com>
 */
 
/* buttons */
$lang['btn_create_new_page'] = 'Crea Nuova Pagina';
$lang['btn_create_page'] = 'Crea Pagina';
$lang['btn_new_folder']  = 'Nuova Cartella';
$lang['btn_ok'] = 'OK';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = 'Sei sicuro di voler \ncreare una pagina chiamata:\n';
$lang['dlg_new_folder'] = 'Inserisci nome nuova cartella:';
 
/* misc */
$lang['msc_page_title'] = 'Titolo Pagina';

Fila dialog_folder_name.txt:

Prego inserire il mome della cartella.\\
Nota: La cartella viene creata solamente quando contiene\\
ALMENO UNA pagina.

Spanish translation

lang.php

<?php
/**
 * Spanish language file for the "New Page Dialog" plugin
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Digna González <digna.gonzalezotero[at]gmail[dot]com
 */
 
/* buttons */
$lang['btn_create_new_page'] = 'Crear nueva página';
$lang['btn_create_page'] = 'Crear Página';
$lang['btn_new_folder']  = 'Nueva Carpeta';
$lang['btn_ok'] = 'Aceptar';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = '¿Está seguro de que desea \n crear una página llamada:\n?';
$lang['dlg_new_folder'] = 'Introduzca el nombre de la carpeta:';
 
/* misc */
$lang['msc_page_title'] = 'Título de la página:';
 
//Setup VIM: ex: et ts=4 enc=utf-8 :

Archivo dialog_folder_name.txt

Por favor, introduzca el nombre de la carpeta.\\
Atención: **NO** se creará una carpeta hasta que se **GUARDE**\\
una página dentro de esa carpeta

Russian translation

lang.php

<?php
/**
 * Russian language file for the "New Page Dialog" plugin
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Ilya Paramonov
 */
 
/* buttons */
$lang['btn_create_new_page'] = 'Создать новую страницу';
$lang['btn_create_page'] = 'Создать страницу';
$lang['btn_new_folder']  = 'Создать пространство имён';
$lang['btn_ok'] = 'OK';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = 'Вы действительно хотите\nсоздать страницу с именем:\n';
$lang['dlg_new_folder'] = 'Введите имя нового пространства имён:';
 
/* misc */
$lang['msc_page_title'] = 'Имя страницы';
 
//Setup VIM: ex: et ts=4 enc=utf-8 :

dialog_folder_name.txt

Введите название пространства имён.\\
Заметьте, что пространство имён **НЕ** будет создано,\\
пока страница внутри него не будет **СОХРАНЕНА**.

Czech translation

lang.php

/**
 * Česká verze pluginu "New Page Dialog"
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     2046
 */
 
/* buttons */
$lang['btn_create_new_page'] = 'Vytvoř novou stránku';
$lang['btn_create_page'] = 'Vytvoř stránku';
$lang['btn_new_folder']  = 'Nový adresář';
$lang['btn_ok'] = 'OK';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = 'Jseš si jistý, \nže chceš vytvořit stránku s názvem:\n';
$lang['dlg_new_folder'] = 'Zvol název adresáře:';
 
/* misc */
$lang['msc_page_title'] = 'Název stránky';

lang.php

<?php
/**
 * český jazykový soubor pro plugin "New Page Dialog"
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Tomas Safarik <safarik[curly thing]server[full stop]cz>
 */
 
/* buttons */
$lang['btn_create_new_page'] = 'Vytvořit novou stránku';
$lang['btn_create_page'] = 'Vytvořit stránku';
$lang['btn_new_folder']  = 'Nová složka';
$lang['btn_ok'] = 'OK';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = 'Určitě chcete vytvořit \nstránku s názvem:\n';
$lang['dlg_new_folder'] = 'Zadejte název nové složky:';
 
/* misc */
$lang['msc_page_title'] = 'Název stránky';

dialog_folder_name.txt

Prosím zadejte Název složky.\\
Pamatujte, že složka **NEBUDE** vytvořena, dokud nebude\\
v ní vytvářená stránka **ULOŽENA**.

Japanese translation

lang.php:

/**
 * Japanese language file for the "New Page Dialog" plugin
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     smeghead <smeghead[at]users.sourceforge.jp>
 */
 
/* buttons */
$lang['btn_create_new_page'] = '新しいページの作成';
$lang['btn_create_page'] = 'ページの作成';
$lang['btn_new_folder']  = '新しいフォルダ';
$lang['btn_ok'] = 'OK';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = '新しいページを作成します。よろしいですか? \nページ名:\n';
$lang['dlg_new_folder'] = '新しいフォルダ名を入力してください。:';
 
/* misc */
$lang['msc_page_title'] = 'ページタイトル';

dialog_folder_name.txt:

フォルダ名を入力してください。\\
\\
注意:フォルダーの中のページが保存されるまで、\\
フォルダーは作成されません。\\

Slovenian translation

lang.php:

/**
 * Slovenian language file for the "New Page Dialog" plugin
 *
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     paxman <paxmanpwnz [AT] gmail [DOT] com>
 */
 
 
/* buttons */
$lang['btn_create_new_page'] = 'Ustvari novo stran';
$lang['btn_create_page'] = 'Ustvari stran';
$lang['btn_new_folder']  = 'Nova mapa';
$lang['btn_ok'] = 'Potrdi';
 
/* dialogs */
$lang['dlg_confirm_page_name'] = 'Ste prepričani, da želite\n ustvariti stran:\n';
$lang['dlg_new_folder'] = 'Vnesite ime nove mape:';
 
/* misc */
$lang['msc_page_title'] = 'Naslov strani';

dialog_folder_name.txt:

Prosim, vnesite ime mape.\\
Opomba: mapa **NE** bo ustvarjena, dokler ni\\
stran iz le-te **SHRANJENA**.

Discussion

function setNameSpace(node){
	var nameSpace = '';
	
	nameSpace = node.parentNode.parentNode.innerHTML;
	if (nameSpace.substring(0,8) == '<A href='){
		nameSpace = nameSpace.substring(nameSpace.indexOf('href=')+6);
		nameSpace = nameSpace.substring(0,nameSpace.indexOf('\"'));
		nameSpace = nameSpace.replace(/&amp;/g,'&');
		window.location.href = nameSpace;
	}

	return nameSpace;
}

just add ist to the main.php of this template and add the following line at the and of the function getEventElement(e)

	setNameSpace(node);

Glufu 2008/09/23 12:09

Replace in the file plugins/npd/tpl/main.php

-        <input type="text" class="" style="display: none;" id="npd_ns" value="<?php echo trim($_REQUEST['idx'], ":"); ?>"/>
+        <input type="text" class="" style="display: none;" id="npd_ns" value="<?php echo urlencode(trim($_REQUEST['idx'],':')); ?>"/>

and in the function npd_save :

-    opener.location.href = "doku.php?do=editfckw&id=" + $('npd_ns').value + ":" + page_name;
+    opener.location.href = "doku.php?do=editfckw&id=" + $('npd_ns').value + "%3A" + page_name;

SoX 2009/05/29 17:51

Some of the presented code lines come from tips found on the web, thanks to their respective authors

diff -r npd_original/helper.php npd_patch/helper.php
4a5
>  * @author     Patched by Benoît Locher <benoit.locher(at)skf(dot)com> and Matthieu Rioteau <matthieu.rioteau(at)skf(dot)com>
80c81
<             $ret .= '<a rel="nofollow" url="'.$url.'" style="display:none;" id="npd_create_button" class="action npd" href="#">'.$label.'</a>';
---
>             $ret .= '<a rel="nofollow" href="'.$url.'" style="display:none;" id="npd_create_button" class="action npd">'.$label.'</a>';
83c84
<             $ret .= '<form class="button"><div class="no">';
---
>             $ret .= '<form class="button" action="'.$url.'"><div class="no">';
89,90d89
<             // the url attribute will be used by the JavaScript
<             $ret .= 'url="'.$url.'" ';
diff -r npd_original/js/button.js npd_patch/js/button.js
6,7c6,12
<
<     npd_clicked_url = button.getAttribute('url');
---
>
>     if (button.nodeName.toLowerCase() == 'a') {
>         npd_clicked_url = button.getAttribute('href');
>     } else {
>         npd_clicked_url = button.parentNode.parentNode.getAttribute('action');
>     }
>
diff -r npd_original/tpl/main.php npd_patch/tpl/main.php
12a13
>  * @author Patched by Benoît Locher <benoit.locher(at)skf(dot)com> and Matthieu Rioteau <matthieu.rioteau(at)skf(dot)com>
104c105
<     opener.location.href = "doku.php?do=edit&id=" + $('npd_ns').value + ":" + page_name;
---
>     opener.location.href = "doku.php?do=edit&id=" + $('npd_ns').value + "%3A" + page_name;
217a219,226
>     switch (li.nodeName.toLowerCase()) {
>       case "strong":
>             li = li.parentNode.parentNode.parentNode;
>             break;
>         case "a":
>             li = li.parentNode.parentNode;
>             break;
>     }
238c247,248
<             if (a == $('npd_ns').value) {
---
>             var a = a.replace(/%3A/gi, ":");
>             if (a == $('npd_ns').value.replace(/%3A/gi, ":")) {
374c384
<         <input type="text" class="" style="display: none;" id="npd_ns" value="<?php echo trim($_REQUEST['idx'], ":"); ?>"/>
---
>         <input type="text" class="" style="display: none;" id="npd_ns" value="<?php echo urlencode(trim($_REQUEST['idx'],':')); ?>"/>

BL & MR 2009/06/16 14:23

 $ret .= '<a rel="nofollow" href="'.$url.'" style="display:none;" id="npd_create_button" class="action npd">'.$label.'</a>';
 ...
  $ret .= '<input id="npd_create_button" type="submit" value="'.htmlspecialchars($label).'" class="button" ';

lines in helper.php to

 $ret .= '<a name="npd_button" rel="nofollow"href="'.$url.'" style="display:none;" id="npd_create_button" class="action npd">'.$label.'</a>';
 ...
 $ret .= '<input name="npd_button" id="npd_create_button" type="submit" value="'.htmlspecialchars($label).'" class="button" ';

and the init_npd() function in /js/button.js to

 function init_npd()
{
    var links = document.getElementsByName('npd_button');
    var links_length = links.length;

    for(i=0; i<links_length; i++) 
    {
           if (links[i].nodeName.toLowerCase() == 'a') 
           {
               npd_clicked_url = links[i].getAttribute('href');
	    } else {
		npd_clicked_url = links[i].parentNode.parentNode.getAttribute('action');
	    }
	    
	    addEvent(links[i], "click", npd_clicked);

	    // show the button
	    links[i].style.display = '';
    }

}