inuse - Ist die Datei in Benutzung?

Fragen zur Installation von CONTENIDO 4.10? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
McHubi
Beiträge: 1209
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

inuse - Ist die Datei in Benutzung?

Beitrag von McHubi » So 24. Mär 2019, 23:34

Diese Core-Erweiterung wurde aus der Version 4.9 übernommen (viewtopic.php?f=98&t=35372) und ausgeweitet.

Die folgende Erweiterung einer Core-Datei der Dateiverwaltung sorgt dafür, dass überprüft werden kann, ob

1)
eine Datei innerhalb des wysiwyg-Contents verwendet wird, sprich über den TinyMCE eingebunden wurde – dabei wird nicht nur die aktuelle Version des Webartikels geprüft sondern auch alte Versionen, die bei einer aktivierten Artikelversionierung (siehe "Administration -> System" im Reiter "Konfiguration") angelegt werden
2)
ein Bild über die Module "content_header_image" (anfangs "content_image") oder "content_teaser_config" aktuell eingebunden ist
3)
eine Datei über den Artikel-Reiter "Konfiguration" zugewiesen wurde.

Einbinden der Erweiterung
Im Verzeichnis "root->contenido/includes/" die Datei "include.upl_files_overview.php" öffnen. Bitte unbedingt eine Sicherung dieser Datei vor der Anpassung anlegen!

Im Quelltext der Datei nach "public function convert($field, $data)" suchen. In der Version 4.10.0 wird man in Zeile 358 fündig.

Einige Zeilen weiter unten nach diesen Infos schauen und ergänzen:

Code: Alles auswählen

