Вход Регистрация
Файл: textpattern-4.5.7/textpattern/include/txp_category.php
Строк: 486
<?php

/*
    This is Textpattern

    Copyright 2005 by Dean Allen
    www.textpattern.com
    All rights reserved

    Use of this software indicates acceptance of the Textpattern license agreement

$HeadURL: https://textpattern.googlecode.com/svn/releases/4.5.7/source/textpattern/include/txp_category.php $
$LastChangedRevision: 4972 $
*/

if (!defined('txpinterface')) die('txpinterface is undefined.');

if (
$event == 'category') {
    
require_privs('category');

    
$available_steps = array(
        
'cat_category_list'      => false,
        
'cat_category_multiedit' => true,
        
'cat_article_create'     => true,
        
'cat_image_create'       => true,
        
'cat_file_create'        => true,
        
'cat_link_create'        => true,
        
'cat_article_save'       => true,
        
'cat_image_save'         => true,
        
'cat_file_save'          => true,
        
'cat_link_save'          => true,
        
'cat_article_edit'       => false,
        
'cat_image_edit'         => false,
        
'cat_file_edit'          => false,
        
'cat_link_edit'          => false,
    );

    if (
$step && bouncer($step, $available_steps)){
        
$step();
    } else {
        
cat_category_list();
    }
}

//-------------------------------------------------------------
    
function cat_category_list($message="")
    {
        
pagetop(gTxt('categories'),$message);
        
$out = array('<h1 class="txp-heading">'.gTxt('tab_organise').'</h1>',
        
'<div id="category_container" class="txp-container">',
        
'<table class="category-list">',
        
'<tr>',
            
tdtl('<div id="categories_article">'.cat_article_list().'</div>',' class="categories article"'),
            
tdtl('<div id="categories_link">'.cat_link_list().'</div>',' class="categories link"'),
            
tdtl('<div id="categories_image">'.cat_image_list().'</div>',' class="categories image"'),
            
tdtl('<div id="categories_file">'.cat_file_list().'</div>',' class="categories file"'),
        
'</tr>',
        
endTable(),
        
'</div>',
        
script_js( <<<EOS
            $(document).ready(function() {
                $('.category-tree').txpMultiEditForm({
                    'row' : 'p',
                    'highlighted' : 'p'
                });
            });
EOS
        ));
        echo 
join(n,$out);
    }


//-------------------------------------------------------------
    
function cat_article_list()
    {
        return 
cat_event_category_list('article');
    }

//-------------------------------------------------------------
    
function cat_article_create()
    {
        return 
cat_event_category_create('article');
    }

//-------------------------------------------------------------
    
function cat_article_edit()
    {
        return 
cat_event_category_edit('article');
    }

//-------------------------------------------------------------
    
function cat_article_save()
    {
        return 
cat_event_category_save('article', 'textpattern');
    }

//--------------------------------------------------------------

    
function cat_parent_pop($name, $type, $id)
    {
        if (
$id)
        {
            
$id = assert_int($id);
            list(
$lft, $rgt) = array_values(safe_row('lft, rgt', 'txp_category', 'id = '.$id));

            
$rs = getTree('root', $type, "lft not between $lft and $rgt");
        }

        else
        {
            
$rs = getTree('root', $type);
        }

        if (
$rs)
        {
            return array(
treeSelectInput('parent', $rs, $name, 'category_parent'), true);
        }

        return array(
gTxt('no_other_categories_exist'), false);
    }

// -------------------------------------------------------------
    
function cat_link_list()
    {
        return 
cat_event_category_list('link');
    }

//-------------------------------------------------------------
    
function cat_link_create()
    {
        return 
cat_event_category_create('link');
    }

//-------------------------------------------------------------
    
function cat_link_edit()
    {
        return 
cat_event_category_edit('link');
    }

//-------------------------------------------------------------
    
function cat_link_save()
    {
        return 
cat_event_category_save('link', 'txp_link');
    }

// -------------------------------------------------------------
    
function cat_image_list()
    {
        return 
cat_event_category_list('image');
    }

//-------------------------------------------------------------
    
function cat_image_create()
    {
        return 
cat_event_category_create('image');
    }

//-------------------------------------------------------------
    
function cat_image_edit()
    {
        return 
cat_event_category_edit('image');
    }

//-------------------------------------------------------------
    
function cat_image_save()
    {
        return 
cat_event_category_save('image', 'txp_image');
    }


// -------------------------------------------------------------
    
