Alle Sprachinhalte kopieren

Bei Problemen/Anregungen mehrsprachiger Webseiten.

Kann ich vielleicht mal gebrauchen

Umfrage endete am 17. Mär 2010, 18:27

Ja
2
100%
Nein
0
Keine Stimmen
 
Abstimmungen insgesamt : 2

Alle Sprachinhalte kopieren

Beitragvon patrick.softloop » 7. Dez 2009, 18:27

Für den Fall, dass es jemand braucht (nicht schön programmiert, aber funktional und schnell):

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 -->
  }

?>
patrick.softloop
 
Beiträge: 12
Registriert: 19. Aug 2009, 10:26

Beitragvon rkemmere » 7. Dez 2009, 23:22

Hi,

schön das Du sowas progammiert hast ;) Danke
Gibt dafür bereits ein Addon.

http://www.redaxo.de/180-0-addon-detail ... don_id=226
Benutzeravatar
rkemmere
 
Beiträge: 382
Registriert: 6. Feb 2007, 16:47

Beitragvon patrick.softloop » 8. Dez 2009, 10:03

*heul*

das ist meine Strafe dafür, dass ich Google nicht bemüht habe :(

naja, wer trotzdem interesse daran hat. Die Klasse ist unabhängig von Redaxo. Als Parameter benötigt sie nur den Tableprefix und ist dann von überall via Datenbankverbindung ausführbar. Wenigstens ein kleiner Trost...
patrick.softloop
 
Beiträge: 12
Registriert: 19. Aug 2009, 10:26


Zurück zu Mehrsprachigkeit [R4]

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron