Как добавить параметр url в сниппет-парсер?

Тема в разделе "MODx", создана пользователем Lexx59, 20 сен 2011.

  1. Lexx59

    Lexx59

    Регистр.:
    9 янв 2009
    Сообщения:
    179
    Симпатии:
    38
    Есть сниппет-парсер:
    [[parseRSS]]
    Код:
    <?php
    /********************************************************** 
     * Parse XML data into an array structure                 * 
     * Usage: array parse_rss ( string data )                 * 
     **********************************************************/ 
    function parse_rss($reg_exp, $xml_data) { 
        preg_match_all($reg_exp, $xml_data, $temp); 
        return array( 
            'count'=>count($temp[0]), 
            'title'=>$temp[1], 
            'link'=>$temp[2], 
            'desc'=>$temp[3], 
            'pubdate'=>$temp[4]   //добавлено 
        ); 
    } 
    /********************************************************** 
     * Parse Array data into an HTML structure                * 
     * Usage: string parse_rss ( array data )                 * 
     **********************************************************/ 
    function output_rss($pattern, $rss_data) { 
        $temp = ""; 
        for($i=0; $i<$rss_data['count']; $i++) { 
            $temp .= sprintf($pattern, 
                $rss_data['link'][$i], 
                html_entity_decode($rss_data['title'][$i]), 
                html_entity_decode($rss_data['desc'][$i]), 
                $rss_data['pubdate'][$i]   //добавлено 
            ); 
        } 
        return $temp; 
    } 
    /********************************************************** 
     * Settings                                               * 
     **********************************************************/ 
    [SIZE="5"][COLOR="SeaGreen"][B]$url = 'http://rss.org/catalog.php?ID=CZduXYymiAJ';[/B][/COLOR][/SIZE]
    $reg_exp  = '#<item>.*?<title>(.*?)<\/title>.*?'; 
    $reg_exp .='<link>(.*?)<\/link>.*?<description>'; 
    $reg_exp .='(.*?)<\/description>.*?<pubDate>'; //исправлено 
    $reg_exp .= '(.*?)<\/pubDate>.*?<\/item>#si';  //добавлено 
    $pattern = '<a href="%s">%s</a><br>Date: %s<hr>'; 
    /********************************************************** 
     * Main script                                            * 
     **********************************************************/ 
    if ( $xml_data = file_get_contents($url) ) { 
        $rss_data = parse_rss($reg_exp, $xml_data); 
        echo output_rss($pattern, $rss_data); 
    } 
    /********************************************************** 
      * The END                                                * 
     **********************************************************/
    ?>
    
    У него внутри есть параметр - $url - выделен зеленым.
    Как переделать снипет так, чтобы url можно было задавать параметром при вызове сниппета?
    Типа [[parseRSS?URL=`http://rss.org/catalog.php?ID=CZduXYymiAJ`]]
    Пытался разобраться как передаются параметры в WayFinder - но слишком сложно для меня на текущий момент :(
     
  2. SpaceW

    SpaceW Постоялец

    Регистр.:
    27 сен 2007
    Сообщения:
    95
    Симпатии:
    45
    Это делается очень просто:
    сначала определяем переменную в сниппете:
    PHP:
    if(isset($url)) $url $url; else $url='';
    А потом уже используем переменную.

    Перевод, примерно, следующий:
    PHP:
    if(isset($url)) //Если сниппет вызывается с определенным параметром url, то
    $url $url// передаем этот параметр переменной, в противном случае
    else $url=''// назначаем переменной значение по умолчанию, в этом случае у нас в переменной ничего нет, но мы могли бы написать $url='http://rss.org/catalog.php?ID=CZduXYymiAJ' и тогда, если в сниппете не задан url, то парсер будет обрабатывать ссылку по умолчанию, т.е. http://rss.org/catalog.php?ID=CZduXYymiAJ
    Соответственно, вызывать сниппет
    PHP:
    [[parseRSS? &url=`http://rss.org/catalog.php?ID=CZduXYymiAJ`]]
    для кэшированного или
    PHP:
    [!parseRSS? &url=`http://rss.org/catalog.php?ID=CZduXYymiAJ`!]
    для некэшированного
     
    Lexx59 нравится это.
  3. Lexx59

    Lexx59

    Регистр.:
    9 янв 2009
    Сообщения:
    179
    Симпатии:
    38
    При адресе вида:
    [!rssparser?url=`http://feeds2.feedburner.com/visual-ideas`!]
    все работает отлично.

    А, когда подставляю такой адрес:
    [!rssparser?url=`http://r1.rssmix.org/catalog.php?ID=CZduXYymiAJKG87lNrOi_2gcrVkfCi-PN3CPWAUoS3E7OoXmJdolja46x7DSHVXaP5yqdBfUTbcfsT9ylurowQ`!]
    то модх вылетает:

    ощущение, что проблема в параметрах самого адреса - наличие знака вопроса. не знаю как поправить.
     
  4. konishoa

    konishoa Постоялец

    Регистр.:
    22 сен 2010
    Сообщения:
    126
    Симпатии:
    36
    как говорится: решение у вас не получилось... Предлагаю своё. Надеюсь не через Ж :-]
    Насколько я понял, речь идёт об MODx Evolution...
    Устанавливаем экстра pieX Ver0.6.1 http://forums.modx.com/index.php?action=dlattach%3btopic=18030.0%3battach=6025
    Смотрим сюда http://wiki.modxcms.com/index.php/PieX
    и понимаем, что наш вызов будет выглядеть вот так:
    HTML:
    [!pieX? &url=`feedURL`!]
    а если со знаками, то их мы заменяем по правилу:
    HTML:
    "?" => |xq|
    "=" => |xe|
    "&" => |xa|
    Погнале
    HTML:
    УРЛ=http://r1.rssmix.org/catalog.php?ID=CZduXYymiAJKG87lNrOi_2gcrVkfCi-PN3CPWAUoS3E7OoXmJdolja46x7DSHVXaP5yqdBfUTbcfsT9yl urowQ
    Будет
    HTML:
    http://r1.rssmix.org/catalog.php|xq|ID|xe|CZduXYymiAJKG87lNrOi_2gcrVkfCi-PN3CPWAUoS3E7OoXmJdolja46x7DSHVXaP5yqdBfUTbcfsT9yl urowQ 
    Вызов сниппета
    HTML:
    [!pieX? &url=`http://r1.rssmix.org/catalog.php|xq|ID|xe|CZduXYymiAJKG87lNrOi_2gcrVkfCi-PN3CPWAUoS3E7OoXmJdolja46x7DSHVXaP5yqdBfUTbcfsT9yl urowQ`!]
     
  5. Lexx59

    Lexx59

    Регистр.:
    9 янв 2009
    Сообщения:
    179
    Симпатии:
    38
    там все на китайском :)

    вот это:
    Код:
    "?" => |xq|
    "=" => |xe|
    "&" => |xa|
    
    только при установленном PieX работает? Или можно без него заменять?
     
  6. konishoa

    konishoa Постоялец

    Регистр.:
    22 сен 2010
    Сообщения:
    126
    Симпатии:
    36
    Я не могу сказать "С" или "БЕЗ", пока сам не попробовал. Пробуй - и нам расскажи. Это как для спецсимвола "[" =&#91, работает, но не везде...
     
  7. Lexx59

    Lexx59

    Регистр.:
    9 янв 2009
    Сообщения:
    179
    Симпатии:
    38
    modx все-равно вылетает
    Код:
    PHP error debug
      Error: 	
    file_get_contents(http://r1.rssmix.org/catalog.php|xq|ID|xe|CZduXYymiAJKG87lNrOi_2gcrVkfCi-PN3CPWAUoS3E7OoXmJdolja46x7DSHVXaP5yqdBfUTbcfsT9ylurowQ)
    [function.file-get-contents]: 
    failed to open stream: 
    HTTP request failed! HTTP/1.1 403 Forbidden 
    
    Хотя если url задавать явно внутри сниппета:

    Код:
    $url = 'http://r1.rssmix.org/catalog.php[B]?[/B]ID=CZduXYymiAJKG87lNrOi_2gcrVkfCi-PN3CPWAUoS3E7OoXmJdolja46x7DSHVXaP5yqdBfUTbcfsT9ylurowQ'; 
    
    то все работает.

    Когда url задается в качестве параметра, то
    Код:
    echo $url;
    
    выдает
    Куда-то пропадают знак вопроса перед ID, а после ID знак равенства и все что после него.
     
  8. AlexMist

    AlexMist Создатель

    Регистр.:
    17 ноя 2009
    Сообщения:
    49
    Симпатии:
    7
    Если значения не часто подставлять то наверняка поможен Перейти по ссылке

    Код:
    http%3A%2F%2Fr1.rssmix.org%2Fcatalog.php%3FID%3DCZduXYymiAJKG87lNrOi_2gcrVkfCi-PN3CPWAUoS3E7OoXmJdolja46x7DSHVXaP5yqdBfUTbcfsT9ylurowQ