• Как правильно указать директорию?

    @Sandro_s Автор вопроса
    Какой догадливый) только я в курсе, что именно в этом файле нужно искать ошибку, поэтому он опубликован
  • Как решить эту задачу с обработкой форм в php?

    @Sandro_s Автор вопроса
    Максим Тимофеев, к чему все это? Воспитывайте своего ребёнка как хотите. Увольняйте, если можете преподов, я ищу решение с циклами. Вариант выше не зачли просто.
  • Как решить эту задачу с обработкой форм в php?

    @Sandro_s Автор вопроса
    Максим Тимофеев, могу скрин скинуть.
    5b06fe22cbe08041635458.jpeg

    Почему с циклами? Просто в той теме , к которой задание ничего не упоминалось об этих функциях, которые вы привели. Или по задумке лектора нужно о них узнать самому или уже знать априори.

    Вот о чем был урок.
    <?php
        $summa = false;
        $x = false;
        $y = false;
        if (isset($_POST['myform'])) {
            $x = $_POST['x']?? false;
            $y = $_POST['y']?? false;
            if ($x !== false && $y !== false && is_numeric($x) && is_numeric($y)) $summa = $x + $y;
        }
    ?>
    <?php if ($summa !== false) : ?><p>Сумма равна: <?=$summa?></p><?php endif ?>
    <form name="myform" action="<?=$_SERVER['REQUEST_URI']?>" method="post">
        <div>
            X: <input type="text" name="x" value="<?=$x?>" />
        </div>
        <div>
            Y: <input type="text" name="y" value="<?=$y?>" />
        </div>
        <div>
            <input type="submit" name="myform" value="Сумма" />
        </div>
    </form>
  • Как решить эту задачу с обработкой форм в php?

    @Sandro_s Автор вопроса
    Мануал читал. Да, можно написать и так, но это будет неверно по заданию т.к. должно быть решение с циклами и посимвольному перебору строки.

    //взять строку
    $txt   = "моя строка"; // $_POST['text'];
    
    //разбить на символы
    
    $chars = preg_split("//", $txt,-1, PREG_SPLIT_NO_EMPTY);
    
    //оставить нечетные
    
    $odd   = array_filter($chars, function($idx){ return $idx & 1;}, ARRAY_FILTER_USE_KEY);
    
    //слить обратно
    
    //$result = implode("", $odd);
    
    //в целом четные буквы можно еще удалить, например, так
    
    $result = preg_replace("/.(.)/", "$1", $txt);
    
    echo $result;


    Но здесь ещё проблема с кодировкой - сменой на ut8 в ред. и вставкой мета-тэгов не решается.
  • Ошибка в БД со строками- как исправить?

    @Sandro_s Автор вопроса
    Codebaker, благодарю за помощь, всё сработало! Уже вроде и начал догадываться в чём дело-написал в reg.php вначале
    ini_set('display_errors',1);
    error_reporting(E_ALL);

    и выдало : "Notice: Undefined index: password_1 in D:\sites\mysite.local\www\blocks\reg.php on line 6
    Notice: Undefined index: password_2 in D:\sites\mysite.local\www\blocks\reg.php on line 7"

    Да, знаний пока недостаточно в MSQL, запросами и отладкой вообще, буду изучать )
  • Ошибка в БД со строками- как исправить?

    @Sandro_s Автор вопроса
    Codebaker,

    записи -через форму обработки в guestbook.php Не знаю, в чем была ошибка, но она пропала, записи в гостевой теперь добавляются, в bd -сохраняются, строка 1 появилась. Но вот с регистрацией, по прежнему, -беда(

    В бд таблица выглядит вот так 5aecd3c274ba9912108716.jpeg

    Есть файл reg.php в корне сайта
    <?php
    	require_once "start.php";
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    	<title>Регистрация</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" type="text/css" href="styles/main.css" />
    </head>
    <body>
    	<table id="main">
    	<?php 
    	require_once "blocks/top.php";
    	?>
    
    	
    		<tr>
    			<td colspan="2">
    					<table cellpadding="0" cellpadding="0" id="content">
    					<tr>
    						<td>
    							<?php
    							  require_once "blocks/reg.php";
    							?>
    						
    						</td>
    			<td id="banners_240">
    			<?php
    			 require_once "blocks/banners_240.php";
    			?>
    			            </td>
    					</tr>
    				</table>
    			</td>		
    		</tr>
    		<?php
    			 require_once "blocks/footer.php";
    			?>
    
    	</table>	
    </body>
    </html>


    reg.php (blocks)

    <?php
    	if (!empty($_POST["button_reg"])) {
    		$email = htmlspecialchars($_POST["email"]);
    		$password_1 = htmlspecialchars($_POST["password_1"]);
    		$password_2 = htmlspecialchars($_POST["password_2"]);
    		if (strlen($email) < 3) $success = false;
    		elseif (strlen($password_1) < 3) $success = false;
    		elseif ($password_1 != $password_2) $success = false;
    		else $success = addUser ($email, md5($password_1));
    		if (!$success) $alert = "Ошибка при регистрации";
    		else $alert = "Вы успешно зарегистрировались";
    		include "alert.php";
        }
    ?>
    
    <h2>Регистрация</h2>
    <form name="reg" action="" method="post">
    	<table>
    		<tr>
    		<td>E-mail:</td>
    		<td>
    		<input type="text" name="email" />
    			</td>
    		</tr>
    		    <tr>
    			    <td>Пароль:</td>
    			    <td>
    			     <input type="password_1" name="password" />
    				</td>
    			</tr>
    			    <tr>
    			    	<td>Подтвердите пароль:</td>
    				 	<td>
    				 	<input type="password_2" name="password" />
    					</td>
    				</tr>
    				<tr>
    					<td colspan="2">
    					<input type="submit" name="button_reg" value="Зарегистрироваться" />
    					</td>
    				</tr>
    	</table>
    </form>


    function.php

    <?php
    
    	$mysqli = false;
    	function connectDB() {
    		global $mysqli;
    		$mysqli = new mysqli("localhost", "root", "", "mysite-local");
    		$mysqli->query("SET NAMES 'utf8',");
    	}
    
    	function getAllArticles () {
    		global $mysqli;
    		connectDB();
    		$result_set = $mysqli->query("SELECT * FROM `articles`");
    		closeDB();
    		return resultSetToArray($result_set);
    	}
    
    	function getAllGuestBookComments () {
    		global $mysqli;
    		connectDB();
    		$result_set = $mysqli->query("SELECT * FROM `guestbook`");
    		closeDB();
    		return resultSetToArray($result_set);
    	}
    
    	 function addGuestBookComment($name, $comment) {
    	 	global $mysqli;
    		connectDB();
    $success = $mysqli->query("INSERT INTO `guestbook` (`name`,`comment`) VALUES ('$name', '$comment')");
    		closeDB();
    		return $success;
    	 }
    
    	  function addUser ($email, $password) {
    	 	global $mysqli;
    		connectDB();
    $success = $mysqli->query("INSERT INTO `users`(`email`, `password`) VALUES ('$email', '$password')");
    		closeDB();
    		return $success;
    	 }
    
    	function getArticle($id) {
    		global $mysqli;
    		connectDB();
    		$result_set = $mysqli->query("SELECT * FROM `articles` WHERE `id`='$id'");
    		closeDB();
    		return $result_set->fetch_assoc();
    	}
    	
    	function resultSetToArray($result_set) {
    		$array = array();
    		while (($row = $result_set->fetch_assoc()) !=false) 
    		$array [] = $row;
    		return $array;
    		}
    
    	function closeDB() {
    		global $mysqli;
    		$mysqli->close();
    	}
    ?>
  • Почему не добавляется запись в гостевую книгу?

    @Sandro_s Автор вопроса
    Roman T, нет, в бд не сохраняется ничего.

    а что может с addGuestBookComment ?

    у меня есть отдельный файл в blocks guestbook_comment.php
    <p><b><?php echo $name;?>:</b><?php echo $comment;?></p>


    и в function.php

    function addGuestBookComment($name, $comment) {
    	 	global $mysqli;
    		connectDB();
    $success = $mysqli->query("INSERT INTO `questbook`(`name`, `comment`) VALUES ('$name', '$comment')");
    		closeDB();
    		return $success;
    	 }


    а логи msql смотреть -это где, на локальном сервере надо? и error ,
    если такой командой, то не выводится.
    error_log(print_r($my_array, TRUE), 0);
  • Почему не добавляется запись в гостевую книгу?

    @Sandro_s Автор вопроса
    ipokos

    strlen -- возвращает длину строки.

    если длина строки name меньше 3 символов или длина строки comment тоже меньше 3 символов, то ставится переменная $success=false;
    если проверку прошли, то вернётся function addGuestBookComment - добавление данных в базу.

    p.s - ну здесь вроде вопрос о внесении данных в базу phpmyadmin)
  • Почему не отображается картинка в браузере?

    @Sandro_s Автор вопроса
    Тон Панталон, в мазиле просто дублируется название заголовка, только шрифтом меньше. Ведь дело в том, что в intro_text - картинки отображаются, но при переходе на full-text - нет.

    intro_article.php
    <div class="article">
    	<h2><?php echo $title;?></h2>
    	<p class="article_img">
    	<img src="images/article_<?php echo $id;?>.png" alt="<?php echo $title;?>" />
    	</p>
    	<?php echo $intro_text;?>
    	<p>
    	<a href="article.php?id=<?php echo $id;?>">Читать дальше</a>
    	</p>
    </div>
    <hr/>


    может быть, дело в id - но пока не разберусь
  • Nested sets с drag&drop почему не выпадает список?

    @Sandro_s Автор вопроса
    Максим Тимофеев Добрый вечер!
    Мне кажется, что-то с Вашим вариантом кода не так(
    Если в таком виде вывести (с github) то он появляется и работает
    <?php
    use yii\web\JsExpression;
    use wbraganca\fancytree\FancytreeWidget;
    use wokster\treebehavior\NestedSetsTreeBehavior;
    /**
    
    /* @var $this yii\web\View */
    /* @var $data array */
    
    $this->title = 'дерево категорий';
    ?>
    
    <div class "">
     <div class = "row">
     	<div class = "col-xs-6 col-sm-6 col-md-6 col-lg-6">
    	  <div class = "box box-primary">
    		<dib class = "box-header with-border">
    		 <h3 class ="box-title">дерево</h3>
    	      <div class ="box-tools pull-right">
    			<a href="<?=\yii\helpers\Url::toRoute('/menu/create')?>" class="btn btn-box-tool"><i class="fa fa-plus-square-o" aria-hidden="true"></i></a>
    	<button type="button" class="btn btn-box-tool" data-wiget="collapse"><i class="fa fa-minus"></i></button>
    </div>
    </div><!--/.box-header -->
    <div class="box-body">
    
     <?php
    // Example of data.
    
    
    echo  
    	\wbraganca\fancytree\FancytreeWidget::widget([
      'options' =>[
        'source' => $data,
        'extensions' => ['dnd'],
        'dnd' => [
          'preventVoidMoves' => true,
          'preventRecursiveMoves' => true,
          'autoExpandMS' => 400,
          
          'dragStart' => new JsExpression('function(node, data) {
            return true;
          }'),
          'dragEnter' => new JsExpression('function(node, data) {
            return true;
          }'),
         'dragDrop' => new JsExpression('function(node, data) {
            $.get("move",{item: data.otherNode.data["id"], action: data.hitMode, second: node.data["id"]},function(e ) {
              data.otherNode.moveTo(node, data.hitMode);
             console.log(e);
            });
    	}'),
    	   ],
     /* 'activate' => new JsExpression ('function(event,data) {
    			var title = data.node.title;
    			var id = data.node.key.substr(1);
    			$("#cat-info .box-header>h3") .text(title);
    			$.get("/menu/view-ajax",(id: id),function(data) {
    				$("#cat-info" .box-body").html (data);
    		    });
           }'),*/
        ]
    ]);
    ?>
    
    
           </div>
          </div>
         </div>
    <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
    	<div class="box box-primary" id="cat-info">
    	  <div class="box-header with-border">
    	   <h3 class="box-title">инфо</h3>
    	     <div class="box-tools pull-right">
    	      <button type="button" class="btn btn-box-tool" data-wiget="collapse"><i class="fa fa-minus"></i>
    	     </button>
    	     </div>
    	   </div>
    	</div><!--/.box-header-->
    	</div class="box-body">
    
            </div>
          </div>
        </div>
      </div>
    </div>	
    
    ?>


    5a5faa3605c57262896224.jpeg
    но без связей с инфо и если добавить эту часть с 'activate', чтобы при клике в меню в инфо что-то отображалось- то сам виджет не отображается вообще. (у Вас в видео 23.2 этот момент на 12.08 мин.)

    'activate' => new JsExpression ('function(event,data) {
    			var title = data.node.title;
    			var id = data.node.key.substr(1);
    			$("#cat-info .box-header>h3") .text(title);
    			$.get("/menu/view-ajax",(id: id),function(data) {
    				$("#cat-info" .box-body").html (data);
    		    });
           }'),*/

    5a5fabace6de4708958886.jpeg

    то же самое, если вставить Ваш вариант кода с 'dragDrop' и substr(1)
    и закомм. 'activate'

    echo  
    	\wbraganca\fancytree\FancytreeWidget::widget([
      'options' =>[
        'source' => $data,
        'extensions' => ['dnd'],
        'dnd' => [
          'preventVoidMoves' => true,
          'preventRecursiveMoves' => true,
          'autoExpandMS' => 400,
          
          'dragStart' => new JsExpression('function(node, data) {
            return true;
          }'),
          'dragEnter' => new JsExpression('function(node, data) {
            return true;
          }'),
       /*  'dragDrop' => new JsExpression('function(node, data) {
            $.get("move",{item: data.otherNode.data["id"], action: data.hitMode, second: node.data["id"]},function(e ) {
              data.otherNode.moveTo(node, data.hitMode);
             console.log(e);
            });*/
    
            'dragDrop' => new JsExpression('function (node, data) {
    $.get("/menu/move",(item: data.otherNode.key.substr(1), action: data.hitMode, second:node.key.substr(1)},function() {
    	data.otherNode.moveTo(node, data.hitMode);
    });
    	}'), 
    	   ],
     /* 'activate' => new JsExpression ('function(event,data) {
    			var title = data.node.title;
    			var id = data.node.key.substr(1);
    			$("#cat-info .box-header>h3") .text(title);
    			$.get("/menu/view-ajax",(id: id),function(data) {
    				$("#cat-info" .box-body").html (data);
    		    });
           }'),*/
           
        ]
    ]);
    ?>
  • Nested sets с drag&drop почему не выпадает список?

    @Sandro_s Автор вопроса
    '=' добавлено, но по прежнему, ничего не открывается( а что там нужно выводить?
  • Nested sets с drag&drop почему не выпадает список?

    @Sandro_s Автор вопроса
    form.php

    spoiler
    <?php

    use yii\helpers\Html;
    use yii\widgets\ActiveForm;
    use yii\helpers\ArrayHelper;
    /* var $this yii\web\View */
    /* var $model common\models\Menu */
    /* var $form yii\widgets\ActiveForm */
    ?>



    <?php $form = ActiveForm::begin([
    'action'=> ($model->isNewRecord)?\yii\helpers\Url::toRoute(['/menu/create']):\yii\helpers\Url::toRoute(['/menu/update','id'=>$model->id])
    ]);?>

    <?= $form->field($model, 'sub')->dropDownList (\yii\helpers\ArrayHelper::map(\common\models\Menu::find()->all(),'id','name')) ?>

    <?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'url')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'text')->textarea() ?>


    <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>


    <?php ActiveForm::end(); ?>

  • Проблема с загрузкой и сохранением картинок-как решить?

    @Sandro_s Автор вопроса
    Максим Тимофеев и верно ли указан адрес загрузки ? ArcticleController находится в vendor
    'url' => '/backend/web/uploads/images/articles',
    'path' => '@backend/web/uploads/images/articles'
    5a46ca11d57e5661435463.jpeg
  • Проблема с загрузкой и сохранением картинок-как решить?

    @Sandro_s Автор вопроса
    Максим Тимофеев
    В ArcticleController добавлен action images-get
    но как решить эту ошибку?

    5a46c6cceaa13604270334.jpeg5a46c75da7ed4195435392.jpeg
    public function actions()
        {
            return [
                'images-get' => [
                    'class' => 'vova07\imperavi\actions\GetAction',
                  'url' =>  '/backend/web/uploads/images/articles', // URL адрес папки где хранятся изображения.
                'path' => '@backend/web/uploads/images/articles' , // Или абсолютный путь к папке с изображениями.
                  /*  'url' => \Yii::$app->controller->module->allRedactorImageUrl, */
                   // Directory URL address, where files are stored.
                   /* 'path' => \Yii::$app->controller->module->redactor_upload_path_alias, // Or absolute path to directory where files are stored.*/
    
                    'type' => \vova07\imperavi\actions\GetAction::TYPE_IMAGES,
                   /* 'imageManagerJson' => Url::to(['/arcticle/image-get']),*/
                     'imageManagerJson' => \yii\helpers\Url::toRoute(['/article/article/images-get']),
                ],


    ArcticleController полностью
    spoiler
    <?php

    namespace wokster\article\controllers;

    use yii;
    use wokster\article\models\Article;
    use wokster\article\models\ArticleSearch;
    use yii\web\MethodNotAllowedHttpException;
    use yii\web\NotFoundHttpException;
    use yii\filters\VerbFilter;
    use yiidreamteam\upload\FileUploadBehavior;
    use vova07\imperavi\Widget;

    /**
    * ArticleController implements the CRUD actions for Article model.
    */
    class ArticleController extends yii\web\Controller
    {
    public function behaviors()
    {
    return [
    'verbs' => [
    'class' => VerbFilter::className(),
    'actions' => [
    'delete' => ['post'],
    ],
    ],
    ];
    }

    public function actions()
    {
    return [
    'images-get' => [
    'class' => 'vova07\imperavi\actions\GetAction',
    'url' => '/backend/web/uploads/images/articles', // URL адрес папки где хранятся изображения.
    'path' => '@backend/web/uploads/images/articles' , // Или абсолютный путь к папке с изображениями.
    /* 'url' => \Yii::$app->controller->module->allRedactorImageUrl, */
    // Directory URL address, where files are stored.
    /* 'path' => \Yii::$app->controller->module->redactor_upload_path_alias, // Or absolute path to directory where files are stored.*/

    'type' => \vova07\imperavi\actions\GetAction::TYPE_IMAGES,
    /* 'imageManagerJson' => Url::to(['/arcticle/image-get']),*/
    'imageManagerJson' => \yii\helpers\Url::toRoute(['/article/article/images-get']),
    ],
    //Загрузка файлов
    /* 'file-upload' => [
    'class' => 'vova07\imperavi\actions\UploadAction', ?
    'url' => '/backend/web/uploads/images/articles',
    'path' => '@backend/web/uploads/images/articles' ,
    'uploadOnlyImage' => false, //загрузка не изображений
    'unique' => false, //не переименовывать файлы
    'validatorOptions' => [
    'maxSize' => 100000, //Размер в Bite
    ]
    ],*/
    'files-get' => [
    'class' => 'vova07\imperavi\actions\GetAction',
    'url' => '/backend/web/uploads/images/articles', // URL адрес папки где хранятся изображения.
    'path' => '@backend/web/uploads/images/articles' , //
    'type' => \vova07\imperavi\actions\GetAction::TYPE_FILES,
    ],
    'image-upload' => [
    'class' => 'vova07\imperavi\actions\UploadAction',
    /* 'url' => \Yii::$app->controller->module->redactorImageUrl, // Directory URL address, where files are stored.
    /* 'path' => \Yii::$app->controller->module->redactorPath, // Or absolute path to directory where files are stored.*/
    'url' => '/backend/web/uploads/images/articles',
    /* 'url' => 'yii2.com/images/articles', */
    'path' => '@backend/web/uploads/images/articles',
    'validatorOptions' => [
    'maxWidth' => 1500,
    'maxHeight' => 1000
    ],
    'unique' => false, //не переименовывать файлы
    ],
    ];
    }

    /**
    * Lists all Article models.
    * return mixed
    */


    public function getImage()
    {
    return $this->hasMany(ImageManager::className(), ['item_id' => 'id'])->andWhere(['class'=>self::tableName()])->orderBy('sort');
    }

    public function actionIndex()
    {
    $searchModel = new ArticleSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    return $this->render('index', [
    'searchModel' => $searchModel,
    'dataProvider' => $dataProvider,
    ]);
    }

    /**
    * Displays a single Article model.
    * @param integer $id
    * return mixed
    */
    public function actionView($id)
    {
    return $this->render('view', [
    'model' => $this->findModel($id),
    ]);
    }

    /**
    * Creates a new Article model.
    * If creation is successful, the browser will be redirected to the 'view' page.
    * return mixed
    */
    public function actionCreate($type=null)
    {
    $model = new Article();
    if(is_numeric($type))
    $model->type_id = $type;

    /* if ($model->load(Yii::$app->request->post()) && $model->save()) {
    if(Yii::$app->request->post('toview',false)){
    return $this->redirect(['view', 'id' => $model->id]);
    }else{
    return $this->redirect(['update', 'id' => $model->id]);
    }*/
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
    // $file - атрибут в модели для хранения пути до файла (поле в таблице БД)
    $model->file = $model->getUploadedFileUrl('fileUpload');
    if($model->save())
    return $this->redirect(['view', 'id' => $model->id]);

    } else {
    return $this->render('create', [
    'model' => $model,
    ]);
    }
    }

    /**
    * Updates an existing Article model.
    * If update is successful, the browser will be redirected to the 'view' page.
    * @param integer $id
    * return mixed
    */
    public function actionUpdate($id)
    {
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
    return $this->redirect(['update', 'id' => $model->id]);
    } else {
    return $this->render('update', [
    'model' => $model,
    ]);
    }
    }

    /**
    * Deletes an existing Article model.
    * If deletion is successful, the browser will be redirected to the 'index' page.
    * @param integer $id
    * return mixed
    */
    public function actionDelete($id)
    {
    $this->findModel($id)->delete();

    return $this->redirect(['index']);
    }

    /**
    * Finds the Article model based on its primary key value.
    * If the model is not found, a 404 HTTP exception will be thrown.
    * @param integer $id
    * return Article the loaded model
    * @throws NotFoundHttpException if the model cannot be found
    */
    protected function findModel($id)
    {
    if (($model = Article::findOne($id)) !== null) {
    return $model;
    } else {
    throw new NotFoundHttpException('The requested page does not exist.');
    }
    }
    }
  • Проблема с загрузкой и сохранением картинок-как решить?

    @Sandro_s Автор вопроса
    форма
    spoiler
    <?php

    use yii\helpers\Html;
    use kartik\form\ActiveForm;
    use \dosamigos\fileinput\FileInput;

    /* var $this yii\web\View */
    /* var $model wokster\article\models\Article */
    /* var $form yii\widgets\ActiveForm */

    if($model->hasErrors()):
    \wokster\ltewidgets\BoxWidget::begin([
    'solid'=>true,
    'color'=>'danger',
    'title'=>'Ошибки валидации',
    'close'=> true,
    ]);
    $error_data = $model->firstErrors;
    echo \yii\widgets\DetailView::widget([
    'model'=>$error_data,
    'attributes'=>array_keys($error_data)
    ]);
    \wokster\ltewidgets\BoxWidget::end();
    endif;
    ?>

    <?php $form = ActiveForm::begin([
    'enableClientValidation' => false,
    'options' => [
    'enctype' => 'multipart/form-data',
    ],
    ]);
    /*$form = ActiveForm::begin([
    'options' => ['enctype'=>'multipart/form-data'],
    'enableClientValidation' => false
    ]); */
    ?>
    <?= $form->field($model, 'fileUpload')->fileInput() ?>

    <?= $form->field($model, 'title', ['addon' => ['prepend' => ['content' => '']],'options'=>['class'=>'col-xs-12 col-md-6']])->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'url', ['addon' => ['prepend' => ['content' => '']],'options'=>['class'=>'col-xs-12 col-md-6']])->widget(\wokster\behaviors\TranslitWidget::className())
    ?>

    <?= $form->field($model, 'text',['options'=>['class'=>'col-xs-12']])->widget(\vova07\imperavi\Widget::className(),[
    'settings' => [
    'lang' => 'ru',
    'minHeight' => 200,
    'pastePlainText' => true,
    'imageUpload' => \yii\helpers\Url::toRoute(['/article/article/image-upload']),
    'imageManagerJson' => \yii\helpers\Url::toRoute(['/article/article/images-get']),
    'replaceDivs' => false,
    'formattingAdd' => [
    [
    'tag' => 'p',
    'title' => 'text-success',
    'class' => 'text-success'
    ],
    [
    'tag' => 'p',
    'title' => 'text-danger',
    'class' => 'text-danger'
    ],
    ],
    'plugins' => [
    'fullscreen',
    'table',
    'imagemanager',
    'fontcolor',
    'fontsize',
    'video'
    ]
    ]
    ])
    ?>




    <?= $form->field($model, 'status_id',['options'=>['class'=>'col-xs-12']])->dropDownList(Yii::$app->modules['article']->status_list)
    ?>

    <?= $form->field($model, 'type_id', ['addon' => ['prepend' => ['content' => '']],'options'=>['class'=>'col-xs-12']])->dropDownList(Yii::$app->modules['article']->type_list) ?>


    <?= $form->field($model, 'date_start', ['options'=>['class'=>'col-xs-12']])->widget(\kartik\datecontrol\DateControl::className(),[]) ?>



    <?= $form->field($model, 'date_finish', ['options'=>['class'=>'col-xs-12']])->widget(\kartik\datecontrol\DateControl::className(),[]) ?>


    <?= $form->field($model, 'new_tags', ['addon' => ['prepend' => ['content' => '']],'options'=>['class'=>'col-xs-12']])->widget(\wokster\tags\TagsInputWidget::className()) ?>


    <?= $form->field($model, 'file', ['options'=>['class'=>'col-xs-12']])->label(false)->widget(FileInput::className(),[
    'attribute' => 'image', // image is the attribute
    // using STYLE_IMAGE allows me to display an image. Cool to display previously
    // uploaded images
    /*'thumbnail' => ''.$model-',
    'style' => FileInput::STYLE_IMAGE*/
    ]);?>


    <?= \wokster\seomodule\SeoFormWidget::widget(['model'=>$model,'form'=>$form]);?>



    <?= Html::submitButton('Сохранить', ['class' =>'btn btn-success']) ?>



    <?php ActiveForm::end(); ?>

    <?php $this->registerJs("
    $('#article-type_id').on('change',function(){
    var type = $(this).val();
    if(type == ".\wokster\article\Article::TYPE_SALE."){
    $('#sale-date-div').removeClass('hidden');
    $('#start-date-div').removeClass('hidden');
    }else if(type == ".\wokster\article\Article::TYPE_NEWS."){
    $('#sale-date-div').addClass('hidden');
    $('#start-date-div').removeClass('hidden');
    }else{
    $('#sale-date-div').addClass('hidden');
    $('#start-date-div').addClass('hidden');
    }
    });
    ");
  • Как правильно установить виджеты даты и времени в Yii2?

    @Sandro_s Автор вопроса
    Максим Тимофеев: я указал Table name: 'time', а model class - 'Time' и сгенерировался common/models/Time.php, а в CRUD Generator таким образом 520f8f8e04144e94952a591647921531.jpg но только вкладки: 'Time" нет слева - наверное, где-то в 'rules' это нужно добавить? Когда пробую 'update' пост, то появляется: "Invalid argument supplied for foreach()" yii2-blog\models\Blog.php in line 190 ae313e0e38e04d0aae675cecca9cf4da.jpg843f415aa142499ba23229edcdbc719a.jpg

    yi2\models\Blog.php

    <?php
    
    namespace  sand\blog\models;
    
    use common\components\behaviors\StatusBehavior;
    use Yii;
    use yii\behaviors\TimestampBehavior;
    use yii\db\ActiveRecord;
    use yii\db\Expression;
    use yii\helpers\ArrayHelper;
    use yii\helpers\Url;
    use yii\web\UploadedFile;
    use common\models\User;
    use common\models\ImageManager;
    
    /**
     * This is the model class for table "blog".
     *
     * @property integer $id
     * @property string $title
     * @property string $text
     * @property string $image
     * @property string $url
     * @property string $date_create
     * @property string $date_update
     * @property integer $status_id
     * @property integer $sort
     */
    class Blog extends ActiveRecord
    {
        const STATUS_LIST = ['off','on'];
        const IMAGES_SIZE = [
            ['50','50'],
            ['800',null],
        ];
        public $tags_array;
        public $file;
    
        /**
         * @inheritdoc
         */
        public static function tableName()
        {
            return 'blog';
        }
    
        public function behaviors()
        {
            return [
                'timestampBehavior'=>[
                    'class' => TimestampBehavior::className(),
                    'createdAtAttribute' => 'date_create',
                    'updatedAtAttribute' => 'date_update',
                    'value' => new Expression('NOW()'),
                ],
                'statusBehavior'=>[
                    'class' => StatusBehavior::className(),
                    'statusList' => self::STATUS_LIST,
                ]
            ];
        }
    
        /**
         * @inheritdoc
         */
        public function rules()
        {
            return [
                [['title', 'url'], 'required'],
                [['text'], 'string'],
                [['url'], 'unique'],
                [['status_id', 'sort'], 'integer'],
                [['sort'], 'integer', 'max'=>99, 'min'=>1],
                [['title', 'url'], 'string', 'max' => 150],
                [['image'], 'string', 'max' => 100],
                [['file'], 'image'],
                [['tags_array','date_create','date_update'], 'safe'],
            ];
        }
    
        /**
         * @inheritdoc
         */
        public function attributeLabels()
        {
            return [
                'id' => 'ID',
                'title' => 'Заголовок',
                'text' => 'Текст',
                'url' => 'ЧПУ',
                'status_id' => 'Статус',
                'sort' => 'Сортировка',
                'tags_array' => 'Тэги',
                'image' => 'Картинка',
                'file' => 'Картинка',
                'tagsAsString' => 'Тэги',
                'author.username' => 'Имя Автора',
                'author.email' => 'Почта Автора',
                'date_update' => 'Обновлено',
                'date_create' => 'Создано',
            ];
        }
    
    
        public function getAuthor(){
            return $this->hasOne(User::className(),['id'=>'user_id']);
        }
        public function getImages()
        {
            return $this->hasMany(ImageManager::className(), ['item_id' => 'id'])->andWhere(['class'=>self::tableName()])->orderBy('sort');
        }
        public function getImagesLinks()
        {
            return ArrayHelper::getColumn($this->images,'imageUrl');
        }
        public function getImagesLinksData()
        {
            return ArrayHelper::toArray($this->images,[
                    ImageManager::className() => [
                        'caption'=>'name',
                        'key'=>'id',
                    ]]
            );
        }
        public function getBlogTag(){
            return $this->hasMany(BlogTag::className(),['blog_id'=>'id']);
        }
    
        public function getTags()
        {
            return $this->hasMany(Tag::className(), ['id' => 'tag_id'])->via('blogTag');
        }
    
        public function getTagsAsString()
        {
            $arr = \yii\helpers\ArrayHelper::map($this->tags,'id','name');
            return implode(', ',$arr);
        }
    
        public function getSmallImage()
        {
            if($this->image){
                $path = str_replace('admin.','',Url::home(true)).'uploads/images/blog/50x50/'.$this->image;
            }else{
                $path = str_replace('admin.','',Url::home(true)).'uploads/images/ss.jpg';
            }
            return $path;
        }
    
    
        public function afterFind()
        {
            parent::afterFind();
            $this->tags_array = $this->tags;
        }
    
    
        public function beforeSave($insert)
        {
            if($file = UploadedFile::getInstance($this, 'file')){
                $dir = Yii::getAlias('@images').'/blog/';
                if(file_exists($dir.$this->image)){
                    unlink($dir.$this->image);
                }
                if(file_exists($dir.'50x50/'.$this->image)){
                    unlink($dir.'50x50/'.$this->image);
                }
                if(file_exists($dir.'800x/'.$this->image)){
                    unlink($dir.'800x/'.$this->image);
                }
                $this->image = strtotime('now').'_'.Yii::$app->getSecurity()->generateRandomString(6)  . '.' . $file->extension;
                $file->saveAs($dir.$this->image);
                $imag = Yii::$app->image->load($dir.$this->image);
                $imag->background('#fff',0);
                $imag->resize('50','50', Yii\image\drivers\Image::INVERSE);
                $imag->crop('50','50');
                $imag->save($dir.'50x50/'.$this->image, 90);
                $imag = Yii::$app->image->load($dir.$this->image);
                $imag->background('#fff',0);
                $imag->resize('800',null, Yii\image\drivers\Image::INVERSE);
                $imag->save($dir.'800x/'.$this->image, 90);
            }
            return parent::beforeSave($insert);
        }
    
        public function afterSave($insert, $changedAttributes)
        {
            parent::afterSave($insert, $changedAttributes);
            $arr = \yii\helpers\ArrayHelper::map($this->tags,'id','id');
            foreach ($this->tags_array as $one){
                if(!in_array($one,$arr)){
                    $model = new BlogTag();
                    $model->blog_id = $this->id;
                    $model->tag_id = $one;
                    $model->save();
                }
                if(isset($arr[$one])){
                    unset($arr[$one]);
                }
            }
            BlogTag::deleteAll(['tag_id'=>$arr]);
        }
    
    
    public function beforeDelete()
          
            {   if (parent::beforeDelete()) {
                    $dir = Yii::getAlias('@images').'/blog/';
                 /*if($this->image != '')*/
               if(!empty($this->image))
                /* if($this->image && file_exists($dir.$this->image))*/
            if (isset($this->image) && file_exists($idr.$this->image)){
                  unlink($dir.$this->image);
                    }
              /* if(file_exists($dir.$this->image)){
                        unlink($dir.$this->image);
                    }*/
                foreach (self::IMAGES_SIZE as $size){
                        $size_dir = $size[0].'x';
                if($size[1] !== null)
                            $size_dir .= $size[1];
               /* if(file_exists($dir.$this->image)){
                            unlink($dir.$size_dir.'/'.$this->image);
                        }*/
                    }
               BlogTag::deleteAll(['blog_id'=>$this->id]);
               return true;
                     } else {
                return false;
                  }
            }
    }
  • Как правильно установить виджеты даты и времени в Yii2?

    @Sandro_s Автор вопроса
    таким образом? 6672bc298c414c30956e536e7a48c305.jpg потому-что, если писать: 'common/models/Time то "Only word characters, and optionally spaces, an asterisk and/or a dot are allowed."