Для получения полного доступа
зарегистрируйтесь.
RSS

Все сниппеты с тэгом «yii»



Gravatar image
Insolita
  • Репутация: 7
  • Сниппеты: 3
  • Ревизии: 1

При сохранении груповых данных, зачастую требуется сопоставить, то-что у нас уже хранится в БД и то-что пришло с формы, для этого приходится сверять элименты по уникальному полю, данный снипет, из одной незамысловатой строки, вернет массив с уникальными ключами. Затем можно уже проверять на isset($models_by_id[$id]) или array_diff_key, ну и т.д.

$models_by_id=Model::find()->indexBy('id')->all(); //yii 2 path @mista twista

$models=Model::model()->findAll(); //yii 1
$models_by_id=array_combine(array_keys(CHtml::listData($models, 'id', 'id')),$models);
$models_by_id=array_combine(array_column($model,'id'),$model); //since php5.5

samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Если у вас в приложении всего один язык, не обязательно использовать Yii::t() для множественных форм:

echo Yii::$app->i18n->format('На диване {n, plural, =0{нет кошек} =1{лежит одна кошка} one{лежит # кошка} few{лежит # кошки} many{лежит # кошек} other{лежит # кошки}}!', ['n' => 0], 'ru_RU');

Для удобства это можно завернуть в функцию:

function f($message, $params)
{
    return Yii::$app->i18n->format($message, $params, 'ru_RU');
}
Kosuha606
  • Репутация: 11
  • Сниппеты: 11
  • Ревизии: 0

Этот класс можно использовать в случаях, когда необходимо заставить барузеры клиентов обновить ресурсы ( css, js ) при их изменении в git. Требует доступного на выполнение git.

Этот пример оптимизирован по совету пользователя matweew. Улучшенную версию смотрите ниже после этой.

Первая версия:

<?php

class HashedAsset
{
    public $hash;
    
    public function init()
    {
        exec('git describe --always',$version_hash);
        if (isset($version_hash[0])) {
            $this->hash = md5($version_hash[0]);    
        }
    }
}

Продолжение »

Kosuha606
  • Репутация: 11
  • Сниппеты: 11
  • Ревизии: 0

У меня на работе появилась задачка сделать небольшой проект, для простого просмотра картинок из папок локальной сети.. И как то так само собой сложилось, что я написал вот такой класс для рендеринга видов ( просто я люблю Yii2 да и вообще MVC ). Вот решил поделиться и спросить у занющих людей насколько рабочим в реальных проектах был бы этот класс??? Возможно ли решить задачу по другому?? Просто это первое что пришло в голову и есть сомнения в качестве...

Реализацию yii2 рендеринга не смотрел, так как само как то получилось... но посмотрю как нибудь обязательно...

Еще дополню, в проекте не использовался вообще никакой фреймворк... просто приложение на PHP.

Продолжение »

samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Чтобы удалить кеш фрагмента в Yii 2.0 необходимо специальным образом сформировать ключ.

function deleteFragmentCacheByKey($key)
{
    return Yii::$app->cache->delete(['yii\widgets\FragmentCache', $key]);
}
Gravatar image
diDevel
  • Репутация: 1
  • Сниппеты: 4
  • Ревизии: 0

Данный отрезок кода содержит пример вызова массива для формы поля select т.е. для выбора из нескольких вариантов. Фаил Helper_money.php кидаем в yii\protected\components. Фаил _form.php автоматически сгенерирован через Yii Gii. Да на выходе в форме, будет html select (выпадающее меню).

<?php // Helper_money.php
class Helper_money
{		
    	public static function get_support_currency($need)
    {	/* $need = 'now';
	$cur_array = Helper_money::get_support_currency($need); */
	
	$cur_array = array();
	
		switch ($need) {
			case 'now';
	$cur_array = array(
	'usd'=>Yii::t('money', 'usd - United States Dollar'), 
	'eur'=>Yii::t('money', 'eur - Euro Member Countries'),
	'rub'=>Yii::t('money', 'rub - Russia Ruble'),
	'uah'=>Yii::t('money', 'uah - Ukraine Hryvna'), 
	);
				break;
				
			case 'new';
	$cur_array = array(
	'usd'=>Yii::t('money', 'n_usd - United States Dollar'), 
	'eur'=>Yii::t('money', 'n_eur - Euro Member Countries'),
	'rub'=>Yii::t('money', 'n_rub - Russia Ruble'),
	'uah'=>Yii::t('money', 'n_uah - Ukraine Hryvna'), 
	);
				break;
				
			case 'in_code';
	$cur_array = array('rub', 'eur', 'usd', 'uah');
	
				break;
				
			default ;
				$cur_array = 'Error';
				break;
						}
	return $cur_array;
	}
    
/* _ class - Helper - End's _ */

}
?>



<?php // -------------------------------------------------------------------------
// _form.php файл формы в котором вызываем статический метод (функцию) из хелпера ?>

<?php if (Yii::app()->request->isAjaxRequest): ?>
<div class="modal-header">
	<a class="close" data-dismiss="modal">&times;</a>
	<h4><?php echo $model->isNewRecord ? 'Create Cmoney' : Yii::t('bases', 'update').' '.Yii::t('bases', 'entry').' #'.$model->id ?></h4>
</div>

<div class="modal-body">
<?php endif; ?>
<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm',array(
	'id'=>'count-money-form',
	'enableAjaxValidation'=>false,
)); ?>

	<p class="help-block"><?php
	echo Yii::t('bases',
	'Fields with <span class="required">*</span> are required.');
	?></p>

	<?php echo $form->errorSummary($model); ?>
    
   <?php $need = 'now'; 