[...]
public function convert($field, $data) {	
[...]
                    $retValue = '<a class="jsZoom" href="' . $href . '">
                           <img class="hover" name="smallImage" alt="" src="' . $sCacheThumbnail . '" data-width="' . $iWidth . '" data-height="' . $iHeight . '">
                           <img class="preview" name="prevImage" alt="" src="' . $sCacheThumbnail . '">
                       </a>';
/******************** FILES IN USE? modifications begin ********************/
$parts_path_name = explode("/", $data);
$check_data=$parts_path_name= end($parts_path_name);

$retValue.='<br/>';
$inuse_url = $sess->url('main.php');
$retValue.='<a href="'.$inuse_url.'&area=upl&frame=4&path='.$path.'&startpage='.$_REQUEST['startpage'].'&check_file_inuse='.$check_data.'">';//.$inuse_url.'&area=upl&frame=4&path='.$path.'&startpage='.$_REQUEST[startpage].'&check_file_inuse='.$check_data;
$retValue.='<img src="images/info.gif" title="Datei in Benutzung?"/>';//.$check_data;
$retValue.='</a>';
if(htmlspecialchars(strip_tags($_GET['check_file_inuse']))!="" AND $check_data==htmlspecialchars(strip_tags($_GET['check_file_inuse']))) // delete second condition if all files of page should be checked
  {
  $arr_inuse=array();
  $arr_inuse_version=array();
  $arr_inuse_collection=array();
  $arr_inuse_version_collection=array();
  $arr_inuse_folder=array();

  echo '<p><b>Suche nach Datei</b><br/>Berücksichtigt werden<ul><li>alle Dateien, die per wysiwyg-Editor erstellt wurden in der aktuellen sowie alten Versionen der Webartikel</li><li>Dateien, die per Artikel-Reiter "Konfiguration" zugewiesen wurden</li><li>Bilder, die per Modul "content_image" oder "content_teaser_config" eingebunden wurden</li></ul><table><tr style="background-color: #e2e2e2;"><td>Suche in DB-Tabelle</td><td>Suche nach</td><td>Funde</td><td>Prüfung nach</td></tr>';

  //con_content
  $search = "SELECT idartlang FROM con_content WHERE value LIKE '%$data%'";
  $result = cRegistry::getDb();
  $result->query($search);
  $amount_of_hits=0;
  while($result->nextRecord())
    {
    $amount_of_hits++;
    $arr_inuse=$result->toArray();
    $arr_inuse_collection[]=$arr_inuse['idartlang'];
    }
   echo '<tr><td>con_content</td><td>'.$data.'</td><td>'.$amount_of_hits.'</td><td>per wysiwyg eingebundene Dateien in der aktuellen Fassung</td></tr>';

  //con_content_version
  $search = "SELECT idartlang FROM con_content_version WHERE value LIKE '%$data%'";
  $result = cRegistry::getDb();
  $result->query($search);
  $amount_of_hits=0;
  while($result->nextRecord())
    {
    $amount_of_hits++;
    $arr_inuse_version=$result->toArray();
    $arr_inuse_version_collection[]=$arr_inuse_version['idartlang'];
    }
  $arr_inuse_version_collection=array_unique($arr_inuse_version_collection);
  echo '<tr><td>con_content_version</td><td>'.$data.'</td><td>'.$amount_of_hits.'</td><td>per wysiwyg eingebundene Dateien in alten Versionen</td></tr>';

  //content_image
  $search="SELECT * FROM con_content,con_upl WHERE value=idupl AND filename='$check_data'";
  $result = cRegistry::getDb();
  $result->query($search);
  $amount_of_hits=0;
  while($result->nextRecord())
    {
    $amount_of_hits++;
    $arr_inuse=$result->toArray();
    $arr_inuse_collection[]=$arr_inuse['idartlang'];
    }
  echo '<tr><td>con_content,con_upl</td><td>'.$check_data.'</td><td>'.$amount_of_hits.'</td><td>per Modul "content_image" oder "content_teaser_config" eingebundene Bilder</td></tr>';

  //con_container_conf - file
  $search="SELECT * FROM con_container_conf WHERE container LIKE '%$check_data%'";
  $result = cRegistry::getDb();
  $result->query($search);
  $amount_of_hits=0;
  while($result->nextRecord())
    {
    $arr_idtplcfg=$result->toArray();
    $search2="SELECT * FROM con_art_lang WHERE idtplcfg='$arr_idtplcfg[idtplcfg]'";
    $result2 = cRegistry::getDb();
    $result2->query($search2);
    while($result2->nextRecord())
      {
      $amount_of_hits++;
      $arr_inuse=$result2->toArray();
      $arr_inuse_collection[]=$arr_inuse['idartlang'];
      }
    }
  echo '<tr><td>con_container_conf</td><td>'.$check_data.'</td><td>'.$amount_of_hits.'</td><td>über den Artikel-Reiter "Konfiguration" zugewiesene Dateien</td></tr></table></p>';

  $arr_inuse_collection=array_unique($arr_inuse_collection);

  echo '<p><b>Verwendung</b><br/><img src="' . $sCacheThumbnail . '"><br/><br/><span style="background-color: #e2e2e2;">idarts der Artikel, in denen die Datei "'.$check_data.'" aktuell verwendet wird</span><br/>';
  if(count($arr_inuse_collection)>0) foreach($arr_inuse_collection AS $element) echo'<a href="'.$cfgClient[$client]["path"]["htmlpath"].'front_content.php?idart='.$element.'" target="_blank">'.$element.'</a>&nbsp;|&nbsp;';
    else echo 'keine';
  echo '<br/><span style="background-color: #e2e2e2;">oder wurde</span><br/>';
  if(count($arr_inuse_version_collection)>0)
    {
    foreach($arr_inuse_version_collection AS $element) echo '<a href="'.$cfgClient[$client]["path"]["htmlpath"].'front_content.php?idart='.$element.'" target="_blank">'.$element.'</a>&nbsp;&nbsp;|&nbsp;';
    echo '<br/>';
    }
    else echo 'keine<br/>';
  echo '</p>';
  }
/******************** FILES IN USE? modifications end ********************/
                    return $retValue;
                    break;
                default:
                    $sCacheThumbnail = uplGetThumbnail($data, 150);
                    return '<img class="hover_none" name="smallImage" alt="" src="' . $sCacheThumbnail . '">';
            }
        }

        return $data;
    }
 [...]
