569 lines
20 KiB
PHP
569 lines
20 KiB
PHP
<?php
|
|
|
|
namespace BRSystems\Core\Library\cMapUrls;
|
|
|
|
use BRSystems\Core\Library\cUrl\cUrl;
|
|
|
|
/**
|
|
* Map Urls class
|
|
*
|
|
* @category LIB Map Urls
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @since Version 1.0
|
|
*/
|
|
class cMapUrls
|
|
{
|
|
private $module;
|
|
private $mapData = array();
|
|
private $mapDataArray = array();
|
|
|
|
const type_map = 0;
|
|
const type_map_url = 1;
|
|
|
|
private $defaultLangId = 0;
|
|
|
|
/**
|
|
* Class constructor
|
|
*/
|
|
public function __construct() {
|
|
|
|
|
|
$this->module = new cMapUrlsModule();
|
|
|
|
}
|
|
|
|
/**
|
|
* Function to create site map urls new array if no errors found, else return error array
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category LIB Map Urls
|
|
* @param array $urls4products - lang key based array for passed site map chunks -> lang_id => array( 'l' => '/link-to-add/', 'id' => 'alias_id' )
|
|
* @param int|bool $recordId - by ref item id for storage
|
|
* @param int|bool $sm_aliasID - site map alias id
|
|
* @param int|bool $smu_aliasID - site map urls alias id
|
|
* @param int $url_type - url type
|
|
* @param int $urlChCount - url chunk count before before substring cutting of products
|
|
* @return void|array containing errors
|
|
*/
|
|
public function checkAndCreateMapUrlsForInsert($urls4products = array(), &$recordId = 0, $sm_aliasID = false, $smu_aliasID = false, $url_type = 0, $urlChCount = 1){
|
|
|
|
$oUrl = new cUrl();
|
|
$oUrl->_endSlash = true;
|
|
|
|
if(!!$urls4products && is_array($urls4products) && ($sm_aliasID || $smu_aliasID)){
|
|
|
|
// Get base urls data
|
|
$baseUrl = $this->getFullUrlById($sm_aliasID, $smu_aliasID);
|
|
$urlChCount = substr_count($oUrl->rmSlashesIndex(firstE($baseUrl)['url']), '/');
|
|
|
|
if(!!$baseUrl && is_array($baseUrl)){
|
|
|
|
$i = 0;
|
|
$nUrl = array();
|
|
$node = array();
|
|
$itemUrls = array();
|
|
$this->mapData = array();
|
|
$mapDataLangRefId = 0;
|
|
|
|
// Load all item linked data for update or insert
|
|
if($recordId){
|
|
$itemUrls = $this->module->getAllSiteMapUrlsByItemId($recordId, $urlChCount);
|
|
}
|
|
|
|
// Loop each url chunk
|
|
foreach($urls4products as $langId=>$v){
|
|
|
|
$id = 0;
|
|
$parentUrl = $oUrl->rmSlashesIndex((!empty($baseUrl[$langId]['url']) ? $baseUrl[$langId]['url'] :'/dummy-link/'));
|
|
|
|
if(!!$parentUrl){
|
|
$nUrl[$langId] = $this->addUrlChunk($parentUrl, $v["l"]);
|
|
|
|
// Check if found & set id & ref
|
|
if (!empty($itemUrls[$langId][$parentUrl])) {
|
|
$id = $itemUrls[$langId][$parentUrl]['id'];
|
|
$mapDataLangRefId = $itemUrls[$langId][$parentUrl]['r_id'];
|
|
//pr($id, $baseUrl);
|
|
}
|
|
|
|
// Create new link item
|
|
$node = array(
|
|
'id' => $id,
|
|
'url_fname' => $nUrl[$langId],
|
|
'url_alias_id' => $baseUrl[$langId]['map_id'],
|
|
'url_type' => $url_type,
|
|
'url_lang_ref_id' => &$mapDataLangRefId,
|
|
'url_lang_id' => $langId,
|
|
'url_item_id' => &$recordId,
|
|
'url_p_id' => 0,
|
|
);
|
|
|
|
if(!!$smu_aliasID)
|
|
$node['url_p_id'] = $smu_aliasID;
|
|
}
|
|
|
|
$this->mapData[($id ? $id : 'c' . $i++)] = $node;
|
|
}
|
|
|
|
// Check if found duplicates
|
|
if(!!($foundUrls = $this->chkModUrlExists($nUrl, false, array_keys($this->mapData)))){
|
|
// Go through all provided links & set error array for return
|
|
foreach($nUrl as $langId=>$url){
|
|
if(!in_array($url, $foundUrls)){
|
|
unset($nUrl[$langId]);
|
|
}
|
|
}
|
|
|
|
// Send error lang links
|
|
return $nUrl;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Function to create site map urls new array if no errors found, else return error array
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category LIB Map Urls
|
|
* @param array $urls4products - lang key based array for passed site map chunks -> lang_id => '/link-to-add/'
|
|
* @param int|bool $recordId - by ref item id for storage
|
|
* @param array|bool $sm_aliasID - site map alias id's
|
|
* @param array|bool $smu_aliasID - site map urls alias id's
|
|
* @param int|bool $url_type - url type
|
|
* @param array|bool $baseUrlData - overwritten data array for urls -> id => array( 'language_id' => array( 'url' => '/url-to-add/', 'map_id' => 233)
|
|
* @param bool $subCat - whether its has sub cat or not
|
|
* @return void|array containing errors
|
|
*/
|
|
public function checkAndCreateMapUrlsForInsertArrayToArray(
|
|
$urls4products = [],
|
|
&$recordId = 0,
|
|
$sm_aliasID = false,
|
|
$smu_aliasID = false,
|
|
$url_type = false,
|
|
$baseUrlData = false,
|
|
$subCat = false
|
|
) {
|
|
$itemUrls = [];
|
|
if (!!$urls4products && is_array($urls4products) && (!!$sm_aliasID || !!$smu_aliasID || !!$baseUrlData)) {
|
|
|
|
if (!!$sm_aliasID && !is_array($sm_aliasID))
|
|
$sm_aliasID = array($sm_aliasID);
|
|
if (!!$smu_aliasID && !is_array($smu_aliasID))
|
|
$smu_aliasID = array($smu_aliasID);
|
|
|
|
|
|
// Get base urls data
|
|
if (!!!$baseUrlData || !is_array($baseUrlData))
|
|
$baseUrlData = $this->getFullUrlById($sm_aliasID, $smu_aliasID);
|
|
|
|
// Load all item linked data for update or insert
|
|
if ($recordId) $itemUrls = $this->module->getAllSiteMapUrlsByItemId($recordId, $subCat ? 4 : 3);
|
|
//pr([$baseUrlData, $recordId, $itemUrls]);
|
|
|
|
if (!!$baseUrlData && is_array($baseUrlData)) {
|
|
$i = 0;
|
|
$nUrl = [];
|
|
$this->mapDataArray = [];
|
|
|
|
// Loop each record
|
|
foreach ($baseUrlData as $subType => $langUrls) {
|
|
|
|
$langUrls['mapDataLangRefId'] = 0;
|
|
foreach($urls4products as $langId=>$urlChunk) {
|
|
$id = 0;
|
|
$mapId = 0;
|
|
$parentUrl = '';
|
|
if(!empty($langUrls[$langId]['url'])){
|
|
$mapId = $langUrls[$langId]['map_id'];
|
|
$parentUrl = $langUrls[$langId]['url'];
|
|
}
|
|
|
|
if (!!$parentUrl) {
|
|
$nUrl["{$i}-{$langId}"] = $this->addUrlChunk($parentUrl, $urlChunk);
|
|
|
|
//pr([$parentUrl, $itemUrls[$langId]]);
|
|
// Check if found & set id & ref
|
|
if (!empty($itemUrls[$langId][$parentUrl])) {
|
|
$id = $itemUrls[$langId][$parentUrl]['id'];
|
|
$langUrls['mapDataLangRefId'] = $itemUrls[$langId][$parentUrl]['r_id'];
|
|
}
|
|
|
|
// Create new link item
|
|
$this->mapDataArray[($id ?: "c{$i}")] = [
|
|
'id' => $id,
|
|
'url_p_id' => ($subType ?: 0),
|
|
'url_fname' => $nUrl["{$i}-{$langId}"],
|
|
'url_alias_id' => $mapId,
|
|
'url_type' => ($url_type ?: 0),
|
|
'url_lang_ref_id' => &$langUrls['mapDataLangRefId'],
|
|
'url_lang_id' => $langId,
|
|
'url_item_id' => &$recordId,
|
|
];
|
|
$i++;
|
|
}
|
|
}
|
|
}
|
|
//pr($this->mapDataArray);
|
|
|
|
// Check if found duplicates
|
|
if (!!($foundUrls = $this->chkModUrlExists($nUrl, false, array_keys($this->mapDataArray)))) {
|
|
// Go through all provided links & set error array for return
|
|
$errors = [];
|
|
foreach ($nUrl as $key => $url) {
|
|
if (in_array($url, $foundUrls)) {
|
|
$p = explode('-', $key);
|
|
$errors[$p[1]] = $urls4products[$p[1]];
|
|
}
|
|
unset($p, $nUrl[$key]);
|
|
}
|
|
|
|
// Send error lang links
|
|
return $errors;
|
|
}
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Function to update map url data & update alias ids to translation array
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category LIB Map Urls
|
|
* @param array $sTranslations - translation array based on language keys -> lang_id => array( data_keys => values )
|
|
* @param string $sKey - field key to set alias id
|
|
* @param bool $bUpdateChildUrls - update child urls in site_maps_urls table
|
|
* @return bool
|
|
*/
|
|
public function updateMapUrls(&$sTranslations, $sKey, $bUpdateChildUrls = false){
|
|
|
|
if(!!$this->mapData){
|
|
|
|
// Set lang ref id
|
|
foreach($this->mapData as &$v){
|
|
if(!$v['id'])
|
|
break;
|
|
if(!$this->defaultLangId)
|
|
$this->defaultLangId = $v['url_lang_id'];
|
|
if($v['url_lang_id'] == $this->defaultLangId){
|
|
$v['url_lang_ref_id'] = $v['id'];
|
|
break;
|
|
}
|
|
}
|
|
unset($v);
|
|
|
|
foreach($this->mapData as &$v){
|
|
|
|
if($v['id']){
|
|
// Update children urls
|
|
if($bUpdateChildUrls)
|
|
$this->module->updateChildUrlsByParentId($v['id'], $v['url_fname'], $v['url_lang_id']);
|
|
|
|
// update link
|
|
$this->module->saveMapUrlsData($v['id'], array(
|
|
'url_fname' => $v['url_fname'],
|
|
'url_alias_id' => $v['url_alias_id'],
|
|
'url_type' => $v['url_type'],
|
|
'url_lang_ref_id' => $v['url_lang_ref_id'],
|
|
'url_p_id' => $v['url_p_id'],
|
|
), array(
|
|
'id' => $v['id'],
|
|
'url_lang_id' => $v['url_lang_id']
|
|
));
|
|
}else{
|
|
// Insert new link
|
|
unset($v['id']);
|
|
$v['id'] = $this->module->saveMapUrlsData(false, $v);
|
|
|
|
if(!$v['url_lang_ref_id']){
|
|
$v['url_lang_ref_id'] = $v['id'];
|
|
$this->module->saveMapUrlsData($v['id'], array('url_lang_ref_id' => $v['id']));
|
|
}
|
|
}
|
|
|
|
if(isset($sTranslations[$v['url_lang_id']][$sKey]))
|
|
$sTranslations[$v['url_lang_id']][$sKey] = $v['id'];
|
|
}
|
|
unset($v);
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
/**
|
|
* Function to update map url data array
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category LIB Map Urls
|
|
* @return bool
|
|
*/
|
|
public function updateMapUrlsArray(){
|
|
|
|
if(!!$this->mapDataArray){
|
|
|
|
foreach($this->mapDataArray as &$v){
|
|
|
|
$id = $v['id'];
|
|
unset($v['id']);
|
|
|
|
if(!!$id){
|
|
// update link
|
|
$this->module->saveMapUrlsData($id, $v, array(
|
|
'id' => $id,
|
|
'url_lang_id' => $v['url_lang_id']
|
|
));
|
|
}else{
|
|
// Insert new link
|
|
$id = $this->module->saveMapUrlsData(false, $v);
|
|
// Update references
|
|
if(!$v['url_lang_ref_id']){
|
|
$v['url_lang_ref_id'] = $id;
|
|
$this->module->saveMapUrlsData($id, array('url_lang_ref_id' => $id));
|
|
}
|
|
}
|
|
}
|
|
|
|
unset($v);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
/**
|
|
* Function to generate & insert new sub-child urls
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category LIB Map Urls
|
|
* @param array $sTranslations - translation array based on product to language keys -> prod_id => lang_id => array( data_keys => values )
|
|
* @param string $sKey - field key to set alias id
|
|
* @param array $urlChunks - chunk array based on -> prod_id => language keys => url
|
|
* @param array $aliasesToDelete - alias ids to delete
|
|
* @param string $sUrlType - url type
|
|
* @param int|bool $defLangId - default language id
|
|
* @return mixed
|
|
*/
|
|
public function updateSubChildrenUrls(&$sTranslations, $sKey, $urlChunks, $aliasesToDelete, $sUrlType, $defLangId = false){
|
|
|
|
$this->defaultLangId = $defLangId;
|
|
|
|
// Delete old urls
|
|
if(!!$aliasesToDelete && is_array($aliasesToDelete) && $sUrlType){
|
|
$this->module->deleteAliasesById($aliasesToDelete, $sUrlType);
|
|
}
|
|
|
|
if(!!$urlChunks && is_array($urlChunks) && $sUrlType && !!$this->mapData){
|
|
|
|
// Recreate base url array
|
|
$baseUrl = array();
|
|
foreach($this->mapData as $v){
|
|
$baseUrl[$v['url_lang_id']] = array(
|
|
'l' => $v['url_fname'],
|
|
'map_id' => $v['url_alias_id'],
|
|
);
|
|
}
|
|
|
|
|
|
|
|
$i = 0;
|
|
$mapData = array();
|
|
$this->mapData = array();
|
|
|
|
// Loop each passed prod & languages creating links
|
|
$nUrl = array();
|
|
foreach($urlChunks as $pId=>$prodLangs){
|
|
if(!!$prodLangs && is_array($prodLangs)){
|
|
|
|
$mapDataLangRefId = 0;
|
|
foreach($prodLangs as $langId=>$url){
|
|
if(!empty($url)){
|
|
$nUrl[$i] = $this->addUrlChunk((!empty($baseUrl[$langId]['l']) ? $baseUrl[$langId]['l'] : '/dummy-sub-link/'), $url);
|
|
|
|
// Create new link item
|
|
$mapData[$pId][$langId] = array(
|
|
'id' => 0,
|
|
'url_fname' => $nUrl[$i],
|
|
'url_alias_id' => $baseUrl[$langId]['map_id'],
|
|
'url_type' => $sUrlType,
|
|
'url_lang_ref_id' => &$mapDataLangRefId,
|
|
'url_lang_id' => $langId,
|
|
);
|
|
|
|
$i++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Check if found duplicates
|
|
if(!!($foundUrls = $this->chkModUrlExists($nUrl))){
|
|
return 'Somwhere duplicate url found';
|
|
}
|
|
|
|
// Insert new ones
|
|
if(!!$mapData && is_array($mapData)){
|
|
foreach ($mapData as $pId=>$langTrData){
|
|
$this->mapData = $langTrData;
|
|
if(isset($sTranslations[$pId]))
|
|
$this->updateMapUrls($sTranslations[$pId], $sKey);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Function to get site map url by id
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category LIB Map Urls
|
|
* @param int|array|bool $eSid - exclude site_map id
|
|
* @param int|array|bool $eUid - exclude site_map_urls id
|
|
* @return string - url data
|
|
*/
|
|
private function getFullUrlById($eSid = false, $eUid = false){
|
|
|
|
if(!!$eSid){
|
|
if(is_array($eSid))
|
|
return $this->module->getSiteMapDataArrayById($eSid);
|
|
else
|
|
return $this->module->getSiteMapDataById($eSid, 'p_full_url', true);
|
|
}elseif(!!$eUid){
|
|
if(is_array($eUid))
|
|
return $this->module->getSiteMapUrlsDataArrayById($eUid);
|
|
else
|
|
return $this->module->getSiteMapUrlsDataById($eUid, 'url_fname', true);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Function to check if url already exists in db
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category LIB Map Urls
|
|
* @param string|array $url - search full link
|
|
* @param int|array|bool $eSid - exclude site_map id
|
|
* @param int|array|bool $eUid - exclude site_map_urls id
|
|
* @return string - ajax request code
|
|
*/
|
|
public function chkModUrlExists($url, $eSid = false, $eUid = false){
|
|
|
|
if(is_string($url))
|
|
$url = array($url);
|
|
|
|
// Get all found data from both tables
|
|
// Array structure for keys -> 'type', 'lang_ref_id', 'id'
|
|
$foundData = $this->module->getAllUrlOccurrencesInBothTables($url);
|
|
//pr([$eSid, $eUid, $foundData]);
|
|
// Loop data & unset unneeded
|
|
if(!!$foundData && is_array($foundData)){
|
|
$id = array(0);
|
|
$type = -1;
|
|
if($eSid){
|
|
$type = self::type_map;
|
|
$id = array_flip(is_array($eSid) ? $eSid : array($eSid));
|
|
}elseif($eUid){
|
|
$type = self::type_map_url;
|
|
$id = array_flip(is_array($eUid) ? $eUid : array($eUid));
|
|
}
|
|
//pr([$id, $foundData, $type]);
|
|
if(isset($foundData[$type]) && !!$foundData[$type]){
|
|
// remove all ref id based data
|
|
$foundData[$type] = array_diff_key($foundData[$type], $id);
|
|
// Loop each base id
|
|
if(!!$foundData[$type]){
|
|
foreach($foundData[$type] as $ref_id=>$v){
|
|
if(count(array_intersect_key($v, $id))){
|
|
unset($foundData[$type][$ref_id]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!!!$foundData[$type])
|
|
unset($foundData[$type]);
|
|
|
|
if(!empty($foundData))
|
|
return $this->array_value_recursive($foundData);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Function to add url chunk & create correct full urls
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category LIB Map Urls
|
|
* @param string $baseUrl - base full url
|
|
* @param string $chunk - chunk to add at the end
|
|
* @param bool $lang - has language attached
|
|
* @return string - url data
|
|
*/
|
|
private function addUrlChunk($baseUrl, $chunk, $lang = false){
|
|
|
|
if($baseUrl && $chunk){
|
|
// Replace startiong and ending slashes
|
|
$chunks = explode('/', preg_replace('/^\/|\/+$/', '', $baseUrl));
|
|
|
|
// Handle language
|
|
if($lang){
|
|
$lang = array_pop($chunks);
|
|
$chunks[] = $chunk;
|
|
$chunks[] = $lang;
|
|
}else{
|
|
$chunks[] = $chunk;
|
|
}
|
|
|
|
if($chunks[0] == 'index')
|
|
unset($chunks[0]);
|
|
|
|
return '/' . implode('/', array_filter($chunks)) . '/';
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Function to get all array values from depth of an array
|
|
*
|
|
* @author Mareks Keišs <mareks.keiss@brsystems.lv>
|
|
* @category LIB Map Urls
|
|
* @param array $arr - array to walk
|
|
* @return mixed - data gathered
|
|
*/
|
|
private function array_value_recursive($arr){
|
|
$vals = array();
|
|
$this->array_walk_recursive($vals, $arr);
|
|
return $vals;
|
|
}
|
|
private function array_walk_recursive(&$vals, $arr){
|
|
if(is_array($arr)){
|
|
foreach($arr as $v)
|
|
$this->array_walk_recursive($vals, $v);
|
|
}else{
|
|
array_push($vals, $arr);
|
|
}
|
|
}
|
|
}
|