ugrás a tartalomhoz

XML fájlba írás és törlés onnan

attiss94 · 2011. Szep. 26. (H), 15.56
Sziasztok!
Szokás szerint hoztam magammal egy nyakatekert kérdést. Most egy FLASH képnézegetőt szeretnék készíteni (mely egy XML fájlból kapja a képeket), csakhogy szeretnék hozzá egy adminisztrációs oldalt, ahol online tudok feltölteni és letörölni képeket a képnézegetőből. Sokat gondolkoztam, hogy hogyan tudnám megoldani, de semmi ötletem nem akadt...

Még talán a feltöltést meg tudom oldani, egy sima fájlfeltöltővel és fwrite-tal, de hogyan töröljek az XML-ből csak egy-egy adott sort? Van valakinek ötlete?
A válaszokat előre is köszönöm: attiss94
 
1

Én egy ilyesmit úgy oldottam

pinguka · 2011. Szep. 26. (H), 16.04
Én egy ilyesmit úgy oldottam meg, hogy adatbázisba dolgoztam és új felvételénél vagy módosításnál újra írattam az xml fájlt.
Kiolvasod az adatokat db-ből és egy változóba belepakolod az xml-t a db-ből jövő adatokkal aztán file_put_contents-el kiírod az xml-t.
2

Köszönöm a választ, de nekem

attiss94 · 2011. Szep. 26. (H), 16.13
Köszönöm a választ, de nekem ez nagyon meredek (nem régóta használom ezt a nyelvet, egyenlőre még csak tanulgatom), szóval azt mondod, hogy a képet töltsem fel a szerverre, az elérési utat töltsem fel egy adatbázisba, majd az adatbázisból már megfelelő helyre pakoljam az elérési utat. Ez eddig többnyire tiszta, de ezek után már semmit nem értek (nem csináltam még ilyesmit, neharagudj az értetlenségem miatt), tudnál mutatni nekem erre egy példát?
Köszönettel: attiss94
3

hogy néz ki az xml

Karvaly84 · 2011. Szep. 26. (H), 16.23
hogy néz ki az xml struktúrája?
4

egyébként meg XML

Karvaly84 · 2011. Szep. 26. (H), 16.32
egyébként meg XML Manipulation. Itt szerintem meg találod ami kell. :)
5

<?xml version="1.0"

attiss94 · 2011. Szep. 26. (H), 16.36

<?xml version="1.0" encoding="UTF-8" ?>
<flash_parameters copyright="socusoftFSMTheme">
    <preferences>
        <global>
            <basic_property movieWidth="660" movieHeight="415" html_title="valami" loadStyle="Bar" startAutoPlay="true" backgroundColor="0x000080" socusoftMenu="false" hideAdobeMenu="false" photoDynamicShow="true" enableURL="true" transitionArray=""/>
            <title_property photoTitleColor="0xfffbf0" photoTitleSize="10" photoTitleFont="Verdana"/>
            <music_property path="" stream="true" loop="true"/>
            <photo_property topPadding="3" bottomPadding="28" leftPadding="2" rightPadding="185" photoBorder="true" photoBorderSize="1" photoBorderColor="0xfffbf0"/>
            <button_property buttonColor="0xfffbf0"/>
            <properties enable="true" backgroundColor="0xffffff" backgroundAlpha="30" cssText="a:link{text-decoration: underline;} a:hover{color:#ff0000; text-decoration: none;} a:active{color:#0000ff;text-decoration: none;} .blue {color:#0000ff; font-size:15px; font-style:italic; text-decoration: underline;} .body{color:#ff5500;font-size:20px;}" align="bottom"/>
        </global>
        <thumbnail>
            <basic_property thumbnailWidth="40" thumbnailHeight="30" showBorder="true" borderColor="0xffffff" align="right" rowCount="4" thumbnailSpacing="5"/>
            <dropShadow_property shadowColor="0x666666" shadowTransparency="20" shadowSize="0" shadowHoverSize="2"/>
        </thumbnail>
    </preferences>
    <album>
        <slide jpegURL="thumbs/t_0001.jpg" d_URL="slides/p_0001.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="1" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0002.jpg" d_URL="slides/p_0002.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="2" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0003.jpg" d_URL="slides/p_0003.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="3" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0004.jpg" d_URL="slides/p_0004.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="4" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0005.jpg" d_URL="slides/p_0005.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="5" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0006.jpg" d_URL="slides/p_0006.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="6" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0007.jpg" d_URL="slides/p_0007.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="7" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0008.jpg" d_URL="slides/p_0008.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="8" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0009.jpg" d_URL="slides/p_0009.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="9" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0010.jpg" d_URL="slides/p_0010.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="10" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0011.jpg" d_URL="slides/p_0011.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="11" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0012.jpg" d_URL="slides/p_0012.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="12" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0013.jpg" d_URL="slides/p_0013.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="13" width="473" height="384"/>
        <slide jpegURL="thumbs/t_0014.jpg" d_URL="slides/p_0014.jpg" transition="0" panzoom="1" URLTarget="0" phototime="2" title="14" width="473" height="384"/>
    </album>
