Yii копилка советов

Просто набор советов, чтобы подглядеть

1.Создайте абстрактный класс и от него наследуйте свои модели. При новой генерации код не будет потерян

\protected\components\PgActiveRecord.php

<?php
/**
 * Class PgActiveRecord
 * 
 * Базовый класс ActiveRecord для таблиц, хранящихся в PostgreSQL
 * Вычисляет идентификаторы сущностей после сохранения
 */
class PgActiveRecord extends CActiveRecord
{
    protected $_sequence = null;

    public function sequence()
    {
        return $this->_sequence;
    }

    protected function afterSave()
    {
        // если основной ключ не составной
        // и основной ключ ещё не определён
        // и в этом классе указана последовательность для вычисления основного ключа
        if (!is_array($this->primaryKey) && is_null($this->primaryKey) && $this->sequence())
        {
            // вычислить название компоненты для коннекта к базе данных
            $dbComponent = 'db';
            $tableName = $this->tableName();
            if (false!==strpos($tableName, '.'))
            {
                list($dbComponent, ) = explode('.', $tableName);
            }
            // извлечь последнее значение последовательности
            $this->primaryKey = Yii::app()->getComponent($dbComponent)->getLastInsertID($this->sequence());
        }
        return parent::afterSave();
    }
}

2. Используйте повторяющийся код
\protected\modules\admin\models\Department.php

    public static function recursDep($id)
    {
        $criteria = new CDbCriteria;
        /*Рекурсивно выбираем потомков*/
        $connection = Yii::app()->db;
        $sql = "
            WITH RECURSIVE temp1 ( id,id_parent,name,PATH, LEVEL, myname , type, hidden) AS (
            SELECT T1.id,T1.id_parent, T1.name, CAST (T1.id AS VARCHAR (50)) as PATH, 1 ,
            CAST (T1.name AS VARCHAR (255)) as myname, t1.type as type, t1.hidden as hidden
            FROM vgok_site.t_department T1 WHERE T1.id = $id  and t1.hidden = 0
            union
            select T2.id, T2.id_parent, T2.name, CAST ( temp1.PATH ||'->'|| T2.id AS VARCHAR(50)) ,LEVEL + 1 ,
            CAST ((repeat(' _ ', LEVEL+1)||T2.name) AS VARCHAR(255)), t2.type, t2.hidden
            FROM vgok_site.t_department T2 INNER JOIN temp1 ON( temp1.id= T2.id_parent and t2.hidden = 0))
            select * from temp1
            ORDER BY PATH desc LIMIT 100
            ";
        $dataReader = $connection->createCommand($sql)->query();
        $rows = $dataReader->readAll();
        for($i = 0, $cnt = count($rows); $i < $cnt; $i++) //формируем столбцы
        {
            if ($rows[$i]['id'] != $id)
                $opts[$rows[$i]['id']] = $rows[$i]['name'];
        }
        return $opts;
    }
\protected\modules\analiz\views\recalculation\admin.php


        array(
            'name' => 'level_id',
            'type' => 'raw',
            'value' => '($data->level_id) ? $data->lvl->name : ""',
            'class' => 'bootstrap.widgets.TbEditableColumn',
            'headerHtmlOptions' => array('style' => 'text-align:center'),
            'editable' => array(
                'type' => 'select',
                'url' => $this->createUrl('editable'),
                'source' => Department::recursDep(5), 
                'params' => array('YII_CSRF_TOKEN' => Yii::app()->request->csrfToken),
            )
        ),
3. Можно изменить шаблон для отображения страницы без шапки и футера
\views\layouts\myrender.php

<?php $this->beginContent('//layouts/mymain'); ?>
 
    <div class="span-23">
        <div id="content">
            <?php echo $content; ?>
        </div><!-- content -->
    </div>

<?php $this->endContent(); ?>

4. Простой селект одного элемента

                          $max = Yii::app()->db->createCommand()
                                ->select('max(id) as max')
                                ->from('a_analiz_create')
                                ->queryScalar();
Нескольких элементов

        $znS = Yii::app()->db->createCommand()
                ->select('*')
                ->from('vgok_site.a_constant')
                ->where("level_id = $id")
                ->queryAll();
 

5. Ajax button

<div class="form-actions">

    <?php
    $this->widget('bootstrap.widgets.TbButton', array(
        'buttonType' => 'button',
        'icon' => 'fa fa-print',
        'type' => 'primary',
        'label' => 'Экспорт',
        'id' => 'btn',
        'htmlOptions' => array('onclick' => 'send();', 'disabled' => 'disabled'),
    ));
    ?>
</div>
<?php $this->endWidget(); ?>
<script type="text/javascript">
    function send()
    {
        var data = $("#plan-form").serialize();

        $.ajax({
            type: 'POST',
            url: '<?php echo Yii::app()->createAbsoluteUrl("product/tagData/req"); ?>',
            data: data,
            success: function (data) {
                $('#excel').html(data);
                // alert(data); 
            },
            error: function (data) { // if error occured
                alert("Error occured.please try again");
                alert(data);
            },
            dataType: 'html'
        });
    }
</script>

6.Получение $_GET

Yii::app()->request->getQuery('template')

7. Последний id по sequence

$id_analiz = Yii::app()->getComponent('db')->getLastInsertID('a_analiz_create_id_seq1');

Популярные сообщения из этого блога

Учебник yii2

Авторизация yii 2 из базы

Пишем логи на C# (.NET). Легкий способ.