É preciso sempre muito cuidado ao copiar códigos! Na verdade, sou contra essa prática. O ideal é ver o exemplo, entender como ele funciona e implementar sua própria solucão.
Não testei aqui, mas acredito que o seu erro está aqui:
$data=Location::cidade()->findAll('parent_id=:parent_id',
array(':parent_id'=>(int) $_POST['estado_id']));
De onde você tirou esse Location::cidade()? Você tem algum modelo que tenha uma método static chamado cidade? Acho que não =D
No tutorial do cookbook, temos o seguinte:
$data=Location::model()->findAll('parent_id=:parent_id',
array(':parent_id'=>(int) $_POST['estado_id']));
Veja o Location::model(). Essa é a forma correta de utilizar o método findAll, do Active Record. Location é o modelo que representa as cidades, que no seu caso vejo que é a classe cidade. Sendo assim, no seu caso ficaria algo como:
Cidade::model()->findAll()
Note também, que o parâmetro 'parent_id', passado para o método findAll, indica que devem ser retornadas todas as cidades onde o campo parent_id tenha o id do estado informado. Você também deve alterar esse parâmetro para refletir o formato de sua tabela.
Para entender melhor como funciona o Active Record no Yii veja:
http://www.yiiframew...ide/database.ar
Ah, uma dica! Procure iniciar o nome de suas classes (e, por consequência, de seus modelos) com letras Maiúsculas. Vi que seu modelo se chama cidade, com letra minúscula. Isso é ruim e diminui a legibilidade do código, pois faz com que fique fácil de confundir uma classe com uma variável ou método.
Caso o nome de suas tabelas estejam em minusculas e seu banco seja case-sensitive, você pode criar a sua classe normalmente, com letras maiúsculas, e sobrescrever o método tableName() para retornar o nome correto da tabela. Por exemplo
class Cidade extends CActiveRecord {
...
public function tableName() {
return 'cidade';
}
...
}