Меню, Gravatar, ЧПУ

Выкладываем свои наработки
Ответить
Аватара пользователя
Razunter
Сообщения: 18
Зарегистрирован: 2009.07.04, 17:36
Контактная информация:

Меню, Gravatar, ЧПУ

Сообщение Razunter »

ИМХО, примеров кода очень мало, потому я решил выложить свои наработки. На PHP программирую недавно, и наверняка код крайне неоптимален. Тестировалось на PHP 5.3

Виджет главного меню с подсветкой активных пунктов не только конкретных действий, но и отдельных страниц:

Код: Выделить всё

<?php
class MainMenu extends CWidget {
    public $items=array();

    public function run() {
        $items=array();
        $controller=$this->controller;
        foreach($this->items as $item) {
            if(isset($item['visible']) && !$item['visible'])
                continue;
            if(isset($item['access']) && $item['access']=='admin' && Yii::app()->user->isGuest)
                continue;
            $item2=array();
            $item2['label']=$item['label'];
            if(is_array($item['url']))
                $item2['url']=$controller->createUrl($item['url'][0]);
            else
                $item2['url']=$item['url'];
            $pattern=isset($item['pattern'])?$item['pattern']:$item['url'];
            $item2['active']=$this->isActive($pattern,$controller);
            $items[]=$item2;
        }
        $this->render('mainMenu',array('items'=>$items));
    }

    protected function isActive($pattern,$controller) {
        if(!is_array($pattern) || !isset($pattern[0]))
            return false;
        $controllerID=$controller->uniqueID;
        $actionID=$controller->action->id;
        $currentID=0;    
        if (method_exists($controller, 'load'))
        {
            $model=$controller->load(null, true);
            if(isset($model)) $currentID=$model->id;
        }
        $pattern[0]=trim($pattern[0],'/');
        $matched=false;
        $fullurl=$controllerID.'/'.$actionID.'/id/'.$currentID;
        if(strpos($pattern[0],'/')!==false) {
            $matched=$pattern[0]===$controllerID.'/'.$actionID;
            if(!$matched) $matched=$pattern[0]===$fullurl;
        }
        else {
            $matched=$pattern[0]===$controllerID;
            if(!$matched) $matched=$pattern[0]===substr($controller->createUrl($fullurl), strlen(Yii::app()->getRequest()->getBaseUrl())+1);
        }

        if($matched && count($pattern)>1) {
            foreach(array_splice($pattern,1) as $name=>$value) {
                if(!isset($_GET[$name]) || $_GET[$name]!=$value)
                    return false;
            }
            return true;
        }
        else
            return $matched;
    }
} 
Для его работы в контроллере должна быть функция load примерно такого содержания:

Код: Выделить всё

public function load($id=null, $docheck=false) {
        if($this->_model===null) {
            if($id!==null || isset($_GET['id']))
                $this->_model=page::model()->findbyPk($id!==null ? $id : $_GET['id']);
            if($this->_model===null && !$docheck)
                throw new CHttpException(404,'The requested page does not exist.');
        }
        return $this->_model;
    } 
Так же предполагается, что используется формат ссылок "путь", index.php скрывается:

Код: Выделить всё

        'urlManager'=>array(
            'urlFormat'=>'path',
            'showScriptName'=>FALSE,
        ), 
Чуть позже выложу еще... или не надо? :)
Последний раз редактировалось Razunter 2009.08.11, 18:43, всего редактировалось 1 раз.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Сообщение samdark »

Выкладывай — пригодится.
Аватара пользователя
Razunter
Сообщения: 18
Зарегистрирован: 2009.07.04, 17:36
Контактная информация:

Re: Код от новичка

Сообщение Razunter »

Система управления синонимами (rules):
https://dl.getdropbox.com/u/103461/newUrlManager.7z

Не стал выкладывать сюда код, т.к. его много. В целом: создается отдельный подкласс urlManager и набор контроллер-модель-представление Path. В readme есть инструкция для привязки к своим моделям.
Аватара пользователя
Razunter
Сообщения: 18
Зарегистрирован: 2009.07.04, 17:36
Контактная информация:

Re: Код от новичка

Сообщение Razunter »

Виджет для загрузки аватаров с Gravatar

Код: Выделить всё

<?php 

class Gravatar extends CWidget {
    public $email='';
    public $default='';
    
    public function init() {
        $this->setEmail($this->email);
        $this->setDefault($this->default);
    }

    public function run() {
        echo $this->toHTML();
    }

    /**
     *    Gravatar's url
     */
    const GRAVATAR_URL = "http://www.gravatar.com/avatar.php";

