Скрипт для быстрого добавления фоток в блог из Фотки.Яндекс v0.2

После появившейся недавно ошибки в работе этого скрипта, переработала код и вот что получилось.

<?php
/*
Post URI: http://lisax.blindage.org/?p=2473, http://lisax.blindage.org/?p=2858
Description: Get information about photo from yandex fotki url and post links for your blog into file
Version: 0.2
Author: Anna Smagina
Author URI: http://lisax.blindage.org
*/

/*
License: GPL v3
Compatibility: All
*/
require(‘./simple_html_dom.php’);
$file_in = «fotki.txt»;
$file_out = ‘fotki_out.txt’;
$content = file_get_contents($file_in);
$content = explode(«\n»,$content);
file_put_contents($file_out, »);
foreach ($content as $line) {
if ($line != ») {
$photopage = new simple_html_dom();
$photopage->load_file($line);

foreach ($photopage->find(‘div.b-preview’) as $div) {
foreach ($div->find(‘h1.name’) as $titles) {
$title = $titles->title;
}
}

foreach ($photopage->find(‘div#foto-actions’) as $actions) {
foreach ($actions->find(‘div.url’) as $urls) {
foreach ($urls->find(‘textarea’) as $textUrl) {
$urlXL = substr_replace($textUrl->plaintext, ‘XL’ ,strlen($textUrl->plaintext)-5,1);
$urlM = substr_replace($textUrl->plaintext,’M’,strlen($textUrl->plaintext)-5,1);
file_put_contents($file_out, ‘<a href=»‘ . $urlXL . ‘»><img title=»‘. $title .'» src=»‘ . $urlM .'» alt=»‘ . $title . ‘» border=»0″ /></a>’ . «\n» ,FILE_APPEND);
}
}
}

unset($photopage);
}
}

?>

Скрипт для быстрого добавления фоток в блог из Фотки.Яндекс v0.1

Запарилась уже руками выдирать со страницы нужную информацию для ссылки на фотографию, переправляться всё, чтобы вставить в блог ссылку в таком виде, как это делает wordpress. В итоге села и написала скриптик, который почти всё делает за меня. Ему надо подсунуть исходный файл (fotki.txt в директории со скриптом) со ссылками на страницы с фоткой, например,

http://fotki.yandex.ru/users/ann-iljina/view/532710/?page=4

И дальше запускаю скрипт в консоли:
php yandexfotki.php

И он создаёт файл с готовыми ссылками.

Скрипт использует simple html dom, так что вам надо скачать его самостоятельно и, распаковав, положить мой скрипт и файл со ссылками там же, где и simple_html_dom.php. В результате создастся файл fotki_out.txt. Пример результирующей строчки:

<a href=»http://img-fotki.yandex.ru/get/31/12344805.2/0_820e6_cd798f5c_XL.jpg»><img title=»топик до модицикации» src=»http://img-fotki.yandex.ru/get/31/12344805.2/0_820e6_cd798f5c_M.jpg» alt=»топик до модицикации» border=»0″ /></a>

После этого вам остаётся добавить между фотками описание/комментарии и можно публиковать вашу запись. Собственно сам скрипт ниже.
Читать далее

Преобразование массива строк в массив чисел (ASP .NET C#)

Нашла более изящное и короткое решение данной задачи нежели простой перебор.

string[] StringsArray = StartString.Split(',');
int[] IntArray = StringsArray.Select(x => int.Parse(x)).ToArray();

Обычный метод перебора массива и преобразования.

int[] SelAuds = new int[] { };
if (SelAudsString != String.Empty)
{
    string[] auditors = SelAudsString.Split(',');
    SelAuds = new int[auditors.Count()];
    int index = 0;
    foreach (var item in auditors)
    {
        SelAuds[index] = Convert.ToInt32(item);
        index++;
    }
}

Источник
(запись от Thursday, May 17, 2007 10:34 PM)

Как воспользоваться getProperty в случае, если property nullable (ASP .NET C#)

Понадобилось мне добавить сортировку в запрос, но поле, по которому сортировать и направление сортировки передавать я могла только через переменную. Например, var sortby = "UserRoleId";. В связи с этим пришлось познакомиться с лямбда-выражениями (как мне говорили другие программисты эти выражения очень сильная штука и полезная). Ниже приведено само формирование выражения — конец метода вместе с return.


var type = typeof(T);
var parameter = Expression.Parameter(type, "p");
var sortBy = "UserRoleId";
var property = type.GetProperty(sortBy);
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter);
MethodCallExpression resultExp;
if (sortDir == "asc")
resultExp = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { type, property.PropertyType }, queryResult.Expression, Expression.Quote(orderByExp));
else resultExp = Expression.Call(typeof(Queryable), "OrderByDescending", new Type[] { type, property.PropertyType }, queryResult.Expression, Expression.Quote(orderByExp));

return queryResult.Provider.CreateQuery<T>(resultExp).Skip(page * countOnPage).Take(countOnPage);

Помимо того, что необычным способом передавалось поле для сортировки, были поля, по которым надо было иметь возможность сортировать, но в базе они числились как nullable, то есть могут быть null, а это в корне меняет дело, ведь getProperty уже использовать нельзя, так как эта функция приводит к ошибке.

У этой проблемы есть 2 решения.

1. get-property-lambda-from-property-name-where-property-type-can-be-nullable

ParameterExpression param = Expression.Parameter(typeof(T), "arg");

Expression member = Expression.Property(param, propertyName);

if (member.Type.IsValueType)
{
  member = Expression.Convert(member, typeof(object));
}

return Expression.Lambda<Func<T, object>>(member, param);

2. convert-changetype-fails-on-nullable-types

Я, например, выбрала такой:


if (sortBy != String.Empty && sortDir != String.Empty)
{
// add sort by column sortBy
var type = typeof(T);
ParameterExpression parameter = Expression.Parameter(type, "arg");
Expression member = Expression.Property(parameter, sortBy);

member = Expression.Convert(member, typeof(object));

var orderByExp = Expression.Lambda<Func<T, object>>(member, parameter);
MethodCallExpression resultExp;
if (sortDir == «asc»)
resultExp = Expression.Call(typeof(Queryable), «OrderBy», new Type[] { type, member.Type }, queryResult.Expression, Expression.Quote(orderByExp));
else resultExp = Expression.Call(typeof(Queryable), «OrderByDescending», new Type[] { type, member.Type }, queryResult.Expression, Expression.Quote(orderByExp));
return queryResult.Provider.CreateQuery<T>(resultExp).Skip(page * countOnPage).Take(countOnPage);
}

return queryResult.Skip(page * countOnPage).Take(countOnPage);

ASP .NET MVC 3 Проблемы с jquery validation и textarea

Случилось так, что не работала у меня нормально jquery валидация для поля textarea. А именно проблема была в следующем.

Есть у меня типизированная вьюха (View) Create.aspx для создания сущности. По идее эта вьюха не принимает никакие значения полей, а просто отдает модель данного типа и все поля ввода пустые. Но мне надо было при переходе с быстрой (краткой) формы создания передать в полную форму многострочное поле ввода, которое я описала во вьюхе как <%: Html.TextAreaFor(model=>model.Text)%> (оно присутствует в обеих формах). Я пробовала создать в контроллере новый элемент нужного мне класса и заполнить только нужное мне поле (остальные поля были автоматически заполнены значениями по-умолчанию при создании экземпляра класса). В результате заметила, что помимо всего прочего, textarea неправильно генерировась в хтмл код.

Надо было (этот код успешно генерируется в случае перзагрузке страницы, что логично):


textarea cols="50" data-val="true" data-val-length="Текст должен состоять минимум из 1 символов и максимум из 1000." data-val-length-max="1000" data-val-length-min="1" data-val-required="The Текст field is required." id="Text" name="Text" rows="10">

А генерировалось:


textarea class="input-validation-error" cols="50" id="Text" name="Text" rows="10">

(Чтобы показать хтмл пришлось убрать по одной угловой скобке вначале)
В моем случае помимо textarea были еще однострочные поля ввода Html.EditorFor() — для них валидация работала замечательно. Так вот, чтобы было многострочное поле ввода и валидация работала, надо в модели, где описана валидация: что поле обязательное, ограничения на длину, например. Туда следует дописать следующую строчку: [DataType(DataType.MultilineText)]