function cat_article_multiedit_form($area, $array)
    {
        
$rs = getTree('root', $area);
        
$categories = $rs ? treeSelectInput('new_parent', $rs, '') : '';

        
$methods = array(
            
'changeparent' => array('label' => gTxt('changeparent'), 'html' => $categories),
            
'deleteforce'  => gTxt('deleteforce'),
            
'delete'       => gTxt('delete'),
        );

        if (
$array) {
            return
                
form(
                    
join('',$array).
                    
hInput('type',$area).
                    
n.multi_edit($methods, 'category', 'cat_category_multiedit', '', '', '', '', '', $area)
                    ,
'', '', 'post', 'category-tree', '', 'category_'.$area.'_form'
                
);
        }
        return;
    }

// -------------------------------------------------------------
    
function cat_category_multiedit()
    {
        
$type = ps('type');
        
$method = ps('edit_method');
        
$things = ps('selected');

        if (
is_array($things) and $things and in_array($type, array('article','image','link','file')))
        {
            
$things = array_map('assert_int', $things);

            if (
$method == 'delete' || $method == 'deleteforce')
            {
                if (
$type === 'article')
                {
                    
$used = 'name NOT IN(SELECT category1 FROM '.safe_pfx('textpattern').')'.
                        
' AND name NOT IN(SELECT category2 FROM '.safe_pfx('textpattern').')';
                }
                else
                {
                    
$used = 'name NOT IN(SELECT category FROM '.safe_pfx('txp_'.$type).')';
                }

                
$rs = safe_rows('id, name', 'txp_category', "id IN (".join(',', $things).") AND type='".$type."'" . (($method == 'deleteforce') ? '' : " AND rgt - lft = 1 AND ".$used));

                if (
$rs)
                {
                    foreach(
$rs as $cat)
                    {
                        
$catid[] = $cat['id'];
                        
$names[] = doSlash($cat['name']);
                    }

                    if (
safe_delete('txp_category','id IN ('.join(',', $catid).')'))
                    {
                        if (
$method == 'deleteforce')
                        {
                            
// Clear the deleted category names from assets
                            
$affected = join("','", $names);
                            if(
$type === 'article')
                            {
                                
safe_update('textpattern', "category1 = ''", "category1 IN ('$affected')");
                                
safe_update('textpattern', "category2 = ''", "category2 IN ('$affected')");
                            }
                            else
                            {
                                
safe_update('txp_'.$type, "category = ''", "category IN ('$affected')");
                            }

                            
// Promote subcats of deleted cats to root
                            
safe_update('txp_category', "parent='root'", "parent IN ('$affected')");
                        }

                        
rebuild_tree_full($type);
                        
callback_event('categories_deleted', $type, 0, $catid);

                        
$message = gTxt($type.'_categories_deleted', array('{list}' => join(', ',$catid)));

                        return 
cat_category_list($message);
                    }
                }
            }

            else if (
$method == 'changeparent')
            {
                
$new_parent = ps('new_parent');

                
$rs = safe_rows('id, name', 'txp_category', "id IN (".join(',', $things).") AND type='".$type."'");

                if (
$rs)
                {
                    
$exists = safe_field('name', 'txp_category', "name = '".doSlash($new_parent)."' AND type='$type'");
                    
$parent = ($exists == '') ? 'root' : $exists;
                    
$to_change = $affected = array();

                    foreach(
$rs as $cat)
                    {
                        
// Cannot assign parent to itself
                        
if ($cat['name'] != $new_parent)
                        {
                            
$to_change[] = doSlash($cat['name']);
                            
$affected[] = $cat['name'];
                        }
                    }

                    
$ret = safe_update('txp_category', "parent='".doSlash($parent)."'", "name IN ('".join("','", $to_change)."') AND type='".$type."'");

                    if (
$ret)
                    {
                        
rebuild_tree_full($type);

                        
$message = gTxt('categories_set_parent', array('{type}' => gTxt($type), '{parent}' => $parent, '{list}' => join(', ',$affected)));

                        return 
cat_category_list($message);
                    }
                }
            }
        }

        return 
cat_category_list();
    }

//Refactoring: Functions are more or less the same for all event types
// so, merge them. Addition of new event categories is easiest now.

