اشتباه بودن کپتچا برای بار اول در yii2


سلام

روی وان ریماند به ربات انداخته بودن که روزی چند هزار کامنت ایجاد میکرد . یه کم وقت گذاشتم و کپتچا  روش ست کردم ولی یه مشکل کوچک بود

کپتچا واسه بار اول خطا میداد حتی اگه مقدار درست رو وارد می کردی باید حتما یه بار اون رو رفرش می کردی تا مقدار جدید بگیره

اینکه مشکل اساسی از کجاست رو با توجه به کمبود وقت سراغش نرفتم . اومدم با یه کد جاوا اسکریپت اون رو درست کردم ... این طور که بعد از 5 ثانیه یه رویداد کلیک ایجاد بشه و کلیک روی کپتچا رو شبه سازی کنه ( اسم دقیقش رو نمیدونم :)‌)

کد :

 
<script type="text/javascript">
 
    setTimeout(function ()
    {
        jQuery('#comment-captcha-image').click();
    },5000)
</script>

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii

تغییر مقادیر پیش فرض کپچادر yii2


سلام

گاهی لازمه از یه کپچا ساده تر یا پیشرفته تر استفاده کنیم واسه همین مجبور میشیم یه ذره کچای یی رو تغییر بدیم

واسه این بهتره یه کلاس توی کامپونت ها بسازیم و اون رو از اکشن کپچا اکستند کنیم و بعد هم مقادیر دلخواه رو به کپچا بفرستیم

یه نمونه :

<?php
 

namespace app\component;


use yii\base\Widget;
use yii\captcha\Captcha;
use yii\captcha\CaptchaAction;

class myCaptcha extends CaptchaAction {





        protected function generateVerifyCode()
    {

        $length=4;


        $letters='1234567890';
        $code='';
        for($i=0;$i<$length;++$i)
        {
            $code.=$letters[rand(0, strlen($letters)-1)];
        }



        return $code;
    }



} 

 

خب اینو توی یه فایل به اسم myCaptcha  ذخیره کنید و بعد هم توی کنترلی که قراره کپتچا توش استفاده بشه اون رو معرفی کنین

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            'captcha' => [
                'class' => 'app\component\myCaptcha',
                'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
            ],
        ];
    }

بعدش می مونه ی بقیه کارای درست کردن کپچا که خیلی راحته و امیدوارم بلد باشین :)

 

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii

ذخیره کردن داده های encrypt شده


وقتی میخای داده های کد شده رو که قراره بعدا دی کد بشن رو توی دیتابیس ذخیره کن ارور میده ... اگرم نده بعدا داده ی دی کریپت شده با داده ی اصلی مشابه نخاهد بود

باید قبل از ذخیره توی دیتابیس داده ها رو با تابع utf8_encode ایمن سازی کرد

توی یی این دو خط کد رو مد نظر داشته باشید

$encrypted = utf8_encode(Yii::$app->security->encryptByKey($data, $key));
$decrypted = Yii::$app->security->decryptByKey(utf8_decode($encrypted), $key);

 

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii

اضافه کردن تاریخ شمسی به گریدویو


یه ذره که با گرید ویو ور رفتم یه ذره همم کاتومایزش کردم واسه خودم ...

این کد رو به دیتا گرید ویو اضافه کنید

در این مسیر

vendor\yiisoft\yii2\i18n

توی فایل Formatter.php  این تابع رو اضافه کنید

    public function asjdate($value,$format='Y/m/d H:i:s')
    {
        return $this->formatDateTimeValue(jdate( $format,$value), 'Y/M/d H:i:s', 'jdate');
    }

 

حالا توی گرید ویو می تونید اینجوری بنوسید

  'email:email',
            'active',
          'time:jdate',

 

با این کار ما فرمت jdate  رو هم به فرمتهای yii  اضافه کردیم

البته باید کتاب خانه ی jdf  رو توی yii  داشته باشین

 

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii

چند لیست ویو در یک صفحه


وقتی چندتا لیست ویو یا گرید ویو رو توی یک صفحه فراخوانی می کنید به احتمال زیاد برای پارامتر صفحه بندی مشکل به وجود بیاد ... یعنی وقتی واسه لیست ویو اول صفحه ی دو رو انتخاب می کنید لیست ویو دومی نیز اطلاعات صفحه ی دوم رو نمایش بده

واسه حل این مشکل yii  از پارامتر pageParam برای صفحه بندی استفاده کرده ....

'dataProvider' => new \yii\data\ActiveDataProvider(
            ['query'=>\app\models\MemorysComments::find()->where(['memorys_id'=>$memorys->id]),
                'pagination'=>['pageSize'=>2,
                    'pageParam' => 'second-provider-page',],

                'sort'=> ['defaultOrder'=>['id'=>'DESC'] ] ,]
        ),

 

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii

ریلشن ها تو در تو در yii2


چند روزیه درگیر این مشکلم که اگه چندتا جدول مثل شکل زیر داشته باشم و بخوام از ریلشن هاشون تو yii2  استفاده کنم باید چیکار کنم

به این شیوه عمل می کنیم

$query = BCD::find()->with(['BC', 'BC.B', 'BC.B.A']).....

 

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii

اپلود با اجاکس در yii2


حدوده یه روزه مشغول درست کردن این قسمتم ... :)

خب بریم سراغ یکی از عالی ترین (و البته پر دردسرترین:) ) پکیج yii2

نصب :این خط کد رو توی کامپوزر بزنین

$ php composer.phar require kartik-v/bootstrap-fileinput "dev-master"

یا

اضافه کردن این خط به فایل کامپوزر

