PDA

View Full Version : آمار (حل شد)



Tarragon
شنبه 12 بهمن 1392, 21:43 عصر
با سلام
می خواستم بپرسم چطور می شه آمار به پروژه مون اضافه کنیم؟
مثلا آمار بازدید کنندگان ، آمار امروز ، ورودی گوگل و اینا.
اگر اکستنشن داره(گشتم ندیدم) لطفا معرفی کنید.
اگر نداره الگوریتم کارش رو بگید مثلا چه controller و چه model و view هایی باید ایجاد تا تغیر پیدا کنند؟
پیشاپیش از کمکهای مفیدتون ممنونم.

MMSHFE
یک شنبه 13 بهمن 1392, 07:04 صبح
میتونید یک کامپوننت اضافه کنید و داخلش متدهای مربوط به اضافه کردن آمار و شمارش و... رو تعریف کنید و بعد توی کلاس Controller که توی پوشه components هست، متد init اضافه کنید و توی اون متد، دستورات افزایش آمار و... رو بنویسید. این متد با هر Request کاربر، قبل از action موردنظر صدا زده میشه. البته قاعدتاً باید جدول آمار رو هم به دیتابیس اضافه کنید و براش Model هم بسازین. ساخت Controller و Viewهای مناسب برای نمایش آمار رو هم درصورت نیاز، میتونید انجام بدین.

Tarragon
یک شنبه 13 بهمن 1392, 12:01 عصر
سلام
یعنی yii با این همه اکستنشن , یه اکستنشن واسه آمار نداره؟
نمی شه مثل رفتار هایی که برای مدل ها تعریف کردید نمی شه کاری کرد همه جا اعمال بشن؟

MMSHFE
یک شنبه 13 بهمن 1392, 14:34 عصر
اکستنشن که هست اگه بگردین (لینک (http://www.yiiframework.com/extension/googleanalyticscounter)) ولی از اونجا که بحث آمار یک چیز کلی نیست و معمولاً نیازهای آماری برحسب پروژه، فرق میکنه و یکسان نیست، برای پروژه های مختلف، کامپوننت طراحی میکنن و یک اکستنشن واحد بکار نمیره که بخوان اکستنشن کنن ولی همونطور که توی لینکی که گذاشتم مشخصه، برای موارد کلی و پرکاربرد مثل آمار گوگل و... اکستنشن وجود داره.

MMSHFE
یک شنبه 13 بهمن 1392, 14:35 عصر
نمی شه مثل رفتار هایی که برای مدل ها تعریف کردید نمی شه کاری کرد همه جا اعمال بشن؟
توضیحاتی که دادم رو کامل متوجه شدین؟ گفتم توی متد init از کلاس protected/components/Controller.php کدتون رو بگذارین و اونوقت توی تمام Actionها از تمام کنترلرها اعمال میشه.

Tarragon
یک شنبه 13 بهمن 1392, 14:45 عصر
اها حق با شماست من فکر کردم تو هر controller باید مجزا این دستور اعمال بشه.
ممنونم.

Tarragon
یک شنبه 13 بهمن 1392, 16:58 عصر
با سلام دوباره
من این کلاس رو با استفاده از کلاسی که قبلا خود آقای شهرکی نوشته بودند باز نویسی کردم.
اینجا می زارم اگر کسی از دوستان دوست داره می تونه ازش استفاده کنه :
فایل migrate به نام m140122_185008_visit :
<?php

class m140122_185008_visit extends CDbMigration
{
public function up()
{
$this->createTable(
'{{visit}}',
array(
'vdate' => 'char(10) NOT NULL',
'counter' => 'int(11) NOT NULL',
'PRIMARY KEY (`vdate`)'
),
'ENGINE=myISAM'
);
}

public function down()
{
$this->dropTable('{{visit}}');
}
}
و فایل visits که در مسیر components ها قرار می گیره :
<?php
class visits extends CApplicationComponent
{
public function __construct()
{
$this->DoCount();
}
private function tblName()
{
return '{{visit}}';
}

public function DoCount() {
$table = $this->tblName();
$today = Yii::app()->jdate->date('Y/m/d');
$sql = "SELECT * FROM `$table` WHERE `vdate`=:vdate LIMIT 1";
$command = Yii::app()->db->createCommand($sql);
$command->bindValue(":vdate", $today, PDO::PARAM_STR);
$result = $command->queryAll();
if(count($result) == 1)
{
$sql = "UPDATE `$table` SET `counter`=`counter` + 1 WHERE (`vdate`=:vdate)";
$command = Yii::app()->db->createCommand($sql);
$command->bindValue(":vdate", $today, PDO::PARAM_STR);
$result = $command->execute();
}
else
{
$command = Yii::app()->db->createCommand();
$command->insert($table, array('vdate'=>$today,'counter'=>1));
}
return true;
}

private function GetCount($time) {
$result = Yii::app()->db->createCommand()->select('counter')->from($this->tblName())->where('vdate=:vdate',array(':vdate' =>Yii::app()->jdate->date('Y/m/d',$time)))->queryRow();
return $result['counter'];
}

public function GetAll() {
$sql = 'SELECT SUM(`counter`) AS `counter` FROM `' . $this->tblName() . '`';
$result = Yii::app()->db->createCommand($sql)->queryRow();
return $result['counter'];
}

public function GetLastDays($days) {
$visits = 0;
$ts = time();
for($i = 0; $i < $days; $i++) {
$visits += $this->GetCount($ts);
$ts -= 86400;
}
return $visits;
}

public function GetToday() {
return $this->GetCount(time());
}

public function GetMax($days = 0) {
$maxDays = array();
if($days == 0)
{
$sql = 'SELECT vdate FROM '.$this->tblName().' WHERE counter = (SELECT MAX(counter) FROM '.$this->tblName().')';
$result = Yii::app()->db->createCommand($sql)->queryAll();
foreach ($result as $value)
{
$maxDays[$value['vdate']] = $value['counter'];
}
}
else
{
$max = 0;
$vDates = array();
$ts = time();
for($i = 0; $i < $days; $i++) {
$visits = $this->GetCount($ts);
if($max < $visits) {
$max = $visits;
$vDates = array();
}
if($max == $visits) {
$vDates[] = Yii::app()->jdate->date('Y/m/d', $ts);
}
$ts -= 86400;
}
foreach($vDates as $vDate) {
$maxDays[$vDate] = $max;
}
}
return $maxDays;
}
} این متد رو هم باید به controller در همون مسیر اضافه کنید :
public function init()
{
Yii::app()->visits;
}
و البته این اکستنشن باید نصب بشه : http://www.yiiframework.com/extension/jdatetime

shpegah
دوشنبه 14 بهمن 1392, 08:18 صبح
سلام ممنون
برای تعریف کامپوننت


'jdate' => array(
'class' => 'extensions.jdate.JDateTime',
//'class' => 'ext.jdate.JDateTime',
'convert' => true,
'jalali' => true,
'timezone' => 'Asia/Tehran',
),
);

مسیر کلاس رو بااین کد برای من خطا میگیره میتونید منو راهنمایی کنید

SlowCode
دوشنبه 14 بهمن 1392, 11:26 صبح
سلام ممنون
برای تعریف کامپوننت


'jdate' => array(
'class' => 'extensions.jdate.JDateTime',
//'class' => 'ext.jdate.JDateTime',
'convert' => true,
'jalali' => true,
'timezone' => 'Asia/Tehran',
),
);