</flash_parameters>
6

$xml = '<?xml version="1.0"

pinguka · 2011. Szep. 26. (H), 16.44


$xml = '<?xml version="1.0" encoding="UTF-8" ?>  
<flash_parameters copyright="socusoftFSMTheme">  
    <preferences>  
        <global>  
            <basic_property movieWidth="660" movieHeight="415" html_title="valami" loadStyle="Bar" startAutoPlay="true" backgroundColor="0x000080" socusoftMenu="false" hideAdobeMenu="false" photoDynamicShow="true" enableURL="true" transitionArray=""/>  
            <title_property photoTitleColor="0xfffbf0" photoTitleSize="10" photoTitleFont="Verdana"/>  
            <music_property path="" stream="true" loop="true"/>  
            <photo_property topPadding="3" bottomPadding="28" leftPadding="2" rightPadding="185" photoBorder="true" photoBorderSize="1" photoBorderColor="0xfffbf0"/>  
            <button_property buttonColor="0xfffbf0"/>  
            <properties enable="true" backgroundColor="0xffffff" backgroundAlpha="30" cssText="a:link{text-decoration: underline;} a:hover{color:#ff0000; text-decoration: none;} a:active{color:#0000ff;text-decoration: none;} .blue {color:#0000ff; font-size:15px; font-style:italic; text-decoration: underline;} .body{color:#ff5500;font-size:20px;}" align="bottom"/>  
        </global>  
        <thumbnail>  
            <basic_property thumbnailWidth="40" thumbnailHeight="30" showBorder="true" borderColor="0xffffff" align="right" rowCount="4" thumbnailSpacing="5"/>  
            <dropShadow_property shadowColor="0x666666" shadowTransparency="20" shadowSize="0" shadowHoverSize="2"/>  
        </thumbnail>  
    </preferences>  
    <album>';

$sql = mysql_query('LEKÉRDEZÉS');

while($row = mysql_fetch_array($sql))
{
    $xml .= '<slide jpegURL="thumbs/'.$row["kep"].'" d_URL="slides/'.$row["kep"].'" transition="0" panzoom="1" URLTarget="0" phototime="2" title="12" width="473" height="384"/>'
}



$xml .= '</album>  
</flash_parameters>';

file_put_contents('kepek.xml', $xml);

No, így nézne ki ez a dolog! Pofon egyszerű :)
7

Ami általában mindig

Karvaly84 · 2011. Szep. 26. (H), 17.06
Ami általában mindig megoldható az DOM manipuláció vagy az XPath.

$init_file = new DOMDocument();
$init_file->load('slide_show.xml');

$images = $init_file->getElementsByTagName("slide");

foreach($images as $img) {
	// És itt azt csinálsz amit akarsz.
        // További okosságok a dokumentációban vannak.
}
10

SimpleXML

gabesz666 · 2011. Szep. 26. (H), 23.03
Kicsit túl lett bonyolítva a kérdés. SimpleXML-el nagyon egyszerűen megoldható a dolog php-ban.

$xmlContent = file_get_contents('fajl_neve.xml');
$xml = new SimpleXMLElement($xmlContent);

/* 0. kép törlése */
unset($xml->album->slide[0]);

/* $newXmlContent már nem fogja tartalmazni a 0. elemet */
$newXmlContent = $xml->asXML();

