Запитване за CSV метаданни за галерия с изображения в Kirby

Така че изтеглих и наистина ми хареса да започна с Kirby http://www.getkirby.com За тези, които не са запознати е базиран на файл cms.

Като стандарт можете да пуснете куп изображения в директория, напр. site/number1 и ще направи галерия за вас на страница, наречена site.com/number1. Ако едно от вашите изображения се нарича example.jpg, можете да направите файл, наречен example.txt и да поставите вътрешна информация, свързана с изображението, като заглавие, дата и т.н.

Не бях напълно доволен от идеята да имам текстов файл за всяко отделно изображение и изображенията да бъдат разпръснати из сървъра в папките на страниците.

Първо поставих голяма колекция от изображения в активи и добавих променлива към страницата, така че просто трябва да добавя референтното изображение, напр. k-45 към списък в page.txt, напр.

----

Imagelist: a-04, a-08, h-16, i-35

След това добавих следния фрагмент:

 <ul class="gallery">
  <?php $imagelist= $page->imagelist();
  if ($imagelist != ''){
$imagelistitem= explode(", ", $imagelist);
foreach ($imagelistitem  as $image): ?>
  <li><img src="<?php echo url('assets/artistswork/450/').$image.'.jpg' ?>" /></li>
      <?php endforeach ;} ?>
    </ul>

Това генерира галерия с изображения от централната банка и работи чудесно. Разбира се, някой по-опитен от мен би могъл да добави някакво полезно валидиране/корекция на грешки, но докато списъкът е написан без грешки, той работи добре.

Засега това по същество е проблем на Kirby, тук започва въпросът ми.

След това исках да начертая метаданни за изображенията от централен csv лист. Например заглавие, дата, материал и др. полета, свързани с променливата $image.

В моя csv кодът на първата колона на фондовата книга ще има цифра, която е еквивалентна на променливата $image и искам да използвам останалата информация в този ред, за да попълня поредица от интервали, които мога да форматирам и евентуално да анимирам с помощта на jquery и анализирайте до фантастична кутия и т.н.

  1. Имам нужда от по-добра част от кода, за да генерирам ефективен масив от моя csv. Евентуално индексиране на резултатите по номера на борсовата книга
  2. И метод за запитване и анализиране на съответния масив като списък с променливи, които да се използват при инжектирането.

Представих си, че мога да инжектирам кода в цитирания по-горе повторител.

<span class="workTitle">$title</span>
<span class="workDate">$date</span>
<span class="workMaterial">$material</span>
<span class="workDimensions">$dimensions</span>
<span class="workPrice">$price</span>

Първите няколко реда от моя csv са:

Stock book code,Date,Work Title,height,width,materials,Ownership
a-04,1962,River Barge,0,0,Oil on Board,Sold
a-08,1962,Thames Bridge Fantasy ,48,36,Oil on Board,Available
h-15,1963,Split Rocks,36,32,Oil on Board,Available
i-35,1964,Moon Dyptych,32,21,Oil on Board,Available

Всъщност нямам много представа как да завърша това. Знам, че вероятно не е супер трудно, но не съм експерт, със сигурност не когато се занимавам с масиви. Листът е на сървъра и с помощта на някакъв php успях да отпечатам резултата от csv-масива, но без заглавката да е заглавието на масива, те просто бяха третирани като ред, първият масив в по-големия масив.

Така че наистина гледам да започна от нулата за втората част от моя проблем - не очаквам пълно решение за изрязване и поставяне по никакъв начин, но ако някой може да ме насочи в правилната посока, ще бъде страхотно. Не съм използвал j-query и не знам много php. Въпреки това нямам нищо против да чета много и да прекарвам времето си, за да работи сам, но бих могъл да се справя с точка в правилната посока.

Функцията в пълен csv-масив, която намерих, беше както следва. Може да се наложи да започнем отначало с него:

<?PHP
function readCSV($csvFile){
    $file_handle = fopen($csvFile, 'r');
    while (!feof($file_handle) ) {
        $line_of_text[] = fgetcsv($file_handle, 1024);
    }
    fclose($file_handle);
    return $line_of_text;
}


// Set path to CSV file
$csvFile = 'http://localhost/peterliddle/assets/artistswork/imagemeta.csv';

