вторник, 19 октября 2010 г.

Как в JavaScript изменить якорь в URL и перейти по нему одновременно

Если с помощью JavaScript обновлять только якорь URL, то редиректа страинцы не произойдет. Это часто используется в разных механизмах передачи данных между iframe-мами, которые могут менять якоря друг-другу. Но может стоять и противоположная задача - при изменении якоря, обязательно делать редирект. 

В таком случае нам поможет код:


path = "www.some-domain.com/index.html#value";
window.location.href = path;
window.location.reload(true);


У такого подхода есть один недочет: если вы так обновляете страницу у которой старый URL отличаеться от нового не только якорем, то произойдет редирект страницы саму на себя - всему виной строка 3, которая должна запускаться только если URL отличаются якорями.

Если вы хотите написать универсальный метод, то тогда придется немного усложнить код:

function redirectPage(url){
  newUrlParts = url.split("#");
  currentUrlParts = window.location.href.split("#");
  window.location.href = url;
  if(newUrlParts[0]==currentUrlParts[0])
    window.location.reload(true);
}


Такой метод будет работать универсально.

среда, 6 октября 2010 г.

Yii. Добавить новый getter в модель

Бывают случаи, когда после поиска, в результирующем наборе данных должно быть поле, которого нету в таблице. Например, у нас есть в таблице поле адрес, которое в себе содержит название города.

Пусть поле адрес до первой запятой содержит название города. Как лучше всего решить задачу?

Ответ прост, добавить новую property в модель и переопределить для нее getter. К счастью, с Yii это сделать достаточно просто.

Откроем файл с классом модели и добавим такой код:


/**
* @property string $city
*/
protected $city;

/**
* get City property
*/
public function getCity(){
  $address = $this->getAttribute('address');
  $list = explode(",",$address);
  if(count($list)==0)
    return "";
  return trim($list[0]);
}



Теперь можно достать такое поле так:

$criteria = ...
$result = ModelName::model()->->findAll($criteria);
foreach ($result as $item){
  $city = $item->getCity();
  $name = $item->getAttribute('name');
}


Я специально достал из набора два разных поля, чтобы показать как обращатся к стандартной проперти, а как к той что мы создали сами.