Вход Регистрация
Файл: adultscript-2.0.3-pro/files/admin/modules/tools/components/synonyms.php
Строк: 203
<?php
defined
('_VALID') or die('Restricted Accesss!');
set_time_limit(0);
class 
VComponent_Admin_tools_synonyms
{
    private 
$db;
    public function 
__construct()
    {
        
$this->db VF::factory('database');
    }
    
    public function 
render()
    {
        
$errors        = array();
        
$messages    = array();
        
$warnings    = array();

        
$filter        VF::factory('filter');
        
        
$import        = array('url' => '''method' => 'url''separator' => ',');
        if (isset(
$_POST['submit_import'])) {
            
$url        trim($_POST['url']);
            
$method        $filter->get('method');
            
$separator    $filter->get('separator');
            
            if (
$method == 'file') {
                if (isset(
$_FILES['file']) && $_FILES['file']['tmp_name']) {
                    
$file    $_FILES['file']['tmp_name'];
                } else {
                    
$errors[]    = 'Please select synonyms a file to upload!';
                }
            } elseif (
$method == 'url') {
                if (
$url == '') {
                    
$errors[]    = 'Please enter the URL for your synonyms file!';
                } elseif (!
VValid::url($url)) {
                    
$errors[]    = 'Synonyms File URL is not a valid URL address!';
                } else {
                    
$file        TMP_DIR.'/downloads/'.VText::random();
                    if (!
VCurl::file($url$file)) {
                        
$errors[]    = 'Failed to download file!';
                    }
                }
            } else {
                
$errors[]    = 'Invalid import method specified!';
            }
            
            if (!
$errors) {
                
$contents    file($file);
                
$total        0;
                
$already    0;
                
$added        0;
                
$failed        0;
                foreach (
$contents as $line) {
                    
$line        trim($line);
                    
$processed    = array();
                    
$synonyms    $this->get_synonyms($line$separator);
                    
$words        explode($separator$synonyms);
                    foreach (
$words as $word) {
                        
$word    trim($word);
                        if (!
$word) {
                            continue;
                        }
                        
                        if (
$word_id $this->get_word_id($word)) {
                            ++
$already;
                            
$processed[$word]    = $word_id;
                        } elseif (
$word_id $this->add_word($word)) {
                            ++
$added;
                            
$processed[$word]    = $word_id;
                        } else {
                            ++
$failed;
                        }
                        
                        ++
$total;

                        foreach (
$processed as $word => $word_id) {
                            foreach (
$processed as $synonym => $synonym_id) {
                                
$this->add_synonym($word_id$synonym_id);
                            }
                        }
                    }
                }
                
                
VF::cache_del('words''config');
                
                
$messages[]    = 'Processed '.$total.' words! '.$already.' were already in the database, '.$added.' were added and '.$failed.' failed!';
            }
        }
        
        
$synonyms    '';
        if (isset(
$_POST['submit_add'])) {
            
$synonyms    $filter->get('synonyms');
            
            if (
$synonyms == '') {
                
$errors[]    = 'Please enter a comma separated list of words (all synonyms)!';
            } elseif (
strpos($synonyms',') === false) {
                
$errors[]    = 'Please enter at least two words!';
            } else {
                
// we make sure we have a complete list of available synonyms
                
$synonyms    $this->get_synonyms($synonyms);
            }
            
            if (!
$errors) {
                
$words        explode(','$synonyms);
                
$processed    = array();
                
$added        = array();
                
$already    = array();
                
$failed        = array();
                
                foreach (
$words as $word) {
                    
$word        trim($word);
                    if (!
$word) {
                        continue;
                    }
                    
                    if (
$word_id $this->get_word_id($word)) {
                        
$already[$word]        = 1;
                        
$processed[$word]    = $word_id;
                    } else if (
$word_id $this->add_word($word)) {
                        
$added[$word]        = 1;
                        
$processed[$word]    = $word_id;
                    } else {
                        
$failed[$word]    = 1;
                    }                    
                }
                
                foreach (
$processed as $word => $word_id) {
                    foreach (
$processed as $synonym => $synonym_id) {
                        
$this->add_synonym($word_id$synonym_id);
                    }
                }
                
                
$message    'Processed total '.count($processed).' words.';
                if (
$added) {
                    
$message    .= ' Added: '.implode(', 'array_keys($added)).'.';
                }
                
                if (
$already) {
                    
$warnings[]    = 'Already added: '.implode(', 'array_keys($already)).'!';
                }
                
                
VF::cache_del('words''config');
                
                
$messages[]    = $message;
                
$synonyms    '';
            }            
        }
        
        if (isset(
$_POST['word_id']) && isset($_POST['action'])) {
            
$action        trim($_POST['action']);
            
$word_id    = (int) trim($_POST['word_id']);
            if (
$action == 'delete') {
                
$this->db->query("DELETE FROM #__words WHERE word_id = ".$word_id." LIMIT 1");
                
VF::cache_del('words''config');
                
$messages[]    = 'Word deleted!';
            } else {
                
$errors[]    = 'Invalid action!';
            }
        }
        
        if (isset(
$_POST['submit_actions'])) {
            
$action        trim($_POST['action']);
            
$ids        = (isset($_POST['checked'])) ? (array) $_POST['checked'] : array();
            if (
$ids) {
                if (
$action == 'delete') {
                    
$this->db->query("DELETE FROM #__words WHERE word_id IN (".implode(','array_keys($ids)).")");
                    
VF::cache_del('words''config');
                    
$messages[]    = 'Selected words deleted!';
                } else {
                    
$errors[]    = 'Invalid action!';
                }
            } else {
                
$errors[]    = 'Please select at least one word!';
            }
        }
        
        
$page            = (isset($_GET['page'])) ? (int) $_GET['page'] : 1;
        
$query            = (isset($_GET['s'])) ? $filter->get('s''STRING''GET') : false;
        
$type            = (isset($_GET['t'])) ? trim($_GET['t']) : 'start';
        
$order            = (isset($_GET['o'])) ? $filter->get('o''STRING''GET') : 'ASC';
        
$display        = (isset($_GET['d'])) ? (int) trim($_GET['d']) : 50;
        
$where            '';
        if (
$query) {
            
$where        = ($type == 'fixed')
                ? 
" WHERE w.word = '".$this->db->escape($query)."' "
                
" WHERE w.word LIKE '".$this->db->escape($query)."%' ";
        }
        
$sql            "SELECT COUNT(*) AS total_words
                           FROM #__words AS w"
.$where;
        
$total_words    $this->db->get_field($sql'total_words');
        
$pagination        VPagination::get($page$total_words$display);
        
$sql            "SELECT w.word_id, w.word, GROUP_CONCAT(ws.word) AS synonyms
                           FROM #__words AS w
                           LEFT JOIN #__synonyms AS s ON (s.word_id = w.word_id AND s.synonym_id != w.word_id)
                           LEFT JOIN #__words AS ws ON (ws.word_id = s.synonym_id)"
.$where."
                           GROUP BY w.word_id
                           ORDER BY w.word_id DESC
                           LIMIT "
.$pagination['limit'];
        
        
$tpl VF::factory('template');
        
$tpl->menu             'main';
        
$tpl->submenu        'tools';
        
$tpl->meta_title    'Tools::Synonyms Database';
        
$tpl->errors        $errors;
        
$tpl->messages        $messages;
        
$tpl->warnings        $warnings;
        
$tpl->import        $import;
        
$tpl->query            $query;
        
$tpl->type            $type;
        
$tpl->order            $order;
        
$tpl->display        $display;
        
$tpl->synonyms        $synonyms;
        
$tpl->words            $this->db->get_rows($sql);
        
$tpl->pagination    $pagination;
        
$tpl->load(array('header''tools_synonyms''footer'));
        
$tpl->display();
    }
    
    private function 
get_word_id($word)
    {
        
$this->db->query("SELECT word_id
                          FROM #__words
                          WHERE word = '"
.$this->db->escape($word)."'
                          LIMIT 1"
);
        if (
$this->db->affected_rows()) {
            return 
$this->db->fetch_field('word_id');
        }
        
        return 
false;
    }
    
    private function 
add_word($word)
    {
        
$this->db->query("INSERT INTO #__words
                          SET word = '"
.$this->db->escape($word)."'");
        if (
$this->db->affected_rows()) {
            return 
$this->db->get_last_insert_id('#__words');
        }
        
        return 
false;
    }
    
    private function 
synonym_exists($word_id$synonym_id)
    {
        
$this->db->query("SELECT word_id
                          FROM #__synonyms
                          WHERE word_id = "
.$word_id."
                          AND synonym_id = "
.$synonym_id."
                          LIMIT 1"
);
        
        return 
$this->db->affected_rows();
    }
    
    private function 
add_synonym($word_id$synonym_id)
    {
        if (!
$this->synonym_exists($word_id$synonym_id)) {
            
$this->db->query("INSERT INTO #__synonyms (word_id, synonym_id)
                              VALUES ("
.$word_id.", ".$synonym_id.")
                              ON DUPLICATE KEY UPDATE word_id = word_id"
);
        }
    }
    
    private function 
get_synonyms($words$separator ',')
    {
        
$words        explode($separator$words);
        
$all        = array();
        
        
$in            = array();
        foreach (
$words as $word) {
            
$word        trim($word);
            
$all[$word]    = 1;
            
$in[]        = "'".$this->db->escape(trim($word))."'";
        }

        
$this->db->query("SELECT word_id FROM #__words WHERE word IN (".implode(','$in).")");
        if (!
$this->db->affected_rows()) {
            return 
implode($separatorarray_keys($all));
        }
        
        
$ids    = array();
        
$rows    $this->db->fetch_rows();
        foreach (
$rows as $row) {
            
$ids[]    = $row['word_id'];
        }
        
        
$this->db->query("
            SELECT s.synonym_id, w.word
            FROM #__synonyms AS s
            LEFT JOIN #__words AS w ON (w.word_id = s.synonym_id)
            WHERE s.word_id IN ("
.implode(','array_values($ids)).")
            GROUP BY s.synonym_id"
        
);
        
        if (!
$this->db->affected_rows()) {
            return 
implode($separatorarray_keys($all));
        }
        
        foreach (
$this->db->fetch_rows() as $row) {
            
$word    $row['word'];
            if (!isset(
$all[$word])) {
                
$all[$word]    = 1;
            }
        }
        
        return 
implode($separatorarray_keys($all));
    }    
}
Онлайн: 1
Реклама