/* Ú kép hozzáadása */
$slide = $xml->album->addChild('slide');
$slide->addAttribute('jpegURL', 'valami');
$slide->addAttribute('d_URL', 'valami');
$slide->addAttribute('transition', '0');
$slide->addAttribute('panzoom', '1');
$slide->addAttribute('URLTarget', '0');
$slide->addAttribute('phototime', '2');
$slide->addAttribute('title', 'valami');
$slide->addAttribute('width', '473');
$slide->addAttribute('height', '384');

/* $newXmlContent már tartalmazni fogja az új elemet */
$newXmlContent = $xml->asXML();

8

Köszönöm a válaszokat, bár a

attiss94 · 2011. Szep. 26. (H), 19.58
Köszönöm a válaszokat, bár a másodikból semmit nem értek (még nem találkoztam ilyesmivel), és ha lehet, akkor inkább a MYSQL dologgal oldanám meg. Még egy kérdés ezzel kapcsolatban: a képeket 473*384 méretűre kell alakítanom. Ugye vannak álló és fekvő képek, az állóknál úgy kellene megoldanom, hogy fekete legyen a maradék kitöltendő háttér. Mivel még nem vagyok annyira jártas a dologban, hogy magamnak írjak egy átméretező scriptet, keresgéltem a Google-on, de sajnos ilyen programot nem találtam, mivel ez megint egy összetett probléma.

Tehát a lényeg: amint a képeket feltöltöm a szerverre, méretezze át egy 473*384-es képre, a maradék üres helyet pedig töltse ki feketével, majd tegyen rá egy vízjelet (lehetőleg a bal alsó sarokba, ez lehet egy másik képből vagy csak szöveg), mentse el a képet, és a kép elérési útját töltse fel az adatbázisomba.

Próbálkoztam magamtól megírni, de hát ehhez én még gyenge vagyok : )...

Ismét előre is köszönöm a segíségeteket! : )
9

az meg a gd library lesz...

Karvaly84 · 2011. Szep. 26. (H), 20.05
az meg a gd library lesz... de ahhoz nem értek...
11

Miért?

gabesz666 · 2011. Szep. 27. (K), 10.02
Miért kell pont 473×384-es kép? Van ennek valami praktikus oka? Egy képkezelő osztályom épp akad kéznél, ez a méretezésnél, forgatásnál lehet hasznos:

class SimpleImage {
   
   var $image;
   var $image_type;
 
   function load($filename) {
      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {
         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {
         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {
         $this->image = imagecreatefrompng($filename);
      }
   }
   function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {
      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {
         imagegif($this->image,$filename);         
      } elseif( $image_type == IMAGETYPE_PNG ) {
         imagepng($this->image,$filename);
      }   
      if( $permissions != null) {
         chmod($filename,$permissions);
      }
   }
   function output($image_type=IMAGETYPE_JPEG) {
      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {
         imagegif($this->image);         
      } elseif( $image_type == IMAGETYPE_PNG ) {
         imagepng($this->image);
      }   
   }
   function getWidth() {
      return imagesx($this->image);
   }
   function getHeight() {
      return imagesy($this->image);
   }
   function resizeToHeight($height) {
      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }
   function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }
   function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100; 
      $this->resize($width,$height);
   }
   function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;   
   }  
   function rotate($angle = 90) {
      $new_image = imagerotate($this->image, $angle, 255);
      $this->image = $new_image;   
   }
   function crop($x, $y, $x2, $y2, $w, $h) {
      
      $new_image = imagecreatetruecolor($w, $h);
      imagecopyresampled($new_image, $this->image, 0, 0, (int)$x, (int)$y, (int)$w, (int)$h, (int)$w, (int)$h);
      $this->image = $new_image;

   }
}
Használata pedig:

$image = new SimpleImage('/utvonal/fajlnev.jpg');

/* Átméretezés */
if($image->getWidth() > $image->getHeight()) {
   /* Fekvő kép */
   $image->resize(473, 384);
}
else {
   /* Álló kép */
   $image->resize(384, 473);
}

/* Forgatás 30°-al */
$image->rotate(30);

/* Kép mentése */
$image->save('/utvonal/atmeretezett_forgatott_fajl.jpg');

Vízjel hozzáadásához itt egy leírás: http://hu2.php.net/manual/en/image.examples-watermark.php
12

Köszönöm szépen, amikor lesz