// вызываем сам статический метод и выбираем массив 'now' в функции get_support_currency
 $cur_array = Helper_money::get_support_currency($need);
   echo $form->dropDownListRow($model, 'currency', 
   
   $cur_array,
   
	array('class'=>'span5', 'maxlength'=>3, 'required'=>'string', )
	); ?><div class="control-group success help-inline">
	<span class="help-inline"><?php echo Yii::t('bases', 'select currency');?></span></div>

	<?php echo $form->numberFieldRow($model,'money',array('class'=>'span4', 'min'=>1, 'max'=>100000000000, 
	'required'=>'string', 'placeholder'=>'3639', )); ?><div class="control-group success help-inline">
	<span class="help-inline"><?php echo Yii::t('bases', 'amount of money in the currency');?></span></div>

		<?php /* этот участок кода у вас не будет работать по этому закомментен
        >_ - For_isBuyuser_buy_user - start _>>> _ *
			// isBuyuser isGuest isAdmin
		if (Yii::app()->getModule('user')->isBuyuser()) { ?>	
	<?php echo $form->textFieldRow($model,'note',array('class'=>'span7','maxlength'=>30)); ?>

	<?php echo $form->textAreaRow($model,'other',array('class'=>'span10','maxlength'=>120)); ?><div class="control-group success help-inline">
	<span class="help-inline"><?php echo Yii::t('bases', 'description');?></span></div>
		<?php }
		/* <_ - For_isBuyuser_buy_user -  end  _<<< _ */ ?>
	
	<?php if (!Yii::app()->request->isAjaxRequest): ?>
	<div class="form-actions">
		<?php $this->widget('bootstrap.widgets.TbButton', array(
			'buttonType'=>'submit',
			'type'=>'primary',
			'label'=>$model->isNewRecord ? Yii::t('bases', 'Add') : Yii::t('bases', 'Save'),
		)); ?>
	</div>
	<?php endif; ?>
<?php $this->endWidget(); ?>

<?php if (Yii::app()->request->isAjaxRequest): ?>
</div>

<div class="modal-footer">
    <?php $this->widget('bootstrap.widgets.TbButton', array(
        'type'=>'primary',
        'label'=>$model->isNewRecord ? Yii::t('bases', 'Add') : Yii::t('bases', 'Save'),
        'url'=>'#',
		'htmlOptions'=>array(
			'id'=>'submit-'.mt_rand(),
			'ajax' => array(
				'url'=>$model->isNewRecord ? $this->createUrl('create') : $this->createUrl('update', array('id'=>$model->id)),
				'type'=>'post',
				'data'=>'js:$(this).parent().parent().find("form").serialize()',
				'success'=>'function(r){
					if(r=="success"){
						window.location.reload();
					}
					else{
						$("#TBDialogCrud").html(r).modal("show");
					}
				}', 
			),
		),
    )); ?>
    <?php $this->widget('bootstrap.widgets.TbButton', array(
        'label'=> Yii::t('bases', 'Close'),
        'url'=>'#',
        'htmlOptions'=>array(
			'id'=>'btn-'.mt_rand(),
			'data-dismiss'=>'modal'
		),
    )); ?>
</div>
<?php endif; // конец файла _form.php ?>
Gravatar image
opotemkin
  • Репутация: 11
  • Сниппеты: 4
  • Ревизии: 0

Если есть адрес сайта, включающий поддомен (формат poddomen.domen.ru), а необходимо получить домен первого уровня (domen.ru), то на помощь придет код в одну строку

http://<?php echo substr( Yii::app()->getRequest()->getHostInfo(), strpos( Yii::app()->getRequest()->getHostInfo(), "." ) + 1 ); ?>
Maxim Kuptsov
  • Репутация: 23
  • Сниппеты: 1
  • Ревизии: 1

Один extensions проверять мало, по хорошему еще нужен MIME type

public function rules()
{
    return [
        ['avatar', 'image', 'extensions' => 'png, jpg, gif',
			'mimeTypes'=>'image/jpeg, image/png, image/gif',
			'minWidth' => 200, 'minHeight' => 200
		]
    ];
}
dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

Всё больше меня радует Yii2, столько вещей уже продумано за нас. Возможно, вы уже слышали об этом, а возможно, и нет. В Yii2 есть различные валидаторы, которые очень сильно сэкономят вам время. Например, офф. документация по валидаторам.

Пример, работы валидатора для изображений:

e3ba73ff0ee0fa16ab04b21b6c9a3a56.gif

Указываем имя поля, типа валидатора и ваши правила в модели:

public function rules()
{
    return [['avatar', 'image', 'extensions' => 'png, jpg, gif','minWidth' => 200, 'minHeight' => 200]];
}
Gravatar image
reinq
  • Репутация: 1
  • Сниппеты: 1
  • Ревизии: 1

При сохранении груповых данных, зачастую требуется сопоставить, то-что у нас уже хранится в БД и то-что пришло с формы, для этого приходится сверять элименты по уникальному полю, данный снипет, из одной незамысловатой строки, вернет массив с уникальными ключами. Затем можно уже проверять на isset($models_by_id[$id]) или array_diff_key, ну и т.д.

$models_by_id=Model::find()->indexBy('id')->all(); //yii 2 path @mista twista

$models=Model::model()->findAll(); //yii 1
$models_by_id=array_combine(array_keys(CHtml::listData($models, 'id', 'id')),$models);