array(grid_id => block data) */ public static function getList($params = array()) { /** * Prepares params for SQL query before getting grids * @param array $params input params * @param string $lang_code 2 letter language code */ fn_set_hook('get_grids_pre', $params); $condition = $join = ''; $fields = array( '*' ); if (!empty($params['container_ids'])) { $condition .= db_quote(" AND g.container_id IN (?n)", $params['container_ids']); } if (!empty($params['simple'])) { $fields = array( 'g.grid_id', 'g.container_id' ); } $grids = db_get_hash_multi_array( "SELECT " . implode(', ', $fields) . " FROM ?:bm_containers as c " . "LEFT JOIN ?:bm_grids as g ON g.container_id = c.container_id ?p" . "WHERE 1 ?p ORDER BY g.order, g.parent_id, g.grid_id ASC", array('container_id', 'grid_id'), $join, $condition ); /** * Processes grids list after getting it * @param array $grids Array of grids data */ fn_set_hook('get_grids_post', $grids); return $grids; } /** * Gets grid data by id * @static * @param int $grid_id Grid identifier * @param string $lang_code 2 letter language code * @return array Grid data */ public static function getById($grid_id, $lang_code = CART_LANGUAGE) { /** * Prepares params for SQL query before getting grid * @param int $grid_id Grid identifier * @param string $lang_code 2 letter language code */ fn_set_hook('get_grid_pre', $grid_id, $lang_code); $grid = db_get_row('SELECT * FROM ?:bm_grids WHERE grid_id = ?i ORDER BY ?:bm_grids.order', $grid_id); /** * Processes grid data after getting it * @param array $grid Array of grid data * @param string $lang_code 2 letter language code */ fn_set_hook('get_grid_post', $grid, $lang_code); return $grid; } /** * Gets identifiers of grids from array of grids as container_id => array(grid_id => block data) * @static * @param array $grids Array of grids as container_id => array(grid_id => block data) * @return array Grid identifiers */ public static function getIds($grids) { $grids_ids = array(); foreach ($grids as $container) { $grids_ids = array_merge($grids_ids, array_keys($container)); } return $grids_ids; } /** * Creates or updates grid * $grid_data must be array in this format *
array (
* grid_id
* container_id
* parent_id
* order
* width - grid 960 param
* suffix - grid 960 param
* prefix - grid 960 param
* omega - grid 960 param
* alpha - grid 960 param
* wrapper - path to wrapper template relative to "templates" directory
* content_align - LEFT|RIGHT|FULL_WIDTH, blocks in this grid will be placed as float left, float right or with width 100% in case.
* html_element - name of html element of this grid (div, ul, li, p, etc.)
* clear - If 1 then after this grid will be clear div on rendered page
* user_class
* )
* @static
* @param array $grid_data Array of grid data
* @return int|db_result Grid id if new grid was created, DB result otherwise
*/
public static function update($grid_data)
{
/**
* Processes grid data before update it
* @param int $grid_data Array of grid data
*/
fn_set_hook('update_grid', $grid_data);
$grid_id = db_replace_into('bm_grids', $grid_data);
return $grid_id;
}
/**
* Removes grid
* @param int $grid_id Grid identifier
* @return bool True in success, false otherwise
*/
public static function remove($grid_id)
{
$grids = db_get_hash_array('SELECT b.grid_id, b.parent_id FROM ?:bm_grids as a LEFT JOIN ?:bm_grids as b ON a.container_id = b.container_id WHERE a.grid_id = ?i ORDER BY b.parent_id, b.grid_id ASC', 'grid_id', $grid_id);
if (!empty($grids)) {
$grids = fn_build_hierarchic_tree($grids, 'grid_id');
foreach ($grids as $grid) {
self::_remove($grid_id, $grid);
}
self::removeMissing();
return true;
} else {
return false;
}
}
/**
* Performs a cleanup: removes grid related data
* @static
* @return bool Always true
*/
public static function removeMissing()
{
// Remove missing grids
db_remove_missing_records('bm_grids', 'container_id', 'bm_containers');
// Remove missing snappings
db_remove_missing_records('bm_snapping', 'grid_id', 'bm_grids');
return true;
}
/**
* Copies grids/snappings from one container to another
* @param int $container_id source container ID
* @param int $new_container_id target container ID
*/
public static function copy($container_id, $new_container_id)
{
$clone_blocks = false;
if (fn_allowed_for('ULTIMATE')) {
$company_ids = db_get_hash_single_array(
"SELECT lay.company_id, con.container_id FROM ?:bm_layouts as lay " .
"LEFT JOIN ?:bm_locations as loc ON loc.layout_id = lay.layout_id " .
"LEFT JOIN ?:bm_containers as con ON con.location_id = loc.location_id " .
"WHERE con.container_id IN (?n)",
array('container_id', 'company_id'),
array($container_id, $new_container_id));
if ($company_ids[$container_id] != $company_ids[$new_container_id]) {
$clone_blocks = true;
}
}
$links = array();
$grids = db_get_hash_array("SELECT * FROM ?:bm_grids WHERE container_id = ?i ORDER BY grid_id", 'grid_id', $container_id); //FIXME: order should not be by grid ID
foreach ($grids as $grid_id => $grid) {
unset($grid['grid_id']);
$grid['container_id'] = $new_container_id;
$new_grid_id = db_query("INSERT INTO ?:bm_grids ?e", $grid);
$links[$grid_id] = $new_grid_id;
}
$new_snapping_ids = array();
foreach ($links as $old_grid_id => $new_grid_id) {
db_query("UPDATE ?:bm_grids SET parent_id = ?i WHERE parent_id = ?i AND grid_id IN (?n)", $new_grid_id, $old_grid_id, $links);
$snappings = db_get_hash_array("SELECT * FROM ?:bm_snapping WHERE grid_id = ?i", 'snapping_id', $old_grid_id);
foreach ($snappings as $snapping_id => $snapping) {
unset($snapping['snapping_id']);
$snapping['grid_id'] = $new_grid_id;
$new_snapping_id = db_query("INSERT INTO ?:bm_snapping ?e", $snapping);
$new_snapping_ids[$snapping_id] = $new_snapping_id;
$statuses = db_get_array("SELECT * FROM ?:bm_block_statuses WHERE snapping_id = ?i", $snapping_id);
foreach ($statuses as $status) {
$status['snapping_id'] = $new_snapping_id;
db_query("INSERT INTO ?:bm_block_statuses ?e", $status);
}
}
}
if ($clone_blocks == true) {
Block::instance($company_ids[$container_id])->copy($new_snapping_ids, $company_ids[$new_container_id]);
}
}
/**
* Sets the clear param as 1 on the grids that must have a clear div after them.
* @static
* @param array $clear_divs_data
* @return bool Always true
*/
public static function setClearDivs($clear_divs_data)
{
if (!empty($clear_divs_data['containers'])) {
db_query('UPDATE ?:bm_grids SET clear = 0 WHERE container_id IN (?a)', array_keys($clear_divs_data['containers']));
}
if (!empty($clear_divs_data['grids'])) {
db_query('UPDATE ?:bm_grids SET clear = 1 WHERE grid_id IN (?a)', array_keys($clear_divs_data['grids']));
}
return true;
}
/**
* @static
* @param $start_grid_id
* @param $grid
* @param bool $delete_grids
*/
private static function _remove($start_grid_id, $grid, $delete_grids = false)
{
if (isset($grid['grid_id']) && $start_grid_id == $grid['grid_id']) {
$delete_grids = true;
}
if ($delete_grids) {
/**
* Action before remove grid
* @param int $grid_id Grid identifier
*/
$grid_id = $grid['grid_id'];
fn_set_hook('remove_grid', $grid_id);
db_query('DELETE FROM ?:bm_grids WHERE grid_id = ?i', $grid['grid_id']);
}
if (!empty($grid['children']) && is_array($grid['children'])) {
foreach ($grid['children'] as $_grid) {
self::_remove($start_grid_id, $_grid, $delete_grids);
}
}
}
}