Typesetter-Original-gtbu/include/Page/Rename.php
2021-09-08 19:52:21 +02:00

392 lines
10 KiB
PHP

<?php
namespace gp\Page{
defined('is_running') or die('Not an entry point...');
class Rename{
static $hidden_rows = false;
/**
* Display form in popup for renaming page given by $index
*
*/
public static function RenameForm(){
global $langmessage, $page, $gp_index, $gp_titles, $config;
$index = $_REQUEST['index'];
if( !isset($gp_titles[$index]) ){
msg($langmessage['OOPS'].' (Invalid Request)');
return;
}
$action = \gp\tool::GetUrl($page->requested);
$label = \gp\tool::GetLabelIndex($index);
$title = \gp\tool::IndexToTitle($index);
$title_info = $gp_titles[$index];
$title_info += array(
'browser_title' => '',
'keywords' => '',
'description' => '',
'rel' => '',
);
if( empty($_REQUEST['new_title']) ){
$new_title = \gp\tool::LabelSpecialChars($label);
}else{
$new_title = htmlspecialchars($_REQUEST['new_title']);
}
$new_title = str_replace('_',' ',$new_title);
ob_start();
echo '<div class="inline_box">';
echo '<form action="'.$action.'" method="post" id="gp_rename_form">';
echo '<input type="hidden" name="title" id="old_title" value="'.htmlspecialchars($title).'" />';
echo '<input type="hidden" id="gp_space_char" value="'.htmlspecialchars($config['space_char']).'" />';
echo '<h2>'.$langmessage['rename/details'].'</h2>';
echo '<table class="bordered full_width" id="gp_rename_table">';
echo '<thead>';
echo '<tr><th colspan="2">';
echo $langmessage['options'];
echo '</th></tr>';
echo '</thead>';
echo '<tbody>';
//label
self::FormLabel('label');
echo '<input type="text" class="title_label gpinput" name="new_label" maxlength="100" size="50" value="'.$new_title.'" />';
echo '</td></tr>';
//slug (title)
$attr = '';
$class = 'new_title';
if( $title == \gp\admin\Tools::LabelToSlug($label) ){
//$attr = 'disabled="disabled" ';
$attr = 'readonly="readonly"" ';
$class .= ' sync_label';
}
self::FormLabel('Slug/URL');
echo '<input type="text" class="'.$class.' gpinput" name="new_title" maxlength="100" size="50" value="'.htmlspecialchars($title).'" '.$attr.'/>';
self::ToggleSync($attr);
echo '</td></tr>';
//browser title defaults to label
$attr = '';
$class = 'browser_title';
$browser_title = $title_info['browser_title'];
self::FormLabel('browser_title',$title_info['browser_title']);
if( empty($title_info['browser_title']) ){
$browser_title = htmlspecialchars($label);
$attr = 'readonly="readonly" ';
$class .= ' sync_label';
}
echo '<input type="text" class="'.$class.' gpinput" size="50" name="browser_title" value="'.$browser_title.'" '.$attr.'/>';
self::ToggleSync($attr);
echo '</td></tr>';
//meta keywords
self::FormLabel('keywords',$title_info['keywords']);
echo '<input type="text" class="gpinput" size="50" name="keywords" value="'.$title_info['keywords'].'" />';
echo '</td></tr>';
//meta description
self::FormLabel('description',$title_info['description']);
$count_label = sprintf($langmessage['_characters'],'<span>'.strlen($title_info['description']).'</span>');
echo '<span class="show_character_count gptextarea">';
echo '<textarea rows="2" cols="50" name="description">'.$title_info['description'].'</textarea>';
echo '<span class="character_count">'.$count_label.'</span>';
echo '</span>';
echo '</td></tr>';
//robots
self::FormLabel('robots',$title_info['rel']);
echo '<label>';
$checked = (strpos($title_info['rel'],'nofollow') !== false) ? 'checked="checked"' : '';
echo '<input type="checkbox" name="nofollow" value="nofollow" '.$checked.'/> ';
echo ' Nofollow ';
echo '</label>';
echo '<label>';
$checked = (strpos($title_info['rel'],'noindex') !== false) ? 'checked="checked"' : '';
echo '<input type="checkbox" name="noindex" value="noindex" '.$checked.'/> ';
echo ' Noindex';
echo '</label>';
echo '</td></tr>';
echo '</tbody>';
echo '</table>';
//redirection
echo '<p id="gp_rename_redirect" class="nodisplay">';
echo '<label>';
echo '<input type="checkbox" name="add_redirect" value="add" /> ';
echo sprintf($langmessage['Auto Redirect'],'"'.$title.'"');
echo '</label>';
echo '</p>';
echo '<p>';
if( self::$hidden_rows ) echo ' &nbsp; <a data-cmd="showmore" >+ '.$langmessage['more_options'].'</a>';
echo '</p>';
echo '<p>';
echo '<input type="hidden" name="cmd" value="RenameFile"/> ';
echo '<input type="submit" name="" value="'.$langmessage['save_changes'].'...'.'" class="gpsubmit" data-cmd="gppost"/>';
echo '<input type="button" class="admin_box_close gpcancel" name="" value="'.$langmessage['cancel'].'" />';
echo '</p>';
echo '</form>';
echo '</div>';
$content = ob_get_clean();
$page->ajaxReplace = array();
$array = array();
$array[0] = 'gpabox';
$array[1] = '';
$array[2] = $content;
$page->ajaxReplace[] = $array;
//call renameprep function after admin_box
$array = array();
$array[0] = 'renameprep';
$array[1] = '';
$array[2] = '';
$page->ajaxReplace[] = $array;
}
protected static function FormLabel($lang_key, $hidden_if_empty = 'not-empty' ){
global $langmessage;
if( empty($hidden_if_empty) ){
echo '<tr class="nodisplay">';
self::$hidden_rows = true;
}else{
echo '<tr>';
}
echo '<td class="formlabel">';
echo $langmessage[$lang_key];
echo '</td><td>';
}
/**
* Display Sync Toggle
*
*/
protected static function ToggleSync($attr){
global $langmessage;
echo ' <div class="label_synchronize">';
if( empty( $attr ) ){
echo '<a data-cmd="ToggleSync">'.$langmessage['sync_with_label'].'</a>';
echo '<a data-cmd="ToggleSync" class="slug_edit nodisplay">'.$langmessage['edit'].'</a>';
}else{
echo '<a data-cmd="ToggleSync" class="nodisplay">'.$langmessage['sync_with_label'].'</a>';
echo '<a data-cmd="ToggleSync" class="slug_edit">'.$langmessage['edit'].'</a>';
}
echo '</div>';
}
/**
* Handle renaming a page based on POSTed data
*
*/
public static function RenameFile($title){
global $langmessage, $page, $gp_index, $gp_titles;
$page->ajaxReplace = array();
//change the title
$title = self::RenameFileWorker($title);
if( $title === false ){
return false;
}
if( !isset($gp_index[$title]) ){
msg($langmessage['OOPS']);
return false;
}
$id = $gp_index[$title];
$title_info = &$gp_titles[$id];
//change the label
$title_info['label'] = \gp\admin\Tools::PostedLabel($_POST['new_label']);
if( isset($title_info['lang_index']) ){
unset($title_info['lang_index']);
}
//browser_title, keywords, description
self::SetInfo($title_info, 'browser_title');
self::SetInfo($title_info, 'keywords');
self::SetInfo($title_info, 'description');
self::SetRobots($title_info);
//same as auto-generated?
$auto_browser_title = strip_tags($title_info['label']);
if( isset($title_info['browser_title']) && $title_info['browser_title'] == $auto_browser_title ){
unset($title_info['browser_title']);
}
if( !\gp\admin\Tools::SavePagesPHP(true,true) ){
return false;
}
return $title;
}
/**
* Set the title_info value if not emptpy
* Otherwise, unset the key
*
*/
private static function SetInfo( &$title_info, $key){
if( isset($_POST[$key]) ){
$title_info[$key] = htmlspecialchars($_POST[$key]);
if( empty($title_info[$key]) ){
unset($title_info[$key]);
}
}
}
/**
* Set the robot visibility
*
*/
private static function SetRobots(&$title_info){
$title_info['rel'] = '';
if( isset($_POST['nofollow']) ){
$title_info['rel'] = 'nofollow';
}
if( isset($_POST['noindex']) ){
$title_info['rel'] .= ',noindex';
}
$title_info['rel'] = trim($title_info['rel'],',');
if( empty($title_info['rel']) ){
unset($title_info['rel']);
}
}
private static function RenameFileWorker($title){
global $langmessage,$dataDir,$gp_index;
//use new_label or new_title
if( isset($_POST['new_title']) ){
$new_title = \gp\admin\Tools::PostedSlug($_POST['new_title']);
}else{
$new_title = \gp\admin\Tools::LabelToSlug($_POST['new_label']);
}
//title unchanged
if( $new_title == $title ){
return $title;
}
$special_file = false;
if( \gp\tool::SpecialOrAdmin($title) !== false ){
$special_file = true;
}
if( !\gp\admin\Tools::CheckTitle($new_title,$message) ){
msg($message);
return false;
}
$old_gp_index = $gp_index;
//re-index: make the new title point to the same data index
$old_file = \gp\tool\Files::PageFile($title);
$file_index = $gp_index[$title];
unset($gp_index[$title]);
$gp_index[$new_title] = $file_index;
//rename the php file
if( !$special_file ){
$new_file = \gp\tool\Files::PageFile($new_title);
//if the file being renamed doesn't use the index naming convention, then we'll still need to rename it
if( $new_file != $old_file ){
$new_dir = dirname($new_file);
$old_dir = dirname($old_file);
if( !\gp\tool\Files::Rename($old_dir,$new_dir) ){
msg($langmessage['OOPS'].' (N3)');
$gp_index = $old_gp_index;
return false;
}
}
//gallery rename
\gp\special\Galleries::RenamedGallery($title,$new_title);
}
//create a 301 redirect
if( isset($_POST['add_redirect']) && $_POST['add_redirect'] == 'add' ){
\gp\admin\Settings\Missing::AddRedirect($title,$new_title);
}
\gp\tool\Plugins::Action('RenameFileDone',array($file_index, $title, $new_title));
return $new_title;
}
/**
* Rename a page
*
*/
public static function RenamePage(){
global $langmessage, $gp_index, $page;
$new_title = self::RenameFile($page->title);
if( ($new_title !== false) && $new_title != $page->title ){
msg(sprintf($langmessage['will_redirect'],\gp\tool::Link_Page($new_title)));
$page->head .= '<meta http-equiv="refresh" content="15;url='.\gp\tool::GetUrl($new_title,'',false,'').'">';
$page->ajaxReplace[] = array('location',\gp\tool::GetUrl($new_title,'',false,''),15000);
return true;
}
return false;
}
}
}
namespace{
class gp_rename extends \gp\Page\Rename{}
}