Diese Ergänzung sorgt dafür, dass in der Dateiverwaltung unterhalb der Vorschaubilder ein (i)-Icon erscheint. Beim Anklicken wird die Datenbank dann nach dem Dateinamen durchsucht, bei einem Fund dann die idart des Webartikels ausgelesen und als verlinkter Hinweis ausgeben.
be-dateiverwaltung-inuse-001.jpg
be-dateiverwaltung-inuse-001.jpg (94.7 KiB) 28857 mal betrachtet
Es kann vorkommen, dass eine idart aufgeführt wird, bei deren Öffnen im Frontend man das Bild gar nicht sieht. Grund: Wenn die Artikelversionierung angeschaltet ist, hätte man die Möglichkeit, auf eine alte Version zurückzukehren. Und wenn dort die Datei eingebunden war, würde sie bei einem Zurücksetzen natürlich benötigt. Daher wird sie auch bei der Prüfung gefunden. Genaue Hinweise zur Suche findet man in der Auflistung zu den Datenbank-Tabellen.

Was ist mit anderweitig eingebundenen Dateien?
Zum Beispiel Dateien, die in Bildergalerien verwendet werden.

Das ist schwierig und einfach zugleich. Diese Core-Erweiterung kann nur Dinge berücksichtigen, die in allen mit CONTENIDO 4.10 umgesetzten Websites vorkommen. Ideal wäre es natürlich, wenn sämtliche Möglichkeiten Dateien einzubinden geprüft würden. Aber da Module und Plugins aus der Feder von verschiedensten Entwicklern stammen, ist es unmöglich die Verwendung der Dateien vorherzusehen und eine allgemeingültige, verlässliche Prüfroutine zu entwickeln.

Dieses Manko kann aber größtenteils umgangen werden, indem man die Ordnerstruktur in der Dateiverwaltung sinnvoll aufbauen. Im Fall der Bildergalerien zum Beispiel sollte man die dort verwendeten Bilder eindeutig von den übrigen trennen. So weiß man immer, dass die in diesen Ordnern genutzten Dateien ausschließlich in einer Galerie genutzt werden. Und wenn die Galerie nicht mehr online ist, können die Bilder natürlich gelöscht werden.

Die Prüfung auf weitere Dateitypen ausweiten
Sofern man nicht nur die Verwendung von Bildern sondern zum Beispiel auch von PDF-Dateien prüfen will (was Sinn macht, denn die werden schließlich oft genug verlinkt) muss die Datei "include.upl_files_overview.php" noch einmal um diese Zeilen erweitert werden:

Code: Alles auswählen