//-------------------------------------------------------------

    
function cat_event_category_list($event)
    {
        
$rs = getTree('root', $event);

        
$parent = ps('parent_cat');

        
$heading = 'tab_' . ($event == 'article' ? 'list' : $event);
        
$for = $rs ? ' for="'.$event.'_category_parent"' : '';

        
$out = n.n.hed(gTxt($heading).sp.popHelp($event.'_category'), 2).
            
form(
                
fInput('text', 'title', '', '', '', '', INPUT_REGULAR).
                ((
$rs) ? '<div class="parent"><label'.$for.'>' . gTxt('parent') . '</label>' . treeSelectInput('parent_cat', $rs, $parent, $event.'_category_parent') . '</div>' : '').
                
n.fInput('submit', '', gTxt('Create')).
                
n.eInput('category').
                
n.sInput('cat_'.$event.'_create')
            ,
'', '', 'post', 'action-create '.$event);

        if (
$rs)
        {
            
$total_count = array();

            if (
$event == 'article')
            {
                
// Count distinct articles for both categories, avoid duplicates
                
$rs2 = getRows(
                    
'select category, count(*) as num from ('.
                        
'select ID, Category1 as category from '.safe_pfx('textpattern').
                        
' union '.
                        
'select ID, Category2 as category from '.safe_pfx('textpattern').
                    
') as t where category != "" group by category');

                if (
$rs2 !== false)
                {
                    foreach (
$rs2 as $a)
                    {
                        
$total_count[$a['category']] = $a['num'];
                    }
                }
            }

            else
            {
                switch (
$event)
                {
                    case 
'link':
                        
$rs2 = safe_rows_start('category, count(*) as num', 'txp_link', "1 group by category");
                    break;

                    case 
'image':
                        
$rs2 = safe_rows_start('category, count(*) as num', 'txp_image', "1 group by category");
                    break;

                    case 
'file':
                        
$rs2 = safe_rows_start('category, count(*) as num', 'txp_file', "1 group by category");
                    break;
                }

                while (
$a = nextRow($rs2))
                {
                    
$name = $a['category'];
                    
$num = $a['num'];

                    
$total_count[$name] = $num;
                }
            }

            
$items = array();

            foreach (
$rs as $a)
            {
                
extract($a);

                
// format count
                
switch ($event)
                {
                    case 
'article':
                        
$url = 'index.php?event=list'.a.'search_method=categories'.a.'crit='.$name;
                    break;

                    case 
'link':
                        
$url = 'index.php?event=link'.a.'search_method=category'.a.'crit='.$name;
                    break;

                    case 
'image':
                        
$url = 'index.php?event=image'.a.'search_method=category'.a.'crit='.$name;
                    break;

                    case 
'file':
                        
$url = 'index.php?event=file'.a.'search_method=category'.a.'crit='.$name;
                    break;
                }

                
$count = isset($total_count[$name]) ? href('('.$total_count[$name].')', $url) : '(0)';

                if (empty(
$title)) {
                    
$edit_link = '<em>'.eLink('category', 'cat_'.$event.'_edit', 'id', $id, gTxt('untitled')).'</em>';
                } else {
                    
$edit_link = eLink('category', 'cat_'.$event.'_edit', 'id', $id, $title);
                }

                
$items[] = graf(
                    
checkbox('selected[]', $id, 0).sp.str_repeat(sp.sp, $level * 2).$edit_link.sp.$count
                
, ' class="level-'.$level.'"');
            }

            if (
$items)
            {
                
$out .= cat_article_multiedit_form($event, $items);
            }
        }

        else
        {
            
$out .= graf(gTxt('no_categories_exist'));
        }

        return 
$out;
    }

//-------------------------------------------------------------

    
function cat_event_category_create($event)
    {
        
$title = ps('title');

        
$name = strtolower(sanitizeForUrl($title));

        if (!
$name)
        {
            
$message = array(gTxt($event.'_category_invalid', array('{name}' => $name)), E_ERROR);

            return 
cat_category_list($message);
        }

        
$exists = safe_field('name', 'txp_category', "name = '".doSlash($name)."' and type = '".doSlash($event)."'");

        if (
$exists)
        {
            
$message = array(gTxt($event.'_category_already_exists', array('{name}' => $name)), E_ERROR);

            return 
cat_category_list($message);
        }

        
$parent = strtolower(sanitizeForUrl(ps('parent_cat')));
        
$parent_exists = safe_field('name', 'txp_category', "name = '".doSlash($parent)."' and type = '".doSlash($event)."'");
        
$parent = ($parent_exists) ? $parent_exists : 'root';

        
$q = safe_insert('txp_category', "name = '".doSlash($name)."', title = '".doSlash($title)."', type = '".doSlash($event)."', parent = '".$parent."'");

        if (
$q)
        {
            
rebuild_tree_full($event);

            
$message = gTxt($event.'_category_created', array('{name}' => $name));

            
cat_category_list($message);
        }
        else
        {
            
cat_category_list(array(gTxt('category_save_failed'), E_ERROR));
        }
    }

