Commit 3735dff7ee125b66a7cacbcc27a8343e1125c292
1 parent
e75f77a6
test
Showing
20 changed files
with
1212 additions
and
336 deletions
Show diff stats
common/config/bootstrap.php
1 | <?php | 1 | <?php |
2 | -Yii::setAlias('common', dirname(__DIR__)); | ||
3 | -Yii::setAlias('frontend', dirname(dirname(__DIR__)) . '/frontend'); | ||
4 | -Yii::setAlias('backend', dirname(dirname(__DIR__)) . '/backend'); | ||
5 | -Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console'); | ||
6 | -Yii::setAlias('saveImageDir', '@frontend/web/images/upload/'); | ||
7 | -Yii::setAlias('storage', dirname(dirname(__DIR__)) . '/storage'); | 2 | + Yii::setAlias('common', dirname(__DIR__)); |
3 | + Yii::setAlias('frontend', dirname(dirname(__DIR__)) . '/frontend'); | ||
4 | + Yii::setAlias('backend', dirname(dirname(__DIR__)) . '/backend'); | ||
5 | + Yii::setAlias('console', dirname(dirname(__DIR__)) . '/console'); | ||
6 | + Yii::setAlias('saveImageDir', '@frontend/web/images/upload/'); | ||
7 | + Yii::setAlias('storage', dirname(dirname(__DIR__)) . '/storage'); | ||
8 | + Yii::setAlias('documentRoot', dirname(dirname(__DIR__))); |
common/config/main.php
1 | <?php | 1 | <?php |
2 | 2 | ||
3 | + use common\modules\fileloader\controllers\FileloaderController; | ||
4 | + | ||
3 | return [ | 5 | return [ |
4 | 'timeZone' => 'Europe/Kiev', | 6 | 'timeZone' => 'Europe/Kiev', |
5 | 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', | 7 | 'vendorPath' => dirname(dirname(__DIR__)) . '/vendor', |
@@ -28,6 +30,9 @@ | @@ -28,6 +30,9 @@ | ||
28 | 'artbox-comment' => [ | 30 | 'artbox-comment' => [ |
29 | 'class' => \common\modules\comment\Controller::className(), | 31 | 'class' => \common\modules\comment\Controller::className(), |
30 | ], | 32 | ], |
33 | + 'fileloader' => [ | ||
34 | + 'class' => FileloaderController::className(), | ||
35 | + ], | ||
31 | ], | 36 | ], |
32 | 37 | ||
33 | 'modules' => [ | 38 | 'modules' => [ |
common/models/Project.php
@@ -3,9 +3,12 @@ | @@ -3,9 +3,12 @@ | ||
3 | namespace common\models; | 3 | namespace common\models; |
4 | 4 | ||
5 | use common\modules\comment\models\CommentProject; | 5 | use common\modules\comment\models\CommentProject; |
6 | + use common\modules\fileloader\behaviors\FileloaderBehavior; | ||
7 | + use common\modules\fileloader\models\Fileloader; | ||
6 | use Yii; | 8 | use Yii; |
7 | use yii\behaviors\BlameableBehavior; | 9 | use yii\behaviors\BlameableBehavior; |
8 | use yii\behaviors\TimestampBehavior; | 10 | use yii\behaviors\TimestampBehavior; |
11 | + use yii\db\ActiveQuery; | ||
9 | use yii\db\Expression; | 12 | use yii\db\Expression; |
10 | 13 | ||
11 | /** | 14 | /** |
@@ -33,6 +36,8 @@ | @@ -33,6 +36,8 @@ | ||
33 | * @property Currency $budgetCurrency | 36 | * @property Currency $budgetCurrency |
34 | * @property Project $parent | 37 | * @property Project $parent |
35 | * @property int $hidden | 38 | * @property int $hidden |
39 | + * @property int[] $fileloader | ||
40 | + * @method File[] getFileloaderFiles() | ||
36 | */ | 41 | */ |
37 | class Project extends \yii\db\ActiveRecord | 42 | class Project extends \yii\db\ActiveRecord |
38 | { | 43 | { |
@@ -64,12 +69,15 @@ | @@ -64,12 +69,15 @@ | ||
64 | 'updatedAtAttribute' => false, | 69 | 'updatedAtAttribute' => false, |
65 | 'value' => new Expression('NOW()'), | 70 | 'value' => new Expression('NOW()'), |
66 | ], | 71 | ], |
67 | - 'slug' => [ | 72 | + 'slug' => [ |
68 | 'class' => 'common\behaviors\Slug', | 73 | 'class' => 'common\behaviors\Slug', |
69 | 'in_attribute' => 'name', | 74 | 'in_attribute' => 'name', |
70 | 'out_attribute' => 'link', | 75 | 'out_attribute' => 'link', |
71 | 'translit' => true, | 76 | 'translit' => true, |
72 | ], | 77 | ], |
78 | + 'fileloader' => [ | ||
79 | + 'class' => FileloaderBehavior::className(), | ||
80 | + ], | ||
73 | ]; | 81 | ]; |
74 | } | 82 | } |
75 | 83 | ||
@@ -154,21 +162,21 @@ | @@ -154,21 +162,21 @@ | ||
154 | 'boolean', | 162 | 'boolean', |
155 | ], | 163 | ], |
156 | [ | 164 | [ |
157 | - ['hidden'], | 165 | + [ 'hidden' ], |
158 | 'default', | 166 | 'default', |
159 | 'value' => 0, | 167 | 'value' => 0, |
160 | ], | 168 | ], |
161 | [ | 169 | [ |
162 | - ['date_end'], | 170 | + [ 'date_end' ], |
163 | 'filter', | 171 | 'filter', |
164 | 'filter' => function($value) { | 172 | 'filter' => function($value) { |
165 | $unix = strtotime($value); | 173 | $unix = strtotime($value); |
166 | if($unix <= time()) { | 174 | if($unix <= time()) { |
167 | - $unix = time() + (3600 * 24 * 7); | 175 | + $unix = time() + ( 3600 * 24 * 7 ); |
168 | } | 176 | } |
169 | return date('Y-m-d', $unix); | 177 | return date('Y-m-d', $unix); |
170 | - } | ||
171 | - ] | 178 | + }, |
179 | + ], | ||
172 | ]; | 180 | ]; |
173 | } | 181 | } |
174 | 182 | ||
@@ -332,4 +340,5 @@ | @@ -332,4 +340,5 @@ | ||
332 | return $this->hasMany(CommentProject::className(), [ 'model_id' => 'project_id' ]) | 340 | return $this->hasMany(CommentProject::className(), [ 'model_id' => 'project_id' ]) |
333 | ->andWhere([ 'model' => $this->className() ]); | 341 | ->andWhere([ 'model' => $this->className() ]); |
334 | } | 342 | } |
343 | + | ||
335 | } | 344 | } |
1 | +<?php | ||
2 | + namespace common\modules\fileloader; | ||
3 | + | ||
4 | + /** | ||
5 | + * Class Module | ||
6 | + * @package common\modules\comment | ||
7 | + */ | ||
8 | + class Module extends \yii\base\Module | ||
9 | + { | ||
10 | + | ||
11 | + /** | ||
12 | + * @var string Module name | ||
13 | + */ | ||
14 | + public static $moduleName = 'artbox_fileloader'; | ||
15 | + | ||
16 | + /** | ||
17 | + * @inheritdoc | ||
18 | + */ | ||
19 | + public function init() | ||
20 | + { | ||
21 | + parent::init(); | ||
22 | + } | ||
23 | + } | ||
0 | \ No newline at end of file | 24 | \ No newline at end of file |
common/modules/fileloader/assets/FileloaderAsset.php
0 → 100644
1 | +<?php | ||
2 | + namespace common\modules\fileloader\assets; | ||
3 | + | ||
4 | + use yii\web\View; | ||
5 | + | ||
6 | + class FileloaderAsset extends \yii\web\AssetBundle | ||
7 | + { | ||
8 | + | ||
9 | + public $sourcePath = '@common/modules/fileloader/resources'; | ||
10 | + | ||
11 | + public $css = [ | ||
12 | + 'fileloader.css', | ||
13 | + ]; | ||
14 | + | ||
15 | + public $js = [ | ||
16 | + 'jquery.ui.widget.js', | ||
17 | + 'jquery.fileupload.js', | ||
18 | + 'jquery.iframe-transport.js', | ||
19 | + 'handler.js', | ||
20 | + ]; | ||
21 | + | ||
22 | + public $depends = [ | ||
23 | + '\yii\web\YiiAsset', | ||
24 | + '\yii\web\JqueryAsset', | ||
25 | + '\yii\bootstrap\BootstrapAsset', | ||
26 | + ]; | ||
27 | + | ||
28 | + public $jsOptions = [ | ||
29 | + 'position' => View::POS_HEAD, | ||
30 | + ]; | ||
31 | + | ||
32 | + } | ||
0 | \ No newline at end of file | 33 | \ No newline at end of file |
common/modules/fileloader/behaviors/FileloaderBehavior.php
0 → 100644
1 | +<?php | ||
2 | + namespace common\modules\fileloader\behaviors; | ||
3 | + | ||
4 | + use yii\base\Behavior; | ||
5 | + use yii\base\Event; | ||
6 | + use yii\db\ActiveQuery; | ||
7 | + use yii\db\ActiveRecord; | ||
8 | + use yii\validators\Validator; | ||
9 | + | ||
10 | + /** | ||
11 | + * Class FileloaderBehavior | ||
12 | + * @package common\modules\fileloader\behaviors | ||
13 | + */ | ||
14 | + class FileloaderBehavior extends Behavior | ||
15 | + { | ||
16 | + | ||
17 | + /** | ||
18 | + * @var string $fileclass Classname that hande files | ||
19 | + */ | ||
20 | + public $fileclass = 'common\models\File'; | ||
21 | + | ||
22 | + /** | ||
23 | + * @var string $relationtable Table name that keeps relation between model and file | ||
24 | + */ | ||
25 | + public $relationclass = 'common\modules\fileloader\models\FileRelation'; | ||
26 | + | ||
27 | + /** | ||
28 | + * @var int[] Files ids to insert | ||
29 | + */ | ||
30 | + public $fileloader = [ ]; | ||
31 | + | ||
32 | + /** | ||
33 | + * @inheritdoc | ||
34 | + */ | ||
35 | + public function events() | ||
36 | + { | ||
37 | + return [ | ||
38 | + ActiveRecord::EVENT_AFTER_INSERT => 'afterSave', | ||
39 | + ActiveRecord::EVENT_AFTER_UPDATE => 'afterSave', | ||
40 | + ActiveRecord::EVENT_INIT => 'attachValidator', | ||
41 | + ]; | ||
42 | + } | ||
43 | + | ||
44 | + public function attachValidator($event) | ||
45 | + { | ||
46 | + $validator = Validator::createValidator('safe', $this->owner, 'fileloader'); | ||
47 | + $this->owner->validators->append($validator); | ||
48 | + } | ||
49 | + | ||
50 | + /** | ||
51 | + * After saving model delete all relative files and insert new file connections from | ||
52 | + * fileloader variable | ||
53 | + * | ||
54 | + * @param Event $event | ||
55 | + */ | ||
56 | + public function afterSave($event) | ||
57 | + { | ||
58 | + /** | ||
59 | + * @var ActiveRecord $owner | ||
60 | + * @var string $relation | ||
61 | + */ | ||
62 | + $owner = $this->owner; | ||
63 | + $relation = $this->relationclass; | ||
64 | + call_user_func([ | ||
65 | + $relation, | ||
66 | + 'deleteAll', | ||
67 | + ], [ | ||
68 | + 'model' => $owner->className(), | ||
69 | + 'model_id' => $owner->primaryKey, | ||
70 | + ]); | ||
71 | + if(!empty( $owner->fileloader )) { | ||
72 | + foreach($owner->fileloader as $file) { | ||
73 | + /** | ||
74 | + * @var ActiveRecord $model | ||
75 | + */ | ||
76 | + $model = new $relation([ | ||
77 | + 'file_id' => $file, | ||
78 | + 'model' => $owner->className(), | ||
79 | + 'model_id' => $owner->primaryKey, | ||
80 | + 'user_id' => \Yii::$app->user->getId(), | ||
81 | + 'status' => 1, | ||
82 | + ]); | ||
83 | + if($model->validate()) { | ||
84 | + $model->save(false); | ||
85 | + } | ||
86 | + unset( $model ); | ||
87 | + } | ||
88 | + } | ||
89 | + } | ||
90 | + | ||
91 | + /** | ||
92 | + * Bind owner class tp specified $fileclass via $relationclass table. | ||
93 | + * @return ActiveQuery | ||
94 | + */ | ||
95 | + public function getFileloaderFiles() | ||
96 | + { | ||
97 | + /** | ||
98 | + * @var ActiveRecord $owner | ||
99 | + */ | ||
100 | + $owner = $this->owner; | ||
101 | + $relationtable = call_user_func([ | ||
102 | + $this->relationclass, | ||
103 | + 'tableName', | ||
104 | + ]); | ||
105 | + return $owner->hasMany($this->fileclass, [ 'file_id' => 'file_id' ]) | ||
106 | + ->viaTable($relationtable, [ 'model_id' => $owner->primaryKey()[ 0 ] ], function($query) use ($owner) { | ||
107 | + /** | ||
108 | + * @var ActiveQuery $query | ||
109 | + */ | ||
110 | + $query->andWhere([ | ||
111 | + 'model' => $owner->className(), | ||
112 | + 'status' => 1, | ||
113 | + ]); | ||
114 | + }); | ||
115 | + } | ||
116 | + } | ||
0 | \ No newline at end of file | 117 | \ No newline at end of file |
common/modules/fileloader/controllers/FileloaderController.php
0 → 100644
1 | +<?php | ||
2 | + namespace common\modules\fileloader\controllers; | ||
3 | + | ||
4 | + use common\modules\fileloader\models\Fileloader; | ||
5 | + use yii\filters\AccessControl; | ||
6 | + use yii\helpers\Html; | ||
7 | + use yii\web\UploadedFile; | ||
8 | + | ||
9 | + class FileloaderController extends \yii\web\Controller | ||
10 | + { | ||
11 | + | ||
12 | + /** | ||
13 | + * @inheritdoc | ||
14 | + */ | ||
15 | + public function behaviors() | ||
16 | + { | ||
17 | + return [ | ||
18 | + 'access' => [ | ||
19 | + 'class' => AccessControl::className(), | ||
20 | + 'rules' => [ | ||
21 | + [ | ||
22 | + 'allow' => true, | ||
23 | + 'roles' => [ '@' ], | ||
24 | + ], | ||
25 | + ], | ||
26 | + ], | ||
27 | + 'verbs' => [ | ||
28 | + 'class' => \yii\filters\VerbFilter::className(), | ||
29 | + 'actions' => [ | ||
30 | + '*' => [ 'post' ], | ||
31 | + ], | ||
32 | + ], | ||
33 | + ]; | ||
34 | + } | ||
35 | + | ||
36 | + /** | ||
37 | + * Handle ajax file uploading | ||
38 | + * | ||
39 | + * @return array | ||
40 | + */ | ||
41 | + public function actionUpload() | ||
42 | + { | ||
43 | + $request = \Yii::$app->request; | ||
44 | + $response = \Yii::$app->response; | ||
45 | + $response->format = $response::FORMAT_JSON; | ||
46 | + $model = new Fileloader(); | ||
47 | + $model->files = UploadedFile::getInstance($model, 'files'); | ||
48 | + if(!empty( $model->files )) { | ||
49 | + $file_id = $model->saveFile($model->files); | ||
50 | + if(!empty( $file_id )) { | ||
51 | + $child_model = $request->post('model', $model->className()); | ||
52 | + $child_model = new $child_model([ 'file' => $file_id ]); | ||
53 | + $input = Html::activeHiddenInput($child_model, 'fileloader[]', [ | ||
54 | + 'value' => $file_id, | ||
55 | + 'class' => 'fileloader-item-input', | ||
56 | + ]); | ||
57 | + return [ | ||
58 | + 'result' => [ | ||
59 | + 'file_id' => $file_id, | ||
60 | + 'file_name' => $model->name, | ||
61 | + 'file_href' => $model->dir, | ||
62 | + 'input' => $input, | ||
63 | + 'id' => $request->post('id'), | ||
64 | + ], | ||
65 | + ]; | ||
66 | + } else { | ||
67 | + return [ 'error' => 'Ошибка сохранения файла' ]; | ||
68 | + } | ||
69 | + } | ||
70 | + return [ 'error' => 'Ошибка загрузки' ]; | ||
71 | + } | ||
72 | + | ||
73 | + /** | ||
74 | + * Handle ajax file deleting | ||
75 | + * | ||
76 | + * @return array | ||
77 | + */ | ||
78 | + public function actionDelete() | ||
79 | + { | ||
80 | + /** | ||
81 | + * @var Fileloader $model | ||
82 | + */ | ||
83 | + $request = \Yii::$app->request; | ||
84 | + $response = \Yii::$app->response; | ||
85 | + $response->format = $response::FORMAT_JSON; | ||
86 | + if(empty( $request->post('id') )) { | ||
87 | + return [ 'error' => 'Не указан id файла' ]; | ||
88 | + } | ||
89 | + $model = Fileloader::find() | ||
90 | + ->where([ | ||
91 | + 'file_id' => $request->post('id'), | ||
92 | + 'user_id' => \Yii::$app->user->getId(), | ||
93 | + ]) | ||
94 | + ->one(); | ||
95 | + if(empty( $model )) { | ||
96 | + return [ 'error' => 'Файл не найден' ]; | ||
97 | + } | ||
98 | + if($model->delete()) { | ||
99 | + return [ 'result' => [ 'message' => 'Файл успешно удален' ] ]; | ||
100 | + } else { | ||
101 | + return [ 'error' => 'Ошибка удаления файла' ]; | ||
102 | + } | ||
103 | + } | ||
104 | + | ||
105 | + } | ||
0 | \ No newline at end of file | 106 | \ No newline at end of file |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\modules\fileloader\models; | ||
4 | + | ||
5 | +use common\models\File; | ||
6 | +use common\models\User; | ||
7 | +use Yii; | ||
8 | + | ||
9 | +/** | ||
10 | + * This is the model class for table "file_relation". | ||
11 | + * | ||
12 | + * @property integer $file_relation_id | ||
13 | + * @property integer $file_id | ||
14 | + * @property string $model | ||
15 | + * @property integer $model_id | ||
16 | + * @property integer $user_id | ||
17 | + * @property string $date_add | ||
18 | + * @property integer $status | ||
19 | + * | ||
20 | + * @property File $file | ||
21 | + * @property User $user | ||
22 | + */ | ||
23 | +class FileRelation extends \yii\db\ActiveRecord | ||
24 | +{ | ||
25 | + /** | ||
26 | + * @inheritdoc | ||
27 | + */ | ||
28 | + public static function tableName() | ||
29 | + { | ||
30 | + return 'file_relation'; | ||
31 | + } | ||
32 | + | ||
33 | + /** | ||
34 | + * @inheritdoc | ||
35 | + */ | ||
36 | + public function rules() | ||
37 | + { | ||
38 | + return [ | ||
39 | + [['file_id', 'model', 'model_id'], 'required'], | ||
40 | + [['file_id', 'model_id', 'user_id', 'status'], 'integer'], | ||
41 | + [['date_add'], 'safe'], | ||
42 | + [['model'], 'string', 'max' => 255], | ||
43 | + [['file_id'], 'exist', 'skipOnError' => true, 'targetClass' => File::className(), 'targetAttribute' => ['file_id' => 'file_id']], | ||
44 | + [['user_id'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['user_id' => 'id']], | ||
45 | + ]; | ||
46 | + } | ||
47 | + | ||
48 | + /** | ||
49 | + * @inheritdoc | ||
50 | + */ | ||
51 | + public function attributeLabels() | ||
52 | + { | ||
53 | + return [ | ||
54 | + 'file_relation_id' => Yii::t('app', 'File Relation ID'), | ||
55 | + 'file_id' => Yii::t('app', 'File ID'), | ||
56 | + 'model' => Yii::t('app', 'Model'), | ||
57 | + 'model_id' => Yii::t('app', 'Model ID'), | ||
58 | + 'user_id' => Yii::t('app', 'User ID'), | ||
59 | + 'date_add' => Yii::t('app', 'Date Add'), | ||
60 | + 'status' => Yii::t('app', 'Status'), | ||
61 | + ]; | ||
62 | + } | ||
63 | + | ||
64 | + /** | ||
65 | + * @return \yii\db\ActiveQuery | ||
66 | + */ | ||
67 | + public function getFile() | ||
68 | + { | ||
69 | + return $this->hasOne(File::className(), ['file_id' => 'file_id']); | ||
70 | + } | ||
71 | + | ||
72 | + /** | ||
73 | + * @return \yii\db\ActiveQuery | ||
74 | + */ | ||
75 | + public function getUser() | ||
76 | + { | ||
77 | + return $this->hasOne(User::className(), ['id' => 'user_id']); | ||
78 | + } | ||
79 | +} |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\modules\fileloader\models; | ||
4 | + | ||
5 | +use common\models\Tools; | ||
6 | +use Yii; | ||
7 | +use yii\behaviors\BlameableBehavior; | ||
8 | +use yii\web\UploadedFile; | ||
9 | + | ||
10 | +/** | ||
11 | + * This is the model class for table "file". | ||
12 | + * | ||
13 | + * @property integer $file_id | ||
14 | + * @property integer $status | ||
15 | + * @property string $name | ||
16 | + * @property string $dir | ||
17 | + */ | ||
18 | +class Fileloader extends \yii\db\ActiveRecord | ||
19 | +{ | ||
20 | + public $files; | ||
21 | + /** | ||
22 | + * @inheritdoc | ||
23 | + */ | ||
24 | + public static function tableName() | ||
25 | + { | ||
26 | + return 'file'; | ||
27 | + } | ||
28 | + | ||
29 | + /** | ||
30 | + * @inheritdoc | ||
31 | + */ | ||
32 | + public function behaviors() | ||
33 | + { | ||
34 | + return [ | ||
35 | + [ | ||
36 | + 'class' => BlameableBehavior::className(), | ||
37 | + 'createdByAttribute' => 'user_id', | ||
38 | + 'updatedByAttribute' => false, | ||
39 | + ], | ||
40 | + ]; | ||
41 | + } | ||
42 | + | ||
43 | + /** | ||
44 | + * @inheritdoc | ||
45 | + */ | ||
46 | + public function rules() | ||
47 | + { | ||
48 | + return [ | ||
49 | + [['status'], 'integer'], | ||
50 | + [['name'], 'string', 'max' => 50], | ||
51 | + [['dir'], 'string', 'max' => 255], | ||
52 | + ]; | ||
53 | + } | ||
54 | + | ||
55 | + /** | ||
56 | + * @inheritdoc | ||
57 | + */ | ||
58 | + public function attributeLabels() | ||
59 | + { | ||
60 | + return [ | ||
61 | + 'file_id' => 'File ID', | ||
62 | + 'status' => 'Status', | ||
63 | + 'name' => 'Name', | ||
64 | + 'dir' => 'Dir', | ||
65 | + ]; | ||
66 | + } | ||
67 | + | ||
68 | + /** | ||
69 | + * @param UploadedFile $file | ||
70 | + * @return int file id in model File | ||
71 | + */ | ||
72 | + public function saveFile(UploadedFile $file){ | ||
73 | + $imgDir = Yii::getAlias('@storage/'.'user_'.\Yii::$app->user->id.'/files/'); | ||
74 | + $uploadName = preg_replace('/\s/', '_', $file->baseName).'_'. time().'.'.$file->extension; | ||
75 | + $uploadName = Tools::translit($uploadName, 'letter'); | ||
76 | + if(!is_dir($imgDir)) { | ||
77 | + mkdir($imgDir, 0755, true); | ||
78 | + } | ||
79 | + if($file->saveAs($imgDir.$uploadName)){ | ||
80 | + $this->dir = '/storage/user_'.\Yii::$app->user->id.'/files/'.$uploadName; | ||
81 | + $this->name = preg_replace('/\s/', '_', $file->baseName).'.'.$file->extension; | ||
82 | + $this->save(); | ||
83 | + return $this->file_id; | ||
84 | + } | ||
85 | + } | ||
86 | + | ||
87 | + /** | ||
88 | + * Extends ActiveRecord::delete() method, also deletes file from file system | ||
89 | + * | ||
90 | + * @see ActiveRecord::delete() | ||
91 | + * @return false|int | ||
92 | + * @throws \Exception | ||
93 | + */ | ||
94 | + public function delete() | ||
95 | + { | ||
96 | + if(!empty($this->dir)) { | ||
97 | + if(file_exists(Yii::getAlias('@documentRoot').$this->dir)) { | ||
98 | + unlink(Yii::getAlias('@documentRoot').$this->dir); | ||
99 | + } | ||
100 | + } | ||
101 | + return parent::delete(); | ||
102 | + } | ||
103 | +} |
1 | +.fileloader-item-name { | ||
2 | + display: inline-block; | ||
3 | +} | ||
4 | +.fileloader-item-name a { | ||
5 | + text-decoration: none; | ||
6 | + border-bottom: dotted 1px; | ||
7 | +} | ||
8 | +.fileloader-item-name a:hover, .fileloader-item-name a:focus { | ||
9 | + text-decoration: none; | ||
10 | +} | ||
11 | +.fileloader-item-remove { | ||
12 | + padding-left: 10px; | ||
13 | + cursor: pointer; | ||
14 | +} | ||
15 | +.fileloader-file { | ||
16 | + position: relative; | ||
17 | +} | ||
0 | \ No newline at end of file | 18 | \ No newline at end of file |
1 | +$(function() { | ||
2 | + if(fileloader !== undefined) { | ||
3 | + $.each(fileloader, function(index, value) { | ||
4 | + var id = value.id; | ||
5 | + var model = value.model; | ||
6 | + var formData = {}; | ||
7 | + if(typeof model == 'string' && model !== '') { | ||
8 | + formData.model = model; | ||
9 | + } | ||
10 | + if(typeof id == 'string' && id !== '') { | ||
11 | + formData.id = id; | ||
12 | + $('#'+id).fileupload({ | ||
13 | + dataType: 'json', | ||
14 | + url: '/fileloader/upload', | ||
15 | + formData: formData, | ||
16 | + done: function(e, data) { | ||
17 | + if(!data.result.error) { | ||
18 | + var id = data.result.result.id; | ||
19 | + var input = $('#'+id); | ||
20 | + var wrapper = $(input).parents('.fileloader-wrapper').first(); | ||
21 | + var html = '<div class="fileloader-item-wrapper" data-id="'+data.result.result.file_id+'">'+ | ||
22 | + data.result.result.input + '<p class="fileloader-item-name">'+ | ||
23 | + '<a href="'+data.result.result.file_href+'" target="_blank">'+data.result.result.file_name+'</a></p>'+'<span class="fileloader-item-remove glyphicon glyphicon-remove"></span>'+ | ||
24 | + '</div>'; | ||
25 | + $(html).appendTo($(wrapper).find('.fileloader-list')); | ||
26 | + } | ||
27 | + } | ||
28 | + }); | ||
29 | + } | ||
30 | + }); | ||
31 | + } | ||
32 | + | ||
33 | + $(document).on('click', '.fileloader-item-remove', function(e) { | ||
34 | + var wrapper = $(this).parents('.fileloader-item-wrapper').first(); | ||
35 | + var id = $(wrapper).data('id'); | ||
36 | + $.post( | ||
37 | + '/fileloader/delete', | ||
38 | + { | ||
39 | + id: id | ||
40 | + }, | ||
41 | + function(data) {} | ||
42 | + ); | ||
43 | + $(wrapper).remove(); | ||
44 | + }); | ||
45 | +}); |
common/modules/fileloader/widgets/FileloaderWidget.php
0 → 100644
1 | +<?php | ||
2 | + namespace common\modules\fileloader\widgets; | ||
3 | + | ||
4 | + use common\modules\fileloader\assets\FileloaderAsset; | ||
5 | + use common\modules\fileloader\behaviors\FileloaderBehavior; | ||
6 | + use common\modules\fileloader\models\Fileloader; | ||
7 | + use yii\db\ActiveRecord; | ||
8 | + use yii\helpers\ArrayHelper; | ||
9 | + use \yii\helpers\Html; | ||
10 | + use yii\web\View; | ||
11 | + | ||
12 | + /** | ||
13 | + * Class FileloaderWidget | ||
14 | + * @package common\modules\fileloader\widgets | ||
15 | + */ | ||
16 | + class FileloaderWidget extends \yii\base\Widget | ||
17 | + { | ||
18 | + | ||
19 | + /** | ||
20 | + * @var array $labelOptions Label options. | ||
21 | + * <i>Special: 1. You cannot modify 'for' attribute</i> | ||
22 | + */ | ||
23 | + public $labelOptions = [ ]; | ||
24 | + | ||
25 | + /** | ||
26 | + * @var array $inputOptions Input options. | ||
27 | + * <i> | ||
28 | + * Special: | ||
29 | + * 1. You cannot modify 'id' attribute. | ||
30 | + * 2. Class will be appended by base input class | ||
31 | + * <i> | ||
32 | + */ | ||
33 | + public $inputOptions = [ ]; | ||
34 | + | ||
35 | + /** | ||
36 | + * @var array $hintOptions Hint options. | ||
37 | + * <i> | ||
38 | + * 1. tag will be used to generate container tag. Default to 'div' | ||
39 | + * 2. value will be used to generate content. If missing, component won't be rendered | ||
40 | + * </i> | ||
41 | + */ | ||
42 | + public $hintOptions = [ ]; | ||
43 | + | ||
44 | + /** | ||
45 | + * @var array $errorOptions Error options | ||
46 | + * <i> | ||
47 | + * 1. tag will be used to generate container tag. Default to 'div' | ||
48 | + * 2. class will be appended by base error class | ||
49 | + * </i> | ||
50 | + */ | ||
51 | + public $errorOptions = [ ]; | ||
52 | + | ||
53 | + /** | ||
54 | + * @var array $listOptions Items list options | ||
55 | + * <i> | ||
56 | + * 1. tag will be used to generate container tag. Default to 'div' | ||
57 | + * 2. class will be appended by base list class | ||
58 | + * </i> | ||
59 | + */ | ||
60 | + public $listOptions = [ ]; | ||
61 | + | ||
62 | + /** | ||
63 | + * @var array $options Container options | ||
64 | + * <i> | ||
65 | + * 1. tag will be used to generate container tag. Default to 'div' | ||
66 | + * 2. class will be appended by base wrapper class | ||
67 | + * </i> | ||
68 | + */ | ||
69 | + public $options = [ ]; | ||
70 | + | ||
71 | + /** | ||
72 | + * @var ActiveRecord $model Model where to insert files | ||
73 | + */ | ||
74 | + public $model; | ||
75 | + | ||
76 | + /** | ||
77 | + * @var string $attribute Model attribute | ||
78 | + */ | ||
79 | + public $attribute; | ||
80 | + | ||
81 | + /** | ||
82 | + * @var View $view Current view object | ||
83 | + */ | ||
84 | + public $view; | ||
85 | + | ||
86 | + /** | ||
87 | + * @var string $template Widget template. Recognised components: {label}, {input}, {hint}, | ||
88 | + * {error}, {list} | ||
89 | + */ | ||
90 | + public $template = '{label}{input}{hint}{error}{list}'; | ||
91 | + | ||
92 | + /** | ||
93 | + * @var bool $displayLabel Whether to display label component or not | ||
94 | + */ | ||
95 | + public $displayLabel = true; | ||
96 | + | ||
97 | + /** | ||
98 | + * @var bool $displayInput Whether to display input component or not | ||
99 | + */ | ||
100 | + public $displayInput = true; | ||
101 | + | ||
102 | + /** | ||
103 | + * @var bool $displayHint Whether to display hint component or not | ||
104 | + */ | ||
105 | + public $displayHint = true; | ||
106 | + | ||
107 | + /** | ||
108 | + * @var bool $displayError Whether to display error component or not | ||
109 | + */ | ||
110 | + public $displayError = true; | ||
111 | + | ||
112 | + /** | ||
113 | + * @var bool $displayList Whether to display list component or not | ||
114 | + */ | ||
115 | + public $displayList = true; | ||
116 | + | ||
117 | + protected $label = ''; | ||
118 | + | ||
119 | + protected $input = ''; | ||
120 | + | ||
121 | + protected $hint = ''; | ||
122 | + | ||
123 | + protected $error = ''; | ||
124 | + | ||
125 | + protected $list = ''; | ||
126 | + | ||
127 | + /** | ||
128 | + * @var string Unique widget ID | ||
129 | + */ | ||
130 | + protected $inputID; | ||
131 | + | ||
132 | + /** | ||
133 | + * @var Fileloader $fileloader Fileloader model | ||
134 | + */ | ||
135 | + protected $fileloader; | ||
136 | + | ||
137 | + protected $output = ''; | ||
138 | + | ||
139 | + /** | ||
140 | + * @var string $baseClass Will be added to input component | ||
141 | + */ | ||
142 | + protected $baseClass = ' fileloader-input'; | ||
143 | + | ||
144 | + /** | ||
145 | + * @var string $baseErrorClass Will be added to error container | ||
146 | + */ | ||
147 | + protected $baseErrorClass = ' fileloader-error'; | ||
148 | + | ||
149 | + /** | ||
150 | + * @var string $baseListClass Will be added to list container | ||
151 | + */ | ||
152 | + protected $baseListClass = ' fileloader-list'; | ||
153 | + | ||
154 | + /** | ||
155 | + * @var string $baseWrapperClass Will be added to Container | ||
156 | + */ | ||
157 | + protected $baseWrapperClass = ' fileloader-wrapper'; | ||
158 | + | ||
159 | + /** | ||
160 | + * @inheritdoc | ||
161 | + */ | ||
162 | + public function init() | ||
163 | + { | ||
164 | + parent::init(); | ||
165 | + FileloaderAsset::register($this->view); | ||
166 | + } | ||
167 | + | ||
168 | + /** | ||
169 | + * @inheritdoc | ||
170 | + * @return string | ||
171 | + */ | ||
172 | + public function run() | ||
173 | + { | ||
174 | + $this->fileloader = new Fileloader(); | ||
175 | + $this->inputID = 'fileloader-' . $this->getId(); | ||
176 | + $this->createParts(); | ||
177 | + $this->output = $this->renderLoader(); | ||
178 | + $this->renderJS(); | ||
179 | + return $this->output; | ||
180 | + } | ||
181 | + | ||
182 | + /** | ||
183 | + * Fills widget components with data | ||
184 | + */ | ||
185 | + public function createParts() | ||
186 | + { | ||
187 | + if(!empty( $this->displayLabel ) && preg_match('/^.*\{label\}.*$/i', $this->template)) { | ||
188 | + $this->labelOptions[ 'for' ] = $this->inputID; | ||
189 | + $this->label = Html::activeLabel($this->fileloader, 'files', $this->labelOptions); | ||
190 | + } | ||
191 | + if(!empty( $this->displayInput ) && preg_match('/^.*\{input\}.*$/i', $this->template)) { | ||
192 | + if(empty( $this->inputOptions[ 'class' ] )) { | ||
193 | + $this->inputOptions[ 'class' ] = $this->baseClass; | ||
194 | + } else { | ||
195 | + $this->inputOptions[ 'class' ] .= $this->baseClass; | ||
196 | + } | ||
197 | + $this->inputOptions[ 'id' ] = $this->inputID; | ||
198 | + $this->input = Html::activeFileInput($this->fileloader, 'files', $this->inputOptions); | ||
199 | + } | ||
200 | + if(!empty( $this->displayHint ) && preg_match('/^.*\{hint\}.*$/i', $this->template) && !empty( $this->hintOptions[ 'value' ] )) { | ||
201 | + $this->hint = Html::tag(ArrayHelper::remove($this->hintOptions, 'tag', 'div'), ArrayHelper::remove($this->hintOptions, 'value'), $this->hintOptions); | ||
202 | + } | ||
203 | + if(!empty( $this->displayError ) && preg_match('/^.*\{error\}.*$/i', $this->template)) { | ||
204 | + if(empty( $this->errorOptions[ 'class' ] )) { | ||
205 | + $this->errorOptions[ 'class' ] = $this->baseErrorClass; | ||
206 | + } else { | ||
207 | + $this->errorOptions[ 'class' ] .= $this->baseErrorClass; | ||
208 | + } | ||
209 | + $this->error = Html::tag(ArrayHelper::remove($this->errorOptions, 'tag', 'div'), '', $this->errorOptions); | ||
210 | + } | ||
211 | + if(!empty( $this->displayList ) && preg_match('/^.*\{list\}.*$/i', $this->template)) { | ||
212 | + if(empty( $this->listOptions[ 'class' ] )) { | ||
213 | + $this->listOptions[ 'class' ] = $this->baseListClass; | ||
214 | + } else { | ||
215 | + $this->listOptions[ 'class' ] .= $this->baseListClass; | ||
216 | + } | ||
217 | + $list = ''; | ||
218 | + $items = $this->getItems(); | ||
219 | + if(!empty( $items )) { | ||
220 | + foreach($items as $item) { | ||
221 | + $list .= '<div class="fileloader-item-wrapper" data-id="' . $item->file_id . '">' . Html::activeHiddenInput($this->model, 'fileloader[]', [ | ||
222 | + 'value' => $item->file_id, | ||
223 | + 'class' => 'fileloader-item-input', | ||
224 | + ]) . Html::tag('p', Html::a($item->name, $item->dir, [ 'target' => '_blank' ]), [ | ||
225 | + 'class' => 'fileloader-item-name', | ||
226 | + ]) . Html::tag('span', '', [ | ||
227 | + 'class' => 'fileloader-item-remove glyphicon glyphicon-remove', | ||
228 | + ]) . '</div>'; | ||
229 | + } | ||
230 | + } | ||
231 | + $this->list = Html::tag(ArrayHelper::remove($this->listOptions, 'tag', 'div'), $list, $this->listOptions); | ||
232 | + } | ||
233 | + } | ||
234 | + | ||
235 | + /** | ||
236 | + * Fills template with components | ||
237 | + * @return string | ||
238 | + */ | ||
239 | + public function renderLoader() | ||
240 | + { | ||
241 | + $template = $this->template; | ||
242 | + $template = preg_replace('/{label}/', $this->label, $template); | ||
243 | + $template = preg_replace('/{input}/', $this->input, $template); | ||
244 | + $template = preg_replace('/{hint}/', $this->hint, $template); | ||
245 | + $template = preg_replace('/{error}/', $this->error, $template); | ||
246 | + $template = preg_replace('/{list}/', $this->list, $template); | ||
247 | + if(empty( $this->options[ 'class' ] )) { | ||
248 | + $this->options[ 'class' ] = $this->baseWrapperClass; | ||
249 | + } else { | ||
250 | + $this->options[ 'class' ] .= $this->baseWrapperClass; | ||
251 | + } | ||
252 | + return Html::tag(ArrayHelper::remove($this->options, 'tag', 'div'), $template, $this->options); | ||
253 | + } | ||
254 | + | ||
255 | + /** | ||
256 | + * Get already set items | ||
257 | + * @return ActiveRecord[] | ||
258 | + */ | ||
259 | + public function getItems() | ||
260 | + { | ||
261 | + /** | ||
262 | + * @var ActiveRecord $model | ||
263 | + */ | ||
264 | + $model = $this->model; | ||
265 | + if($behavior = $model->getBehavior('fileloader')) { | ||
266 | + if($behavior instanceof FileloaderBehavior) { | ||
267 | + return $model->getFileloaderFiles() | ||
268 | + ->all(); | ||
269 | + } else { | ||
270 | + return [ ]; | ||
271 | + } | ||
272 | + } else { | ||
273 | + return [ ]; | ||
274 | + } | ||
275 | + } | ||
276 | + | ||
277 | + /** | ||
278 | + * Render JS for widget | ||
279 | + */ | ||
280 | + public function renderJS() | ||
281 | + { | ||
282 | + /** | ||
283 | + * @var View $view | ||
284 | + */ | ||
285 | + $view = $this->view; | ||
286 | + $vars = json_encode([ | ||
287 | + 'id' => $this->inputID, | ||
288 | + 'model' => $this->model->className(), | ||
289 | + ]); | ||
290 | + $js = "if(fileloader === undefined) { | ||
291 | + var fileloader = []; | ||
292 | + fileloader[0] = " . $vars . "; | ||
293 | + } else { | ||
294 | + fileloader[fileloader.length] = " . $vars . "; | ||
295 | + } | ||
296 | + "; | ||
297 | + $view->registerJs($js, $view::POS_BEGIN); | ||
298 | + } | ||
299 | + | ||
300 | + } | ||
0 | \ No newline at end of file | 301 | \ No newline at end of file |
console/migrations/m160325_153328_file_relation_table.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | + use yii\db\Migration; | ||
4 | + | ||
5 | + class m160325_153328_file_relation_table extends Migration | ||
6 | + { | ||
7 | + | ||
8 | + public function up() | ||
9 | + { | ||
10 | + $this->createTable('{{%file_relation}}', [ | ||
11 | + 'file_relation_id' => $this->primaryKey(), | ||
12 | + 'file_id' => $this->integer() | ||
13 | + ->notNull(), | ||
14 | + 'model' => $this->string() | ||
15 | + ->notNull(), | ||
16 | + 'model_id' => $this->integer() | ||
17 | + ->notNull(), | ||
18 | + 'user_id' => $this->integer(), | ||
19 | + 'date_add' => $this->timestamp() | ||
20 | + ->notNull() | ||
21 | + ->defaultExpression('NOW()'), | ||
22 | + 'status' => $this->smallInteger() | ||
23 | + ->defaultValue(1), | ||
24 | + ]); | ||
25 | + $this->addForeignKey('file_relation_file', '{{%file_relation}}', 'file_id', '{{%file}}', 'file_id', 'CASCADE', 'CASCADE'); | ||
26 | + $this->addForeignKey('file_relation_user', '{{%file_relation}}', 'user_id', '{{%user}}', 'id', 'SET NULL', 'CASCADE'); | ||
27 | + } | ||
28 | + | ||
29 | + public function down() | ||
30 | + { | ||
31 | + $this->dropForeignKey('file_relation_file', '{{%file_relation}}'); | ||
32 | + $this->dropForeignKey('file_relation_user', '{{%file_relation}}'); | ||
33 | + $this->dropTable('{{%file_relation}}'); | ||
34 | + } | ||
35 | + } |
console/migrations/m160329_085324_file_add_user.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +use yii\db\Migration; | ||
4 | + | ||
5 | +class m160329_085324_file_add_user extends Migration | ||
6 | +{ | ||
7 | + public function up() | ||
8 | + { | ||
9 | + $this->addColumn('{{%file}}', 'user_id', $this->integer()); | ||
10 | + $this->addForeignKey('file_user', '{{%file}}', 'user_id', '{{%user}}', 'id', 'SET DEFAULT', 'CASCADE'); | ||
11 | + } | ||
12 | + | ||
13 | + public function down() | ||
14 | + { | ||
15 | + $this->dropForeignKey('file_user', '{{%file}}'); | ||
16 | + $this->dropColumn('{{%file}}', 'user_id'); | ||
17 | + } | ||
18 | +} |
frontend/controllers/SiteController.php
@@ -4,6 +4,7 @@ namespace frontend\controllers; | @@ -4,6 +4,7 @@ namespace frontend\controllers; | ||
4 | use common\models\Cities; | 4 | use common\models\Cities; |
5 | use common\models\CompanyInfo; | 5 | use common\models\CompanyInfo; |
6 | use common\models\Country; | 6 | use common\models\Country; |
7 | +use common\models\Project; | ||
7 | use common\models\Specialization; | 8 | use common\models\Specialization; |
8 | use common\models\UserInfo; | 9 | use common\models\UserInfo; |
9 | use Faker\Provider\is_IS\Company; | 10 | use Faker\Provider\is_IS\Company; |
frontend/views/accounts/_projects_form.php
@@ -7,10 +7,12 @@ | @@ -7,10 +7,12 @@ | ||
7 | */ | 7 | */ |
8 | use common\components\Request; | 8 | use common\components\Request; |
9 | use common\models\Currency; | 9 | use common\models\Currency; |
10 | + use common\models\File; | ||
10 | use common\models\Payment; | 11 | use common\models\Payment; |
11 | use common\models\Project; | 12 | use common\models\Project; |
12 | use common\models\Specialization; | 13 | use common\models\Specialization; |
13 | use common\modules\file\widgets\ImageUploader; | 14 | use common\modules\file\widgets\ImageUploader; |
15 | + use common\modules\fileloader\widgets\FileloaderWidget; | ||
14 | use kartik\select2\Select2; | 16 | use kartik\select2\Select2; |
15 | use mihaildev\ckeditor\CKEditor; | 17 | use mihaildev\ckeditor\CKEditor; |
16 | use yii\helpers\Html; | 18 | use yii\helpers\Html; |
@@ -24,7 +26,7 @@ | @@ -24,7 +26,7 @@ | ||
24 | <div class="login-left-column-title"><?= $this->title ?></div> | 26 | <div class="login-left-column-title"><?= $this->title ?></div> |
25 | 27 | ||
26 | <?php | 28 | <?php |
27 | - $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); | 29 | + $form = ActiveForm::begin([ 'options' => [ 'enctype' => 'multipart/form-data' ] ]); |
28 | ?> | 30 | ?> |
29 | 31 | ||
30 | 32 | ||
@@ -212,43 +214,55 @@ | @@ -212,43 +214,55 @@ | ||
212 | </div> | 214 | </div> |
213 | 215 | ||
214 | <?php | 216 | <?php |
215 | -/* == Здесь епты == */ | ||
216 | -?> | ||
217 | -<div class="tender-file-wr"> | ||
218 | - <?= $form->field($project, 'files[]') | ||
219 | - ->fileInput([ 'class' => 'multi', 'multiple' => 'multiple' ]) | ||
220 | - ->label(false) ?> | ||
221 | - <a href="#" class="addfilemulti">Прикрепить файл</a> | ||
222 | - <div class="max-size">Максимальный размер<br/>файла 5 МБ</div> | ||
223 | -</div> | ||
224 | -<?php | ||
225 | -/* == .i. Конец епты .i. == */ | ||
226 | -?> | ||
227 | - | ||
228 | -<div class="input-blocks-wrapper admin-project-file"> | ||
229 | - <div class="input-blocks"> | ||
230 | - <div style="position: absolute; float: left;top: 0; left: 0; z-index: 1; width: 100%; overflow: hidden"> | ||
231 | - <div class="gen-admin-title">Присоединить файл</div> | ||
232 | - <div class="admin-project-file-btn">Загрузить</div> | ||
233 | - <div class="not-file-mb-adm">До 3 Мб файл</div> | ||
234 | - </div> | ||
235 | - <div style="opacity: 0; height: 54px; width: 100%; float: left;position: absolute; top: 0;left: 0; z-index: 2;-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)'"> | ||
236 | - <?= $form->field($project, 'files[]') | ||
237 | - ->fileInput([ 'multiple' => 'multiple' ]) ?> | 217 | + /* == Old file upload == |
218 | + ?> | ||
219 | + <div class="input-blocks-wrapper admin-project-file"> | ||
220 | + <div class="input-blocks"> | ||
221 | + <div style="position: absolute; float: left;top: 0; left: 0; z-index: 1; width: 100%; overflow: hidden"> | ||
222 | + <div class="gen-admin-title">Присоединить файл</div> | ||
223 | + <div class="admin-project-file-btn">Загрузить</div> | ||
224 | + <div class="not-file-mb-adm">До 3 Мб файл</div> | ||
225 | + </div> | ||
226 | + <div style="opacity: 0; height: 54px; width: 100%; float: left;position: absolute; top: 0;left: 0; z-index: 2;-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=0)'"> | ||
227 | + <?= $form->field($project, 'files[]') | ||
228 | + ->fileInput([ 'multiple' => 'multiple' ]) ?> | ||
229 | + </div> | ||
238 | </div> | 230 | </div> |
239 | - | ||
240 | </div> | 231 | </div> |
232 | + <?php | ||
233 | + == End of old file upload == */ | ||
234 | +?> | ||
235 | + | ||
236 | +<div class="input-blocks-wrapper"> | ||
237 | + <?php | ||
238 | + echo $form->field($project, 'fileloader') | ||
239 | + ->label(false) | ||
240 | + ->widget(FileloaderWidget::className(), [ | ||
241 | + 'labelOptions' => [ 'label' => '<div class="gen-admin-title">Присоединить файлы</div><div class="admin-project-file-btn">Загрузить</div><div class="not-file-mb-adm">До 3 Мб файл</div>' ], | ||
242 | + 'inputOptions' => [ | ||
243 | + 'multiple' => 'multiple', | ||
244 | + 'class' => 'hidden', | ||
245 | + ], | ||
246 | + 'options' => [ 'class' => 'fileloader-file' ], | ||
247 | + ]); | ||
248 | + ?> | ||
241 | </div> | 249 | </div> |
242 | 250 | ||
243 | <div class="input-blocks-wrapper"> | 251 | <div class="input-blocks-wrapper"> |
244 | <div class="input-blocks admin-project-list admin-currency-second"> | 252 | <div class="input-blocks admin-project-list admin-currency-second"> |
245 | - <?= $form->field($project, 'date_end')->widget(DatePicker::className(), ['dateFormat' => 'yyyy-MM-dd', 'clientOptions' => ['minDate' => 1]]) ?> | 253 | + <?= $form->field($project, 'date_end') |
254 | + ->widget(DatePicker::className(), [ | ||
255 | + 'dateFormat' => 'yyyy-MM-dd', | ||
256 | + 'clientOptions' => [ 'minDate' => 1 ], | ||
257 | + ]) ?> | ||
246 | </div> | 258 | </div> |
247 | </div> | 259 | </div> |
248 | 260 | ||
249 | <div class="input-blocks-wrapper"> | 261 | <div class="input-blocks-wrapper"> |
250 | <div class="input-blocks admin-project-list admin-currency-second"> | 262 | <div class="input-blocks admin-project-list admin-currency-second"> |
251 | - <?= $form->field($project, 'hidden')->checkbox()->hint('Проект, снятый с тендера, будет добавлен в Архив (не доступен в поиске, но доступен по ссылке)') ?> | 263 | + <?= $form->field($project, 'hidden') |
264 | + ->checkbox() | ||
265 | + ->hint('Проект, снятый с тендера, будет добавлен в Архив (не доступен в поиске, но доступен по ссылке)') ?> | ||
252 | </div> | 266 | </div> |
253 | </div> | 267 | </div> |
254 | 268 |
frontend/views/layouts/performer.php
@@ -22,7 +22,7 @@ | @@ -22,7 +22,7 @@ | ||
22 | <?php | 22 | <?php |
23 | if($this->params[ 'user' ]->id != \Yii::$app->user->getId()) { | 23 | if($this->params[ 'user' ]->id != \Yii::$app->user->getId()) { |
24 | // Offer project button | 24 | // Offer project button |
25 | - if(!empty( $this->params[ 'type' ] ) && $this->params[ 'type' ] == 'customer') { | 25 | + if(empty( $this->params[ 'type' ] ) || $this->params[ 'type' ] != 'customer') { |
26 | echo Html::a('Предложить проект', [ '#' ], [ | 26 | echo Html::a('Предложить проект', [ '#' ], [ |
27 | 'class' => 'blog-buttons-offer', | 27 | 'class' => 'blog-buttons-offer', |
28 | 'data-performer-id' => $this->params[ 'user' ]->id, | 28 | 'data-performer-id' => $this->params[ 'user' ]->id, |
frontend/views/site/index.php
1 | <?php | 1 | <?php |
2 | 2 | ||
3 | -use \yii\helpers\Html; | ||
4 | -use \common\models\Specialization; | ||
5 | -/** | ||
6 | - * @var $this yii\web\View | ||
7 | - * @var $specializations common\models\Specialization | ||
8 | - */ | 3 | + use common\models\Project; |
4 | + use common\modules\fileloader\widgets\FileloaderWidget; | ||
5 | + use \yii\helpers\Html; | ||
6 | + use \common\models\Specialization; | ||
7 | + use yii\widgets\ActiveForm; | ||
9 | 8 | ||
10 | -$this->title = 'My Yii Application'; | ||
11 | -?> | 9 | + /** |
10 | + * @var $this yii\web\View | ||
11 | + * @var $specializations common\models\Specialization | ||
12 | + */ | ||
12 | 13 | ||
13 | - <div class="section-box-1"> | ||
14 | - <div class="box-wr"> | ||
15 | - <div class="box-all"> | ||
16 | - <div class="section-box-base"> | ||
17 | - Самая полная база текущих и реализованных | ||
18 | - строительных проектов с исполнителями | ||
19 | - </div> | ||
20 | - <div class="section-box-base-block"> | ||
21 | - <div class="base-blocks"> | ||
22 | - <?= Html::a('Хочу заказать проект',['landing/landing-order-project'],['class'=>'base-blocks-button first_butt']) ?> | ||
23 | - <div class="base-blocks-text"> | ||
24 | - <p>Лучшие компании и исполнители готовы помочь вам</p> | ||
25 | - </div> | 14 | + $this->title = 'My Yii Application'; |
15 | +?> | ||
16 | +<div class="section-box-1"> | ||
17 | + <div class="box-wr"> | ||
18 | + <div class="box-all"> | ||
19 | + <div class="section-box-base"> | ||
20 | + Самая полная база текущих и реализованных | ||
21 | + строительных проектов с исполнителями | ||
22 | + </div> | ||
23 | + <div class="section-box-base-block"> | ||
24 | + <div class="base-blocks"> | ||
25 | + <?= Html::a('Хочу заказать проект', [ 'landing/landing-order-project' ], [ 'class' => 'base-blocks-button first_butt' ]) ?> | ||
26 | + <div class="base-blocks-text"> | ||
27 | + <p>Лучшие компании и исполнители готовы помочь вам</p> | ||
26 | </div> | 28 | </div> |
27 | - <div class="base-blocks"> | ||
28 | - <?= Html::a('Проектант/Фрилансер',['landing/landing-freelance'],['class'=>'base-blocks-button second_butt']) ?> | ||
29 | - <div class="base-blocks-text"> | ||
30 | - <p> | ||
31 | - Частные проекты и субподряды от лучших компаний и заказчиков для вас | ||
32 | - </p> | ||
33 | - <p> | ||
34 | - <?= Html::a('Ищу работу',['landing/landing-work']) ?> | ||
35 | - Вакансии компаний и заказчиков на полную занятость и резюме свободных проектантов | ||
36 | - </p> | ||
37 | - </div> | 29 | + </div> |
30 | + <div class="base-blocks"> | ||
31 | + <?= Html::a('Проектант/Фрилансер', [ 'landing/landing-freelance' ], [ 'class' => 'base-blocks-button second_butt' ]) ?> | ||
32 | + <div class="base-blocks-text"> | ||
33 | + <p> | ||
34 | + Частные проекты и субподряды от лучших компаний и заказчиков для вас | ||
35 | + </p> | ||
36 | + <p> | ||
37 | + <?= Html::a('Ищу работу', [ 'landing/landing-work' ]) ?> | ||
38 | + Вакансии компаний и заказчиков на полную занятость и резюме свободных проектантов | ||
39 | + </p> | ||
38 | </div> | 40 | </div> |
39 | - <div class="base-blocks"> | ||
40 | - <?= Html::a('Представляю компанию',['landing/landing-company'], ['class'=>'base-blocks-button third_butt']) ?> | ||
41 | - <div class="base-blocks-text"> | ||
42 | - <p>Презентуйте лучшую команду профессиональных проектантов и получите актуальные тендеры на проектирование.</p> | ||
43 | - </div> | 41 | + </div> |
42 | + <div class="base-blocks"> | ||
43 | + <?= Html::a('Представляю компанию', [ 'landing/landing-company' ], [ 'class' => 'base-blocks-button third_butt' ]) ?> | ||
44 | + <div class="base-blocks-text"> | ||
45 | + <p>Презентуйте лучшую команду профессиональных проектантов и получите актуальные тендеры на проектирование.</p> | ||
44 | </div> | 46 | </div> |
45 | </div> | 47 | </div> |
46 | </div> | 48 | </div> |
47 | </div> | 49 | </div> |
48 | </div> | 50 | </div> |
49 | - <div class="section-box-2"> | ||
50 | - <div class="box-wr"> | ||
51 | - <div class="box-all"> | ||
52 | - <div class="menu-two-wrapp-title">Специализация работ по исполнителям</div> | ||
53 | - <div class="menu-two-wrapp" style="background: url('/images/menu-pic-1.jpg') 100% 100% no-repeat"> | ||
54 | - <ul class="content-menu-first"> | ||
55 | - <?php foreach($specializations as $specialization):?> | ||
56 | - <li data-img="<?= $specialization->image?>"> | ||
57 | - <span data-menu-bg="<?= $specialization->background ?>" style="background: <?= $specialization->background ?>"></span><a href="#"><?= $specialization->specialization_name?></a> | ||
58 | - <ul> | ||
59 | - <?php foreach($specialization->children as $child_first):?> | 51 | +</div> |
52 | +<div class="section-box-2"> | ||
53 | + <div class="box-wr"> | ||
54 | + <div class="box-all"> | ||
55 | + <div class="menu-two-wrapp-title">Специализация работ по исполнителям</div> | ||
56 | + <div class="menu-two-wrapp" style="background: url('/images/menu-pic-1.jpg') 100% 100% no-repeat"> | ||
57 | + <ul class="content-menu-first"> | ||
58 | + <?php foreach($specializations as $specialization): ?> | ||
59 | + <li data-img="<?= $specialization->image ?>"> | ||
60 | + <span data-menu-bg="<?= $specialization->background ?>" style="background: <?= $specialization->background ?>"></span><a href="#"><?= $specialization->specialization_name ?></a> | ||
61 | + <ul> | ||
62 | + <?php foreach($specialization->children as $child_first): ?> | ||
60 | 63 | ||
61 | - <?php if($child_first instanceof Specialization):?> | ||
62 | - <li> | ||
63 | - <a href="#"><?= $child_first->specialization_name?></a> | ||
64 | - <ul> | ||
65 | - <?php foreach($child_first->children as $child_second):?> | ||
66 | - <?php if($child_first instanceof Specialization): ?> | ||
67 | - <li><a href="#"><?= $child_second->specialization_name?></a></li> | ||
68 | - <?php endif;?> | ||
69 | - <?php endforeach; ?> | ||
70 | - </ul> | ||
71 | - </li> | ||
72 | - <?php endif; ?> | ||
73 | - <?php endforeach; ?> | 64 | + <?php if($child_first instanceof Specialization): ?> |
65 | + <li> | ||
66 | + <a href="#"><?= $child_first->specialization_name ?></a> | ||
67 | + <ul> | ||
68 | + <?php foreach($child_first->children as $child_second): ?> | ||
69 | + <?php if($child_first instanceof Specialization): ?> | ||
70 | + <li> | ||
71 | + <a href="#"><?= $child_second->specialization_name ?></a> | ||
72 | + </li> | ||
73 | + <?php endif; ?> | ||
74 | + <?php endforeach; ?> | ||
75 | + </ul> | ||
76 | + </li> | ||
77 | + <?php endif; ?> | ||
78 | + <?php endforeach; ?> | ||
74 | 79 | ||
75 | - </ul> | ||
76 | - </li> | ||
77 | - <?php endforeach; ?> | ||
78 | - </ul> | ||
79 | - </div> | 80 | + </ul> |
81 | + </li> | ||
82 | + <?php endforeach; ?> | ||
83 | + </ul> | ||
80 | </div> | 84 | </div> |
81 | </div> | 85 | </div> |
82 | </div> | 86 | </div> |
83 | - <div class="section-box-3"> | ||
84 | - <div class="box-wr"> | ||
85 | - <div class="box-all"> | ||
86 | - <div class="all-project-home-title_menu"> | ||
87 | - <p>Проекты на нашем сайте</p> | ||
88 | - <ul> | ||
89 | - <li class="project-home-active"><span>Текущие</span></li> | ||
90 | - <li><span>Завершенные</span></li> | ||
91 | - </ul> | ||
92 | - </div> | 87 | +</div> |
88 | +<div class="section-box-3"> | ||
89 | + <div class="box-wr"> | ||
90 | + <div class="box-all"> | ||
91 | + <div class="all-project-home-title_menu"> | ||
92 | + <p>Проекты на нашем сайте</p> | ||
93 | + <ul> | ||
94 | + <li class="project-home-active"><span>Текущие</span></li> | ||
95 | + <li><span>Завершенные</span></li> | ||
96 | + </ul> | ||
93 | </div> | 97 | </div> |
94 | </div> | 98 | </div> |
95 | - <div class="section-box-map"> | ||
96 | - <div class="shadow-map"></div> | ||
97 | - <div id="map_cloud" style="display: none;"> | ||
98 | - <script type="text/javascript"> | ||
99 | - function initialize() { | ||
100 | - var start_position = new google.maps.LatLng('56', '30'); | ||
101 | - var settings = { | ||
102 | - zoom: 7, | ||
103 | - scrollwheel: false, | ||
104 | - center: start_position, | ||
105 | - mapTypeControl: false, | ||
106 | - mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}, | ||
107 | - navigationControl: false, | ||
108 | - navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL}, | ||
109 | - scaleControl: false, | ||
110 | - streetViewControl: false, | ||
111 | - rotateControl: false, | ||
112 | - zoomControl:true, | ||
113 | - mapTypeId: google.maps.MapTypeId.ROADMAP}; | ||
114 | - var map = new google.maps.Map(document.getElementById("map_canvas"), settings); | ||
115 | - | ||
116 | - | ||
117 | - var image1 = new google.maps.MarkerImage('/images/markers/marker-we-1.png', | ||
118 | - new google.maps.Size(21, 32), | ||
119 | - new google.maps.Point(0,0), | ||
120 | - new google.maps.Point(16, 35) | ||
121 | - ); | ||
122 | - var image2 = new google.maps.MarkerImage('/images/markers/marker-we-2.png', | ||
123 | - new google.maps.Size(21, 32), | ||
124 | - new google.maps.Point(0,0), | ||
125 | - new google.maps.Point(16, 35) | ||
126 | - ); | ||
127 | - var image3 = new google.maps.MarkerImage('/images/markers/marker-we-3.png', | ||
128 | - new google.maps.Size(21, 32), | ||
129 | - new google.maps.Point(0,0), | ||
130 | - new google.maps.Point(16, 35) | ||
131 | - ); | ||
132 | - var image4 = new google.maps.MarkerImage('/images/markers/marker-we-4.png', | ||
133 | - new google.maps.Size(21, 32), | ||
134 | - new google.maps.Point(0,0), | ||
135 | - new google.maps.Point(16, 35) | ||
136 | - ); | ||
137 | - var image5 = new google.maps.MarkerImage('/images/markers/marker-we-5.png', | ||
138 | - new google.maps.Size(21, 32), | ||
139 | - new google.maps.Point(0,0), | ||
140 | - new google.maps.Point(16, 35) | ||
141 | - ); | ||
142 | - var image6 = new google.maps.MarkerImage('/images/markers/marker-we-6.png', | ||
143 | - new google.maps.Size(21, 32), | ||
144 | - new google.maps.Point(0,0), | ||
145 | - new google.maps.Point(16, 35) | ||
146 | - ); | ||
147 | - var image7 = new google.maps.MarkerImage('/images/markers/marker-we-7.png', | ||
148 | - new google.maps.Size(21, 32), | ||
149 | - new google.maps.Point(0,0), | ||
150 | - new google.maps.Point(16, 35) | ||
151 | - ); | ||
152 | - var image8 = new google.maps.MarkerImage('/images/markers/marker-we-8.png', | ||
153 | - new google.maps.Size(21, 32), | ||
154 | - new google.maps.Point(0,0), | ||
155 | - new google.maps.Point(16, 35) | ||
156 | - ); | ||
157 | - var image9 = new google.maps.MarkerImage('/images/markers/marker-we-9.png', | ||
158 | - new google.maps.Size(21, 32), | ||
159 | - new google.maps.Point(0,0), | ||
160 | - new google.maps.Point(16, 35) | ||
161 | - ); | ||
162 | - var image10 = new google.maps.MarkerImage('/images/markers/marker-empl-1.png', | ||
163 | - new google.maps.Size(21, 32), | ||
164 | - new google.maps.Point(0,0), | ||
165 | - new google.maps.Point(16, 35) | ||
166 | - ); | ||
167 | - var image11 = new google.maps.MarkerImage('/images/markers/marker-empl-2.png', | ||
168 | - new google.maps.Size(21, 32), | ||
169 | - new google.maps.Point(0,0), | ||
170 | - new google.maps.Point(16, 35) | ||
171 | - ); | ||
172 | - var image12 = new google.maps.MarkerImage('/images/markers/marker-empl-3.png', | ||
173 | - new google.maps.Size(21, 32), | ||
174 | - new google.maps.Point(0,0), | ||
175 | - new google.maps.Point(16, 35) | ||
176 | - ); | ||
177 | - var image13 = new google.maps.MarkerImage('/images/markers/marker-empl-4.png', | ||
178 | - new google.maps.Size(21, 32), | ||
179 | - new google.maps.Point(0,0), | ||
180 | - new google.maps.Point(16, 35) | ||
181 | - ); | ||
182 | - var image14 = new google.maps.MarkerImage('/images/markers/marker-empl-5.png', | ||
183 | - new google.maps.Size(21, 32), | ||
184 | - new google.maps.Point(0,0), | ||
185 | - new google.maps.Point(16, 35) | ||
186 | - ); | ||
187 | - var image15 = new google.maps.MarkerImage('/images/markers/marker-empl-6.png', | ||
188 | - new google.maps.Size(21, 32), | ||
189 | - new google.maps.Point(0,0), | ||
190 | - new google.maps.Point(16, 35) | ||
191 | - ); | ||
192 | - var image16 = new google.maps.MarkerImage('/images/markers/marker-empl-7.png', | ||
193 | - new google.maps.Size(21, 32), | ||
194 | - new google.maps.Point(0,0), | ||
195 | - new google.maps.Point(16, 35) | ||
196 | - ); | ||
197 | - var image17 = new google.maps.MarkerImage('/images/markers/marker-empl-8.png', | ||
198 | - new google.maps.Size(21, 32), | ||
199 | - new google.maps.Point(0,0), | ||
200 | - new google.maps.Point(16, 35) | ||
201 | - ); | ||
202 | - var image18 = new google.maps.MarkerImage('/images/markers/marker-empl-9.png', | ||
203 | - new google.maps.Size(21, 32), | ||
204 | - new google.maps.Point(0,0), | ||
205 | - new google.maps.Point(16, 35) | ||
206 | - ); | 99 | + </div> |
100 | + <div class="section-box-map"> | ||
101 | + <div class="shadow-map"></div> | ||
102 | + <div id="map_cloud" style="display: none;"> | ||
103 | + <script type="text/javascript"> | ||
104 | + function initialize() | ||
105 | + { | ||
106 | + var start_position = new google.maps.LatLng('56', '30'); | ||
107 | + var settings = { | ||
108 | + zoom : 7, scrollwheel : false, center : start_position, | ||
109 | + mapTypeControl : false, | ||
110 | + mapTypeControlOptions : {style : google.maps.MapTypeControlStyle.DROPDOWN_MENU}, | ||
111 | + navigationControl : false, | ||
112 | + navigationControlOptions : {style : google.maps.NavigationControlStyle.SMALL}, | ||
113 | + scaleControl : false, streetViewControl : false, rotateControl : false, | ||
114 | + zoomControl : true, mapTypeId : google.maps.MapTypeId.ROADMAP | ||
115 | + }; | ||
116 | + var map = new google.maps.Map(document.getElementById("map_canvas"), settings); | ||
207 | 117 | ||
208 | - var markers = []; | 118 | + var image1 = new google.maps.MarkerImage( |
119 | + '/images/markers/marker-we-1.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
120 | + ); | ||
121 | + var image2 = new google.maps.MarkerImage( | ||
122 | + '/images/markers/marker-we-2.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
123 | + ); | ||
124 | + var image3 = new google.maps.MarkerImage( | ||
125 | + '/images/markers/marker-we-3.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
126 | + ); | ||
127 | + var image4 = new google.maps.MarkerImage( | ||
128 | + '/images/markers/marker-we-4.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
129 | + ); | ||
130 | + var image5 = new google.maps.MarkerImage( | ||
131 | + '/images/markers/marker-we-5.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
132 | + ); | ||
133 | + var image6 = new google.maps.MarkerImage( | ||
134 | + '/images/markers/marker-we-6.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
135 | + ); | ||
136 | + var image7 = new google.maps.MarkerImage( | ||
137 | + '/images/markers/marker-we-7.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
138 | + ); | ||
139 | + var image8 = new google.maps.MarkerImage( | ||
140 | + '/images/markers/marker-we-8.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
141 | + ); | ||
142 | + var image9 = new google.maps.MarkerImage( | ||
143 | + '/images/markers/marker-we-9.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
144 | + ); | ||
145 | + var image10 = new google.maps.MarkerImage( | ||
146 | + '/images/markers/marker-empl-1.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
147 | + ); | ||
148 | + var image11 = new google.maps.MarkerImage( | ||
149 | + '/images/markers/marker-empl-2.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
150 | + ); | ||
151 | + var image12 = new google.maps.MarkerImage( | ||
152 | + '/images/markers/marker-empl-3.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
153 | + ); | ||
154 | + var image13 = new google.maps.MarkerImage( | ||
155 | + '/images/markers/marker-empl-4.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
156 | + ); | ||
157 | + var image14 = new google.maps.MarkerImage( | ||
158 | + '/images/markers/marker-empl-5.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
159 | + ); | ||
160 | + var image15 = new google.maps.MarkerImage( | ||
161 | + '/images/markers/marker-empl-6.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
162 | + ); | ||
163 | + var image16 = new google.maps.MarkerImage( | ||
164 | + '/images/markers/marker-empl-7.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
165 | + ); | ||
166 | + var image17 = new google.maps.MarkerImage( | ||
167 | + '/images/markers/marker-empl-8.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
168 | + ); | ||
169 | + var image18 = new google.maps.MarkerImage( | ||
170 | + '/images/markers/marker-empl-9.png', new google.maps.Size(21, 32), new google.maps.Point(0, 0), new google.maps.Point(16, 35) | ||
171 | + ); | ||
209 | 172 | ||
210 | - var marker = new google.maps.Marker({ | ||
211 | - position: new google.maps.LatLng('56', '35.3'), | ||
212 | - map: map, | ||
213 | - title: 'Marker Title2', | ||
214 | - icon: image1 | ||
215 | - }); | ||
216 | - markers.push(marker); | 173 | + var markers = []; |
217 | 174 | ||
218 | - var marker = new google.maps.Marker({ | ||
219 | - position: new google.maps.LatLng('56', '36'), | ||
220 | - map: map, | ||
221 | - title: 'Marker Title2', | ||
222 | - icon: image2 | ||
223 | - }); | ||
224 | - markers.push(marker); | 175 | + var marker = new google.maps.Marker( |
176 | + { | ||
177 | + position : new google.maps.LatLng('56', '35.3'), map : map, | ||
178 | + title : 'Marker Title2', icon : image1 | ||
179 | + } | ||
180 | + ); | ||
181 | + markers.push(marker); | ||
225 | 182 | ||
226 | - var marker = new google.maps.Marker({ | ||
227 | - position: new google.maps.LatLng('56', '34.5'), | ||
228 | - map: map, | ||
229 | - title: 'Marker Title3', | ||
230 | - icon: image18 | ||
231 | - }); | ||
232 | - markers.push(marker); | 183 | + var marker = new google.maps.Marker( |
184 | + { | ||
185 | + position : new google.maps.LatLng('56', '36'), map : map, | ||
186 | + title : 'Marker Title2', icon : image2 | ||
187 | + } | ||
188 | + ); | ||
189 | + markers.push(marker); | ||
233 | 190 | ||
234 | - var marker = new google.maps.Marker({ | ||
235 | - position: new google.maps.LatLng('56', '35'), | ||
236 | - map: map, | ||
237 | - title: 'Marker Title4', | ||
238 | - icon: image13 | ||
239 | - }); | ||
240 | - markers.push(marker); | 191 | + var marker = new google.maps.Marker( |
192 | + { | ||
193 | + position : new google.maps.LatLng('56', '34.5'), map : map, | ||
194 | + title : 'Marker Title3', icon : image18 | ||
195 | + } | ||
196 | + ); | ||
197 | + markers.push(marker); | ||
241 | 198 | ||
199 | + var marker = new google.maps.Marker( | ||
200 | + { | ||
201 | + position : new google.maps.LatLng('56', '35'), map : map, | ||
202 | + title : 'Marker Title4', icon : image13 | ||
203 | + } | ||
204 | + ); | ||
205 | + markers.push(marker); | ||
242 | 206 | ||
243 | - var clusterStyles = [ | ||
244 | - { | ||
245 | - url: '/images/markers/clasters.png', | ||
246 | - height: 36, | ||
247 | - width: 36 | ||
248 | - } | 207 | + var clusterStyles = [ |
208 | + { | ||
209 | + url : '/images/markers/clasters.png', height : 36, width : 36 | ||
210 | + } | ||
249 | 211 | ||
250 | - ]; | ||
251 | - markerClusterer = new MarkerClusterer(map, markers, | ||
252 | - { | ||
253 | - maxZoom: 10, | ||
254 | - gridSize: 100, | ||
255 | - styles: clusterStyles | ||
256 | - }); | ||
257 | - } | ||
258 | - </script> | ||
259 | - </div> | ||
260 | - <div id="map_canvas" style="width: 100%; height:100%;"></div> | 212 | + ]; |
213 | + markerClusterer = new MarkerClusterer( | ||
214 | + map, markers, { | ||
215 | + maxZoom : 10, gridSize : 100, styles : clusterStyles | ||
216 | + } | ||
217 | + ); | ||
218 | + } | ||
219 | + </script> | ||
261 | </div> | 220 | </div> |
221 | + <div id="map_canvas" style="width: 100%; height:100%;"></div> | ||
262 | </div> | 222 | </div> |
223 | +</div> | ||
263 | 224 | ||
264 | - <div class="section-box-4"> | ||
265 | - <div class="box-wr"> | ||
266 | - <div class="box-all"> | ||
267 | - <div class="federation-home-title">Зачем нужна Международная федерация проектантов</div> | ||
268 | - <div class="federation-home-list-wr"> | ||
269 | - <ul class="federation-home-list"> | ||
270 | - <li class="federation-home-list-active"><span>Заказчикам</span></li> | ||
271 | - <li><span>Компаниям</span></li> | ||
272 | - <li><span>Проектантам</span></li> | ||
273 | - <li><span>Наша миссия</span></li> | ||
274 | - </ul> | ||
275 | - </div> | ||
276 | - <div class="federation-home-blocks-wr"> | ||
277 | - <div class="federation-home-blocks-wr-blocks"> | ||
278 | - <div class="federation-home-blocks"> | ||
279 | - <div class="federation-home-ico"><img src="/images/ico-fed-1.png" alt=""/></div> | ||
280 | - <div class="federation-home-text">Описания рейтингов</div> | 225 | +<div class="section-box-4"> |
226 | + <div class="box-wr"> | ||
227 | + <div class="box-all"> | ||
228 | + <div class="federation-home-title">Зачем нужна Международная федерация проектантов</div> | ||
229 | + <div class="federation-home-list-wr"> | ||
230 | + <ul class="federation-home-list"> | ||
231 | + <li class="federation-home-list-active"><span>Заказчикам</span></li> | ||
232 | + <li><span>Компаниям</span></li> | ||
233 | + <li><span>Проектантам</span></li> | ||
234 | + <li><span>Наша миссия</span></li> | ||
235 | + </ul> | ||
236 | + </div> | ||
237 | + <div class="federation-home-blocks-wr"> | ||
238 | + <div class="federation-home-blocks-wr-blocks"> | ||
239 | + <div class="federation-home-blocks"> | ||
240 | + <div class="federation-home-ico"><img src="/images/ico-fed-1.png" alt=""/> | ||
281 | </div> | 241 | </div> |
282 | - <div class="federation-home-blocks"> | ||
283 | - <div class="federation-home-ico"><img src="/images/ico-fed-2.png" alt=""/></div> | ||
284 | - <div class="federation-home-text">Вы получаете лучшую цену</div> | 242 | + <div class="federation-home-text">Описания рейтингов</div> |
243 | + </div> | ||
244 | + <div class="federation-home-blocks"> | ||
245 | + <div class="federation-home-ico"><img src="/images/ico-fed-2.png" alt=""/> | ||
285 | </div> | 246 | </div> |
286 | - <div class="federation-home-blocks"> | ||
287 | - <div class="federation-home-ico"><img src="/images/ico-fed-3.png" alt=""/></div> | ||
288 | - <div class="federation-home-text">Гарантии получения проекта в срок</div> | 247 | + <div class="federation-home-text">Вы получаете лучшую цену</div> |
248 | + </div> | ||
249 | + <div class="federation-home-blocks"> | ||
250 | + <div class="federation-home-ico"><img src="/images/ico-fed-3.png" alt=""/> | ||
289 | </div> | 251 | </div> |
252 | + <div class="federation-home-text">Гарантии получения проекта в срок</div> | ||
290 | </div> | 253 | </div> |
254 | + </div> | ||
291 | 255 | ||
292 | - <div class="federation-home-blocks-wr-blocks"> | ||
293 | - <div class="federation-home-blocks"> | ||
294 | - <div class="federation-home-ico"><img src="/images/ico-fed-1.png" alt=""/></div> | ||
295 | - <div class="federation-home-text">2Описания рейтингов</div> | 256 | + <div class="federation-home-blocks-wr-blocks"> |
257 | + <div class="federation-home-blocks"> | ||
258 | + <div class="federation-home-ico"><img src="/images/ico-fed-1.png" alt=""/> | ||
296 | </div> | 259 | </div> |
297 | - <div class="federation-home-blocks"> | ||
298 | - <div class="federation-home-ico"><img src="/images/ico-fed-2.png" alt=""/></div> | ||
299 | - <div class="federation-home-text">2Вы получаете лучшую цену</div> | 260 | + <div class="federation-home-text">2Описания рейтингов</div> |
261 | + </div> | ||
262 | + <div class="federation-home-blocks"> | ||
263 | + <div class="federation-home-ico"><img src="/images/ico-fed-2.png" alt=""/> | ||
300 | </div> | 264 | </div> |
301 | - <div class="federation-home-blocks"> | ||
302 | - <div class="federation-home-ico"><img src="/images/ico-fed-3.png" alt=""/></div> | ||
303 | - <div class="federation-home-text">2Гарантии получения проекта в срок</div> | 265 | + <div class="federation-home-text">2Вы получаете лучшую цену</div> |
266 | + </div> | ||
267 | + <div class="federation-home-blocks"> | ||
268 | + <div class="federation-home-ico"><img src="/images/ico-fed-3.png" alt=""/> | ||
304 | </div> | 269 | </div> |
270 | + <div class="federation-home-text">2Гарантии получения проекта в срок</div> | ||
305 | </div> | 271 | </div> |
272 | + </div> | ||
306 | 273 | ||
307 | - <div class="federation-home-blocks-wr-blocks"> | ||
308 | - <div class="federation-home-blocks"> | ||
309 | - <div class="federation-home-ico"><img src="/images/ico-fed-1.png" alt=""/></div> | ||
310 | - <div class="federation-home-text">3Описания рейтингов</div> | 274 | + <div class="federation-home-blocks-wr-blocks"> |
275 | + <div class="federation-home-blocks"> | ||
276 | + <div class="federation-home-ico"><img src="/images/ico-fed-1.png" alt=""/> | ||
311 | </div> | 277 | </div> |
312 | - <div class="federation-home-blocks"> | ||
313 | - <div class="federation-home-ico"><img src="/images/ico-fed-2.png" alt=""/></div> | ||
314 | - <div class="federation-home-text">3Вы получаете лучшую цену</div> | 278 | + <div class="federation-home-text">3Описания рейтингов</div> |
279 | + </div> | ||
280 | + <div class="federation-home-blocks"> | ||
281 | + <div class="federation-home-ico"><img src="/images/ico-fed-2.png" alt=""/> | ||
315 | </div> | 282 | </div> |
316 | - <div class="federation-home-blocks"> | ||
317 | - <div class="federation-home-ico"><img src="/images/ico-fed-3.png" alt=""/></div> | ||
318 | - <div class="federation-home-text">3Гарантии получения проекта в срок</div> | 283 | + <div class="federation-home-text">3Вы получаете лучшую цену</div> |
284 | + </div> | ||
285 | + <div class="federation-home-blocks"> | ||
286 | + <div class="federation-home-ico"><img src="/images/ico-fed-3.png" alt=""/> | ||
319 | </div> | 287 | </div> |
288 | + <div class="federation-home-text">3Гарантии получения проекта в срок</div> | ||
320 | </div> | 289 | </div> |
290 | + </div> | ||
321 | 291 | ||
322 | - <div class="federation-home-blocks-wr-blocks"> | ||
323 | - <div class="federation-home-blocks"> | ||
324 | - <div class="federation-home-ico"><img src="/images/ico-fed-1.png" alt=""/></div> | ||
325 | - <div class="federation-home-text">4Описания рейтингов</div> | 292 | + <div class="federation-home-blocks-wr-blocks"> |
293 | + <div class="federation-home-blocks"> | ||
294 | + <div class="federation-home-ico"><img src="/images/ico-fed-1.png" alt=""/> | ||
326 | </div> | 295 | </div> |
327 | - <div class="federation-home-blocks"> | ||
328 | - <div class="federation-home-ico"><img src="/images/ico-fed-2.png" alt=""/></div> | ||
329 | - <div class="federation-home-text">4Вы получаете лучшую цену</div> | 296 | + <div class="federation-home-text">4Описания рейтингов</div> |
297 | + </div> | ||
298 | + <div class="federation-home-blocks"> | ||
299 | + <div class="federation-home-ico"><img src="/images/ico-fed-2.png" alt=""/> | ||
330 | </div> | 300 | </div> |
331 | - <div class="federation-home-blocks"> | ||
332 | - <div class="federation-home-ico"><img src="/images/ico-fed-3.png" alt=""/></div> | ||
333 | - <div class="federation-home-text">4Гарантии получения проекта в срок</div> | 301 | + <div class="federation-home-text">4Вы получаете лучшую цену</div> |
302 | + </div> | ||
303 | + <div class="federation-home-blocks"> | ||
304 | + <div class="federation-home-ico"><img src="/images/ico-fed-3.png" alt=""/> | ||
334 | </div> | 305 | </div> |
306 | + <div class="federation-home-text">4Гарантии получения проекта в срок</div> | ||
335 | </div> | 307 | </div> |
336 | </div> | 308 | </div> |
337 | </div> | 309 | </div> |
338 | </div> | 310 | </div> |
339 | - </div> | ||
340 | \ No newline at end of file | 311 | \ No newline at end of file |
312 | + </div> | ||
313 | +</div> | ||
341 | \ No newline at end of file | 314 | \ No newline at end of file |
frontend/views/site/registration.php
@@ -117,7 +117,10 @@ | @@ -117,7 +117,10 @@ | ||
117 | </div> | 117 | </div> |
118 | <div class="input-blocks-wrapper"> | 118 | <div class="input-blocks-wrapper"> |
119 | <div class="input-blocks"> | 119 | <div class="input-blocks"> |
120 | - <?= $form->field($model, 'city', ['enableClientValidation' => false, 'options' => ['class' => 'required-no-star']]) | 120 | + <?= $form->field($model, 'city', [ |
121 | + 'enableClientValidation' => false, | ||
122 | + 'options' => [ 'class' => 'required-no-star' ], | ||
123 | + ]) | ||
121 | ->widget(Select2::classname(), [ | 124 | ->widget(Select2::classname(), [ |
122 | 'options' => [ 'placeholder' => 'Выбор города ...' ], | 125 | 'options' => [ 'placeholder' => 'Выбор города ...' ], |
123 | 'pluginOptions' => [ | 126 | 'pluginOptions' => [ |
@@ -199,9 +202,6 @@ | @@ -199,9 +202,6 @@ | ||
199 | $('.field-signupform-lastname label').html(labelLastName) | 202 | $('.field-signupform-lastname label').html(labelLastName) |
200 | $('.register-company-block').css('display', 'none'); | 203 | $('.register-company-block').css('display', 'none'); |
201 | $('#w0').yiiActiveForm('remove','signupform-name'); | 204 | $('#w0').yiiActiveForm('remove','signupform-name'); |
202 | - | ||
203 | - | ||
204 | - | ||
205 | } else { | 205 | } else { |
206 | //company | 206 | //company |
207 | $('.field-signupform-firstname label').html(labelName+' '+newLabelName) | 207 | $('.field-signupform-firstname label').html(labelName+' '+newLabelName) |
frontend/web/css/style.css
@@ -6414,7 +6414,7 @@ input[disabled], select[disabled] { | @@ -6414,7 +6414,7 @@ input[disabled], select[disabled] { | ||
6414 | position: relative; | 6414 | position: relative; |
6415 | height: 54px; | 6415 | height: 54px; |
6416 | } | 6416 | } |
6417 | -.admin-project-file .admin-project-file-btn{ | 6417 | +.admin-project-file .admin-project-file-btn, .fileloader-file .admin-project-file-btn { |
6418 | background: #fff; | 6418 | background: #fff; |
6419 | color: #0072bc; | 6419 | color: #0072bc; |
6420 | height: 29px; | 6420 | height: 29px; |
@@ -6428,12 +6428,12 @@ input[disabled], select[disabled] { | @@ -6428,12 +6428,12 @@ input[disabled], select[disabled] { | ||
6428 | border-radius: 4px; | 6428 | border-radius: 4px; |
6429 | cursor: pointer; | 6429 | cursor: pointer; |
6430 | } | 6430 | } |
6431 | -.admin-project-file .admin-project-file-btn:hover{ | 6431 | +.admin-project-file .admin-project-file-btn:hover, .fileloader-file .admin-project-file-btn:hover{ |
6432 | transition: 0.2s; | 6432 | transition: 0.2s; |
6433 | background: #0072bc; | 6433 | background: #0072bc; |
6434 | color: #fff; | 6434 | color: #fff; |
6435 | } | 6435 | } |
6436 | -.admin-project-file .gen-admin-title{ | 6436 | +.admin-project-file .gen-admin-title, .fileloader-file .gen-admin-title{ |
6437 | font-size: 13px; | 6437 | font-size: 13px; |
6438 | font-weight: 700; | 6438 | font-weight: 700; |
6439 | margin-bottom: 10px; | 6439 | margin-bottom: 10px; |
@@ -6444,7 +6444,7 @@ input[disabled], select[disabled] { | @@ -6444,7 +6444,7 @@ input[disabled], select[disabled] { | ||
6444 | cursor: pointer; | 6444 | cursor: pointer; |
6445 | margin-top: 8px; | 6445 | margin-top: 8px; |
6446 | } | 6446 | } |
6447 | -.admin-project-file .not-file-mb-adm{ | 6447 | +.admin-project-file .not-file-mb-adm, .fileloader-file .not-file-mb-adm { |
6448 | position: static; | 6448 | position: static; |
6449 | margin-left: 10px; | 6449 | margin-left: 10px; |
6450 | width: 540px; | 6450 | width: 540px; |