"kartik-v/bootstrap-fileinput": "dev-master"

وبعد اپدیت کردن کامپوزر با دستور composer update

نکته : امیدوارم بلد باشین با کامپوزر کار کنین :|

یک نمونه از این اپلودر ...

echo $form->field($memorysImage, 'image',['options'=>['id'=>'up','class'=>'file']])->widget(FileInput::classname(), [

    'language' => 'fa',
    'options' => ['multiple' => true, 'accept' => 'image/*',],
    'pluginOptions' => [
        'showPreview' => true,
       // 'showCaption' => true,
        'showRemove' => true,
         'showUpload' => true,
        'uploadUrl' => Url::to(['memorys/ajax']),
        'uploadExtraData' => [
            'filename'=>'no name',
        ],
        'maxFileCount' => 100,
//        'initialPreview'=>[
//        ],

    ]
]);

تقریبا راحته و این اپلودر واسه عکس تنظیم شده و حالت چند عکسی و تعداد عکس ها رو میشه تنظیم کرد و کلی امکانات دیگه

امیدوارم یادتون نرفته باشه این خط کد رو اضافه کنید

 use kartik\file\FileInput;
 use yii\helpers\Url;

و یک نکته ی کوچیک ... اینکه اگه توی activeForm  دارین از این اپلودر استفاده می کنین یا یه فرم دیگه بهتره یادتون نره که فرم رو واسه ارسال فایل  تنظیم کنید ...

    'enctype'=>'multipart/form-data',

خب بریم سراغ کدهای کنترلر ...

 public function actionAjax()
    {
        if(empty($_FILES))
        {
            echo json_encode(['error'=>'file not uploaded!']);
            return;
        }
        else {
            

            $file = $_FILES['MemorysImage'];
          
            
            foreach ($file['tmp_name'] as $name => $key) {
                 $target = 'user_file'. $file['name'][$name];
                if (move_uploaded_file($file['tmp_name'][$name], $target))
                {
                    

                }
                else
                {
                    echo json_decode(['error' => 'no uploaded']);
                }
            }
        }

    }

خب فک کنم توضح خاصی نخاد ...

لینک های منبع:

http://demos.krajee.com/widget-details/fileinput

https://github.com/kartik-v/yii2-widget-fileinput/

 

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii

mkdir(): No such file or directory


این خطا وقتی به وجود میاد که مسیر فایل مورد نظر وجود نداشته باشه و یا به احتمال زیاد اون فولدر دسترسی خواندن و نوشتن نداشته باشد

بهتره از این کد استفاده کنید

     $dir =\Yii::$app->basePath.'/up/';
        if(is_dir($dir)===false)
        {
            mkdir($dir, 0644, true);
        }

 

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii

اسکرول بی نهایت در yii2


یکی از جذابیت های وب اسکرول بی نهایته ... شخصا که عاشقم :)

نمونه های مشابهش رو میشه توی فیس بوک و یا گوگل پلاس و یا هر شبکه ای اجتماعی دیگه دید ...

خب بریم سراغ این پکیج :

نصب کردنش که راحته : توی فایل کامپوزر این خط کد رو توی قسمت require وارد کنید بعد هم خط فرمان composer update رو بزنین تا پکیج نصب بشه و به پروژه تون اضافه بشه

"kop/yii2-scroll-pager": "dev-master"

خب توی فایل README.me توضیحات هر بخش وجود داره و برای راحتی کار من هم یکی از مثل ها رو خودم استفاده کردم میارم

        echo ListView::widget([
            'dataProvider' => $memorys,
            'itemView' =>'_myView',
            'itemOptions' => ['class' => 'item'],
            'id'=>'body',

    'layout' => "{summary}\n< div class=\"items\">{items}</div>\n{pager}",
            'pager' => ['class' => \kop\y2sp\ScrollPager::className(),
                'triggerText' => 'نمایش بیشتر',
                'triggerTemplate'=>'<div class="col-md-12" style="text-align: center; cursor: pointer;"><a class="btn-group-justified btn-xs button button-3d button-primary button-pill">{text}</a></div>',
                'noneLeftText'=>'اخر نمایش',
                'triggerOffset'=>10,

                'negativeMargin'=>1,

            ]

]);

 

و صفحه ی اصلی پکیج توی gitHub

http://kop.github.io/yii2-scroll-pager/

سوالی بود توی کامنتها بپرسین ... در حد توانم جواب میدم :)

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii

pjax در yii2


توی yii1 به راحتی میشد یک فرم رو با اجاکس فرستاد و یه یک لینک اجاکس تولید کرد و طبیعتا تویی yii2  این کار باید راحت تر هم انجام بشه و میشه

با پلاگین جاوااسکریپت pjax  این کار به راحتی اب خوردنه ...

حتی میشه چندین لینک رو یکجا با هم اجاکس کنین و یا چندتا فرم رو ...

use yii\widgets\Pjax;
Pjax::begin(['timeout'=>false,'enablePushState'=>false]);
?>

<?php
foreach($memoryslist as $list):

 ?>

    <li><a class="btn" href="<?php echo  Yii::$app->urlManager->createAbsoluteUrl(['memorys/showmemorys','id'=>$list->id]) ;?>"> <?= $list->title?></a></li>
<?php endforeach ;
Pjax::end();
?>

حتی می تونین دور چندتا لینک یک تگ pjax ایجاد کنید و همه  ی لینک تبدیل به اجاکس میشن

واسه ی مثال های بیشتر به اینجا مراجعه کنید.

http://blog.neattutorials.com/examples/pjax/web/site/index

 

 

۱۳۴۸/۱۰/۱۱ || in category : فریم ورک yii