attiss94 · 2011. Szep. 27. (K), 20.40
Köszönöm szépen, amikor lesz egy kis időm, kísérletezek az egésszel, ha nem megy valami, majd kérdezek : ).

Azért kell pont akkora méretű kép, mert a FLASH képnézegető akkora képekkel dogozik... : )

Arra nincs valami ötleted, hogy az álló képek is 384 magasak legyenek és a 473-ból fennmaradó üres terület feketével legyen kitöltve?

Tényleg köszönök minden segítséget!
13

Megpróbálkoztam ezzel a

attiss94 · 2011. Szep. 27. (K), 21.26
Megpróbálkoztam ezzel a vízjelezéssel, de nekem nem igazán szeretne összejönni...

A tag, ahol a képet megjelenítem:

<img src="vizjel.php?fajl=kep.jpg" alt="" />
vizjel.php

<?php
$vizjel = imagecreatefrompng('vizjel.png');
$kep = $_GET['fajl'];

$jobb_tavolsag = 10;
$also_tavolsag = 10;
$sx = imagesx($vizjel);
$sy = imagesy($vizjel);

imagecopy($kep, $vizjel, imagesx($kep) - $sx - $jobb_tavolsag, imagesy($kep) - $sy - $also_tavolsag, 0, 0, imagesx($vizjel), imagesy($vizjel));

header('Content-type: image/png');
imagepng($kep);
imagedestroy($kep);
?>
Fogalmam sincs, hogy mit ronthattam el... Vagy ő nem ezen az alapon működik?

Próbáltam a végére más parancsot tenni:

imagejpeg($kep, NULL, 100);
De ugyanaz az eredmény. A kép nem jelenik meg.
14

Összekeverted

Pepita · 2011. Okt. 7. (P), 11.51
a kép forrását (src) egy kép objektummal. A forrás egy string, ami egy fájl elérési útja, a php kódod pedig egy képet akar(na) megjeleníteni egész dokumentumként. Ez a header('Content-type: image/png'); miatt van. Fejlécet csak minden (még DOCTYPE is) előtt szabad kiadni, az <img ... tag pedig már body-ban van. Megoldás lehet, ha a vízjelezést a fájl feltöltésekor teszed meg, csak nem kiküldöd az eredményt, hanem azt mented le a szerverre. Így az img src-nek u.úgy a képfájl nevét adhatod meg.
Milyen hibaüzenetet kaptál? Szerintem kellett kapnod erre.
15

Ne haragudj a késői

attiss94 · 2011. Okt. 13. (Cs), 17.42
Ne haragudj a késői válaszért, csak nem igazán voltam internetközelben. Köszönöm a válaszodat, a mintád alapján próbáltam alkotni valamit, ami nem igazán szeretne működni sajnos (magamat ismerve megint elég nagy barbárságot csinálok...), ha szépen megkérlek rápillantasz erre:

<?php
$image = new SimpleImage($POST['fajl']);  

    if($image->getWidth() > $image->getHeight()) {  
       $image->resize(1049, 700);  
    }  
    else {  
       $image->resize(525, 700);  
    }  

    $image->save('../../galeria/img/kep.png');  
    echo "Sikeres átméretezés!";
?>
Vagy ezt nem így kell használni ($POST-tal)?
16

konstruktor

Poetro · 2011. Okt. 13. (Cs), 18.03
Mivel én az osztályban nem látok konstruktort, nem hiszem, hogy így működni fog. Valamint azt sem tudjuk, hogy mit tartalmaz a $POST['fajl']. Nem lehet, hogy $_POST['fajl']-ot akartál írni? Egyébként pedig az értéknek egy, a szerveren elérhető elérési utat kellene tartalmaznia, legalábbis, ahogy a példában szerepelt (persze csak javított konstruktor után).
17

<?php class SimpleImage {

attiss94 · 2011. Okt. 13. (Cs), 19.47

<?php  
class SimpleImage {
   function __construct() {
    /* mi kerulne ide? */
   }
$image = new SimpleImage($_POST['fajl']);    
  
    if($image->getWidth() > $image->getHeight()) {    
       $image->resize(1049, 700);    
    }    
    else {    
       $image->resize(525, 700);    
    }    
  }
    $image->save('../../galeria/img/kep.png');    
    echo "Sikeres átméretezés!";  
?>


Valahogy így értetted?
Mi kerülne a function-hoz?