meta теги

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Alex007
Сообщения: 3
Зарегистрирован: 2012.04.23, 07:31

meta теги

Сообщение Alex007 »

Здравствуйте. Не подскажете как решить проблему с выводом мета тегов из БД.
Мета теги сохраняются в базе данных в соответствующих полях 'meta_k' и 'meta_d' выводятся через свойства модели на страницу, в head Layouts/main.php нет.
Контроллер SiteController содержит следующий код:

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

<?php

class SiteController extends Controller
{
    /**
     * Declares class-based actions.
     */
    
    public function actions()
    {
        return array(
            // captcha action renders the CAPTCHA image displayed on the contact page
            'captcha'=>array(
                'class'=>'CCaptchaAction',
                'backColor'=>0x1F476C,
                'foreColor' => 0xffffff,
            ),
            // page action renders "static" pages stored under 'protected/views/site/pages'
            // They can be accessed via: index.php?r=site/page&view=FileName
            'page'=>array(
                'class'=>'CViewAction',
            ),
        );
    }

    /**
     * This is the default 'index' action that is invoked
     * when an action is not explicitly requested by users.
     */
    public function actionIndex()
    {
        // renders the view file 'protected/views/site/index.php'
        // using the default layout 'protected/views/layouts/main.php'
        $model = $this->loadModel();
        
        $this->render('index',array('meta_k'=>CHtml::encode($model->meta_k),'meta_d'=>CHtml::encode($model->meta_d)));
    }

    /**
     * This is the action to handle external exceptions.
     */
    public function actionError()
    {
        if($error=Yii::app()->errorHandler->error)
        {
            if(Yii::app()->request->isAjaxRequest)
                echo $error['message'];
            else
                $this->render('error', $error);
        }
    }

    /**
     * Displays the contact page
     */
    public function actionOnline()
    {
        $model=new OnlineForm;

        if(isset($_POST['OnlineForm']))
        {
            $model->attributes=$_POST['OnlineForm'];
            if($model->validate())
            {
                //$headers="From: ".Yii::app()->params['contactEmail']."\r\nReply-To: ".Yii::app()->params['contactEmail'];
                //$mail = mail(Yii::app()->params['contactEmail'],'Онлайн заявка',$model->name."\n".$model->product."\n".$model->contact,$headers);
                $html  = 'ФИО: '.CHtml::encode($model->name);
                $html .= 'Наименование товара: '.CHtml::encode($model->product);
                $html .= 'Контактная информация: '.CHtml::encode($model->contact);
                $mail = $this->sendEmail(Yii::app()->params['contactEmail'], Yii::app()->params['contactEmail'],'Онлайн заявка',$html);


                if($mail === true){
                    Yii::app()->user->setFlash('contact','Спасибо, Ваша заявка успешно отправлена.');
                    $this->refresh();
                }
            }
        }
        $this->render('online',array('model'=>$model));
    }

    /**
     * Displays the login page
     */
    public function actionLogin()
    {
        $model=new LoginForm;

        // if it is ajax validation request
        if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }

        // collect user input data
        if(isset($_POST['LoginForm']))
        {
            $model->attributes=$_POST['LoginForm'];
            // validate user input and redirect to the previous page if valid
            if($model->validate() && $model->login())
                $this->redirect(Yii::app()->user->returnUrl);
        }
        // display the login form
        $this->render('login',array('model'=>$model));
    }

    /**
     * Logs out the current user and redirect to homepage.
     */
    public function actionLogout()
    {
        Yii::app()->user->logout();
        $this->redirect(Yii::app()->homeUrl);
    }
    /**
     * Returns the data model based on the primary key given in the GET variable.
     * If the data model is not found, an HTTP exception will be raised.
     * @param integer the ID of the model to be loaded
     */
    public function loadModel()
    {
       if(isset($_GET['id'])) {
           $criteria=new CDbCriteria;
           $criteria->select = 'meta_k';
           $criteria->select = 'meta_d';
           $criteria->condition = 'id=:id';
           $criteria->params = array(':id'=>$_GET['id']);
           $model=Categories::model()->find($criteria);
           return $model;
       }else{
           if($model===null)
            throw new CHttpException(404,'The requested page does not exist.');
       }
        
        
        
    }
} 
и вот соответствующий код вида:

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="keywords" content="<?=$meta_k;?>" />
    <meta name="description" content="<?=$model->meta_d;?>" />
    <link rel="stylesheet" type="text/css" href="/css/all.css" media="all" />
    <link rel="stylesheet" type="text/css" href="/css/form.css" media="all" />
    <script type="text/javascript" src="/js/jquery-1.4.2.min.js"></script>
    <script type="text/javascript" src="/js/main.js"></script>

    <title><?php echo CHtml::encode($this->pageTitle); ?></title>