$csv = readCSV($csvFile);
echo '<pre>';
print_r($csv);
echo '</pre>';
?>

Това извежда това (и още 300):

Array
(
    [0] => Array
        (
            [0] => Stock book code
            [1] => Date
            [2] => Work Title
            [3] => height
            [4] => width
            [5] => materials
            [6] => Ownership
        )

    [1] => Array
        (
            [0] => a-04
            [1] => 1962
            [2] => River Barge
            [3] => 0
            [4] => 0
            [5] => Oil on Board
            [6] => Sold
        )

    [2] => Array
        (
            [0] => a-08
            [1] => 1962
            [2] => Thames Bridge Fantasy 
            [3] => 48
            [4] => 36
            [5] => Oil on Board
            [6] => Available
        )

    [3] => Array
        (
            [0] => h-15
            [1] => 1963
            [2] => Split Rocks
            [3] => 36
            [4] => 32
            [5] => Oil on Board
            [6] => Available
        )

person Craig Chamberlain    schedule 03.05.2013    source източник
comment
Тук има паралелен низ за потребителите на kirby getkirby.com/forum/extensions/topic: 636/#post2122   -  person Craig Chamberlain    schedule 04.05.2013
comment
Може да е много подобен проблем. Трябва ли да ударя това по главата и да премина към db. Не е нужно особено да редактирам cvs-тата от сървъра. stackoverflow.com/questions/16047131/   -  person Craig Chamberlain    schedule 04.05.2013


Отговори (2)


Първо бих казал, че ако не е необходимо да редактирате файловете, след като са създадени, и току-що започвате, тогава използването на csv файлове е валиден начин. Базите данни въвеждат свой собствен набор от проблеми, като сигурността, които са много по-лесни за избягване с csv файлове. Просто се уверете, че всички файлове са само за четене и ще се оправите.

Второ, бих се изкушил да използвам вградената php функция fgetcsv, за да анализирам вашия csv файлове. Не знам със сигурност, но рискувам да предположа, че вероятно е по-бързо.

Доколкото виждам, има два начина да направите това. Първият е просто да извлечете данните, от които се нуждаете, в асоциативен масив, съдържащ стойностите, от които се нуждаете, като използвате заглавните редове като ключови стойности. И така, след като сте получили вашия масив от стойности от csv файла, нека го наречем $imageMeta, можете да направите нещо като;

foreach ($imageMeta as $row => $meta)
{
    if ($row === 0 && is_array($meta)) //Reading the first line with your header rows
    {
        $tempMeta = $meta; //A temporary holder for the field headers.
    }else{
        foreach ($meta as $key => $field) //Now we go through each meta row and extract the field data
        {
            $finalMeta[$row-1][$tempMeta[$key]] = $field;
        }
    }
}

Това е подход на груба сила, ще се опитам да измисля нещо по-елегантно, което да разгледате.

person Joe Miller    schedule 04.05.2013
comment
Благодаря, Джо, вече се опитах да използвам тази част от кода от gist hub gist.github.com/385876 Въпреки това не го накарах да работи, защото използвах неправилна версия на пътя, т.е. localhost.. не е роднина един. Сега работи добре. Ще работя върху заявката и ще публикувам в gist hub, за да видя дали някой друг може да иска да я използва или подобри. - person Craig Chamberlain; 05.05.2013
comment
Здравей Крейг, моето решение работи ли все пак? Ще съм благодарен, ако приемете отговора, ако е така. Благодаря - person Joe Miller; 05.05.2013
comment
Това е така, защото когато работите с файлове, трябва да използвате пътя на сървъра, а не URL адреса. URL адресът към файла е localhost/peterliddle/assets/artistswork/imagemeta.csv, но пътят на сървъра вероятно е нещо като /var/www/peterliddle/assets/artistswork/imagemeta.csv на linux сървър. - person Joe Miller; 05.05.2013

Изглежда, че Джо е предоставил добро решение и е получил някакъв код от https://gist.github.com/jaywilliams/385876 да работи, като използва относителен път, а не абсолютен чрез localhost/...

Ако имам конкретен проблем, ще напиша отново за него и ще затворя този общ

person Craig Chamberlain    schedule 05.05.2013