Сниппеты. Решение часто возникающих задач

Простые и быстрые решения. DVelum 0.9.x

Сформировать путь к странице на основе правил формирования URL

Request::url(array('controller' , 'action' , 'subaction') , true);

Стандартная конфигурация использует «/» как разделитель и «.html» как расширение. Будет сформирован путь: /controller/action/subaction.html

Сформировать путь к странице публичной части, использующей определенную функциональность (модуль)

Допустим, к странице с кодом newspage прикреплена функциональность news, необходимо сформировать ссылку на вторую новостную страницу:

$frontendRouter = new Frontend_Router(); 
$url = Request::url( array( $frontendRouter->findUrl('news') , 2 ) , true);

Будет сформирован путь: /news/2.html

Определить, авторизован ли пользователь

$user = User::getInstance(); 
$authorized = $user->isAuthorized();

Авторизовать пользователя по логину и паролю

$user = User::login($login , $password);

Если пара login-password верная, то $user будет содержать ссылку на объект User, иначе false.

Извлечь колонку из многомерного массива (актуально для результатов выборок из базы данных)

$data = array(
   array('id' => 10 , 'name' => 'Name1' , 'group' => 'admin'),
   array('id' => 22 , 'name' => 'Name2' , 'group' => 'admin'),
   array('id' => 34 , 'name' => 'Name3' , 'group' => 'dev'),
   array('id' => 45 , 'name' => 'Name4' , 'group' => 'admin'),
   array('id' => 52 , 'name' => 'Name5' , 'group' => 'dev'),
   array('id' => 61 , 'name' => 'Name6' , 'group' => 'user'),
);
$ids = Utils::fetchCol('id' , $data);
print_r($ids);
//Будет получено:
Array
(
   [0] => 10
   [1] => 22
   [2] => 34
   [3] => 45
   [4] => 52
   [5] => 61
)

Переиндексировать многомерный массив (актуально для результатов выборок из базы данных)

$data = array(
    array('id'=>10,'name'=>'Name1','group'=>'admin'),
    array('id'=>22,'name'=>'Name2','group'=>'admin'),
    array('id'=>34,'name'=>'Name3','group'=>'dev'),
    array('id'=>45,'name'=>'Name4','group'=>'admin'),
    array('id'=>52,'name'=>'Name5','group'=>'dev'),
    array('id'=>61,'name'=>'Name6','group'=>'user'),
);
$ids = Utils::rekey('id' , $data);
print_r($ids);
Array
(
    [10] => Array([id] => 10 [name] => Name1 [group] => admin)
    [22] => Array([id] => 22 [name] => Name2 [group] => admin)
    [34] => Array([id] => 34 [name] => Name3 [group] => dev)
    [45] => Array([id] => 45[name] => Name4[group] => admin)
    [52] => Array([id] => 52[name] => Name5[group] => dev)
    [61] => Array([id] => 61[name] => Name6[group] => user)
)

Перегруппировать данные многомерного массива (актуально для результатов выборок из базы данных)

$data = array(
 	array('id'=>10,'name'=>'Name1','group'=>'admin'),
 	array('id'=>22,'name'=>'Name2','group'=>'admin'),
 	array('id'=>34,'name'=>'Name3','group'=>'dev'),
 	array('id'=>45,'name'=>'Name4','group'=>'admin'),
 	array('id'=>52,'name'=>'Name5','group'=>'dev'),
 	array('id'=>61,'name'=>'Name6','group'=>'user'),
);
$ids = Utils::groupByKey('group' , $data);
print_r($ids);
Array
(
     [admin] => Array (
         [0] => Array([id] => 10 [name] => Name1 [group] => admin)
         [1] => Array([id] => 22 [name] => Name2 [group] => admin)
         [2] => Array([id] => 45 [name] => Name4 [group] => admin)
     )
     [dev] => Array (
         [0] => Array([id] => 34 [name] => Name3 [group] => dev)
         [1] => Array([id] => 52 [name] => Name5 [group] => dev)
     )
     [user] => Array (
         [0] => Array([id] => 61 [name] => Name6 [group] => user)
     )
)

Получить хэш, используя системную хэширующую функцию системы (использует предустановленную в файле конфигурации 'соль')

Используется для хэширования паролей.

$hash = Utils::hash('string');

Запуск метода необходимо производить после инициализации класса Application, или самостоятельно установить ‘соль’ методом:

Utils::setSalt('somestring');

Получить объект конфигурации. Подключить конфигурационный файл php (содержащий массив)

Получим объект конфигурации новостей, расположенный по адресу: ./system/app/config/news.php

/**
 * @var Config_Abstract
 */
$someCfg = Config::factory(Config::File_Array, './system/app/config/news.php');

Получить объект, содержащий основную конфигурацию. Получить Main Config

