Вход Регистрация
Файл: 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($separator, array_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($separator, array_keys($all));
        }
        
        foreach (
$this->db->fetch_rows() as $row) {
            
$word    = $row['word'];
            if (!isset(
$all[$word])) {
                
$all[$word]    = 1;
            }
        }
        
        return 
implode($separator, array_keys($all));
    }    
}
Онлайн: 3
Реклама