Запости еще функцию clsDoXMLReq() и селект, содержимое которого надо изменить. Вечером напишу - с собой исходников нету.
Через скрытый iframe и XMLRPC можно попробовать.
на select поле вешаешь onChange, который загружает в iframe файл, он подтягивает с удаленного данные и в ответ генерирует уже локальный JavaScript меняющий список в родителе
Честно говоря нет. Сразу же возникла мысль, что если хочешь хорошо - сделай сам :)
Вот тогда еще в догонку. Функция CategorySelect() была разработана для создания списка категорий на страницах добавления/редактирования объявления, но для верности была беспорядочно натыкана везде гне не попадя... иногда по несколько раз... А каждый вызов грозит несколькими десятками запросов к базе. Но это, наверное, исходя из логики, что в шаблон нужно передать максимум, а верстальщик уж пусть сам решает нужен ли ему будет при просмотре объявления выпадающий список с категориями.
Кстати {html_options options=$cust_options selected=$customer_id} еще никто не отменял.
function CatSelectRow($parent,$level){ global $sort_cat; $q = mysql_query("SELECT cat, name, count_items, total_items, parent FROM wzb_cat WHERE cat<>0 and parent=$parent $sort_cat"); $a = array(); while ($row = mysql_fetch_row($q)) { $row[5] = $level; $a[] = $row; $b = CatSelectRow($row[0],$level+1); for ($j=0; $j<count($b); $j++) { $a[] = $b[$j]; } } return $a;}function CategorySelect(){ $category_select = ""; $tmp = isset($_GET["cat"]) ? $_GET["cat"] : (isset($_POST["category_select"]) ? $_POST["category_select"] : null); $cats = CatSelectRow(0,0); for ($i=0; $i<count($cats); $i++) { if($cats[$i][4] == 0)$category_select .= " <optgroup label='".$cats[$i][1]."'></optgroup>\n"; if($cats[$i][4] == 0){ }else{ $category_select .= "<option value=\"".$cats[$i][0]."\""; if ($tmp == $cats[$i][0]) $category_select .= " selected"; $category_select .= ">"; for ($j=0;$j<$cats[$i][5];$j++) $category_select .= "..."; $category_select .= $cats[$i][1]; $category_select .= "</option>\n"; } } return $category_select;}
Что еще отличает порядочного разработчика? Что нужно сделать что бы лишний раз не мозолить глаза надоедливыми варнингами об обращении к неустановленной переменной или несуществующему ключу массива? Нет не правильно - не инициализировать, не проверять на существование и боже упаси использовать эти бредовые is_set`ы и прочуюю муру, а взять и отключить показ ошибок! Зато при включении их можно будет наблюдать аж 2-3 экрана. :)
ЗЫ. Небольшой оффтоп.
Идею с паролем для каждого объявления откинул сразу и пока прикрутил авторизацию с базой пользователей основного сайта. Хотелось бы что бы можно было поставить независимо от основного сайта. Как вариант сделать авторизацию и получение пользовательской инфы через XMLRPC с дальнейшем сохранением в сессии?
Большую часть переписал, но на некоторый бред хотелось бы еще особо обратить внимание :)
Прикрепление изображений к объявлению.
Метод автора: для начала определим сколько нам необходимо прикреплять изображений к объявлению? Пусть будет 3! Не вопрос, в таблице с объявлениями добавляем 3 поля photo, photo1, photo2 где будем хранить имя изображения. Далее в странице добавления объявления 3 раза повторяем кусок кода для загрузки изображения, а на странице редактирования объявления - обрабатываем 3 действия для удаления картинки из объявления, разумеется 3 идентичными кусками кода! Теперь допустим я решил что мне мало 3 фотографий для объявления, хочу 15 - таблица обзаводится еще 12 полями, а в коде размножаем одинаковые куски по 12 раз? Почему же нельзя было создать отдельную табличку куда писать имя файла, ID объявления, а кол-во изображений для объявлений ограничить в конфиге?
Загрузка списка категорий.
Для получения категорий левого (основного меню), (см. аттачмент) основного списка (тот который с иконками в центре) и в центре ниже используются 3 разных метода - которые непременно рекурсивно лазеют в базу ☝ Т.е. для кол-ва рубрик на скриншоте получится около 40 SQL запросов!!! А если рубрик будет больше и вложенность увеличена - то это настоящее испытание для SQL сервера. В итоге был написан 1 запрос, из которого строится полное дерево категорий и передается в шаблон, а там уже в разных местах по разному разбирается одно и тоже дерево.
Ну и так еще некоторые перлы с которыми столкнулся :)
На главной странице выводятся последние объявления, при просмотре раздела - там так же выводятся последние объявления этого раздела. Логично было предположить что используется один метод для получения последних объявлений в зависимости от рубрики (на главной от корня). Но только не здесь! На каждой странице (даже при создании объявления) из базы выгребаются последние для главной, а при просмотре рубрик - выбираются еще и для рубрики. Вот так вот.
Пока все... Но это только пока - работа еще не закончена.
ЗЫ Для всех желающих или вложивших деньги в это чудо разработки по окончании работ будет выложен дистриб под GPL
Да не жрет он много ни ресурсов ни трафика. Стоит уже больше 2-х лет, работает как часы. Только если покупать - то лучше здесь chatmod.net.ru - они демона переписали и затачивают под остальные браузеры кроме IE
Вариант для FF:
Инструменты - Информация о странице - Мультимедиа.
Для каждой картинки/флеша есть кнопка "Сохранить"
Вот рабочий вариант:
function currency($currency_code){ $scripturl = "http://www.cbr.ru/scripts/XML_daily.asp";$doc = "";$handle = fopen($scripturl, "r");while (!feof($handle)) { $doc .= fread($handle, 8192);}fclose($handle);$r = array();preg_match("/<Valute ID=\"".$currency_code."\">(.*)<\/Valute>/is", $doc, $m);preg_match_all("/<Value>([0-9,]+)<\/Value>/is", $m[1], $r, PREG_SET_ORDER);return str_replace(",", ".", $r[0][1]);} echo currency("R01235");
Может еще интеграл предложить с редактором формул для ввода ответа? 😮
А еще у некоторых может анимация не отображаться ( /ru/forum/98059 ) и будет бедный пользователь пытаться вбить первое число, и недоумевать - почему же неверно )))
Дело в настройках сервера, см 8 пост
Если хочешь использовать эту функцию, попробуй такой вариант:
function currency($currency_code){ $scripturl = 'http://www.cbr.ru/scripts/XML_dynamic.asp';$date_1=date('d/m/Y', time()-172800);$date_2=date('d/m/Y');$requrl = "{$scripturl}?date_req1={$date_1}&date_req2={$date_2}&VAL_NM_RQ={$currency_code}";$doc = "";$handle = fopen($scripturl, "r");while (!feof($handle)) { $doc .= fread($handle, 8192);}fclose($handle);$r = array();if(preg_match("/<ValCurs.*?>(.*?)<\/ValCurs>/is", $doc, $m)) preg_match_all("/<Record(.*?)>(.*?)<\/Record>/is", $m[1], $r, PREG_SET_ORDER);$m = array();$d = array();for($i=0; $i<count($r); $i++) { if(preg_match("/Date=\"(\d{2})\.(\d{2})\.(\d{4})\"/is", $r[$i][1],$m)) { $dv = "{$m[1]}/{$m[2]}/{$m[3]}"; if(preg_match("/<Nominal>(.*?)<\/Nominal>.*?<Value>(.*?)<\/Value>/is", $r[$i][2], $m)) { $m[2] = preg_replace("/,/",".",$m[2]); $d[] = array($dv, $m[1], $m[2]); } } }$last = array_pop($d);$prev = array_pop($d);$date = $last[0];$rate = sprintf("%.2f",$last[2]);$delta = (($last[2]>$prev[2])?"+":"").sprintf("%.2f",$last[2]-$prev[2]);$string = "{$rate}\n";return $string;}