[...]
            switch ($fileType) {
                case 'png':
                case 'gif':
                case 'tiff':
                case 'bmp':
                case 'jpeg':
                case 'jpg':
                case 'iff':
                case 'xbm':
                case 'wbmp':
/******************** FILES IN USE? modifications begin ********************/
case 'pdf':
/******************** FILES IN USE? modifications end ********************/
                    $frontendURL = cRegistry::getFrontendUrl();
                    [...]
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

marcus.gnass_4fb
Beiträge: 87
Registriert: Do 26. Apr 2012, 23:02
Kontaktdaten:

Re: inuse - Ist die Datei in Benutzung?

Beitrag von marcus.gnass_4fb » Do 11. Apr 2019, 16:39

Vielen Dank für diese Ergänzung. Ich habe versucht sie ein wenig lesbarer zu gestalten.
Zudem ist mit aufgefallen, dass du idartlangs ausliest, den Artikel aber mittels idart aufrufst. Das habe ich noch korrigiert.

Code: Alles auswählen

[...]
public function convert($field, $data) {	
[...]
                    $retValue = '<a class="jsZoom" href="' . $href . '">
                           <img class="hover" name="smallImage" alt="" src="' . $sCacheThumbnail . '" data-width="' . $iWidth . '" data-height="' . $iHeight . '">
                           <img class="preview" name="prevImage" alt="" src="' . $sCacheThumbnail . '">
                       </a>';

                    /******************** FILES IN USE? modifications begin ********************/
                    $currentBasename = basename($data);
                    $checkInuse      = isset($_REQUEST['check_inuse']) ? cSecurity::escapeString($_REQUEST['check_inuse']) : '';

                    // add inuse icon
                    $href     = $sess->url("main.php?area=upl&frame=4&path=$path&startpage=$startpage&check_inuse=$currentBasename");
                    $retValue .= '<br/><a href="' . $href . '"><img src="images/info.gif" title="Datei in Benutzung?"/></a>';

                    // delete second condition if all files of page should be checked
                    if ($checkInuse && $currentBasename === $checkInuse) {
                        $usageCounts          = [
                            'con_content'         => 0,
                            'con_content_version' => 0,
                            'con_content,con_upl' => 0,
                            'con_container_conf'  => 0,
                        ];
                        $usingArticles        = [];
                        $usingArticleVersions = [];

                        // con_content
                        $result = cRegistry::getDb();
                        $result->query("SELECT idartlang FROM con_content WHERE value LIKE '%$data%'");
                        while ($result->nextRecord()) {
                            $usageCounts['con_content']++;
                            $arr_inuse       = $result->toArray();
                            $usingArticles[] = $arr_inuse['idartlang'];
                        }

                        // con_content_version
                        $result = cRegistry::getDb();
                        $result->query("SELECT idartlang FROM con_content_version WHERE value LIKE '%$data%'");
                        while ($result->nextRecord()) {
                            $usageCounts['con_content_version']++;
                            $arr_inuse_version      = $result->toArray();
                            $usingArticleVersions[] = $arr_inuse_version['idartlang'];
                        }

                        // content_image
                        $result = cRegistry::getDb();
                        $result->query(
                            "SELECT * FROM con_content,con_upl WHERE value=idupl AND filename='$currentBasename'"
                        );
                        while ($result->nextRecord()) {
                            $usageCounts['con_content,con_upl']++;
                            $arr_inuse       = $result->toArray();
                            $usingArticles[] = $arr_inuse['idartlang'];
                        }

                        // con_container_conf - file
                        $result = cRegistry::getDb();
                        $result->query("SELECT * FROM con_container_conf WHERE container LIKE '%$currentBasename%'");
                        while ($result->nextRecord()) {
                            $arr_idtplcfg = $result->toArray();
                            $result2      = cRegistry::getDb();
                            $result2->query("SELECT * FROM con_art_lang WHERE idtplcfg='$arr_idtplcfg[idtplcfg]'");
                            while ($result2->nextRecord()) {
                                $usageCounts['con_container_conf']++;
                                $arr_inuse       = $result2->toArray();
                                $usingArticles[] = $arr_inuse['idartlang'];
                            }
                        }

                        $linkIdArtlangs = function ($tmpIdartlang) use ($cfgClient, $client) {
                            $href =
                                $cfgClient[$client]["path"]["htmlpath"] . 'front_content.php?idartlang=' . $tmpIdartlang;

                            return '<a href="' . $href . '" target="_blank">' . $tmpIdartlang . '</a>';
                        };

                        if (empty($usingArticles)) {
                            $usingArticles = 'keine';
                        } else {
                            $usingArticles = array_unique($usingArticles);
                            $usingArticles = array_map($linkIdArtlangs, $usingArticles);
                            $usingArticles = implode('&nbsp;|&nbsp;', $usingArticles);
                        }

                        if (empty($usingArticleVersions)) {
                            $usingArticleVersions = 'keine';
                        } else {
                            $usingArticleVersions = array_unique($usingArticleVersions);
                            $usingArticleVersions = array_map($linkIdArtlangs, $usingArticleVersions);
                            $usingArticleVersions = implode('&nbsp;|&nbsp;', $usingArticleVersions);
                        }

                        echo '
                            <h2>Suche nach Datei</h2>
                            <p>Berücksichtigt werden</p>
                            <ul>
                                <li>alle Dateien, die per WYSIWYG-Editor erstellt wurden in der aktuellen sowie alten Versionen der Webartikel</li>
                                <li>Dateien, die per Artikel-Reiter "Konfiguration" zugewiesen wurden</li>
                                <li>Bilder, die per Modul "content_image" oder "content_teaser_config" eingebunden wurden</li>
                            </ul>

                            <table class="generic">
                                <tr>
                                    <th>Suche in DB-Tabelle</th>
                                    <th>Suche nach</th>
                                    <th>Funde</th>
                                    <th>Prüfung nach</th>
                                </tr>
                                <tr>
                                    <td>con_content</td>
                                    <td>' . $data . '</td>
                                    <td>' . $usageCounts['con_content'] . '</td>
                                    <td>per wysiwyg eingebundene Dateien in der aktuellen Fassung</td>
                                </tr>
                                <tr>
                                    <td>con_content_version</td>
                                    <td>' . $data . '</td>
                                    <td>' . $usageCounts['con_content_version'] . '</td>
                                    <td>per wysiwyg eingebundene Dateien in alten Versionen</td>
                                </tr>
                                <tr>
                                    <td>con_content,con_upl</td>
                                    <td>' . $currentBasename . '</td>
                                    <td>' . $usageCounts['con_content,con_upl'] . '</td>
                                    <td>per Modul "content_image" oder "content_teaser_config" eingebundene Bilder</td>
                                </tr>
                                <tr>
                                    <td>con_container_conf</td>
                                    <td>' . $currentBasename . '</td>
                                    <td>' . $usageCounts['con_container_conf'] . '</td>
                                    <td>über den Artikel-Reiter "Konfiguration" zugewiesene Dateien</td>
                                </tr>
                            </table>
                            <br />
                            
                            <h2>Verwendung</h2>
                            <p><img src="' . $sCacheThumbnail . '"></p>
                            <p>idartlangs der Artikel, in denen die Datei "' . $currentBasename . '" aktuell</p>
                            <table class="generic">
                                <tr>
                                    <th>verwendet wird</th>
                                    <th>verwendet wurde</th>
                                </tr>
                                <tr>
                                    <td>' . $usingArticles . '</td>
                                    <td>' . $usingArticleVersions . '</td>
                                </tr>
                            </table>
                            <br />';
                    }

                    /******************** FILES IN USE? modifications end ********************/

                    return $retValue;
                    break;
                default:
                    $sCacheThumbnail = uplGetThumbnail($data, 150);
                    return '<img class="hover_none" name="smallImage" alt="" src="' . $sCacheThumbnail . '">';
            }
        }

        return $data;
    }
 [...]

