Codeigniter создает динамические боковые панели

Я искал гибкий способ создания разных боковых панелей на разных страницах. Цель состоит в том, чтобы передать пользовательские ссылки на каждую боковую панель. Библиотеки шаблонов казались излишними для моего приложения, поэтому я разработал простое решение. Я не уверен, что это лучшее решение. Мой вопрос, что вы думаете? Ваш совет очень ценен!

1. В вашем контроллере добавьте приватную функцию, которая загружает вашу боковую панель:

/**
 * The function has 2 arguments. 
 * $title is the sidebar widget title.
 * $widget will contain an array of links to be added in the sidebar widget.
 */

private function sidebar($title, $widget)   
{
    $widget['title'] = $title;
    $this->load->view('includes/sidebar', $widget); 
}

2. В функциях контроллера, для которых вы хотите загрузить пользовательскую боковую панель, вызовите закрытую функцию sidebar() и передайте ей нужные данные боковой панели.

Ниже приведена функция контроллера с именем edit, используемая для редактирования сообщений. В примере мне нужно загрузить боковую панель с параметрами для просмотра и удаления сообщения, в котором я нахожусь:

function edit($post_id = '')
{
    //your code, form validation, etc...

    //Prepare sidebar widget links
    //Array key is link url, array value is link name
    $widget['links'] = array (
        'posts/single/' . $post_id => 'View post',
        'posts/remove/' . $post_id => 'Remove post'
    );
    $this->sidebar('Options', $widget);  //load sidebar  
}

3. Наконец, боковая панель, отображающая пользовательские данные, переданные из контроллера:

<div id="sidebar">
    <ul>
        <li class="widget">
            <div class="label"><?php echo $title; ?></div>
            <ul>
                <?php foreach ($links as $link => $value): ?>
                    <li><?php echo anchor($link, $value); ?></li>
                <?php endforeach; ?>
            </ul>
        </li>
    </ul>
</div>

Заключение

Добавьте следующий код в любую функцию контроллера для пользовательского заголовка боковой панели и ссылок:

$widget['links'] = array (
            'controller/function' => 'Link Name 1',
            'controller/function' => 'Link Name 2',
            'controller/function' => 'Link Name 3'
);
$this->sidebar('Widget Title', $widget);

person CyberJunkie    schedule 29.06.2012    source источник


Ответы (1)


Я думаю, что это делается. Я не эксперт в CodeIgniter, но могу сказать, что это нормально. Одна вещь, которую вы всегда должны проверять, это проверка данных, передаваемых в функцию. В таком случае:

private function sidebar($title=FALSE, $widget=FALSE) {
   if ($title && $widget) {
      //process
   }
   else
      return FALSE
   }
}

Другой способ сделать это — просто передать ссылки на шаблон (не шаблон боковой панели, а ваш основной шаблон:

$data['sidebar'] = array('link/link'=>'My Link');
$this->load->view('mytemplate', $data);

А в шаблоне вы загружаете шаблон боковой панели и передаете ему данные:

<html>
<!--All my html-->
<?php $this->load->view('includes/sidebar', $data['sidebar']); ?>
</html>

Это просто еще один вариант. Но то, что ты сделал, просто прекрасно.

person fedejp    schedule 29.06.2012
comment
спасибо, хорошая альтернатива. Я обычно устанавливаю аргументы функции в пустую строку function sidebar($title = '', $widget = ''. Я не пробовал использовать FALSE раньше. Приватная функция хороша для гибкости. Если, например, вы хотите изменить URL-адрес просмотра, вы должны изменить его в частной функции, и вам не нужно редактировать каждую функцию. - person CyberJunkie; 30.06.2012