Yii Framework Forum: Nome dinamico di una tabella - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Nome dinamico di una tabella Annualmente devo cambiare il nome di una tabella, come fare? Rate Topic: -----

#1 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 23 March 2011 - 04:40 AM

Ho un problema con il nome di una tabella che deve poter cambiare in quando devo/voglio mantenere separati alcuni rilevamenti di anno in anno.

Il nome della tabella viene recuperato dal campo tableName. Ho un database che deve essere diviso di anno in anno quindi ho pensato di aggiungere l'anno al metodo tableName del model.
  public function tableName() {
    return 'ScaricoTempi' . date('Y');
  }


Io però vorrei che fosse possibile selezionare l'anno, memorizzarlo nella session, quindi modificare al volo questo tableName. Vorrei provare con la soluzione del behavior. Non ne ho mai creato uno quindi chiedo il vostro supporto:
<?php
class CurrentYearBehavior extends CBehavior {

  public function events() {
    return array_merge(parent::events(), array(
        'onBeginRequest' => 'beginRequest',
    ));
  }

  public function beginRequest() {
    if ($this->owner->user->getState('currentYear'))
      $this->owner->currentYear = $this->owner->user->getState('currentYear');
    else
      $this->owner->currentYear = date('Y');
  }

}


Aggiungendo quel Behavior mi aspetto che ad ogni richiesta di pagina, venga caricato il parametro currentYear. E qui la domanda sorge spontanea: ho un limite di nomi, o posso inventarmi quelli che voglio? In ogni caso, andrei a recuperare questo valore al momento della richiesta dalla tabella:
  public function tableName() {
    return 'ScaricoTempi' . $this->owner->user->getState('applicationLanguage');
  }


Così avrei risolto solo mezzo problema: ora come faccio a creare una tabella che non esiste quando serve?
      CREATE TABLE IF NOT EXISTS `ScaricoTempi2011` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `id_collaborazione` int(11) NOT NULL,
            `secondi` int(11) NOT NULL,
            `data` date NOT NULL,
            `note` text NOT NULL,
            `orascarico` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
            `id_sotto_commessa` int(11) NOT NULL,
            PRIMARY KEY (`id`)
      );


Che mi suggerite?
0

#2 User is offline   zaccaria 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 2,232
  • Joined: 04-October 09
  • Location:Moscow

Posted 23 March 2011 - 08:34 AM

Per creare la tabella basta usare Yii::app()->db->createCommand("sql")->query();

Io avevo fatto un degenero del genere, ma alla fine ho deciso di fare una sola tabella con un campo anno.

Nel mio caso, pero' avevo meno di 10 000 record per anno, per cui sono andato sul sicuro.
0

#3 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 23 March 2011 - 08:46 AM

Corro il rischio di arrivare a 25000 record annui.

Ma se tu mi dici che mi basta fare Yii::app()->db->createCommand("sql")->query("create table ... ... ..."); io riesco a risolvere.
0

#4 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 23 March 2011 - 09:29 AM

Non ci siamo... allora:
class UserIdentity extends CUserIdentity {

  private $_id;
  public $anno;

  public function authenticate() {
    $username = strtolower($this->username);
    $user = Utenti::model()->find('LOWER(username)=?', array($username));
    if ($user === null) {
      $this->errorCode = self::ERROR_USERNAME_INVALID;
    } else if (!$user->validatePassword($this->password)) {
      $this->errorCode = self::ERROR_PASSWORD_INVALID;
    } else {
      $this->_id = $user->id;
      $this->username = $user->username;
      $this->errorCode = self::ERROR_NONE;
      $this->anno = $user->anno;
    }
    return $this->errorCode == self::ERROR_NONE;
  }


Ho provato ad aggiungere UserIdentity mettendo l'anno e sperando di poterlo leggere in seguito in questo modo:
Yii::app()->user->anno


Ma non è così =(. Come devo fare?
0

#5 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 23 March 2011 - 10:09 AM

Ho rinunciato al mio behavior (peccato perchè sarebbe stata la mia prima estensione).

Così, mentre scrivevo l'ultimo post qui ho cercato nel sito di Yii ed ho trovato questo:
http://www.yiiframew...nding-cwebuser/

In effetti ho trovato il modo di estendere a mio piacimento la classe CWebUser. Spero possa essere utile anche per voi.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users