HEX
Server: Apache/2.4.25 (Debian)
System: Linux server17 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64
User: web37 (1062)
PHP: 7.4.30
Disabled: show_source, highlight_file, apache_child_terminate, apache_get_modules, apache_note, apache_setenv, virtual, dl, disk_total_space, posix_getpwnam, posix_getpwuid, posix_mkfifo, posix_mknod, posix_setpgid, posix_setsid, posix_setuid, posix_uname, proc_nice, openlog, syslog, pfsockopen
Upload Files
File: /var/www/web37/htdocs/fickanzeiger/models/SearchTagModel.php
<?php
/**
 * Arfooo
 * 
 * @package    Arfooo
 * @copyright  Copyright (c) Arfooo Annuaire (fr) and Arfooo Directory (en)
 *             by Guillaume Hocine (c) 2007 - 2010
 *             http://www.arfooo.com/ (fr) and http://www.arfooo.net/ (en)
 * @author     Guillaume Hocine & Adrian Galewski
 * @license    http://creativecommons.org/licenses/by/2.0/fr/ Creative Commons
 */


class SearchTagModel extends Model
{
    protected $primaryKey = "tagId";

    public function handleSearchEngineReferrer($url)
    {
        if (!preg_match("#^http://www\.google\.\w{2,3}/search\?.*q=([^&]+)#", $url, $match)) {
            return;
        }

        $tag = $match[1];
        $this->addSearchTag($tag);
    }

    public function addSearchTag($tag, $site = null)
    {
        if (!Config::get("tagCloudEnabled")) {
            return;
        }
        if ($this->bannedTag->isBanned($tag)) {
            return;
        }

        $tag = strtr($tag, "+-<>()~*\"", "         ");
        $c = new Criteria();
        $c->add("tag", $tag);
        $searchTag = $this->find($c);
        $updateSearchTimes = true;

        if (!$searchTag) {
            if (empty($site)) {
                $site = $this->siteSearcher->searchValidatedSite($tag);
                if (empty($site)) {
                    return;
                }
            }

            $tagParts = explode(" ", $tag);

            foreach ($tagParts as $part) {
                if (stripos($site->description, $part) === false && stripos($site->siteTitle, $part) === false) {
                    return;
                }
            }

            $searchTag = new SearchTagRecord();
            $searchTag->tag = $tag;
            $searchTag->searchTimes = 0;
        } else {
            $ip = Request::getInstance()->getIp();
            $type = "tag";

            if (!$this->visit->exists($ip, $type, $searchTag->tagId, 24)) {
                $visit = new VisitRecord();
                $visit->ip = $ip;
                $visit->type = $type;
                $visit->id = $searchTag->tagId;
                $visit->save();
            } else {
                $updateSearchTimes = false;
            }
        }

        if ($updateSearchTimes) {
            $searchTag->searchTimes = $searchTag->searchTimes + 1;
            $searchTag->save();
        }
    }

    private function sortTag($a, $b)
    {
        return strcmp($a['tag'], $b['tag']);
    }

    public function getTagCloud()
    {
        $c = new Criteria();
        $c->addOrder("searchTimes DESC");
        $c->add("banned", "0");
        $c->setLimit(Config::get("numberOfTagInTagCloud"));
        $tags = $this->findAll($c);

        if (count($tags) < min(Config::get("numberOfTagInTagCloud"), Config::get("minNumberOfTagInTagCloud"))) {
            return array();
        }

        usort($tags, array($this, "sortTag"));

        $maxSearchTimes = 0;
        $minSearchTimes = pow(2, 32);

        $minSize = 1;
        $maxSize = 10;

        foreach ($tags as $tag) {
            $maxSearchTimes = max($maxSearchTimes, $tag['searchTimes']);
        }
        foreach ($tags as $tag) {
            $minSearchTimes = min($minSearchTimes, $tag['searchTimes']);
        }

        $range = $maxSearchTimes - $minSearchTimes;
        if ($range == 0) {
            $range = 1;
        }
        $step = ($maxSize - $minSize) / $range;

        foreach ($tags as &$tag) {
            $tag['size'] = intval($minSize + (($tag['searchTimes'] - $minSearchTimes) * $step));
        }

        return $tags;
    }

    function delByPattern($pattern)
    {
        $searchTags = $this->findAll(null, "*", true);

        foreach ($searchTags as $searchTag) {
            if (preg_match("#^" . str_replace("\\*", ".*", preg_quote($pattern)) . "$#i", $searchTag->tag)) {
                $searchTag->del();
            }
        }
    }
}

class SearchTagRecord extends ModelRecord
{
    public function save()
    {
        parent::save();

        $cache = Cacher::getInstance();
        $cache->clean("tag", array("searchTag"));
    }

    public function del()
    {
        parent::del();
        $cache = Cacher::getInstance();
        $cache->clean("tag", array("searchTag"));
    }
}