I wasn't writting it by myself, but i have to fix this bug.
I don't have OptionsController, but propably PagesController will be
helpful, because the problem is when i'm on the site with page list.
There is everything okey, but when I click on existing page to edit
it, this warning appears, and all forms are empty, because they can't
be taken from database (wrong query).
The strangest thing is that it works localy...

-------------------------------- controllers/pages-controller.php
--------------------------------

<?php
class PagesController extends BackendController {
        var $name = 'Pages';
        var $uses = array('Page', 'Menu', 'Option', 'Language');
        var $viewPath = 'pages';

        function constructSubmenu() {
                $this->registerSubmenuItem('Click here to create a new page in 
the
top level menu', 'pages/add');
        }
        /**
         * List action
         *
         */
        function index() {
                $this->Language->recursive = -1;
                $this->set('languages', $this->Language->find('all'));
                $this->constructSubmenu();
                //$this->Page->recursive = 0;
                //$this->set('pages', $this->paginate());
                $this->loadModel('Extension');

                $tree = $this->Menu->getStructuredTree(1);
                //print_r($tree);
                //print_r($tree);
                $extensions = $this->Extension->loadAll();
                $this->set('extensions', $extensions);

                $this->set('tree', $tree);

                //print_r($options);
                //echo '<a></a>';
                //print_r($tree);
        }

        /**
         * Edit a page
         *
         * @param int $id
         */
        function edit($id = null) {

                if (!$id && empty($this->data)) {

                        $this->flash(__('Invalid Page', true), 
array('action'=>'index'),
'error');
                        exit();
                }

                // link fugu libraries
                $this->fuguLink('media,windows,tabs,page,editor');

                // load Extension model
                $this->loadModel('Extension');

                if (!empty($this->data)) {
                        if ($this->Page->verifyUri($this->data)) {
                        // save page
                                if ($this->Page->save($this->data)) {

                                        if (!empty($_POST['extension'])) {
                                                // save extension
                                                if 
(empty($this->data['Extension'])) $this->data['Extension'] =
null;
                                                $extension = 
$_POST['extension'];
                                                $extension_obj = 
$this->Extension->init($extension);
                                                $extension_obj->handle($id, 
$this->data['Extension'],
false);
                                        }

                                        $name = $this->data['Page']['name'];
                                        $this->flash(__('The page "'.$name.'" 
has been saved.', true),
array('action'=>'index'), 'success');

                                        exit();
                                } else {
                                }
                        } else {
                                $this->Session->setFlash('<div 
class="error">The uri you specified
already exists, please try another one</div>', null);
                        }
                }
                if (empty($this->data)) {
                        $this->data = $this->Page->read(null, $id);
                        $this->set('data', $this->data);
                        if ($this->data==null) {
                                $this->flash(__('Invalid page', true), 
array('action'=>'index'),
'error', __('That page was probably removed', true));

                        }

                }



                // attach the extension object and extract data
                //print_r($_POST);
                if (!empty($_POST['extension'])) {
                        $extension_name = $_POST['extension'];
                } else {
                        $extension_name = 
$this->data['Option']['extension_name'];
                        $extension_args = 
$this->data['Option']['extension_args'];
                }
                // print_r($this->data);
                // echo $extension_name;
                $extension = $this->Extension->load($extension_name);
                $extension_obj = $this->Extension->init($extension_name);
                $ext_data = $extension_obj->fetch($id, $extension_args);
                $extension['data'] = $ext_data;
                //print_r($extension['data']);
                if (!empty($this->data['Extension'])) $extension['data'] = 
$this-
>data['Extension'];
                //print_r($extension['data']);
                $this->set('extension', $extension);

                // register tabs
                $this->registerSidebarTab('General', 'tab_general',
'GeneralScreen');
                $this->registerSidebarTab('Meta', 'tab_meta', 'MetaScreen');
                $this->registerSidebarTab($extension['cfg']['name'],
'tab_extension', 'ExtensionScreen');


                // basic vars
                $this->set('id', $id);
                $this->set('include', array('tinymce' => 1));
        }

        function languagize($option_id, $language_id) {
                if ($this->Page->find(array('language_id'=>$language_id,
'option_id'=>$option_id))) {
                        $this->flash(__('Page exists', true), 
array('action'=>'index'),
'error', __('A page for this language already exists', true));

                } else {
                        //echo 'ok!';exit;
                        $this->Page->ignore_option_creation = true;
                        $this->Page->create();
                        $data['Page']['option_id'] = $option_id;
                        $data['Page']['language_id'] = $language_id;

                        if ($this->Page->save($data)) {
                                $id = $this->Page->getInsertID();
                                $this->flash(__('The page has been saved. You 
can edit it now',
true), '/pages/edit/'.$id, 'success');
                        }
                }
                //$this->Page->create();
                //if ($this->Page->save($this->data)) {

                //}
        }

        /**
         * Add a page
         *
         * @param int $parent_id - parent id, if added the page will be
considered a subpage of tha parent
         */
        function add($parent_id = null) {

                $this->fuguLink('media,windows,tabs,page,editor');

                // print_r($this->Session->read('Auth.User'));
                //$ext_obj = $this->Extension->init('html');

                if (empty($_POST['extension'])) {
                        $this->extension($parent_id);
                        return;
                } else {
                        $extension = $_POST['extension'];
                }

                $this->loadModel('Extension');


                if (!empty($this->data)) {
                        if ($this->Page->verifyUri($this->data)) {


                                $this->Page->create();
                                if ($this->Page->save($this->data)) {
                                        // save Extension here
                                        $ext_data = array();
                                        if (!empty($this->data['Extension'])) 
$ext_data = $this-
>data['Extension'];
                                        $extension_obj = 
$this->Extension->init($extension);
                                        
$extension_obj->handle($this->Page->_lastInsert, $ext_data);

                                        $this->flash(__('The Page has been 
saved.', true),
array('action'=>'index'), 'success');
                                        exit();
                                } else {
                                }
                        } else {
                                $this->Session->setFlash('<div 
class="error">The uri you specified
already exists, please try another one</div>', null);
                        }
                }

                // load extension

                //print_r($this->data);
                $extension = $this->Extension->load($extension);
                if (!empty($this->data['Extension'])) $extension['data'] = 
$this-
>data['Extension'];
                $this->set('extension', $extension);
                //tabs
                $this->registerSidebarTab('General', 'tab_general',
'GeneralScreen');
                $this->registerSidebarTab('Meta', 'tab_meta', 'MetaScreen');
                $this->registerSidebarTab($extension['cfg']['name'],
'tab_extension', 'ExtensionScreen');


                $option = array('menu_id' => 1, 'parent_id' => $parent_id);
                $this->set('option', $option);

        }

        /**
         * Show a extension selection page, called from add()
         *
         * @param int $parent_id
         */
        function extension($parent_id=null) {
                $this->action='extension';
                $this->loadModel('Extension');
                $extensions = $this->Extension->loadAll();
                $this->set('extensions', $extensions);
                $option = array('menu_id' => 1, 'parent_id' => $parent_id);
                $this->set('option', $option);
        }

        /**
         * Delete a page
         *
         */
        function delete($id = null) {
                if (!$id) {
                        $this->flash(__('Invalid Page', true), 
array('action'=>'index'));
                }

                $opt = $this->Option->read(null, $id);

                // look for children
                $children = $this->Option->find(array('parent_id'=>$id));

                if ($children!=null) {
                        $msg = 'This page has subpages and cannot be removed';
                        $this->flash(__($msg, true), array('action'=>'index'), 
'error');
                }
                $page_id = $opt['Option']['page_id'];
                $page_name = $opt['Page']['name'];
                $flash = '';
                if ($this->Option->del($id)) {
                        $flash = 'Option was deleted from the menu<br /><br />';
                        //$this->Option->rebuildIndex($opt['Option']['menu_id'],
$opt['Option']['parent_id']);
                }
                if ($this->Page->del($page_id)) {
                        $flash .= 'Page "'.$page_name.'" was deleted';
                }
                $this->flash(__($flash, true), array('action'=>'index'), 
'success');

        }

        /**
         * Move option up
         *
         * @param int $option_id
         */
        function up($option_id) {
                if ($this->Option->up($option_id)) {

                        $this->flash(__('Page moved up', true), 
array('action'=>'index'),
'success');
                } else {
                        $this->flash(__('Unable to move page up', true),
array('action'=>'index'), 'error');
                }
        }

        /**
         * Move option down
         *
         * @param int $option_id
         */
        function down($option_id) {
                if ($this->Option->down($option_id)) {
                        $this->flash(__('Page moved down', true), 
array('action'=>'index'),
'success');
                } else {
                        $this->flash(__('Unable to move page down', true),
array('action'=>'index'), 'error');
                }
        }
}
?>

--------------------------------   models/page.php
--------------------------------

<?php
// this links the option with the extension
class Page extends AppModel {
        var $name = 'Page';
        var $useTable = 'pages';
        var $belongsTo = array('Option', 'Language');

        var $_lastInsert = null;
        /**
         * Post save
         *
         */
        function afterSave($created) {
                // if object was created, add an option to the menu
                if ($created==true) {
                        $id = $this->getInsertID();
                        $this->_lastInsert = $id;
                        $opt = new Option();
                        $data['Option'] = $this->data['Option'];

                        if ($data['Option']['parent_id']==null) $data['Option']
['parent_id']=0;

                        $menu_id = $data['Option']['menu_id'];
                        $parent_id = $data['Option']['parent_id'];

                        $data['Option']['page_id'] = $id;
                        $data['Option']['order'] = $opt->getNextOrder($menu_id,
$parent_id);
                        //$data['Option']['menu'] ; // moj kod ;P
                        $opt->save($data);
                }
                //$opt->insert
                // update extensions (if necessary)
        }

        function verifyUri($data) {

                $pages = $this->findByUri($data['Page']['uri']);
                if ($pages!=null) {
                        if ($pages['Page']['id']==$data['Page']['id']) {
                                return true;
                        } else {
                                return false;
                        }
                } else {
                        return true;
                }

        }
}
?>

 --------------------------------       views/pages/index.ctp
--------------------------------

<div class="pages index">
<h2><?php __('Page List');?></h2>
<p><?php __('Click the column title to sort the list ascending or
descending');?></p><br />
<p>

<?php
define('URI', $html->url('/'));
//print_r($languages);
foreach($languages as $lang) {
//      echo '<span class="lang">'.$lang['Language']['short'].' </span>';
        if ($lang['Language']['default']==1) define('DEFAULT_LANGUAGE',
$lang['Language']['short']);

}
//echo DEFAULT_LANGUAGE;
//print_r($languages[0]['Language']['short']);
function traverseTree($tree, $extensions, $languages) {
        $masterNode['children'] = $tree;
        //echo '<ul>'."\n";
        traverseNode($masterNode, $extensions, $languages);
        //echo '</ul>'."\n";
}

function traverseNode($node, $extensions, $languages) {
        if (empty($node['children'])) return;
        echo '  <ul class="list">'."\n";
        $iterator = 1;
        $count = count($node['children']);
        foreach ($node['children'] as $item) {
                //print_r($item['Page'][DEFAULT_LANGUAGE]);

                echo '          <li>
                <span class="item">
                        <span class="label">
                                <a 
href="'.URI.'backend/pages/edit/'.$item['Page']
[DEFAULT_LANGUAGE]['id'].'">'.($item['Page'][DEFAULT_LANGUAGE]['name']!
=null ? $item['Page'][DEFAULT_LANGUAGE]['name'] : '(inactive)').'</a>
                                <span class="type" title="This page uses the
'.ucfirst($item['extension_name']).' extension">
'.ucfirst($item['extension_name']).'</span>

                        </span>

                        <span class="options">';

                if ($iterator>1) {
                        echo '<a 
href="'.URI.'backend/pages/up/'.$item['id'].'">'.__('Move
up', true).'</a>';
                }

                if ($iterator!=$count) {
                        echo '<a href="'.URI.'backend/pages/down/'.
$item['id'].'">'.__('Move down', true).'</a>';
                }

                if (!key_exists('children', $item)) {
                echo '<a onclick="return confirm(\''.sprintf(__('Are you sure 
you
want to delete %s?', true), $item['Page'][DEFAULT_LANGUAGE]
['name']).'\');" href="'.URI.'backend/pages/delete/'.
$item['id'].'">Delete page</a>';
                }

                //echo $item['extension_name'];

                $disallow_submenu = false;
                if (!empty($extensions[$item['extension_name']])) {
                        if (!empty($extensions[$item['extension_name']]['cfg']
['disallow_submenu'])) {
                                if ($extensions[$item['extension_name']]['cfg']
['disallow_submenu'] == true) {
                                        $disallow_submenu = true;
                                }
                        }
                }

                if ($disallow_submenu==false) {
                echo '<a href="'.URI.'backend/pages/add/'.$item['id'].'">Add
subpage</a>';
                }

                echo '</span>
                        <span class="clr">&nbsp;</span>';
                        //print_r($languages);
                        foreach($languages as $lang) {
                                if($lang['Language']['default'] != 1) {
                                        if 
(empty($item['Page'][$lang['Language']['short']])) {
                                                // langaugize
                                                echo '<span class="lang"><a 
href="'.URI.'backend/pages/
languagize/'.$item['id'].'/'.$lang['Language']['id'].'">Create page in
'.$lang['Language']['long'].'</a></span>';
                                        } else {
                                                // edit
                                                echo '<span class="lang"><a 
href="'.URI.'backend/pages/edit/'.
$item['Page'][$lang['Language']['short']]['id'].'/'.$lang['Language']
['short'].'">'.$lang['Language']['long'].'</a></span>';
                                        }

                                }
                        }
                        '</span>
                '."\n";

                traverseNode($item, $extensions, $languages);

                echo '          </li>'."\n";

                $iterator++;
        }
        echo '  </ul>'."\n";
}

/*
foreach ($tree as $node) {
        echo '<p>'.$node['id'].'</p>';
        traverseNode($node);
}
*/
// convert the tree to a node

traverseTree($tree, $extensions, $languages);
//print_r($tree);
//traverse tree


?>
</p>

<br />
<div class="actions">
        <ul>
                <li><?php echo $html->link(__('>> Click here to create a new 
page in
the top level menu', true), '/backend/pages/add'); ?></li>
        </ul>
</div>

--------------------------------   views/pages/edit.ctp
--------------------------------

<div class="pages form">

<?php echo $form->create('Page', array('url'=>'/backend/pages/edit/'.
$id));?>

        <input type="hidden" name="extension" value="<?php echo
$extension['cfg']['id']; ?>" />

        <h3><?php __('Currently edited page:'); ?> <?php echo $data['Page']
['name']; ?></h3>
        <br />
        <div id="GeneralScreen">
        <fieldset>
                <legend><?php __('Add Page');?></legend>
        <script type="text/javascript">
                translateNameToUri = function() {

                        oid('PageUri').value = oid('PageName').value.replace(/ 
/g,
'_').toLowerCase();
                }

        </script>
        <?php   echo $form->input('id');?>

        <?php
                echo $rkoform->input('name', 'Name of the page. When left 
empty, the
page is considered inactive and is not shown in the menu',
array('onkeyup'=>"translateNameToUri()"));
                echo $rkoform->input('uri', 'The address of the page, must be
unique',  array('onkeyup'=>"blockTranslation()"));
        ?>
                <div id="translationBlockedNotification" style="display:none"
class="warning">You have manually changed the uri. It will no longer
be translated based on the page name.<br />
                <a href="javascript:resetTranslation()">Click here to turn the
translation back on</a>
                </div>
                <div id="translationBlockedAfterLoadNotification"
style="display:none" class="warning">The uri seems to be not
automatically translated. To avoid possible overwriting, automatic
translation is disabled.<br />
                <a href="javascript:resetTranslation()">Click here to turn the
translation back on</a>
                </div>

        <script type="text/javascript">
                var translationBlocked = false;
                translateNameToUri = function() {
                        if (translationBlocked==true) return;
                        oid('PageUri').value = oid('PageName').value.replace(/ 
/g,
'_').toLowerCase();
                }

                blockTranslation = function() {
                        if (translationBlocked==false) {
                                translationBlocked = true;
                                
oid('translationBlockedNotification').style.display="block";
                        }
                }

                checkTranslation = function() {
                        if (oid('PageName').value.replace(/ /g, 
'_').toLowerCase()!
=oid('PageUri').value ) {
                                translationBlocked = true;
 
oid('translationBlockedAfterLoadNotification').style.display="block";
                        }
                }

                resetTranslation = function() {
                        translationBlocked = false;
                        translateNameToUri();
                        
oid('translationBlockedNotification').style.display="none";
 
oid('translationBlockedAfterLoadNotification').style.display="none";
                }

                checkTranslation();
        </script>
        </fieldset>
        </div>
        <div id="MetaScreen">
        <fieldset>
                <legend><?php __('Page Meta');?></legend>
                <?php
                echo $rkoform->input('meta_title', 'Page title meta tag, when 
not
set page name is used');
                echo $rkoform->input('meta_keywords', 'Page keywords meta tag. 
When
not set the site default keywords are used');

                echo $rkoform->input('meta_description', 'Page description meta 
tag.
When not set the site description keywords are used');

                ?>

        </fieldset>
        </div>

        <div id="ExtensionScreen">
                <?php if (file_exists($extension['form_file'])) {
                        echo '<fieldset>';
                        include($extension['form_file']);
                        echo '</fieldset>';
                }
                ?>
        </div>
<?php echo $form->end('Save');?>
</div>

-------------------------- models/option.php
--------------------------------

<?php
class Option extends AppModel {

        var $name = 'Option';
        var $useTable = 'options';

        var $validate = array(
                'page_id' => VALID_NOT_EMPTY
        );

        var $hasMany = 'Page';


        function getLast($menu_id, $parent_id) {
                return $this->find(array(
                'menu_id'=>$menu_id,
                'parent_id'=>$parent_id
                ), 'id, order', 'order DESC');
        }


        function rebuildIndex($menu_id, $parent_id) {

                $options = $this->findAll(array(
                'menu_id'=>$menu_id,
                'parent_id'=>$parent_id
                ), null, 'order ASC');

                $iterator = 1;

                if ($options==null) return;
                // iterate through a level and rebuild index to get rid of
duplicates
                foreach ($options as $option) {
                        $data = array();
                        $data['Option'] = $option['Option'];
                        $data['Option']['order'] = $iterator;
                        // save with the new order
                        $to_save[] = $data;

                        $iterator++;
                }

                $this->saveAll($to_save);
        }

        function getNextOrder($menu_id, $parent_id) {
                $option = $this->getLast($menu_id, $parent_id);
                return $option['Option']['order']+1;
        }

        function up($id) {
                // get previous option
                $opt = $this->find(array('Option.id'=>$id), null, null, false);

                // extract data
                $parent_id = $opt['Option']['parent_id'];
                $menu_id = $opt['Option']['menu_id'];
                $order = $opt['Option']['order'];

                // make sure the index is correct
                $this->rebuildIndex($opt['Option']['menu_id'], $opt['Option']
['parent_id']);

                // get neighbors
                $neighbors = $this->findNeighbours(array(
                'parent_id' => $parent_id,
                'menu_id' => $menu_id
                ), array('order', 'id'), $order);

                // get previous
                $previous = $neighbors['prev'];
                if ($previous == null) return false;

                // move previous down
                $data = array();
                $data['Option']['id'] = $previous['Option']['id'];
                $data['Option']['order'] = $opt['Option']['order'];

                // save new order
                if ($this->save($data)) {
                        // move chosen up
                        $data = array();
                        $data['Option']['id'] = $opt['Option']['id'];
                        $data['Option']['order'] = $previous['Option']['order'];

                        // save new order
                        if ($this->save($data)) {
                                return true;
                        } else {
                                return false;
                        }
                } else {
                        return false;
                }
                return false;
        }
        function down($id) {
                // get option
                $opt = $this->find(array('Option.id'=>$id), null, null, false);

                // extract data
                $parent_id = $opt['Option']['parent_id'];
                $menu_id = $opt['Option']['menu_id'];
                $order = $opt['Option']['order'];

                // make sure the index is correct
                $this->rebuildIndex($opt['Option']['menu_id'], $opt['Option']
['parent_id']);

                // get neighbors
                $neighbors = $this->findNeighbours(array(
                'parent_id' => $parent_id,
                'menu_id' => $menu_id
                ), array('order', 'id'), $order);

                // get previous
                $next = $neighbors['next'];
                if ($next == null) return false;

                // move previous down
                $data = array();
                $data['Option']['id'] = $next['Option']['id'];
                $data['Option']['order'] = $opt['Option']['order'];

                // save new order
                if ($this->save($data)) {
                        // move chosen up
                        $data = array();
                        $data['Option']['id'] = $opt['Option']['id'];
                        $data['Option']['order'] = $next['Option']['order'];

                        // save new order
                        if ($this->save($data)) {
                                return true;
                        } else {
                                return false;
                        }
                } else {
                        return false;
                }
                return false;
        }
        function preSave() {
                // link extension?
        }
        function postSave() {
                // link extension?
        }
}
?>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To post to this group, send email to cake-php@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to