McHubi
Beiträge: 1209
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: inuse - Ist die Datei in Benutzung?

Beitrag von McHubi » So 14. Apr 2019, 17:19

Ich habe versucht sie ein wenig lesbarer zu gestalten.
Hallo Marcus,

sorry für die späte Rückmeldung, ich war bis gestern im Urlaub. Danke Dir für den Umbau, das passt in der Tat besser und sollte - soweit ich das so sehen kann - auch eine ganze Ecke dichter an euren Coding-Conventions liegen. Wie schätzt Du die Chancen ein, dass dieses Feature künftig standardmäßig in CONTENIDO berücksichtigt bzw. optional über Mandandeneinstellungen oder den Reiter Konfiguration (im Bereich Administration -> System) freischaltbar wird? Denke, ein Mehrwert ist durchaus gegeben und wo Du grad schon dran warst... :wink:

Von der Optik her sollte bei den Tabellen - Du hattest hier die CSS-Klasse "generic" vergeben - noch "border-collapse: collapse;" Einzug halten damit die Tabelle dem üblichen Erscheinungsbild entspricht.

Danke nochmal für's Überarbeiten! :D

EDIT: Problem beim Aufruf mit idartlang ist allerdings, dass es bei aktiviertem AMR zum Aufruf der Fehlerseite kommt - egal welche idartlang angegeben wird. Ist AMR deaktiviert, funktioniert es.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Das Handbuch zur Version 4.10: CONTENIDO für Einsteiger (4.10)

Das Handbuch zur Version 4.9: CONTENIDO für Einsteiger (4.9)

Antworten