[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
Alle Sprachinhalte kopieren - REDAXO Forum
Hallo,

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/

Kann ich vielleicht mal gebrauchen

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

Ja
100%
2
Nein
Keine Stimmen
0
 
Insgesamt abgegebene Stimmen: 2
patrick.softloop
Beiträge: 12
Registriert: 19. Aug 2009, 11:26

Alle Sprachinhalte kopieren

7. Dez 2009, 19: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 -->
  }

?>

Benutzeravatar
rkemmere
Beiträge: 486
Registriert: 6. Feb 2007, 17:47
Kontaktdaten: Website

8. Dez 2009, 00: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

patrick.softloop
Beiträge: 12
Registriert: 19. Aug 2009, 11:26

8. Dez 2009, 11: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...

Max Smily
Beiträge: 29
Registriert: 13. Aug 2006, 14:51

Re: Alle Sprachinhalte kopieren

26. Aug 2014, 18:35

Hallo patrick,

vielen Dank für diese Kopierfunktion. Sie hat mir heute gute Dienste geleistet. Eingesetzt mit Redaxo 4.5.1. Alle Artikel wurden erfolgreich kopiert, nur die SEO42-Einträge nicht, was aber nicht schlimm für mich ist.

Die Klasse habe ich temporär in mein Main-Template eingefügt und den Aufruf der Klasse irgendwo auf einer versteckten Unterseite per PHP-Modul eingefügt. Mit dem Aufruf der Unterseite, wurde die Sprachkopie angelegt.

Ein Ebay-Sprache: alles bestens, gerne wieder.

Grüße
Max

Zurück zu „Allgemeines [R4]“