anbei eine Klasse, die alle Sprachinhalte (Slices, Ctypes, Metainfos...) von einer Sprache in die andere kopiert - für alle vorhandenen Artikel.
Verwendung:
In PHP Modul einbinden:
Code: Alles auswählen
$oLangCopy = new FclsRexCopyLangCont($REX['TABLE_PREFIX']);
if($oLangCopy->connect('host','user','password','database')) {
$oLangCopy->copy(source_language_id,aim_language_id);
$oLangCopy->disconnect();
}
Code: Alles auswählen
<?php
// Alle Inhalte aus einer Sprache in eine neue kopieren (neue Sprache muss bereits angelegt sein)
class FclsRexCopyLangCont {
// <!-- member variables
// language ids
private $nSrcLang = null;
private $nAimLang = null;
// sql cursor
private $hSql = null;
// table prefix of redaxo
private $sTablePrefix = null;
// member variables -->
// <!-- override functions
public function __construct($spiTablePrefix) {
$this->sTablePrefix = $spiTablePrefix;
}
public function __clone() {
$this->hSql = null;
}
// override functions -->
public function connect($spiHost, $spiUsername, $spiPassword, $spiDatabase) {
$bReturn = false;
$hSqlConnect = @mysql_connect($spiHost, $spiUsername, $spiPassword);
if($hSqlConnect) {
if(mysql_select_db($spiDatabase, $hSqlConnect)) {
$bReturn = true;
$this->hSql = $hSqlConnect;
}
}
return $bReturn;
}
public function disconnect() {
return mysql_close($this->hSql);
}
public function copy($npiSrcLang, $npiAimLang) {
// fetch columns from article
$saArtColumns = $this->getColumns('article');
$saColumns = array();
// filter necessary columns
foreach($saArtColumns as $sColumn) {
if($this->matchColumn($sColumn)) {
$saColumns[] = $sColumn;
}
}
// fetch list with ids
$naId = array();
$sSelect = 'SELECT id FROM ' . $this->sTablePrefix . 'article GROUP BY id ORDER BY id';
$oSelect = mysql_query($sSelect, $this->hSql);
while($oaRow = mysql_fetch_row($oSelect)) {
$naId[] = $oaRow[0];
}
mysql_free_result($oSelect);
$saUpdate = array();
// prepare statements
foreach($naId as $nId) {
foreach($saColumns as $sColumn) {
$sSelect = 'SELECT ' . $sColumn . ' FROM ' . $this->sTablePrefix . 'article WHERE id = ' . $nId . ' AND clang = ' . $npiSrcLang;
$oSelect = mysql_query($sSelect, $this->hSql);
$oaRow = mysql_fetch_row($oSelect);
$sNewValue = $oaRow[0];
mysql_free_result($oSelect);
$saUpdate[] = 'UPDATE ' . $this->sTablePrefix . 'article SET ' . $sColumn . ' = "' . mysql_real_escape_string($sNewValue) . '" WHERE id = ' . $nId . ' AND clang = ' . $npiAimLang;
}
}
// update metadata
foreach($saUpdate as $sUpdate) {
mysql_query($sUpdate, $this->hSql);
}
// fetch all columns of article_slice
$saSliceCol = $this->getColumns('article_slice');
$sColumnList = $this->getColumnList($saSliceCol);
// fetch all data from source clang
$aaData = array();
$sSelect = 'SELECT * FROM ' . $this->sTablePrefix . 'article_slice WHERE clang = ' . $npiSrcLang . ' ORDER BY id';
$oResult = mysql_query($sSelect, $this->hSql);
// save results in array of arrays
while($aArray = mysql_fetch_assoc($oResult)) {
$aaData[] = $aArray;
}
mysql_free_result($oResult);
// get list with articles
$naArticleId = $this->getList('SELECT article_id FROM ' . $this->sTablePrefix . 'article_slice WHERE clang = ' . $npiSrcLang . ' GROUP BY article_id ORDER BY article_id');
// pass through articles to get article slices
foreach($naArticleId as $nArticleId) {
$naSlice = $this->getSlices($nArticleId, $npiSrcLang);
foreach($naSlice as $nSlice) {
// get data for slice
$oRow = $this->getRow($aaData, $npiSrcLang, $nArticleId, $nSlice);
$oRow['clang'] = $npiAimLang;
if($oRow['re_article_slice_id'] == 0) {
$nArtSliId = 0;
}
else {
$nArtSliId = $nLastInsert;
}
$oRow['re_article_slice_id'] = $nArtSliId;
$sValueList = $this->getValueList($oRow, $saSliceCol);
$sInsert = 'INSERT INTO ' . $this->sTablePrefix . 'article_slice (' . $sColumnList . ') VALUES(' . $sValueList . ')';
mysql_query($sInsert, $this->hSql);
$nLastInsert = mysql_insert_id($this->hSql);
}
}
}
// <!-- member functions
private function getColumns($spiTable) {
$saColumns = array();
$sQuery = 'DESCRIBE ' . $this->sTablePrefix . $spiTable;
$oQuery = mysql_query($sQuery, $this->hSql);
while($oaResult = mysql_fetch_array($oQuery)) {
$saColumns[] = $oaResult['Field'];
}
mysql_free_result($oQuery);
return $saColumns;
}
private function matchColumn($spiColumn) {
$bReturn = false;
$saMatch = array('art_', 'cat_', 'med_');
if(in_array(substr($spiColumn, 0, 4), $saMatch)) {
$bReturn = true;
}
return $bReturn;
}
private function getColumnList($sapiArray) {
$sReturn = null;
foreach($sapiArray as $sColumn) {
if($sColumn != 'id') {
if($sReturn) {
$sReturn .= ', ';
}
$sReturn .= $sColumn;
}
}
return $sReturn;
}
private function getValueList($sapiArray, $sapiColumns) {
$sReturn = null;
foreach($sapiColumns as $sColumn) {
if($sColumn != 'id') {
if($sReturn) {
$sReturn .= ', ';
}
$sReturn .= '"' . mysql_real_escape_string($sapiArray[$sColumn]) . '"';
}
}
return $sReturn;
}
private function getValue($sSelect) {
$oResult = mysql_query($sSelect, $this->hSql);
$oRow = mysql_fetch_row($oResult);
$sReturn = $oRow[0];
if($sReturn == null) {
$sReturn = -1;
}
mysql_free_result($oResult);
return $sReturn;
}
private function getList($sSelect) {
$oaReturn = array();
$oResult = mysql_query($sSelect, $this->hSql);
while($oRow = mysql_fetch_row($oResult)) {
$oaReturn[] = $oRow[0];
}
mysql_free_result($oResult);
return $oaReturn;
}
private function getSlices($nArticle, $nClang) {
$naSlices = array();
$nFirstSlice = $this->getValue('SELECT id FROM ' . $this->sTablePrefix . 'article_slice WHERE article_id = ' . $nArticle . ' AND clang = ' . $nClang . ' AND re_article_slice_id = 0');
$naSlices[] = $nFirstSlice;
while($nNextSlice = $this->getValue('SELECT id FROM ' . $this->sTablePrefix . 'article_slice WHERE article_id = ' . $nArticle . ' AND clang = ' . $nClang . ' AND re_article_slice_id = ' . $nFirstSlice)) {
if($nNextSlice == -1) {
break;
}
else {
$naSlices[] = $nNextSlice;
$nFirstSlice = $nNextSlice;
}
}
return $naSlices;
}
private function getRow(&$aaData, $clang, $article, $id) {
$oaRow = null;
foreach($aaData as $oRow) {
if($oRow['clang'] == $clang && $oRow['article_id'] == $article && $oRow['id'] == $id) {
$oaRow = $oRow;
break;
}
}
return $oaRow;
}
// member functions -->
}
?>