مسیر کلاس رو بااین کد برای من خطا میگیره میتونید منو راهنمایی کنید
اکستنشن jdate رو تو پوشه protected/extension گذاشتین؟

shpegah
دوشنبه 14 بهمن 1392, 12:14 عصر
بله از سایت برداشتم اکسترکت کردم گذاشتم اینجا دقیقا در همین مسیر این کاررو هم کردم نشد


'class' => 'application.extensions.jdate.JDateTime',

MMSHFE
سه شنبه 15 بهمن 1392, 00:19 صبح
بهتر نبود یک تاپیک جدید ایجاد میکردین؟
بهرحال، اسم فایل اکستنشن رو jdate.php بگذارین و توی پوشه protected/extensions قرار بدین و اسم کلاس داخلش رو هم JDate بگذارین و کامپوننت رو اینطوری تعریف کنید:


'jdate' => array(
'class' => 'ext.jdate',
'convert' => true,
'jalali' => true,
'timezone' => 'Asia/Tehran',
),

shpegah
سه شنبه 15 بهمن 1392, 08:37 صبح
بهتر نبود یک تاپیک جدید ایجاد میکردین؟


بله حق باشماست پوزش میخوام چون حین تست همین تاپیک


البته این اکستنشن باید نصب بشه : http://www.yiiframework.com/extension/jdatetime

بود دراینجا آوردم

پس نام پراپرتی که مسیر extention را مشخص میکند ext است و باید از آن استفاده کرد.ممنون

engmmrj
سه شنبه 15 بهمن 1392, 09:31 صبح
Zend extention برای این کار نداره که نصب کنیم روی Yii ؟

MMSHFE
سه شنبه 15 بهمن 1392, 11:30 صبح
برای آمار سفارشی قاعدتاً باید کد سفارشی نوشته بشه. Zend که هیچ، هر فریمورک دیگه هم که باشه، نمیدونه شما چه آماری مدنظرتونه که براش Extension داشته باشه. اگه آمارگیرهای کلی مثل Google Analytics و... موردنظرتون باشه هم خود Yii داره و نیازی نیست از فریمورک دیگه قرض بگیرین.