//-------------------------------------------------------------

    
function cat_event_category_edit($evname)
    {
        
$id     = assert_int(gps('id'));
        
$parent = doSlash(gps('parent'));

        
$row = safe_row('*', 'txp_category', "id=$id");
        if (
$row) {
            
pagetop(gTxt('edit_category'));
            
extract($row);
            list(
$parent_widget, $has_parent) = cat_parent_pop($parent,$evname,$id);
            
$out = '<div class="txp-edit">'.n.
                
hed(gTxt('edit_category'), 2).n.
                
inputLabel('category_name', fInput('text', 'name', $name, '', '', '', INPUT_REGULAR, '', 'category_name'), $evname.'_category_name').n.
                (
$has_parent ? inputLabel('category_parent', $parent_widget, 'parent') : graf('<span class="edit-label">'.gTxt('parent').'</span><span class="edit-value">'.$parent_widget.'</span>')).n.
                
inputLabel('category_title', fInput('text', 'title', $title, '', '', '', INPUT_REGULAR, '', 'category_title'), $evname.'_category_title').n.
                
pluggable_ui('category_ui', 'extend_detail_form', '', $row).n.
                
hInput('id',$id).
                
graf(fInput('submit', '', gTxt('save'), 'publish')).
                
eInput('category').
                
sInput('cat_'.$evname.'_save').
                
hInput('old_name',$name).
                
'</div>';
            echo 
'<div id="category_container" class="txp-container">'.
                
form(  $out, '', '', 'post', 'edit-form' ).
                
'</div>';
        } else {
            
cat_category_list(array(gTxt('category_not_found'), E_ERROR));
        }
    }

//-------------------------------------------------------------

    
function cat_event_category_save($event, $table_name)
    {
        
extract(doSlash(array_map('assert_string', psa(array('id', 'name', 'old_name', 'parent', 'title')))));
        
$id = assert_int($id);

        
$name = sanitizeForUrl($name);

        
// make sure the name is valid
        
if (!$name)
        {
            
$message = array(gTxt($event.'_category_invalid', array('{name}' => $name)), E_ERROR);

            return 
cat_category_list($message);
        }

        
// don't allow rename to clobber an existing category
        
$existing_id = safe_field('id', 'txp_category', "name = '$name' and type = '$event'");

        if (
$existing_id and $existing_id != $id)
        {
            
$message = array(gTxt($event.'_category_already_exists', array('{name}' => $name)), E_ERROR);

            return 
cat_category_list($message);
        }

        
//TODO: validate parent?
        
$parent = ($parent) ? $parent : 'root';

        
$message = array(gTxt('category_save_failed'), E_ERROR);
        if (
safe_update('txp_category', "name = '$name', parent = '$parent', title = '$title'", "id = $id") &&
            
safe_update('txp_category', "parent = '$name'", "parent = '$old_name' and type='$event'"))
        {
            
rebuild_tree_full($event);

            if (
$event == 'article')
            {
                if (
safe_update('textpattern', "Category1 = '$name'", "Category1 = '$old_name'") &&
                    
safe_update('textpattern', "Category2 = '$name'", "Category2 = '$old_name'"))
                {
                    
$message = gTxt($event.'_category_updated', array('{name}' => doStrip($name)));
                }
            }
            else
            {
                if (
safe_update($table_name, "category = '$name'", "category = '$old_name'"))
                {
                    
$message = gTxt($event.'_category_updated', array('{name}' => doStrip($name)));
                }
            }
        }
        
cat_category_list($message);
    }

// --------------------------------------------------------------
// Non image file upload. Have I mentioned how much I love this file refactoring?
// -------------------------------------------------------------
    
function cat_file_list()
    {
        return 
cat_event_category_list('file');
    }

//-------------------------------------------------------------
    
function cat_file_create()
    {
        return 
cat_event_category_create('file');
    }

//-------------------------------------------------------------
    
function cat_file_edit()
    {
        return 
cat_event_category_edit('file');
    }

//-------------------------------------------------------------
    
function cat_file_save()
    {
        return 
cat_event_category_save('file','txp_file');
    }


?>
Онлайн: 1
Реклама