Problem with front-end and back-end

Hello!

Trying to cook this lesson about organazing directories for applications with front-end and back-end using WebApplicationEnd behavior.

Tried to access into website root, but there is an error appeared :


endName; public function getEndName() { return $this->_endName; } // Run application's end. public function runEnd($name) { $this->_endName = $name; // Attach the changeModulePaths event handler // and raise it. $this->onModuleCreate = array($this, 'changeModulePaths'); $this->onModuleCreate(new CEvent($this->owner)); $this->owner->run(); // Run application. } // This event should be raised when CWebApplication // or CWebModule instances are being initialized. public function onModuleCreate($event) { $this->raiseEvent('onModuleCreate', $event); } // onModuleCreate event handler. // A sender must have controllerPath and viewPath properties. protected function changeModulePaths($event) { $event->sender->controllerPath .= DIRECTORY_SEPARATOR.$this->_endName; $event->sender->viewPath .= DIRECTORY_SEPARATOR.$this->_endName; } }endName; public function getEndName() { return $this->_endName; } // Run application's end. public function runEnd($name) { $this->_endName = $name; // Attach the changeModulePaths event handler // and raise it. $this->onModuleCreate = array($this, 'changeModulePaths'); $this->onModuleCreate(new CEvent($this->owner)); $this->owner->run(); // Run application. } // This event should be raised when CWebApplication // or CWebModule instances are being initialized. public function onModuleCreate($event) { $this->raiseEvent('onModuleCreate', $event); } // onModuleCreate event handler. // A sender must have controllerPath and viewPath properties. protected function changeModulePaths($event) { $event->sender->controllerPath .= DIRECTORY_SEPARATOR.$this->_endName; $event->sender->viewPath .= DIRECTORY_SEPARATOR.$this->_endName; } }

Fatal error: Class 'WebApplicationEndBehavior' not found in J:\yii-1.1.5.r2654\framework\YiiBase.php on line 211

config/main.php :


<?php


// uncomment the following to define a path alias

// Yii::setPathOfAlias('local','path/to/local-folder');


// This is the main Web application configuration. Any writable

// CWebApplication properties can be configured here.

return array(

    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',

    'name'=>'My Web Application',


    // preloading 'log' component

    'preload'=>array('log'),


  'behaviors'=>array(

    'runEnd'=>array(

      'class'=>'application.components.WebApplicationEndBehavior',

    ),

  ),


    // autoloading model and component classes

    'import'=>array(

        'application.models.*',

        'application.components.*',

    ),


    'modules'=>array(

        // uncomment the following to enable the Gii tool

        /*

        'gii'=>array(

            'class'=>'system.gii.GiiModule',

            'password'=>'Enter Your Password Here',

        ),

        */

    ),


    // application components

    'components'=>array(

        'user'=>array(

            // enable cookie-based authentication

            'allowAutoLogin'=>true,

        ),

        // uncomment the following to enable URLs in path-format

        /*

        'urlManager'=>array(

            'urlFormat'=>'path',

            'rules'=>array(

                '<controller:\w+>/<id:\d+>'=>'<controller>/view',

                '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

                '<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

            ),

        ),

        */

        'db'=>array(

            'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/testdrive.db',

        ),

        // uncomment the following to use a MySQL database

        /*

        'db'=>array(

            'connectionString' => 'mysql:host=localhost;dbname=testdrive',

            'emulatePrepare' => true,

            'username' => 'root',

            'password' => '',

            'charset' => 'utf8',

        ),

        */

        'errorHandler'=>array(

            // use 'site/error' action to display errors

            'errorAction'=>'site/error',

        ),

        'log'=>array(

            'class'=>'CLogRouter',

            'routes'=>array(

                array(

                    'class'=>'CFileLogRoute',

                    'levels'=>'error, warning',

                ),

                // uncomment the following to show log messages on web pages


                array(

                    'class'=>'CWebLogRoute',

                ),

                

            ),

        ),

    ),


    // application-level parameters that can be accessed

    // using Yii::app()->params['paramName']

    'params'=>array(

        // this is used in contact page

        'adminEmail'=>'webmaster@example.com',

    ),

); 

WebApplicationEndBehavior.php is in protected/components folder.

What could be the problem?

Thanks.

Looks like for some reason Yii can’t autoload the class.

Try the next code somewhere in your application (without using this behavior).




echo YiiBase::getPathOfAlias('application.components.WebApplicationEndBehavior');



and check if the echoed path exists. Does any other custom component or model loads normally?

I changed webapp run in index.php to :


Yii::createWebApplication($config)->run();

Turned on UrlManager :


'urlManager'=>array(

			'urlFormat'=>'path',

			'rules'=>array(

				//'<controller:\w+>/<id:\d+>'=>'<controller>/view',

				//'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

				'<controller:\w+>/<action:\w+>'=>'front/<controller>/<action>',

			),

		),

And commented behaviors section (in config).

Accessed to front site/index - http://127.0.0.2/site/index

Everything looks like ok. ‘Welcome to My Web Application’ page appeared. getPathOfAlias echoed :


J:\xampplite\htdocs\myproject\www\protected\components\WebApplicationEndBehavior

Can you load components now?

Try the following:

Create MyComponent.php in components directory with the following contents:




class MyComponent extends CComponent

{

    public $foo = 'bar';

}



Then create an instance somewhere in your application:




$myComponent = new MyComponent;

echo $myComponent->foo;



Note, class name and file name must be the same (except ".php" file extension).

I’ve inserted creating of instance into actionIndex() in SiteController.

Error appeared :


Fatal error: Class 'MyComponent' not found in J:\xampplite\htdocs\myproject\www\protected\controllers\front\SiteController.php on line 32

Strange… Autoloading of components is inserted to config :


'import'=>array(

		'application.models.*',

		'application.components.*',

	),

Try to import it explicitly using Yii::import() function:




Yii::import('application.components.MyComponent', true);

$myComponent = new MyComponent;



Make sure this directory is readable.

Ohhh. It wasn’t readable. Everything works now.

Thank you very much! ^_^

I do not understand how to use


echo YiiBase::getPathOfAlias('application.components.WebApplicationEndBehavior');

I followed the same tutorial as shown in the original post and I am getting the following error:


CException


CWebApplication and its behaviors do not have a method or closure named "runEnd".


/var/yii/framework/base/CComponent.php(265)

I just started playing with the yii framework today and got my site up and running and got completely stuck with this. I’m hoping someone out there might know what I did wrong.

There were 2 steps that I was a little confused about and not sure I did them correctly:

First, wasn’t sure if I needed to change any code within column1.php or column2php, I didn’t see anywhere to specify the parent layout as described here:


Note: Since a new full path to front-end layouts is "application.views.front.layouts", you have to edit "column1.php" and "column2.php" files to render "application.views.front.layouts.main" as a parent layout. Also set Controller's (protected/components/Controller.php) layout property to 'column1'.

Second, it sounds like this is only needed if I have a controller that is shared between front and back ends?


protected function init()

{

    // ...    

 

    // We can configure our module depending on the value

    // of Yii::app()->endName.

    $this->foo = (Yii::app()->endName == 'front') ? 'bar1' : 'bar2';

 

    // Raise onModuleCreate event.

    Yii::app()->onModuleCreate(new CEvent($this));

}