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"> </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 -~----------~----~----~----~------~----~------~--~---