</head>
Собственно вопрос пробую выводить переменные $meta_k и $model->meta_d не выводятся переменные ни как свойство у модели ни как локальная переменная заданная в контроллере. Не подскажете что я делаю не так.
scsiman
Сообщения: 8
Зарегистрирован: 2012.04.05, 07:53

Re: meta теги

Сообщение scsiman »

Может, попробовать CClientScript::registerMetaTag()?
Если не устраивает стандартное поведение, можно переопределить метод CClientScript::renderHead() и делать как заблагорассудится.
Alex007
Сообщения: 3
Зарегистрирован: 2012.04.23, 07:31

Re: meta теги

Сообщение Alex007 »

Спасибо, но нельзя ли небольшой примерчик с правильной реализацией, делаю следующее в контроллере

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

public function actionIndex()
    {
        // renders the view file 'protected/views/site/index.php'
        // using the default layout 'protected/views/layouts/main.php'
        $model = $this->loadModel();
        
        $this->render('index',array('model'=>$model));
    }
 
в лайоуте:

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

    <title><?php echo CHtml::encode($this->pageTitle); ?></title>
    <?=CHtml::metaTag($model->meta_d,'Keywords');?>
    <?=CHtml::metaTag($model->meta_d,'description');?>
</head>
мета теги выводятся но контента в них нет, я так понимаю не подгружается модель? Или не передаются параметры?
Извините нуба))
scsiman
Сообщения: 8
Зарегистрирован: 2012.04.05, 07:53

Re: meta теги

Сообщение scsiman »

В общем случае просто передать переменную в layout не получится (здесь была соответствующая тема). Но никто не мешает вызывать CClientScript::registerMetaTag() во view (в вашем случае в /protected/views/site/index.php).

То же самое в случае, если вам необходимо подключить какой-либо свой CSS или javascript. Вызывайте в нужном представлении CClientScript::registerCSSFile() или CClientScript::registerScriptFile(), фреймворк сам пропишет что надо куда надо.
Аватара пользователя
Ryadnov
Сообщения: 456
Зарегистрирован: 2010.06.20, 00:38
Откуда: Санкт-Петербург

Re: meta теги

Сообщение Ryadnov »

опоздал, но не стирать же....

посмотрите как происходит render http://code.google.com/p/yii/source/bro ... er.php#779
сначала рендерится ваш protected/views/site/index.php, в который передаются данные array('model'=>$model) и результат рендера вставляется в основной шаблон через $content
Поэтому основной шаблон protected/views/layouts/main.php ничего не знает о тех данных, которые вы передали во вьюху protected/views/site/index.php

в начале файла protected/views/site/index.php

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

<?
$cs = Yii::app()->getClientScript();
$cs->registerMetaTag($model->meta_d,'Keywords');
$cs->registerMetaTag($model->meta_k,'description');
?>
Alex007
Сообщения: 3
Зарегистрирован: 2012.04.23, 07:31

Re: meta теги

Сообщение Alex007 »

Спасибо!!! Разобрался все работает :)
emelyaart
Сообщения: 2
Зарегистрирован: 2013.02.04, 10:24

Re: meta теги

Сообщение emelyaart »

Всем доброго времени суток!:) Дабы не плодить темы вопрос такой:

