Сниппеты. Решение часто возникающих задач
Простые и быстрые решения. DVelum 0.9.x
- Сформировать путь к странице на основе правил формирования URL
- Сформировать путь к странице публичной части, использующей определенную функциональность (модуль)
- Определить, авторизирован ли пользователь
- Авторизовать пользователя по логину и паролю
- Извлечь колонку из многомерного массива (актуально для результатов выборок из базы данных)
- Переиндексировать многомерный массив (актуально для результатов выборок из базы данных)
- Перегруппировать данные многомерного массива (актуально для результатов выборок из базы данных)
- Получить хэш, используя системную хэширующую функцию системы (использует предустановленную в файле конфигурации ‘соль’)
- Получить объект конфигурации. Подключить конфигурационный файл php (содержащий массив)
- Получить объект, содержащий основную конфигурацию. Получить Main Config
- Узнать количество объектов определенного типа (количество строк в таблице БД)
- Выборка данных объекта при помощи модели
- Получить ссылку на инстанцированый адаптер подключения к базе данных
- Получить ссылку на инстанцированый адаптер кэша
- Вставить html в центральную часть страницы вне шаблона (публичная часть)
- Изменение html-заголовка страницы и мета-содержания
- Шаблон. Вывести блоки, назначенные на определенную позицию (плейсхолдер)
- Вывести в таблицу заголовок вместо ссылки на объект
Сформировать путь к странице на основе правил формирования 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)));
}