    /**
     *    Ratings available
     */
    private $GRAVATAR_RATING = array("G", "PG", "R", "X");

    /**
     *    Query string. key/value
     */
    protected $properties = array(
    "gravatar_id"    => NULL,
    "default"        => NULL,
    "size"            => 32,        // The default value
    "rating"        => NULL,
    "border"        => NULL,
    );

    /**
     *    Extra attributes to the IMG tag like ALT, CLASS, STYLE...
     */
    protected $extra = "";

    /**
     *
     *
     */
    public function setEmail($email) {
        $this->email = $email;
        $this->properties['gravatar_id'] = md5(strtolower($this->email));
        return true;
    }

    /**
     *
     */
    public function setDefault($default) {
        $this->properties['default'] = $default;
    }

    /**
     *
     */
    public function setRating($rating) {
        if (in_array($rating, $this->GRAVATAR_RATING)) {
            $this->properties['rating'] = $rating;
            return true;
        }
        return false;
    }

    /**
     *
     */
    public function setSize($size) {
        $size = (int) $size;
        if ($size <= 0)
            $size = NULL;        // Use the default size
        $this->properties['size'] = $size;
    }

    /**
     *
     */
    public function setExtra($extra) {
        $this->extra = $extra;
    }

    /**
     *    Get source
     */
    public function getSrc() {
        $url = self::GRAVATAR_URL ."?";
        $first = true;
        foreach($this->properties as $key => $value) {
            if (isset($value)) {
                if (!$first)
                    $url .= "&";
                $url .= $key."=".urlencode($value);
                $first = false;
            }
        }
        return $url;
    }

    /**
     *    toHTML
     */
    public function toHTML() {
        return     '<img src="'. $this->getSrc() .'"'
            .(!isset($this->size) ? "" : ' width="'.$this->size.'" height="'.$this->size.'"')
            .$this->extra
            .' />';
    }

    /**
     *    toString
     */
    public function __toString() { return $this->toHTML(); }
} 

?>
Вызывается просто:

Код: Выделить всё

<?php $this->widget('Gravatar', array('email'=>$comment->email)); ?>
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Код от новичка

Сообщение porcelanosa »

Razunter писал(а):Система управления синонимами (rules):
https://dl.getdropbox.com/u/103461/newUrlManager.7z

Не стал выкладывать сюда код, т.к. его много. В целом: создается отдельный подкласс urlManager и набор контроллер-модель-представление Path. В readme есть инструкция для привязки к своим моделям.
Архив не доступен - можете выложить еще - куда нибудь
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
Razunter
Сообщения: 18
Зарегистрирован: 2009.07.04, 17:36
Контактная информация:

Re: Код от новичка

Сообщение Razunter »

porcelanosa писал(а):Архив не доступен - можете выложить еще - куда нибудь
У меня он не сохранился и я не помню уже, что там было. Но нашел файл newurlmanager.php:

Код: Выделить всё

<?php

class NewUrlManager extends CUrlManager
{
     private $_urlFormat=self::GET_FORMAT;
    private $_rules=array();
    private $_baseUrl;

        public function init()
    {
        parent::init();
                $paths=path::model()->findAll();
                foreach ($paths as $path)
                {
                    $this->rules[$path->target]=$path->source;
                }
        $this->processRules();
    }

    protected function createUrlDefault($route,$params,$ampersand)
    {
        if($this->getUrlFormat()===self::PATH_FORMAT)
        {
            $url=rtrim($route,'/');
            if($this->appendParams)
            {
                $url.='/'.$this->createPathInfo($params,'/','/');
                                // START Razunter's code
                                $path=path::model()->findByAttributes(array('source'=>$url));
                                if (isset($path)) $url=$path->target;
                                // END Razunter's code
                                $url=$this->getBaseUrl().'/'.$url;
                return rtrim($url,'/').$this->urlSuffix;
            }
            else
            {
                $query=$this->createPathInfo($params,'=',$ampersand);
                return $query==='' ? $url : $url.'?'.$query;
            }
        }
        else
        {
            $url=$this->getBaseUrl();
            if(!$this->showScriptName)
                $url.='/';
            if($route!=='')
            {
                $url.='?'.$this->routeVar.'='.$route;
                if(($query=$this->createPathInfo($params,'=',$ampersand))!=='')
                    $url.=$ampersand.$query;
            }
            else if(($query=$this->createPathInfo($params,'=',$ampersand))!=='')
                $url.='?'.$query;
            return $url;
        }
    }
}
 
Ответить