/** * Создает DataProvider на основе переданных данных * @param $params - параметры * @return ActiveDataProvider */ public function search($params) { $this->scenario = 'search'; // Устанавливаем сценарий поиска $query = Document::find(); $dataProvider = new ActiveDataProvider(['query' => $query, 'pagination' => ['pageSize' => $this::COUNT], 'sort' => array('defaultOrder' => ['created_at' => SORT_DESC])]); $this->load($params); // Если валидация не пройдена, то ничего не выводить if (!$this->validate()) { $query->where('0=1'); return $dataProvider; } // Фильтрация $query->andFilterWhere(['id' => $this->id, 'position' => $this->position, 'status' => $this->status, 'is_folder' => $this->is_folder, 'parent_id' => $this->parent_id, 'template_id' => $this->template_id, 'updated_at' => $this->updated_at, 'created_by' => $this->created_by, 'updated_by' => $this->updated_by]); if ($this->created_at) { $date = new \DateTime($this->created_at); $this->created_at = $date->format('Y-m-d'); } $query->andFilterWhere(['like', 'name', $this->name])->andFilterWhere(['like', 'alias', $this->alias])->andFilterWhere(['like', 'title', $this->title])->andFilterWhere(['like', 'meta_keywords', $this->meta_keywords])->andFilterWhere(['like', 'meta_description', $this->meta_description])->andFilterWhere(['like', 'annotation', $this->annotation])->andFilterWhere(['like', 'content', $this->content])->andFilterWhere(['like', 'image', $this->image])->andFilterWhere(['like', 'created_at', $this->created_at]); if ($this->id_from) { $query->andFilterWhere(['>=', 'id', $this->id_from]); } if ($this->id_till) { $query->andFilterWhere(['<=', 'id', $this->id_till]); } if ($this->position_from) { $query->andFilterWhere(['>=', 'position', $this->position_from]); } if ($this->position_till) { $query->andFilterWhere(['<=', 'position', $this->position_till]); } if ($this->created_at_from) { $date_from = new \DateTime($this->created_at_from); $query->andFilterWhere(['>=', 'created_at', $date_from->format('Y-m-d')]); } if ($this->created_at_till) { $date_till = new \DateTime($this->created_at_till); $query->andFilterWhere(['<=', 'created_at', $date_till->format('Y-m-d')]); } if ($this->updated_at_from) { $date_from = new \DateTime($this->updated_at_from); $query->andFilterWhere(['>=', 'updated_at', $date_from->format('Y-m-d')]); } if ($this->updated_at_till) { $date_till = new \DateTime($this->updated_at_till); $query->andFilterWhere(['<=', 'updated_at', $date_till->format('Y-m-d')]); } return $dataProvider; }
<div class="col-lg-6"> <?php echo $form->field($model, 'alias', ['addon' => ['append' => ['content' => ButtonDropdown::widget(['label' => 'Сформировать', 'dropdown' => ['items' => [['label' => Yii::t('document', 'Из названия'), 'url' => '#', 'options' => ['class' => 'translate-name']], ['label' => Yii::t('document', 'Из заголовка'), 'url' => '#', 'options' => ['class' => 'translate-title']]]], 'options' => ['class' => 'btn-default']]), 'asButton' => true], 'groupOptions' => ['id' => 'alias-btn']]]); ?> </div> <div class="col-lg-6"> <?php echo $form->field($model, 'status')->dropDownList(Document::getStatusArray()); ?> </div> </div> <div class="row"> <div class="col-lg-6"> <?php echo $form->field($model, 'parent_id')->widget(Select2::classname(), ['data' => Document::getAll(), 'options' => ['placeholder' => '', 'class' => 'parent_id'], 'pluginOptions' => ['allowClear' => true]]); ?> </div> <div class="col-lg-6"> <?php echo $form->field($model, 'template_id')->widget(Select2::classname(), ['data' => Template::getAll(), 'options' => ['placeholder' => '', 'class' => 'template_id'], 'pluginOptions' => ['allowClear' => true]]); ?> </div> </div> <div class="row"> <div class="col-lg-6"> <?php echo $form->field($model, 'meta_keywords')->textarea(['rows' => 2]); ?> </div>
<?php /** * @package yii2-document * @author Yuri Shekhovtsov <*****@*****.**> * @copyright Copyright © Yuri Shekhovtsov, lowbase.ru, 2015 - 2016 * @version 1.0.0 */ use lowbase\document\components\TreeWidget; use lowbase\document\models\Document; use yii\bootstrap\Modal; /* @var $this yii\web\View */ /* @var $model app\modules\document\models\DocumentSearch */ /* @var $form yii\widgets\ActiveForm */ Modal::begin(['header' => '<h1 class="text-center">' . Yii::t('document', 'Дерево документов') . '</h1>', 'toggleButton' => false, 'id' => 'tree', 'options' => ['tabindex' => false]]); ?> <div class="lb-document-module-tree"> <?php echo TreeWidget::widget(['data' => Document::find()->orderBy(['position' => SORT_ASC])->all()]); ?> </div> <?php Modal::end();
/** * Пометка или снятие документа как папки * @param $id - ID документа * @param bool $child_delete - дочерние документы удаляются? * @return bool */ public static function folder($id, $child_delete = false) { $model = Document::findOne($id); $db = self::getDb(); // Помечаем документ как папку если имеются дочерние документы if ($model && $model->children && !$model->is_folder) { $db->createCommand()->update('lb_document', ['is_folder' => 1], ['id' => $model->id])->execute(); } // Помечаем папку как документ если нет дочерних документов или // имеется один дочерний докуемнт, который будет удален if ($model && !$model->children && $model->is_folder || $model && count($model->children) === 1 && $model->is_folder && $child_delete) { $db->createCommand()->update('lb_document', ['is_folder' => 0], ['id' => $model->id])->execute(); } }
/** * Добавление значения мультиполя */ public function actionField() { $document_id = Yii::$app->request->post('document_id'); $model = $document_id ? Document::findOne($document_id) : new Document(); $field_id = Yii::$app->request->post('field_id'); $field = Field::findOne($field_id); if (!$field) { return false; } $data_id = Yii::$app->request->post('data_id'); $data_id = 'new_multi_' . $data_id; // 0 перед id нового поля свидетельствует о добавлении мультизначения $data = ['value' => '', 'position' => '']; return $this->renderAjax('@vendor/lowbase/yii2-document/views/document/_field', ['model' => $model, 'field' => $field, 'field_id' => $field_id, 'data' => $data, 'data_id' => $data_id]); }
/** * Документ * @return \yii\db\ActiveQuery */ public function getDocument() { return $this->hasOne(Document::className(), ['id' => 'document_id']); }
/** * Документы с текущим шаблоном * @return \yii\db\ActiveQuery */ public function getDocuments() { return $this->hasMany(Document::className(), ['template_id' => 'id']); }
DocumentAsset::register($this); ?> <div class="document-view"> <div class="row"> <div class="col-lg-12"> <h1><?php echo Html::encode($this->title); ?> </h1> </div> </div> <p> <?php echo Html::a('<i class="glyphicon glyphicon-pencil"></i> ' . Yii::t('document', 'Редактировать'), ['update', 'id' => $model->id], ['class' => 'btn btn-primary']); ?> <?php echo Html::a('<i class="glyphicon glyphicon-trash"></i> ' . Yii::t('document', 'Удалить'), ['delete', 'id' => $model->id], ['class' => 'btn btn-danger', 'data' => ['confirm' => Yii::t('document', 'Вы уверены, что хотите удалить документ?'), 'method' => 'post']]); ?> <?php echo Html::a('<i class="glyphicon glyphicon-menu-left"></i> ' . Yii::t('document', 'Отмена'), ['index'], ['class' => 'btn btn-default']); ?> </p> <?php echo DetailView::widget(['model' => $model, 'attributes' => ['id', 'name', 'alias', 'title', 'meta_keywords:ntext', 'meta_description:ntext', 'annotation:ntext', 'content:ntext', ['attribute' => 'image', 'format' => 'raw', 'value' => $model->image ? '<img src="' . $model->image . '" class="thumbnail lb-document-module-thumb">' : null], ['attribute' => 'status', 'value' => Document::getStatusArray()[$model->status]], ['attribute' => 'is_folder', 'value' => $model->is_folder ? Yii::t('document', 'Да') : Yii::t('document', 'Нет')], ['attribute' => 'parent_id', 'format' => 'raw', 'value' => $model->parent_id && $model->parent ? Html::a($model->parent->name, ['document/view', 'id' => $model->parent_id]) : null], ['attribute' => 'template_id', 'format' => 'raw', 'value' => $model->template_id && $model->template ? Html::a($model->template->name, ['template/view', 'id' => $model->template_id]) : null], ['attribute' => 'created_at', 'format' => ['date', 'dd.MM.Y HH:mm:ss']], ['attribute' => 'updated_at', 'format' => ['date', 'dd.MM.Y HH:mm:ss']], 'position', ['attribute' => 'created_by', 'format' => 'raw', 'value' => isset($model->created) ? Html::a($model->created->first_name . " " . $model->created->last_name, ['/admin-user/user/view', 'id' => $model->created_by]) : $model->created_by], 'updated_by', ['attribute' => Yii::t('document', 'Просмотры'), 'format' => 'raw', 'value' => $views], ['attribute' => Yii::t('document', 'Лайки'), 'format' => 'raw', 'value' => $likes]]]); ?> </div>
switch ($model->status) { case Document::STATUS_BLOCKED: return '<span class="label label-danger"> <i class="glyphicon glyphicon-lock"></i> ' . Document::getStatusArray()[Document::STATUS_BLOCKED] . '</span>'; break; case Document::STATUS_WAIT: return '<span class="label label-warning"> <i class="glyphicon glyphicon-hourglass"></i> ' . Document::getStatusArray()[Document::STATUS_WAIT] . '</span>'; break; case Document::STATUS_ACTIVE: return '<span class="label label-success"> <i class="glyphicon glyphicon-ok"></i> ' . Document::getStatusArray()[Document::STATUS_ACTIVE] . '</span>'; break; } return false; }, 'filter' => Document::getStatusArray()], ['template' => '{view} {update} {delete}', 'class' => 'kartik\\grid\\ActionColumn'], ['class' => 'kartik\\grid\\CheckboxColumn', 'headerOptions' => ['class' => 'kartik-sheet-style']]]; echo GridView::widget(['layout' => "{items}\n{summary}\n{pager}", 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => $gridColumns, 'containerOptions' => ['style' => 'overflow: auto'], 'headerRowOptions' => ['class' => 'kartik-sheet-style'], 'filterRowOptions' => ['class' => 'kartik-sheet-style'], 'pjax' => false, 'panel' => ['heading' => '<i class="glyphicon glyphicon-book"></i> ' . Yii::t('document', Yii::t('document', 'Документы')), 'type' => GridView::TYPE_PRIMARY, 'before' => Html::a('<span class="glyphicon glyphicon-plus"></span> ' . Yii::t('document', 'Добавить'), ['document/create'], ['class' => 'btn btn-success']) . ' ' . Html::button('<span class="glyphicon glyphicon-search"></span> ' . Yii::t('document', 'Поиск'), ['class' => 'filter btn btn-default', 'data-toggle' => 'modal', 'data-target' => '#filter']) . ' ' . Html::button('<span class="glyphicon glyphicon-tree-deciduous"></span> ' . Yii::t('document', 'Дерево'), ['class' => 'filter btn btn-default', 'data-toggle' => 'modal', 'data-target' => '#tree']), 'after' => "<div class='text-right'><b>" . Yii::t('document', 'Выбранные') . ":</b> " . Html::button('<span class="glyphicon glyphicon-eye-open"></span> ' . Yii::t('document', 'Опубликовать'), ['class' => 'btn btn-default open-all']) . " " . Html::button('<span class="glyphicon glyphicon-eye-close"></span> ' . Yii::t('document', 'Скрыть'), ['class' => 'btn btn-default close-all']) . " " . Html::button('<span class="glyphicon glyphicon-trash"></span> ' . Yii::t('document', 'Удалить'), ['class' => 'btn btn-danger delete-all']) . "</div>"], 'export' => ['fontAwesome' => true], 'bordered' => true, 'striped' => true, 'condensed' => true, 'persistResize' => false, 'hover' => true, 'responsive' => true]); ?> </div> <?php $this->registerJs(' $(".delete-all").click(function(){ var keys = $(".grid-view").yiiGridView("getSelectedRows"); $.ajax({ url: "' . Url::to(['document/multidelete']) . '", type:"POST", data:{keys: keys}, success: function(data){ location.reload(); }
// Строка case 9: // Регулярное выражение echo Html::activeInput('text', $model, $attr_value, ['class' => 'form-control', 'id' => $attr_id]); break; case 3: // Флажок echo Html::activeCheckbox($model, $attr_value, ['class' => 'form-control', 'id' => $attr_id, 'label' => null]); break; case 5: // Текст echo Html::activeTextarea($model, $attr_value, ['class' => 'form-control', 'id' => $attr_id]); break; case 6: // Список (дочерние документы echo Select2::widget(['model' => $model, 'attribute' => $attr_value, 'data' => Document::getAll($field['param']), 'options' => ['id' => $attr_id, 'placeholder' => ''], 'pluginOptions' => ['allowClear' => true, 'class' => 'form-control', 'id' => $attr_id]]); break; case 8: // Файл (выбор с сервера) echo InputFile::widget(['controller' => 'elfinder', 'template' => '<div class="input-group">{input}<span class="input-group-btn">{button}</span></div>', 'options' => ['class' => 'form-control', 'id' => $attr_id], 'buttonOptions' => ['class' => 'btn btn-default'], 'buttonName' => Yii::t('document', 'Выбрать файл'), 'multiple' => false, 'name' => 'Document[fields][' . $field_id . '][data][' . $data_id . '][value]', 'value' => isset($model->fields[$field_id]['data'][$data_id]['value']) ? $model->fields[$field_id]['data'][$data_id]['value'] : null]); break; case 7: // Дата echo DatePicker::widget(['model' => $model, 'attribute' => $attr_value, 'options' => ['id' => $attr_id, 'placeholder' => ''], 'pluginOptions' => ['format' => 'dd.mm.yyyy', 'class' => 'form-control', 'id' => $attr_id]]); break; } } ?> </div> <div class="help-block"> <?php