Код контроллера:

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

    public function actionIndex()
    {
        $criteria = new CDbCriteria(array(
            'condition' => 'category_id = 1',
            'order' => 'sort ASC',
        ));

        $dataProvider=new CActiveDataProvider('Post', array(
            'pagination' => array(
                'pageSize' => 5,
            ),
            'criteria'=>$criteria,
        ));
        
        
        
        $this->render('index',array(
            'dataProvider'=>$dataProvider, 
            

        ));
    } 
Код вьюшки:

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

<?php
    $cs = Yii::app()->getClientScript();
    $cs->registerMetaTag($model->meta_d,'Keywords');
    $cs->registerMetaTag($model->meta_k,'description');
?>

<?php
/* @var $this SiteController */
/* @var $dataProvider CActiveDataProvider */
/* @var $criteria CDbCriteria */
$this->pageTitle=Yii::app()->name;
?>

<?php $this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view',
    'template'=>"{pager}\n{items}\n{pager}",
    'pager' => array (),
)); ?>
Мета теги появляются, но они пустые(( Пытался передать $model вместе с dataProvider страничка рушится((( Не подскажете как и где исправить чтобы мета теги нормально отображались...
Аватара пользователя
greatdane
Сообщения: 408
Зарегистрирован: 2010.10.20, 14:05
Откуда: Электросталь
Контактная информация:

Re: meta теги

Сообщение greatdane »

Я вообще делаю проще — по аналогии с pageTitle. Объявляю в Controller (в том контроллере, от которого наследуются все остальные контроллеры — в сгенерированном приложении это components.controller) две переменные с дефолтными значениями:

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

public $pageKeywords = 'список дефолтных ключевых слов';
public $pageDescription = 'Дефолтное описание'; 
В layout'e вставляю обычные мета-тэги:

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

<meta name="description" content="<?php echo CHtml::encode($this->pageDescription); ?>">
    <meta name="keywords" content="<?php echo CHtml::encode($this->pageKeywords); ?>">
А достаю из моделей и переопределяю переменные уже в действиях контроллеров:

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

$this->pageDescription = $model->description;
$this->pageKeywords = $model->keywords;
$this->pageTitle = $model->title;
 
При таком подходе у страницы мета-тэги есть всегда, даже если я забуду их переопределить — будут дефолтные, максимальные, подходящие в общем-то к большинству страниц сайта.
emelyaart
Сообщения: 2
Зарегистрирован: 2013.02.04, 10:24

Re: meta теги

Сообщение emelyaart »

Блин, не успел ответить)
Вообщем решил проблему вставив:

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

<?php
    $cs = Yii::app()->getClientScript();
    $cs->registerMetaTag($model->meta_k,'Keywords');
    $cs->registerMetaTag($model->meta_d,'description');
?>
в _view.php

Ваше решение вообще открыло глаза)) Буду пробовать реализовать Ваше предложение:) Спасибо огромное!:)
AxMuha
Сообщения: 5
Зарегистрирован: 2013.09.30, 09:00

Re: meta теги

Сообщение AxMuha »

Спасибо! Действительно удобно. Сделал так же... :P
greatdane писал(а):Я вообще делаю проще — по аналогии с pageTitle. Объявляю в Controller (в том контроллере, от которого наследуются все остальные контроллеры — в сгенерированном приложении это components.controller) две переменные с дефолтными значениями:

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

public $pageKeywords = 'список дефолтных ключевых слов';
public $pageDescription = 'Дефолтное описание';
В layout'e вставляю обычные мета-тэги:

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

<meta name="description" content="<?php echo CHtml::encode($this->pageDescription); ?>">
    <meta name="keywords" content="<?php echo CHtml::encode($this->pageKeywords); ?>">
А достаю из моделей и переопределяю переменные уже в действиях контроллеров:

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

$this->pageDescription = $model->description;
$this->pageKeywords = $model->keywords;
$this->pageTitle = $model->title;
При таком подходе у страницы мета-тэги есть всегда, даже если я забуду их переопределить — будут дефолтные, максимальные, подходящие в общем-то к большинству страниц сайта.
Ответить