/**
 * @var Config_Abstract
 */
$cfg = Registry::get('main','config');

Конфигурация хранится в реестре, заносится туда файлом index.php

Узнать количество объектов определенного типа (количество строк в таблице БД)

Получим количество активных учетных записей пользователей (объект User):

 

$count = Model::factory('user')->getCount(array('enabled'=>1)); 

 

Выборка данных объекта при помощи модели

Пример: Выбрать 10 последних новостей

/*
 * Параметры выборки. Получить 10 строк, отсортированных по news_date в порядке убывания
 */
$params = array(
 	'sort'=>'news_date',
 	'dir'=>'DESC',
 	'start'=>0,
 	'limit'=>10
);
/*  
 * Фильтры. Только опубликованные записи  
 */ 
$filters = array('published'=>true); 
/*  
 * Список полей, которые необходимо выбрать  
 */ 
$fields = array('id','title','news_date'); 
/*  
 * Инициализируем модель  
 */ 
$model = Model::factory('News'); 
$data = $model->getList($params , $filters , $fields); 

Получить ссылку на инстанцированый адаптер подключения к базе данных

// Адаптер подключения к базе данных по умолчанию
/**
 * @var Zend_Db_Adapter_Abstract
 */
$db = Model::getGlobalDbConnection();
// Адаптер подключения к базе данных, используемый моделью User
/**
 * @var Zend_Db_Adapter_Abstract
 */
$db = Model::factory('user')->getDbConnection();

Получить ссылку на инстанцированый адаптер кэша

// Получить адаптер кэширования данных
$cm = new Cache_Manager();
/**
 * @var Cache_Abstract | false
 */
$cache = $cm->get('data');

Вставить html в центральную часть страницы вне шаблона (публичная часть)

$page = Page::getInstance();
$page->text.='Some text';

Будьте внимательны, некоторые объекты уже содержат ссылку на объект Page. Например, внутри контроллера публичной части можно написать так:

class Frontend_Controller_News extends Frontend_Controller 
{
   public function someAction()
   {
       $this->_page->text.= ’Some text’;
   }
}

Изменение html-заголовка страницы и мета-содержания

class Frontend_Controller_News extends Frontend_Controller 
{
   public function someAction()
   {
       // дополнение текста
       $this->_page->text.=’Some text’;
       // изменение html-заголовка страницы (тот, что отображается в заголовке окна браузера или его вкладки)
       $this->_page->html_title = 'Page HTML Title';
       // изменение заголовка страницы (обычно выводится внутри шаблона в теге)
       $this->_page->page_title = 'Page Title';
       // изменение содержания тега 
       $this->_page->meta_keywords = 'page meta key words';
       // изменение содержания тега 
       $this->_page->meta_description = 'page meta description';
    }
 }

Шаблон. Вывести блоки, назначенные на определенную позицию

Блоки выводятся в шаблонах, для этого нам необходима ссылка на менеджер блоков, она автоматически передается в шаблон layout.php. Если менеджер блоков вам нужен на вложенном уровне шаблонов, то перед рендерингом передайте ссылку на менеджер блоков. Конфигурация макета (laout_cfg.php) содержит набор плейсхолдеров, к которым привязываются блоки в административном интерфейсе. Каждый плейсхолдер имеет свой код, зная этот код можно вывести блоки в шаблон:

$blockManager = $this->get('blockManager');
echo $blockManager->getBlocksHtml('placecode');

Вывести в таблицу заголовок вместо ссылки на объект

Самое простое решение - переопределить listAction контроллера:

public function listAction()
{
	$pager = Request::post('pager' , 'array' , array());
	$filter = Request::post('filter' , 'array' , array());
	$query = Request::post('search' , 'string' , false);
	
	$filter = array_merge($filter , Request::extFilters());

	$dataModel = Model::factory($this->_objectName);

	$data = $dataModel->getListVc($pager , $filter , $query , $this->_listFields);
	
	// представим, что в объекте есть поле page_id, ссылка на объект page

	if(empty($data))
		Response::jsonSuccess(array() , array('count' => 0 ));

	// получаем все id объекта page, на которые ссылаются выбранные строки
	$pageIds = Utils::fetchCol('page_id', $data);
	// получаем данные объектов page
	$pageData = Model::factory('page')->getList(false , array('id'=>$pageIds), array('id','title'));
	if(!empty($pageData)){
		// переиндексируем по Id
		$pageData = Utils::rekey('id', $pageData);
		foreach ($data as $k=>&$v)
		{
			// подменяем данные строки на заголовок
			if(isset($pageData[$v['page_id']]))
				$v['page_id'] = $pageData[$v['page_id']]['title'];
			else
				$v['page_id'] = '';
		}unset($v);
	}

	Response::jsonSuccess($data , array('count' => $dataModel->getCount($filter , $query)));
}