Yii Framework Forum: Problema Com Cwebmodule::setcomponent - Yii Framework Forum

Jump to content

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

Problema Com Cwebmodule::setcomponent Rate Topic: -----

#1 User is offline   Anderson Scouto da Silva 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 09-May 12

Posted 18 October 2012 - 09:16 AM

Bom dia amigos do Fórum.

Estou tendo um problema no Yii.

Eu tenho um módulo administrator, e tenho o seguinte código:

AdministratorModule.php

<?php
class AdministratorModule extends CWebModule {

    public $preload = array('bootstrap');

    public function init() {
        // this method is called when the module is being created
        // you may place code here to customize the module or the application
        // import the module-level models and components
        $this->setImport(array(
            'administrator.models.*',
            'administrator.components.*',
            'administrator.extensions.*',
        ));

        // alias para este modulo
        Yii::setPathOfAlias('administrator_module', dirname(__FILE__));

        // cria o componente bootstrap
        $componentes['bootstrap'] = Yii::createComponent(array(
            'class' => 'administrator_module.extensions.bootstrap.components.Bootstrap'
        ));
        
        // cria o componente clientScript
        $componentes['clientScript'] = Yii::createComponent(array(
            'class' => 'administrator_module.components.ClientScript',
        ));
        
        
        // percorre o array de componentes criados
        // e os define
        foreach($componentes as $id => $config) {
            $this->setComponent($id, $config);
        }

................

?>


Tenho uma extensão dentro do módulo que é carregada ao iniciar o mesmo:

ClientScript.php

<?php

class ClientScript extends CClientScript {

    //put your code here

    protected $activeScriptId;
    protected $activeScriptPosition;

    public function beginScript($id, $pos = parent::POS_READY) {

        $this->activeScriptId = $id;
        $this->activeScriptPosition = $pos;

        ob_start();
        ob_implicit_flush(false);
    }

    public function endScript() {

        $script = ob_get_clean();

        //$script = strip_tags($script);
        //$script = substr(trim($script), 8, -9);
        //echo $script;

        $script = preg_replace("/<script[^>]*>/", "", $script, 1);

        $script = preg_replace("/<\/script>/", "", $script, 1);

        CClientScript::registerScript($this->activeScriptId, $script, $this->activeScriptPosition);
    }

}

?>



E na view:

novo.php

<?php $cs = $this->getModule()->clientScript; ?>
..........
<?php $cs->beginScript('administrator_artigo_novo_scripts_' . $id); ?>
<script>
     document.id('<?php echo $id; ?>').addEvent('click', function() {
        $(this).button('loading');
     });
</script>
<?php $cs->endScript(); ?>
...............


Simplesmente o código não registra, se eu colocar esta configuração no main.php ele funciona e registra tudo certo, agora quando é carregado pelo modulo não funciona, ja tentei causar erro de propósito dentro da classe e o erro aparece no Yii, indicando que o componente foi criado com sucesso. Outro teste foi colocar o attributo $teste com o valor "teste" na classe ClientScript e chamar na view com:

<?php $cs = $this->getModule()->clientScript; ?>

<?php echo $cs->teste; ?>


E foi impresso com sucesso na tela, o problema está na hora de registrar o script, lembrando que se a classe for criada direto no main.php ela funciona, mas se criar o componente pelo módulo, dai não funciona. Para o tipo de aplicação que eu quero, eu preciso criar este componente dentro do modulo administrator.

Obrigado desde já, abraços a todos.
0

#2 User is offline   Anderson Scouto da Silva 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 09-May 12

Posted 18 October 2012 - 01:25 PM

Boa tarde amigos do fórum.
Venho informar que consegui solucionar o problema com a seguinte modificação no componente ClientScript

De:

<?php
.........
public function endScript() {
        
        $script = ob_get_clean();

        //$script = strip_tags($script);

        //$script = substr(trim($script), 8, -9);

        //echo $script;

        $script = preg_replace("/<script[^>]*>/", "", $script, 1);

        $script = preg_replace("/<\/script>/", "", $script, 1);
        
        parent::registerScript($this->activeScriptId, $script, $this->activeScriptPosition);
        
    }
.........
?>


Para:

<?php
.........
public function endScript() {
        
        $script = ob_get_clean();

        //$script = strip_tags($script);

        //$script = substr(trim($script), 8, -9);

        //echo $script;

        $script = preg_replace("/<script[^>]*>/", "", $script, 1);

        $script = preg_replace("/<\/script>/", "", $script, 1);
        
        Yii::app()->getClientScript()->registerScript($this->activeScriptId, $script, $this->activeScriptPosition);
        
    }
..........
?>


Agora voltou a funcionar este método e também parou de dar erro no componente Bootstrap quando ele era criado junto com o ClientScript. Algum sabe porque estava acontecendo este erro? Para evitar que outros usuários acabem passando pelo mesmo e eu claro rsrsrsrsrs.

Abraços a todos!
0

#3 User is offline   Lothor 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 147
  • Joined: 05-August 11
  • Location:Brazil

Posted 19 October 2012 - 09:14 AM

Anderson, você tentou colocar na função beforeControllerAction ao invés da função init?
0

#4 User is offline   Anderson Scouto da Silva 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 09-May 12

Posted 19 October 2012 - 03:51 PM

View PostLothor, on 19 October 2012 - 09:14 AM, said:

Anderson, você tentou colocar na função beforeControllerAction ao invés da função init?


Não, eu só mudei na classe ClientScript de "parent::registerScript()" para "Yii::app()->getClientScript()->registerScript()", e dai começou a funcionar tudo.

No AdministratorModule.php eu realmente defini os components dentro do método "init()", vou testar como fica definindo dentro do método "beforeControllerAction()", parece que eu já testei isso, não recordo, mas eu testo e volto a postar aqui no fórum os resultados.

Abraços, e obrigado pela resposta.
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